blob: 8476022f7c60e569d1a22a946fb5d91ba4a7b908 [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 Moolenaaradc21822011-04-01 18:03:16 +02003" Date: Apr 01, 2011
4" Version: 141
Bram Moolenaar9964e462007-05-05 17:54:07 +00005" Maintainer: Charles E Campbell, Jr <NdrOchip@ScampbellPfamily.AbizM-NOSPAM>
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00006" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007" Copyright: Copyright (C) 1999-2010 Charles E. Campbell, Jr. {{{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 Moolenaaradc21822011-04-01 18:03:16 +020025let g:loaded_netrw = "v141"
Bram Moolenaar5c736222010-01-06 20:54:52 +010026if v:version < 702
27 echohl WarningMsg
28 echo "***warning*** this version of netrw needs vim 7.2"
29 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
38" sanity checks
Bram Moolenaar578b49e2005-09-10 19:22:57 +000039if v:version < 700
Bram Moolenaar9964e462007-05-05 17:54:07 +000040 call netrw#ErrorMsg(s:WARNING,"you need vim version 7.0 or later for version ".g:loaded_netrw." of netrw",1)
Bram Moolenaar578b49e2005-09-10 19:22:57 +000041 finish
42endif
Bram Moolenaar446cb832008-06-24 21:56:24 +000043
Bram Moolenaar1afcace2005-11-25 19:54:28 +000044let s:keepcpo= &cpo
Bram Moolenaar9964e462007-05-05 17:54:07 +000045setlocal cpo&vim
46"DechoTabOn
47"call Decho("doing autoload/netrw.vim version ".g:loaded_netrw)
Bram Moolenaar071d4272004-06-13 20:20:40 +000048
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +000049" ======================
50" Netrw Variables: {{{1
51" ======================
52
Bram Moolenaar071d4272004-06-13 20:20:40 +000053" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +010054" NetrwInit: initializes variables if they haven't been defined {{{2
55" Loosely, varname = value.
56fun s:NetrwInit(varname,value)
57 if !exists(a:varname)
58 if type(a:value) == 0
59 exe "let ".a:varname."=".a:value
60 elseif type(a:value) == 1
61 exe "let ".a:varname."="."'".a:value."'"
62 else
63 exe "let ".a:varname."=".a:value
64 endif
65 endif
66endfun
67
68" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +000069" Netrw Constants: {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +010070call s:NetrwInit("g:netrw_dirhist_cnt",0)
Bram Moolenaar9964e462007-05-05 17:54:07 +000071if !exists("s:LONGLIST")
Bram Moolenaar5c736222010-01-06 20:54:52 +010072 call s:NetrwInit("s:THINLIST",0)
73 call s:NetrwInit("s:LONGLIST",1)
74 call s:NetrwInit("s:WIDELIST",2)
75 call s:NetrwInit("s:TREELIST",3)
76 call s:NetrwInit("s:MAXLIST" ,4)
Bram Moolenaar9964e462007-05-05 17:54:07 +000077endif
78
79" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +000080" Default values for netrw's global protocol variables {{{2
Bram Moolenaaradc21822011-04-01 18:03:16 +020081call s:NetrwInit("g:netrw_use_errorwindow",1)
82
Bram Moolenaar1afcace2005-11-25 19:54:28 +000083if !exists("g:netrw_dav_cmd")
Bram Moolenaar5c736222010-01-06 20:54:52 +010084 if executable("cadaver")
Bram Moolenaar1afcace2005-11-25 19:54:28 +000085 let g:netrw_dav_cmd = "cadaver"
Bram Moolenaar5c736222010-01-06 20:54:52 +010086 elseif executable("curl")
87 let g:netrw_dav_cmd = "curl"
88 else
89 let g:netrw_dav_cmd = ""
90 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000091endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +000092if !exists("g:netrw_fetch_cmd")
93 if executable("fetch")
94 let g:netrw_fetch_cmd = "fetch -o"
95 else
96 let g:netrw_fetch_cmd = ""
97 endif
98endif
99if !exists("g:netrw_ftp_cmd")
100 let g:netrw_ftp_cmd = "ftp"
101endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200102let s:netrw_ftp_cmd= g:netrw_ftp_cmd
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000103if !exists("g:netrw_http_cmd")
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000104 if executable("elinks")
105 let g:netrw_http_cmd = "elinks"
Bram Moolenaar5c736222010-01-06 20:54:52 +0100106 call s:NetrwInit("g:netrw_http_xcmd","-source >")
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000107 elseif executable("links")
108 let g:netrw_http_cmd = "links"
Bram Moolenaar5c736222010-01-06 20:54:52 +0100109 call s:NetrwInit("g:netrw_http_xcmd","-source >")
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000110 elseif executable("curl")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100111 let g:netrw_http_cmd = "curl"
112 call s:NetrwInit("g:netrw_http_xcmd","-o")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000113 elseif executable("wget")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100114 let g:netrw_http_cmd = "wget"
115 call s:NetrwInit("g:netrw_http_xcmd","-q -O")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000116 elseif executable("fetch")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100117 let g:netrw_http_cmd = "fetch"
118 call s:NetrwInit("g:netrw_http_xcmd","-o")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000119 else
120 let g:netrw_http_cmd = ""
121 endif
122endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100123call s:NetrwInit("g:netrw_rcp_cmd" , "rcp")
124call s:NetrwInit("g:netrw_rsync_cmd", "rsync")
125call s:NetrwInit("g:netrw_scp_cmd" , "scp -q")
126call s:NetrwInit("g:netrw_sftp_cmd" , "sftp")
127call s:NetrwInit("g:netrw_ssh_cmd" , "ssh")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000128
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000129if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000130 \ && exists("g:netrw_use_nt_rcp")
131 \ && g:netrw_use_nt_rcp
132 \ && executable( $SystemRoot .'/system32/rcp.exe')
133 let s:netrw_has_nt_rcp = 1
134 let s:netrw_rcpmode = '-b'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000135else
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000136 let s:netrw_has_nt_rcp = 0
137 let s:netrw_rcpmode = ''
138endif
139
140" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000141" Default values for netrw's global variables {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +0000142" Cygwin Detection ------- {{{3
143if !exists("g:netrw_cygwin")
144 if has("win32") || has("win95") || has("win64") || has("win16")
145 if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$'
146 let g:netrw_cygwin= 1
147 else
148 let g:netrw_cygwin= 0
149 endif
150 else
151 let g:netrw_cygwin= 0
152 endif
153endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000154" Default values - a-c ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100155call s:NetrwInit("g:netrw_alto" , &sb)
156call s:NetrwInit("g:netrw_altv" , &spr)
157call s:NetrwInit("g:netrw_banner" , 1)
158call s:NetrwInit("g:netrw_browse_split", 0)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200159call s:NetrwInit("g:netrw_bufsettings" , "noma nomod nonu nobl nowrap ro")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100160call s:NetrwInit("g:netrw_chgwin" , -1)
161call s:NetrwInit("g:netrw_compress" , "gzip")
162call s:NetrwInit("g:netrw_ctags" , "ctags")
Bram Moolenaaradc21822011-04-01 18:03:16 +0200163if exists("g:netrw_cursorline") && !exists("g:netrw_cursor")
164 call netrw#ErrorMsg(s:NOTE,'g:netrw_cursorline is deprecated; use g:netrw_cursor instead',77)
165 let g:netrw_cursor= g:netrw_cursorline
Bram Moolenaar446cb832008-06-24 21:56:24 +0000166endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200167call s:NetrwInit("g:netrw_cursor" , 2)
168let s:netrw_usercul = &cursorline
169let s:netrw_usercuc = &cursorcolumn
Bram Moolenaar446cb832008-06-24 21:56:24 +0000170" Default values - d-g ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100171call s:NetrwInit("g:netrw_dirhist_cnt" , 0)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200172call s:NetrwInit("g:netrw_decompress" , '{ ".gz" : "gunzip", ".bz2" : "bunzip2", ".zip" : "unzip", ".tar" : "tar -xf", ".xz" : "unxz" }')
Bram Moolenaar5c736222010-01-06 20:54:52 +0100173call s:NetrwInit("g:netrw_dirhistmax" , 10)
174call s:NetrwInit("g:netrw_fastbrowse" , 1)
175call 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 +0000176if !exists("g:netrw_ftp_list_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000177 if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)
178 let g:netrw_ftp_list_cmd = "ls -lF"
179 let g:netrw_ftp_timelist_cmd = "ls -tlF"
180 let g:netrw_ftp_sizelist_cmd = "ls -slF"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000181 else
Bram Moolenaar9964e462007-05-05 17:54:07 +0000182 let g:netrw_ftp_list_cmd = "dir"
183 let g:netrw_ftp_timelist_cmd = "dir"
184 let g:netrw_ftp_sizelist_cmd = "dir"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000185 endif
186endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100187call s:NetrwInit("g:netrw_ftpmode",'binary')
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000188" Default values - h-lh ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100189call s:NetrwInit("g:netrw_hide",1)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000190if !exists("g:netrw_ignorenetrc")
191 if &shell =~ '\c\<\%(cmd\|4nt\)\.exe$'
192 let g:netrw_ignorenetrc= 1
193 else
194 let g:netrw_ignorenetrc= 0
195 endif
196endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100197call s:NetrwInit("g:netrw_keepdir",1)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000198if !exists("g:netrw_list_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000199 if g:netrw_scp_cmd =~ '^pscp' && executable("pscp")
200 " provide a 'pscp' listing command
201 if (has("win32") || has("win95") || has("win64") || has("win16")) && filereadable("c:\\private.ppk")
202 let g:netrw_scp_cmd ="pscp -i C:\\private.ppk"
203 endif
204 let g:netrw_list_cmd= g:netrw_scp_cmd." -ls USEPORT HOSTNAME:"
205 elseif executable(g:netrw_ssh_cmd)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000206 " provide a default listing command
Bram Moolenaar9964e462007-05-05 17:54:07 +0000207 let g:netrw_list_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME ls -FLa"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000208 else
Bram Moolenaar9964e462007-05-05 17:54:07 +0000209" call Decho(g:netrw_ssh_cmd." is not executable")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000210 let g:netrw_list_cmd= ""
211 endif
212endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100213call s:NetrwInit("g:netrw_list_hide","")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000214" Default values - lh-lz ---------- {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +0000215if !exists("g:netrw_localcopycmd")
216 if has("win32") || has("win95") || has("win64") || has("win16")
217 if g:netrw_cygwin
218 let g:netrw_localcopycmd= "cp"
219 else
220 let g:netrw_localcopycmd= "copy"
221 endif
222 elseif has("unix") || has("macunix")
223 let g:netrw_localcopycmd= "cp"
224 else
225 let g:netrw_localcopycmd= ""
226 endif
227endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100228call s:NetrwInit("g:netrw_local_mkdir","mkdir")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000229if !exists("g:netrw_localmovecmd")
230 if has("win32") || has("win95") || has("win64") || has("win16")
231 if g:netrw_cygwin
232 let g:netrw_localmovecmd= "mv"
233 else
234 let g:netrw_localmovecmd= "move"
235 endif
236 elseif has("unix") || has("macunix")
237 let g:netrw_localmovecmd= "mv"
238 else
239 let g:netrw_localmovecmd= ""
240 endif
241endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100242call s:NetrwInit("g:netrw_local_rmdir", "rmdir")
243call s:NetrwInit("g:netrw_liststyle" , s:THINLIST)
244" sanity checks
Bram Moolenaar9964e462007-05-05 17:54:07 +0000245if g:netrw_liststyle < 0 || g:netrw_liststyle >= s:MAXLIST
Bram Moolenaar9964e462007-05-05 17:54:07 +0000246 let g:netrw_liststyle= s:THINLIST
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000247endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000248if g:netrw_liststyle == s:LONGLIST && g:netrw_scp_cmd !~ '^pscp'
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000249 let g:netrw_list_cmd= g:netrw_list_cmd." -l"
250endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000251" Default values - m-r ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100252call s:NetrwInit("g:netrw_markfileesc" , '*./[\~')
253call s:NetrwInit("g:netrw_maxfilenamelen", 32)
254call s:NetrwInit("g:netrw_menu" , 1)
255call s:NetrwInit("g:netrw_mkdir_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME mkdir")
256call s:NetrwInit("g:netrw_mousemaps" , (exists("&mouse") && &mouse =~ '[anh]'))
257call s:NetrwInit("g:netrw_retmap" , 0)
258if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)
259 call s:NetrwInit("g:netrw_chgperm" , "chmod PERM FILENAME")
260elseif has("win32") || has("win95") || has("win64") || has("win16")
261 call s:NetrwInit("g:netrw_chgperm" , "cacls FILENAME /e /p PERM")
262else
263 call s:NetrwInit("g:netrw_chgperm" , "chmod PERM FILENAME")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000264endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100265call s:NetrwInit("g:netrw_preview" , 0)
266call s:NetrwInit("g:netrw_scpport" , "-P")
267call s:NetrwInit("g:netrw_sshport" , "-p")
268call s:NetrwInit("g:netrw_rename_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME mv")
269call s:NetrwInit("g:netrw_rm_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rm")
270call s:NetrwInit("g:netrw_rmdir_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rmdir")
271call s:NetrwInit("g:netrw_rmf_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rm -f")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000272" Default values - s ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100273" g:netrw_sepchr: picking a character that doesn't appear in filenames that can be used to separate priority from filename
274call s:NetrwInit("g:netrw_sepchr" , (&enc == "euc-jp")? "\<Char-0x01>" : "\<Char-0xff>")
Bram Moolenaaradc21822011-04-01 18:03:16 +0200275call s:NetrwInit("s:netrw_silentxfer" , (exists("g:netrw_silent") && g:netrw_silent != 0)? "sil keepj " : "keepj ")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100276call s:NetrwInit("g:netrw_sort_by" , "name") " alternatives: date , size
277call s:NetrwInit("g:netrw_sort_options" , "")
278call s:NetrwInit("g:netrw_sort_direction", "normal") " alternative: reverse (z y x ...)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000279if !exists("g:netrw_sort_sequence")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100280 if has("unix")
281 let g:netrw_sort_sequence= '[\/]$,\<core\%(\.\d\+\)\=\>,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
282 else
283 let g:netrw_sort_sequence= '[\/]$,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000284 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000285endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100286call s:NetrwInit("g:netrw_special_syntax" , 0)
287call s:NetrwInit("g:netrw_ssh_browse_reject", '^total\s\+\d\+$')
288call s:NetrwInit("g:netrw_use_noswf" , 0)
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000289" Default values - t-w ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100290call s:NetrwInit("g:netrw_timefmt","%c")
291call s:NetrwInit("g:netrw_xstrlen",0)
292call s:NetrwInit("g:NetrwTopLvlMenu","Netrw.")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100293call s:NetrwInit("g:netrw_win95ftp",1)
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200294call s:NetrwInit("g:netrw_winsize",25)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000295" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000296" Default values for netrw's script variables: {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +0100297call s:NetrwInit("g:netrw_fname_escape",' ?&;%')
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200298if has("win32") || has("win95") || has("win64") || has("win16")
299 call s:NetrwInit("g:netrw_glob_escape",'[]*?`{$')
300else
301 call s:NetrwInit("g:netrw_glob_escape",'[]*?`{~$\')
302endif
303call s:NetrwInit("g:netrw_menu_escape",'./&? \')
Bram Moolenaar5c736222010-01-06 20:54:52 +0100304call s:NetrwInit("g:netrw_tmpfile_escape",' &;')
305call s:NetrwInit("s:netrw_map_escape","<|\n\r\\\<C-V>\"")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000306
307" BufEnter event ignored by decho when following variable is true
308" Has a side effect that doau BufReadPost doesn't work, so
309" files read by network transfer aren't appropriately highlighted.
310"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000311
Bram Moolenaaradc21822011-04-01 18:03:16 +0200312" ======================
313" Netrw Initialization: {{{1
314" ======================
315if v:version >= 700 && has("balloon_eval") && &beval == 0
316 let &l:bexpr= "netrw#NetrwBalloonHelp()"
317 set beval
318endif
319
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000320" ==============================
321" Netrw Utility Functions: {{{1
322" ==============================
323
Bram Moolenaaradc21822011-04-01 18:03:16 +0200324" ---------------------------------------------------------------------
325" netrw#NetrwBalloonHelp: {{{2
326if v:version >= 700 && has("balloon_eval") && &beval == 1
327 fun! netrw#NetrwBalloonHelp()
328 if !exists("w:netrw_bannercnt") || v:beval_lnum >= w:netrw_bannercnt
329 let mesg= ""
330 elseif v:beval_text == "Netrw" || v:beval_text == "Directory" || v:beval_text == "Listing"
331 let mesg = "i: thin-long-wide-tree gh: quick hide/unhide of dot-files qf: quick file info"
332 elseif getline(v:beval_lnum) =~ '^"\s*/'
333 let mesg = "<cr>: edit/enter o: edit/enter in horiz window t: edit/enter in new tab v:edit/enter in vert window"
334 elseif v:beval_text == "Sorted" || v:beval_text == "by"
335 let mesg = 's: sort by name, time, or file size r: reverse sorting order mt: mark target'
336 elseif v:beval_text == "Sort" || v:beval_text == "sequence"
337 let mesg = "S: edit sorting sequence"
338 elseif v:beval_text == "Hiding" || v:beval_text == "Showing"
339 let mesg = "a: hiding-showing-all ctrl-h: editing hiding list mh: hide/show by suffix"
340 elseif v:beval_text == "Quick" || v:beval_text == "Help"
341 let mesg = "Help: press <F1>"
342 elseif v:beval_text == "Copy/Move" || v:beval_text == "Tgt"
343 let mesg = "mt: mark target mc: copy marked file to target mm: move marked file to target"
344 else
345 let mesg= ""
346 endif
347 return mesg
348 endfun
349endif
350
Bram Moolenaar071d4272004-06-13 20:20:40 +0000351" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000352" s:NetrwOptionSave: save options and set to "standard" form {{{2
353" 06/08/07 : removed call to NetrwSafeOptions(), either placed
354" immediately after NetrwOptionSave() calls in NetRead
355" and NetWrite, or after the s:NetrwEnew() call in
356" NetrwBrowse.
357" vt: normally its "w:" or "s:" (a variable type)
358fun! s:NetrwOptionSave(vt)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100359" call Dfunc("s:NetrwOptionSave(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">"." winnr($)=".winnr("$"))
Bram Moolenaar071d4272004-06-13 20:20:40 +0000360
Bram Moolenaar446cb832008-06-24 21:56:24 +0000361" call Decho(a:vt."netrw_optionsave".(exists("{a:vt}netrw_optionsave")? ("=".{a:vt}netrw_optionsave) : " doesn't exist"))
362 if !exists("{a:vt}netrw_optionsave")
363 let {a:vt}netrw_optionsave= 1
Bram Moolenaar9964e462007-05-05 17:54:07 +0000364 else
Bram Moolenaar446cb832008-06-24 21:56:24 +0000365" call Dret("s:NetrwOptionSave : options already saved")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000366 return
367 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200368" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist")." diff=".&l:diff)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000369
370 " Save current settings and current directory
371 let s:yykeep = @@
372 if exists("&l:acd")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000373 let {a:vt}netrw_acdkeep = &l:acd
Bram Moolenaar9964e462007-05-05 17:54:07 +0000374 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000375 let {a:vt}netrw_aikeep = &l:ai
376 let {a:vt}netrw_awkeep = &l:aw
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200377 let {a:vt}netrw_bombkeep = &l:bomb
Bram Moolenaar446cb832008-06-24 21:56:24 +0000378 let {a:vt}netrw_cikeep = &l:ci
379 let {a:vt}netrw_cinkeep = &l:cin
380 let {a:vt}netrw_cinokeep = &l:cino
381 let {a:vt}netrw_comkeep = &l:com
382 let {a:vt}netrw_cpokeep = &l:cpo
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200383 let {a:vt}netrw_diffkeep = &l:diff
Bram Moolenaar9964e462007-05-05 17:54:07 +0000384 if g:netrw_keepdir
Bram Moolenaar446cb832008-06-24 21:56:24 +0000385 let {a:vt}netrw_dirkeep = getcwd()
Bram Moolenaar9964e462007-05-05 17:54:07 +0000386 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000387 let {a:vt}netrw_fokeep = &l:fo " formatoptions
388 let {a:vt}netrw_gdkeep = &l:gd " gdefault
389 let {a:vt}netrw_hidkeep = &l:hidden
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200390 let {a:vt}netrw_imkeep = &l:im
Bram Moolenaar446cb832008-06-24 21:56:24 +0000391 let {a:vt}netrw_magickeep = &l:magic
392 let {a:vt}netrw_repkeep = &l:report
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200393 let {a:vt}netrw_selkeep = &l:sel
Bram Moolenaar446cb832008-06-24 21:56:24 +0000394 let {a:vt}netrw_spellkeep = &l:spell
395 let {a:vt}netrw_twkeep = &l:tw " textwidth
396 let {a:vt}netrw_wigkeep = &l:wig " wildignore
Bram Moolenaar9964e462007-05-05 17:54:07 +0000397 if has("win32") && !has("win95")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000398 let {a:vt}netrw_swfkeep = &l:swf " swapfile
Bram Moolenaar9964e462007-05-05 17:54:07 +0000399 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200400 if &go =~# 'a' | sil! let {a:vt}netrw_regstar = @* | endif
401 sil! let {a:vt}netrw_regslash= @/
Bram Moolenaar9964e462007-05-05 17:54:07 +0000402
Bram Moolenaar446cb832008-06-24 21:56:24 +0000403" call Dret("s:NetrwOptionSave : win#".winnr()." buf#".bufnr("%"))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000404endfun
405
406" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000407" s:NetrwOptionRestore: restore options {{{2
408fun! s:NetrwOptionRestore(vt)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100409" call Dfunc("s:NetrwOptionRestore(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")." winnr($)=".winnr("$"))
Bram Moolenaar446cb832008-06-24 21:56:24 +0000410 if !exists("{a:vt}netrw_optionsave")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000411" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000412" call Dret("s:NetrwOptionRestore : ".a:vt."netrw_optionsave doesn't exist")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000413 return
414 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000415 unlet {a:vt}netrw_optionsave
Bram Moolenaar9964e462007-05-05 17:54:07 +0000416
417 if exists("&acd")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000418 if exists("{a:vt}netrw_acdkeep")
419" call Decho("g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
420 let curdir = getcwd()
421 let &l:acd = {a:vt}netrw_acdkeep
422 unlet {a:vt}netrw_acdkeep
423 if &l:acd
424" call Decho("exe keepjumps lcd ".fnameescape(curdir)) " NOTE: was g:netrw_fname_escape for some reason
425 try
426 if !exists("&l:acd") && !&l:acd
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200427 exe 'keepj lcd '.fnameescape(curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000428 endif
429 catch /^Vim\%((\a\+)\)\=:E472/
430 call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".curdir."> (permissions?)",61)
431 endtry
432 endif
433 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000434 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000435 if exists("{a:vt}netrw_aikeep") |let &l:ai = {a:vt}netrw_aikeep |unlet {a:vt}netrw_aikeep |endif
436 if exists("{a:vt}netrw_awkeep") |let &l:aw = {a:vt}netrw_awkeep |unlet {a:vt}netrw_awkeep |endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200437 if exists("{a:vt}netrw_bombkeep") |let &l:bomb = {a:vt}netrw_bombkeep |unlet {a:vt}netrw_bombkeep |endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000438 if exists("{a:vt}netrw_cikeep") |let &l:ci = {a:vt}netrw_cikeep |unlet {a:vt}netrw_cikeep |endif
439 if exists("{a:vt}netrw_cinkeep") |let &l:cin = {a:vt}netrw_cinkeep |unlet {a:vt}netrw_cinkeep |endif
440 if exists("{a:vt}netrw_cinokeep") |let &l:cino = {a:vt}netrw_cinokeep |unlet {a:vt}netrw_cinokeep |endif
441 if exists("{a:vt}netrw_comkeep") |let &l:com = {a:vt}netrw_comkeep |unlet {a:vt}netrw_comkeep |endif
442 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 +0200443 if exists("{a:vt}netrw_diffkeep") |let &l:diff = {a:vt}netrw_diffkeep |unlet {a:vt}netrw_diffkeep |endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000444 if exists("{a:vt}netrw_dirkeep") && isdirectory({a:vt}netrw_dirkeep) && g:netrw_keepdir
445 let dirkeep = substitute({a:vt}netrw_dirkeep,'\\','/','g')
446 if exists("{a:vt}netrw_dirkeep") |exe "keepjumps lcd ".fnameescape(dirkeep)|unlet {a:vt}netrw_dirkeep |endif
447 endif
448 if exists("{a:vt}netrw_fokeep") |let &l:fo = {a:vt}netrw_fokeep |unlet {a:vt}netrw_fokeep |endif
449 if exists("{a:vt}netrw_gdkeep") |let &l:gd = {a:vt}netrw_gdkeep |unlet {a:vt}netrw_gdkeep |endif
450 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 +0200451 if exists("{a:vt}netrw_imkeep") |let &l:im = {a:vt}netrw_imkeep |unlet {a:vt}netrw_imkeep |endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000452 if exists("{a:vt}netrw_magic") |let &l:magic = {a:vt}netrw_magic |unlet {a:vt}netrw_magic |endif
453 if exists("{a:vt}netrw_repkeep") |let &l:report = {a:vt}netrw_repkeep |unlet {a:vt}netrw_repkeep |endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200454 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 +0000455 if exists("{a:vt}netrw_spellkeep")|let &l:spell = {a:vt}netrw_spellkeep |unlet {a:vt}netrw_spellkeep|endif
456 if exists("{a:vt}netrw_twkeep") |let &l:tw = {a:vt}netrw_twkeep |unlet {a:vt}netrw_twkeep |endif
457 if exists("{a:vt}netrw_wigkeep") |let &l:wig = {a:vt}netrw_wigkeep |unlet {a:vt}netrw_wigkeep |endif
458 if exists("s:yykeep") |let @@ = s:yykeep |unlet s:yykeep |endif
459 if exists("{a:vt}netrw_swfkeep")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000460 if &directory == ""
461 " user hasn't specified a swapfile directory;
462 " netrw will temporarily set the swapfile directory
463 " to the current directory as returned by getcwd().
464 let &l:directory = getcwd()
Bram Moolenaaradc21822011-04-01 18:03:16 +0200465 sil! let &l:swf = {a:vt}netrw_swfkeep
Bram Moolenaar9964e462007-05-05 17:54:07 +0000466 setlocal directory=
Bram Moolenaar446cb832008-06-24 21:56:24 +0000467 unlet {a:vt}netrw_swfkeep
468 elseif &l:swf != {a:vt}netrw_swfkeep
469 " following line causes a Press ENTER in windows -- can't seem to work around it!!!
Bram Moolenaaradc21822011-04-01 18:03:16 +0200470 sil! let &l:swf= {a:vt}netrw_swfkeep
Bram Moolenaar446cb832008-06-24 21:56:24 +0000471 unlet {a:vt}netrw_swfkeep
Bram Moolenaar9964e462007-05-05 17:54:07 +0000472 endif
473 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200474 if exists("{a:vt}netrw_regstar") |sil! let @*= {a:vt}netrw_regstar |unlet {a:vt}netrw_regstar |endif
475 if exists("{a:vt}netrw_regslash")|sil! let @/= {a:vt}netrw_regslash|unlet {a:vt}netrw_regslash|endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000476
Bram Moolenaar446cb832008-06-24 21:56:24 +0000477" call Decho("g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
478" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist"))
Bram Moolenaarc236c162008-07-13 17:41:49 +0000479" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200480" call Decho("diff=".&l:diff." win#".winnr()." w:netrw_diffkeep=".(exists("w:netrw_diffkeep")? w:netrw_diffkeep : "doesn't exist"))
Bram Moolenaar446cb832008-06-24 21:56:24 +0000481" call Dret("s:NetrwOptionRestore : win#".winnr()." buf#".bufnr("%"))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000482endfun
483
484" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000485" s:NetrwSafeOptions: sets options to help netrw do its job {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +0000486fun! s:NetrwSafeOptions()
Bram Moolenaar5c736222010-01-06 20:54:52 +0100487" call Dfunc("s:NetrwSafeOptions() win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%"))."> winnr($)=".winnr("$"))
488" call Decho("win#".winnr()."'s ft=".&ft)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000489 setlocal cino=
490 setlocal com=
491 setlocal cpo-=aA
Bram Moolenaar446cb832008-06-24 21:56:24 +0000492 if exists("&acd") | setlocal noacd | endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200493 setlocal nocin noai nobomb noci magic nospell nohid wig= noaw noim
Bram Moolenaar446cb832008-06-24 21:56:24 +0000494 setlocal fo=nroql2
Bram Moolenaar9964e462007-05-05 17:54:07 +0000495 setlocal tw=0
496 setlocal report=10000
Bram Moolenaar5c736222010-01-06 20:54:52 +0100497 setlocal isk+=@ isk+=* isk+=/
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200498 setlocal sel=inclusive
Bram Moolenaar9964e462007-05-05 17:54:07 +0000499 if g:netrw_use_noswf && has("win32") && !has("win95")
500 setlocal noswf
501 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200502 call s:NetrwCursor()
Bram Moolenaar5c736222010-01-06 20:54:52 +0100503
504 " allow the user to override safe options
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200505" call Decho("ft<".&ft."> ei=".&ei)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100506 if &ft == "netrw"
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200507" call Decho("do any netrw FileType autocmds")
Bram Moolenaaradc21822011-04-01 18:03:16 +0200508 sil keepalt keepj doau FileType netrw
Bram Moolenaar5c736222010-01-06 20:54:52 +0100509 endif
510
Bram Moolenaar446cb832008-06-24 21:56:24 +0000511" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist"))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000512" call Dret("s:NetrwSafeOptions")
513endfun
514
Bram Moolenaar446cb832008-06-24 21:56:24 +0000515" ---------------------------------------------------------------------
516" netrw#NetrwClean: remove netrw {{{2
517" supports :NetrwClean -- remove netrw from first directory on runtimepath
518" :NetrwClean! -- remove netrw from all directories on runtimepath
519fun! netrw#NetrwClean(sys)
520" call Dfunc("netrw#NetrwClean(sys=".a:sys.")")
521
522 if a:sys
523 let choice= confirm("Remove personal and system copies of netrw?","&Yes\n&No")
524 else
525 let choice= confirm("Remove personal copy of netrw?","&Yes\n&No")
526 endif
527" call Decho("choice=".choice)
528 let diddel= 0
529 let diddir= ""
530
531 if choice == 1
532 for dir in split(&rtp,',')
533 if filereadable(dir."/plugin/netrwPlugin.vim")
534" call Decho("removing netrw-related files from ".dir)
Bram Moolenaarc236c162008-07-13 17:41:49 +0000535 if s:NetrwDelete(dir."/plugin/netrwPlugin.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/plugin/netrwPlugin.vim",55) |endif
536 if s:NetrwDelete(dir."/autoload/netrwFileHandlers.vim")|call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwFileHandlers.vim",55)|endif
537 if s:NetrwDelete(dir."/autoload/netrwSettings.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwSettings.vim",55) |endif
538 if s:NetrwDelete(dir."/autoload/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrw.vim",55) |endif
539 if s:NetrwDelete(dir."/syntax/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrw.vim",55) |endif
540 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 +0000541 let diddir= dir
542 let diddel= diddel + 1
543 if !a:sys|break|endif
544 endif
545 endfor
546 endif
547
548 echohl WarningMsg
549 if diddel == 0
550 echomsg "netrw is either not installed or not removable"
551 elseif diddel == 1
552 echomsg "removed one copy of netrw from <".diddir.">"
553 else
554 echomsg "removed ".diddel." copies of netrw"
555 endif
556 echohl None
557
558" call Dret("netrw#NetrwClean")
559endfun
560
Bram Moolenaar5c736222010-01-06 20:54:52 +0100561" ---------------------------------------------------------------------
562" netrw#Nread: {{{2
563fun! netrw#Nread(mode,fname)
564" call Dfunc("netrw#Nread(mode=".a:mode." fname<".a:fname.">)")
565 call netrw#NetrwSavePosn()
566 call netrw#NetRead(a:mode,a:fname)
567 call netrw#NetrwRestorePosn()
568" call Dret("netrw#Nread")
569endfun
570
Bram Moolenaar9964e462007-05-05 17:54:07 +0000571" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000572" Netrw Transfer Functions: {{{1
573" ===============================
574
Bram Moolenaar071d4272004-06-13 20:20:40 +0000575" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000576" netrw#NetRead: responsible for reading a file over the net {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +0000577" mode: =0 read remote file and insert before current line
578" =1 read remote file and insert after current line
579" =2 replace with remote file
580" =3 obtain file, but leave in temporary format
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000581fun! netrw#NetRead(mode,...)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000582" call Dfunc("netrw#NetRead(mode=".a:mode.",...) a:0=".a:0." ".g:loaded_netrw)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000583
Bram Moolenaar5c736222010-01-06 20:54:52 +0100584 " NetRead: save options {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +0000585 call s:NetrwOptionSave("w:")
586 call s:NetrwSafeOptions()
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200587 call s:RestoreCursorline()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000588
Bram Moolenaar5c736222010-01-06 20:54:52 +0100589 " NetRead: interpret mode into a readcmd {{{3
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000590 if a:mode == 0 " read remote file before current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000591 let readcmd = "0r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000592 elseif a:mode == 1 " read file after current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000593 let readcmd = "r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000594 elseif a:mode == 2 " replace with remote file
595 let readcmd = "%r"
Bram Moolenaar9964e462007-05-05 17:54:07 +0000596 elseif a:mode == 3 " skip read of file (leave as temporary)
597 let readcmd = "t"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000598 else
599 exe a:mode
600 let readcmd = "r"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000601 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000602 let ichoice = (a:0 == 0)? 0 : 1
603" call Decho("readcmd<".readcmd."> ichoice=".ichoice)
604
Bram Moolenaar5c736222010-01-06 20:54:52 +0100605 " NetRead: get temporary filename {{{3
Bram Moolenaar9964e462007-05-05 17:54:07 +0000606 let tmpfile= s:GetTempfile("")
607 if tmpfile == ""
608" call Dret("netrw#NetRead : unable to get a tempfile!")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000609 return
610 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000611
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000612 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000613
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000614 " attempt to repeat with previous host-file-etc
615 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000616" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000617 let choice = b:netrw_lastfile
618 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000619
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000620 else
621 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000622" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000623
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000624 if match(choice,"?") == 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000625 " give help
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000626 echomsg 'NetRead Usage:'
627 echomsg ':Nread machine:path uses rcp'
628 echomsg ':Nread "machine path" uses ftp with <.netrc>'
629 echomsg ':Nread "machine id password path" uses ftp'
630 echomsg ':Nread dav://machine[:port]/path uses cadaver'
631 echomsg ':Nread fetch://machine/path uses fetch'
632 echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
633 echomsg ':Nread http://[user@]machine/path uses http wget'
634 echomsg ':Nread rcp://[user@]machine/path uses rcp'
635 echomsg ':Nread rsync://machine[:port]/path uses rsync'
636 echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
637 echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000638 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000639 break
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000640
Bram Moolenaar9964e462007-05-05 17:54:07 +0000641 elseif match(choice,'^"') != -1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000642 " Reconstruct Choice if choice starts with '"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000643" call Decho("reconstructing choice")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000644 if match(choice,'"$') != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000645 " case "..."
Bram Moolenaaradc21822011-04-01 18:03:16 +0200646 let choice= strpart(choice,1,strlen(choice)-2)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000647 else
648 " case "... ... ..."
649 let choice = strpart(choice,1,strlen(choice)-1)
650 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000651
Bram Moolenaar9964e462007-05-05 17:54:07 +0000652 while match(choice,'"$') == -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000653 let wholechoice = wholechoice . " " . choice
654 let ichoice = ichoice + 1
655 if ichoice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000656 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000657 call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",3)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000658 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000659" call Dret("netrw#NetRead :2 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000660 return
661 endif
662 let choice= a:{ichoice}
663 endwhile
664 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
665 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000666 endif
667 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000668
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000669" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000670 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000671
Bram Moolenaar5c736222010-01-06 20:54:52 +0100672 " NetRead: Determine method of read (ftp, rcp, etc) {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +0000673 call s:NetrwMethod(choice)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100674 if !exists("b:netrw_method") || b:netrw_method < 0
675" call Dfunc("netrw#NetRead : unsupported method")
676 return
677 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000678 let tmpfile= s:GetTempfile(b:netrw_fname) " apply correct suffix
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000679
Bram Moolenaar446cb832008-06-24 21:56:24 +0000680 " Check if NetrwBrowse() should be handling this request
681" call Decho("checking if NetrwBrowse() should handle choice<".choice."> with netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000682 if choice =~ "^.*[\/]$" && b:netrw_method != 5 && choice !~ '^http://'
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000683" call Decho("yes, choice matches '^.*[\/]$'")
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200684 keepj call s:NetrwBrowse(0,choice)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000685" call Dret("netrw#NetRead :3 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000686 return
Bram Moolenaar071d4272004-06-13 20:20:40 +0000687 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000688
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000689 " ============
Bram Moolenaar5c736222010-01-06 20:54:52 +0100690 " NetRead: Perform Protocol-Based Read {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000691 " ===========================
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000692 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
693 echo "(netrw) Processing your read request..."
694 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000695
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000696 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100697 " NetRead: (rcp) NetRead Method #1 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000698 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000699" call Decho("read via rcp (method #1)")
Bram Moolenaard68071d2006-05-02 22:08:30 +0000700 " ER: nothing done with g:netrw_uid yet?
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000701 " ER: on Win2K" rcp machine[.user]:file tmpfile
702 " ER: if machine contains '.' adding .user is required (use $USERNAME)
703 " ER: the tmpfile is full path: rcp sees C:\... as host C
704 if s:netrw_has_nt_rcp == 1
705 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
706 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
707 else
708 " Any way needed it machine contains a '.'
709 let uid_machine = g:netrw_machine .'.'. $USERNAME
710 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000711 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000712 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
713 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
714 else
715 let uid_machine = g:netrw_machine
716 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000717 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +0000718" 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 +0100719 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 +0000720 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000721 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000722
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000723 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100724 " NetRead: (ftp + <.netrc>) NetRead Method #2 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000725 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000726" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaar8dff8182006-04-06 20:18:50 +0000727 let netrw_fname= b:netrw_fname
Bram Moolenaaradc21822011-04-01 18:03:16 +0200728 keepj call s:SaveBufVars()|new|keepj call s:RestoreBufVars()
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000729 let filtbuf= bufnr("%")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000730 setlocal ff=unix
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200731 keepj put =g:netrw_ftpmode
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000732" call Decho("filter input: ".getline(line("$")))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000733 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200734 keepj put =g:netrw_ftpextracmd
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000735" call Decho("filter input: ".getline(line("$")))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000736 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000737 call setline(line("$")+1,'get "'.netrw_fname.'" '.tmpfile)
738" call Decho("filter input: ".getline(line("$")))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000739 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +0200740" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
741 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 +0000742 else
Bram Moolenaaradc21822011-04-01 18:03:16 +0200743" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
744 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000745 endif
746 " 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 +0000747 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
Bram Moolenaarc236c162008-07-13 17:41:49 +0000748 let debugkeep = &debug
Bram Moolenaar9964e462007-05-05 17:54:07 +0000749 setlocal debug=msg
Bram Moolenaaradc21822011-04-01 18:03:16 +0200750 keepj call netrw#ErrorMsg(s:ERROR,getline(1),4)
Bram Moolenaarc236c162008-07-13 17:41:49 +0000751 let &debug = debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000752 endif
Bram Moolenaared39e1d2008-08-09 17:55:22 +0000753 call s:SaveBufVars()
754 bd!
Bram Moolenaar5c736222010-01-06 20:54:52 +0100755 if bufname("%") == "" && getline("$") == "" && line('$') == 1
756 " needed when one sources a file in a nolbl setting window via ftp
Bram Moolenaared39e1d2008-08-09 17:55:22 +0000757 q!
758 endif
759 call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +0000760 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000761 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000762
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000763 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100764 " NetRead: (ftp + machine,id,passwd,filename) NetRead Method #3 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000765 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
766 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000767" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000768 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaaradc21822011-04-01 18:03:16 +0200769 keepj call s:SaveBufVars()|new|keepj call s:RestoreBufVars()
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000770 let filtbuf= bufnr("%")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000771 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000772 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200773 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +0000774" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000775 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200776 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +0000777" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000778 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000779
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000780 if exists("g:netrw_ftp") && g:netrw_ftp == 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200781 keepj put =g:netrw_uid
Bram Moolenaar446cb832008-06-24 21:56:24 +0000782" call Decho("filter input: ".getline('.'))
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200783 keepj put ='\"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +0000784" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000785 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200786 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +0000787" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000788 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000789
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000790 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200791 keepj put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +0000792" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000793 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000794 if exists("g:netrw_ftpextracmd")
Bram Moolenaaradc21822011-04-01 18:03:16 +0200795 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +0000796" call Decho("filter input: ".getline('.'))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000797 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200798 keepj put ='get \"'.netrw_fname.'\" '.tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +0000799" call Decho("filter input: ".getline('.'))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000800
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000801 " perform ftp:
802 " -i : turns off interactive prompting from ftp
803 " -n unix : DON'T use <.netrc>, even though it exists
804 " -n win32: quit being obnoxious about password
Bram Moolenaaradc21822011-04-01 18:03:16 +0200805 keepj norm! 1Gdd
806" call Decho("executing: %!".s:netrw_ftp_cmd." -i -n")
807 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i -n"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000808 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
809 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000810" call Decho("error<".getline(1).">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000811 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000812 call netrw#ErrorMsg(s:ERROR,getline(1),5)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000813 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000814 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000815 call s:SaveBufVars()|bd!|call s:RestoreBufVars()
816 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000817 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000818
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000819 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100820 " NetRead: (scp) NetRead Method #4 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000821 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000822" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000823 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +0000824 let useport= " ".g:netrw_scpport." ".g:netrw_port
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000825 else
826 let useport= ""
827 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100828" 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 +0000829 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 +0000830 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000831 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000832
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000833 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100834 " NetRead: (http) NetRead Method #5 (wget) {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000835 elseif b:netrw_method == 5
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000836" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000837 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000838 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000839 call netrw#ErrorMsg(s:ERROR,"neither the wget nor the fetch command is available",6)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000840 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000841" call Dret("netrw#NetRead :4 getcwd<".getcwd().">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000842 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000843 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000844
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000845 if match(b:netrw_fname,"#") == -1 || exists("g:netrw_http_xcmd")
846 " using g:netrw_http_cmd (usually elinks, links, curl, wget, or fetch)
Bram Moolenaarc236c162008-07-13 17:41:49 +0000847" call Decho('using '.g:netrw_http_cmd.' (# not in b:netrw_fname<'.b:netrw_fname.">)")
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000848 if exists("g:netrw_http_xcmd")
849" 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))
850 exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)." ".g:netrw_http_xcmd." ".shellescape(tmpfile,1)
851 else
852" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1))
853 exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)
854 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000855 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000856
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000857 else
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000858 " wget/curl/fetch plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
Bram Moolenaaradc21822011-04-01 18:03:16 +0200859" call Decho("wget/curl plus jump (# in b:netrw_fname<".b:netrw_fname.">)")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000860 let netrw_html= substitute(b:netrw_fname,"#.*$","","")
861 let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000862" call Decho("netrw_html<".netrw_html.">")
863" call Decho("netrw_tag <".netrw_tag.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000864" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.netrw_html,1))
865 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 +0000866 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000867" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaaradc21822011-04-01 18:03:16 +0200868 exe 'keepj norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000869 endif
870 let b:netrw_lastfile = choice
Bram Moolenaar9964e462007-05-05 17:54:07 +0000871 setlocal ro
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000872
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000873 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100874 " NetRead: (dav) NetRead Method #6 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000875 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000876" call Decho("read via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000877
Bram Moolenaar5c736222010-01-06 20:54:52 +0100878 if !executable(g:netrw_dav_cmd)
879 call netrw#ErrorMsg(s:ERROR,g:netrw_dav_cmd." is not executable",73)
880" call Dret("netrw#NetRead : ".g:netrw_dav_cmd." not executable")
881 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000882 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100883 if g:netrw_dav_cmd =~ "curl"
884" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_dav_cmd." ".shellescape("dav://".g:netrw_machine.b:netrw_fname,1)." ".shellescape(tmpfile,1))
885 exe s:netrw_silentxfer."!".g:netrw_dav_cmd." ".shellescape("dav://".g:netrw_machine.b:netrw_fname,1)." ".shellescape(tmpfile,1)
886 else
887 " Construct execution string (four lines) which will be passed through filter
888 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
889 new
890 setlocal ff=unix
891 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200892 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar5c736222010-01-06 20:54:52 +0100893 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200894 keepj put ='open '.g:netrw_machine
Bram Moolenaar5c736222010-01-06 20:54:52 +0100895 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200896 keepj put ='user '.g:netrw_uid.' '.s:netrw_passwd
897 keepj put ='get '.netrw_fname.' '.tmpfile
898 keepj put ='quit'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000899
Bram Moolenaar5c736222010-01-06 20:54:52 +0100900 " perform cadaver operation:
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200901 keepj norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000902" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100903 exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
904 bd!
905 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000906 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000907 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000908
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000909 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100910 " NetRead: (rsync) NetRead Method #7 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000911 elseif b:netrw_method == 7
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000912" call Decho("read via rsync (method #7)")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000913" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
914 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 +0000915 let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000916 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000917
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000918 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100919 " NetRead: (fetch) NetRead Method #8 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000920 " fetch://[user@]host[:http]/path
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000921 elseif b:netrw_method == 8
Bram Moolenaar9964e462007-05-05 17:54:07 +0000922" call Decho("read via fetch (method #8)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000923 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000924 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +0200925 keepj call netrw#ErrorMsg(s:ERROR,"fetch command not available",7)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000926 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000927" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000928 endif
929 if exists("g:netrw_option") && g:netrw_option == ":http"
930 let netrw_option= "http"
931 else
932 let netrw_option= "ftp"
933 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000934" call Decho("read via fetch for ".netrw_option)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000935
Bram Moolenaar446cb832008-06-24 21:56:24 +0000936 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("s:netrw_passwd") && s:netrw_passwd != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +0000937" 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))
938 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 +0000939 else
Bram Moolenaarc236c162008-07-13 17:41:49 +0000940" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_machine."/".b:netrw_fname,1))
941 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 +0000942 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000943
Bram Moolenaar446cb832008-06-24 21:56:24 +0000944 let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000945 let b:netrw_lastfile = choice
Bram Moolenaar9964e462007-05-05 17:54:07 +0000946 setlocal ro
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000947
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000948 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100949 " NetRead: (sftp) NetRead Method #9 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000950 elseif b:netrw_method == 9
Bram Moolenaar9964e462007-05-05 17:54:07 +0000951" call Decho("read via sftp (method #9)")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000952" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile)
953 exe s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +0000954 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000955 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000956
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000957 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100958 " NetRead: Complain {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000959 else
Bram Moolenaar9964e462007-05-05 17:54:07 +0000960 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",8)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000961 endif
962 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000963
Bram Moolenaar5c736222010-01-06 20:54:52 +0100964 " NetRead: cleanup {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000965 if exists("b:netrw_method")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000966" call Decho("cleanup b:netrw_method and b:netrw_fname")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000967 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000968 unlet b:netrw_fname
969 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200970 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 +0000971" call Decho("cleanup by deleting tmpfile<".tmpfile.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +0200972 keepj call s:NetrwDelete(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000973 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200974 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000975
Bram Moolenaar9964e462007-05-05 17:54:07 +0000976" call Dret("netrw#NetRead :5 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000977endfun
978
979" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000980" netrw#NetWrite: responsible for writing a file over the net {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000981fun! netrw#NetWrite(...) range
Bram Moolenaar9964e462007-05-05 17:54:07 +0000982" call Dfunc("netrw#NetWrite(a:0=".a:0.") ".g:loaded_netrw)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000983
Bram Moolenaar5c736222010-01-06 20:54:52 +0100984 " NetWrite: option handling {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000985 let mod= 0
Bram Moolenaar446cb832008-06-24 21:56:24 +0000986 call s:NetrwOptionSave("w:")
987 call s:NetrwSafeOptions()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000988
Bram Moolenaar5c736222010-01-06 20:54:52 +0100989 " NetWrite: Get Temporary Filename {{{3
Bram Moolenaar9964e462007-05-05 17:54:07 +0000990 let tmpfile= s:GetTempfile("")
991 if tmpfile == ""
992" call Dret("netrw#NetWrite : unable to get a tempfile!")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000993 return
994 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000995
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000996 if a:0 == 0
997 let ichoice = 0
998 else
999 let ichoice = 1
1000 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001001
Bram Moolenaar9964e462007-05-05 17:54:07 +00001002 let curbufname= expand("%")
1003" call Decho("curbufname<".curbufname.">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001004 if &binary
Bram Moolenaar9964e462007-05-05 17:54:07 +00001005 " For binary writes, always write entire file.
1006 " (line numbers don't really make sense for that).
1007 " Also supports the writing of tar and zip files.
Bram Moolenaaradc21822011-04-01 18:03:16 +02001008" call Decho("(write entire file) sil exe w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile))
1009 exe "sil keepj w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001010 elseif g:netrw_cygwin
1011 " write (selected portion of) file to temporary
1012 let cygtmpfile= substitute(tmpfile,'/cygdrive/\(.\)','\1:','')
Bram Moolenaaradc21822011-04-01 18:03:16 +02001013" call Decho("(write selected portion) sil exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001014 exe "sil keepj ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile)
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001015 else
1016 " write (selected portion of) file to temporary
Bram Moolenaaradc21822011-04-01 18:03:16 +02001017" call Decho("(write selected portion) sil exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001018 exe "sil keepj ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001019 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001020
Bram Moolenaar9964e462007-05-05 17:54:07 +00001021 if curbufname == ""
1022 " if the file is [No Name], and one attempts to Nwrite it, the buffer takes
1023 " on the temporary file's name. Deletion of the temporary file during
1024 " cleanup then causes an error message.
1025 0file!
1026 endif
1027
Bram Moolenaar5c736222010-01-06 20:54:52 +01001028 " NetWrite: while choice loop: {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001029 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001030
Bram Moolenaar9964e462007-05-05 17:54:07 +00001031 " Process arguments: {{{4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001032 " attempt to repeat with previous host-file-etc
1033 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001034" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001035 let choice = b:netrw_lastfile
1036 let ichoice= ichoice + 1
1037 else
1038 exe "let choice= a:" . ichoice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001039
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001040 " Reconstruct Choice if choice starts with '"'
1041 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001042 echomsg 'NetWrite Usage:"'
1043 echomsg ':Nwrite machine:path uses rcp'
1044 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
1045 echomsg ':Nwrite "machine id password path" uses ftp'
1046 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
1047 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
1048 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
1049 echomsg ':Nwrite rcp://machine/path uses rcp'
1050 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
1051 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
1052 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaar9964e462007-05-05 17:54:07 +00001053 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001054 break
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001055
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001056 elseif match(choice,"^\"") != -1
1057 if match(choice,"\"$") != -1
1058 " case "..."
1059 let choice=strpart(choice,1,strlen(choice)-2)
1060 else
1061 " case "... ... ..."
1062 let choice = strpart(choice,1,strlen(choice)-1)
1063 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001064
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001065 while match(choice,"\"$") == -1
1066 let wholechoice= wholechoice . " " . choice
1067 let ichoice = ichoice + 1
1068 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001069 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001070 call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",13)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001071 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001072" call Dret("netrw#NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001073 return
1074 endif
1075 let choice= a:{ichoice}
1076 endwhile
1077 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
1078 endif
1079 endif
1080 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001081 let ichoice= ichoice + 1
Bram Moolenaar9964e462007-05-05 17:54:07 +00001082" call Decho("choice<" . choice . "> ichoice=".ichoice)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001083
Bram Moolenaar9964e462007-05-05 17:54:07 +00001084 " Determine method of write (ftp, rcp, etc) {{{4
Bram Moolenaaradc21822011-04-01 18:03:16 +02001085 keepj call s:NetrwMethod(choice)
Bram Moolenaar5c736222010-01-06 20:54:52 +01001086 if !exists("b:netrw_method") || b:netrw_method < 0
1087" call Dfunc("netrw#NetWrite : unsupported method")
1088 return
1089 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001090
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001091 " =============
Bram Moolenaar5c736222010-01-06 20:54:52 +01001092 " NetWrite: Perform Protocol-Based Write {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001093 " ============================
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001094 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
1095 echo "(netrw) Processing your write request..."
Bram Moolenaar446cb832008-06-24 21:56:24 +00001096" call Decho("(netrw) Processing your write request...")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001097 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001098
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001099 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001100 " NetWrite: (rcp) NetWrite Method #1 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001101 if b:netrw_method == 1
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001102" call Decho("write via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001103 if s:netrw_has_nt_rcp == 1
1104 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1105 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
1106 else
1107 let uid_machine = g:netrw_machine .'.'. $USERNAME
1108 endif
1109 else
1110 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1111 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1112 else
1113 let uid_machine = g:netrw_machine
1114 endif
1115 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00001116" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(tmpfile,1)." ".shellescape(uid_machine.":".b:netrw_fname,1))
1117 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 +00001118 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001119
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001120 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001121 " NetWrite: (ftp + <.netrc>) NetWrite Method #2 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001122 elseif b:netrw_method == 2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001123" call Decho("write via ftp+.netrc (method #2)")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001124 let netrw_fname = b:netrw_fname
1125
1126 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
1127 let bhkeep = &l:bh
1128 let curbuf = bufnr("%")
1129 setlocal bh=hide
1130 enew
1131
Bram Moolenaar446cb832008-06-24 21:56:24 +00001132" call Decho("filter input window#".winnr())
Bram Moolenaar8299df92004-07-10 09:47:34 +00001133 setlocal ff=unix
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001134 keepj put =g:netrw_ftpmode
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001135" call Decho("filter input: ".getline('$'))
Bram Moolenaar9964e462007-05-05 17:54:07 +00001136 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001137 keepj put =g:netrw_ftpextracmd
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001138" call Decho("filter input: ".getline("$"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00001139 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02001140 keepj call setline(line("$")+1,'put "'.tmpfile.'" "'.netrw_fname.'"')
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001141" call Decho("filter input: ".getline("$"))
Bram Moolenaar071d4272004-06-13 20:20:40 +00001142 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02001143" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
1144 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 +00001145 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00001146" call Decho("filter input window#".winnr())
Bram Moolenaaradc21822011-04-01 18:03:16 +02001147" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
1148 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001149 endif
1150 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1151 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001152 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001153 keepj call netrw#ErrorMsg(s:ERROR,getline(1),14)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001154 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001155 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +00001156 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001157
1158 " remove enew buffer (quietly)
1159 let filtbuf= bufnr("%")
1160 exe curbuf."b!"
1161 let &l:bh = bhkeep
1162 exe filtbuf."bw!"
1163
Bram Moolenaar071d4272004-06-13 20:20:40 +00001164 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001165
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001166 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001167 " NetWrite: (ftp + machine, id, passwd, filename) NetWrite Method #3 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001168 elseif b:netrw_method == 3
Bram Moolenaar5c736222010-01-06 20:54:52 +01001169 " Construct execution string (three or more lines) which will be passed through filter
Bram Moolenaar9964e462007-05-05 17:54:07 +00001170" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001171 let netrw_fname = b:netrw_fname
1172 let bhkeep = &l:bh
1173
1174 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
1175 let curbuf = bufnr("%")
1176 setlocal bh=hide
1177 enew
Bram Moolenaar8299df92004-07-10 09:47:34 +00001178 setlocal ff=unix
Bram Moolenaar5c736222010-01-06 20:54:52 +01001179
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001180 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001181 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00001182" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001183 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001184 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00001185" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001186 endif
1187 if exists("g:netrw_ftp") && g:netrw_ftp == 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001188 keepj put =g:netrw_uid
Bram Moolenaar446cb832008-06-24 21:56:24 +00001189" call Decho("filter input: ".getline('.'))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001190 keepj put ='\"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001191" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001192 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001193 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001194" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001195 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001196 keepj put =g:netrw_ftpmode
Bram Moolenaar5c736222010-01-06 20:54:52 +01001197" call Decho("filter input: ".getline('$'))
1198 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001199 keepj put =g:netrw_ftpextracmd
Bram Moolenaar5c736222010-01-06 20:54:52 +01001200" call Decho("filter input: ".getline("$"))
1201 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001202 keepj put ='put \"'.tmpfile.'\" \"'.netrw_fname.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001203" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001204 " save choice/id/password for future use
1205 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001206
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001207 " perform ftp:
1208 " -i : turns off interactive prompting from ftp
1209 " -n unix : DON'T use <.netrc>, even though it exists
1210 " -n win32: quit being obnoxious about password
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001211 keepj norm! 1Gdd
Bram Moolenaaradc21822011-04-01 18:03:16 +02001212" call Decho("executing: %!".s:netrw_ftp_cmd." -i -n")
1213 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i -n"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001214 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1215 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001216 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001217 call netrw#ErrorMsg(s:ERROR,getline(1),15)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001218 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001219 let mod=1
1220 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001221
1222 " remove enew buffer (quietly)
1223 let filtbuf= bufnr("%")
1224 exe curbuf."b!"
1225 let &l:bh= bhkeep
1226 exe filtbuf."bw!"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001227
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001228 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001229 " NetWrite: (scp) NetWrite Method #4 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001230 elseif b:netrw_method == 4
Bram Moolenaar9964e462007-05-05 17:54:07 +00001231" call Decho("write via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001232 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00001233 let useport= " ".g:netrw_scpport." ".fnameescape(g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001234 else
1235 let useport= ""
1236 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00001237" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1))
1238 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 +00001239 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001240
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001241 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001242 " NetWrite: (http) NetWrite Method #5 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001243 elseif b:netrw_method == 5
Bram Moolenaar9964e462007-05-05 17:54:07 +00001244" call Decho("write via http (method #5)")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001245 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001246 call netrw#ErrorMsg(s:ERROR,"currently <netrw.vim> does not support writing using http:",16)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001247 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001248
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001249 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001250 " NetWrite: (dav) NetWrite Method #6 (cadaver) {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001251 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001252" call Decho("write via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001253
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001254 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaar5c736222010-01-06 20:54:52 +01001255 let netrw_fname = escape(b:netrw_fname,g:netrw_fname_escape)
1256 let bhkeep = &l:bh
1257
1258 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
1259 let curbuf = bufnr("%")
1260 setlocal bh=hide
1261 enew
1262
Bram Moolenaar8299df92004-07-10 09:47:34 +00001263 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001264 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001265 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001266 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001267 keepj put ='open '.g:netrw_machine
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001268 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001269 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001270 keepj put ='user '.g:netrw_uid.' '.s:netrw_passwd
Bram Moolenaar446cb832008-06-24 21:56:24 +00001271 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001272 keepj put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001273
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001274 " perform cadaver operation:
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001275 keepj norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001276" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001277 exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
Bram Moolenaar5c736222010-01-06 20:54:52 +01001278
1279 " remove enew buffer (quietly)
1280 let filtbuf= bufnr("%")
1281 exe curbuf."b!"
1282 let &l:bh = bhkeep
1283 exe filtbuf."bw!"
1284
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001285 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001286
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001287 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001288 " NetWrite: (rsync) NetWrite Method #7 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001289 elseif b:netrw_method == 7
Bram Moolenaar9964e462007-05-05 17:54:07 +00001290" call Decho("write via rsync (method #7)")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001291" call Decho("executing: !".g:netrw_rsync_cmd." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1))
1292 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 +00001293 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001294
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001295 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001296 " NetWrite: (sftp) NetWrite Method #9 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001297 elseif b:netrw_method == 9
Bram Moolenaar9964e462007-05-05 17:54:07 +00001298" call Decho("read via sftp (method #9)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001299 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001300 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1301 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1302 else
1303 let uid_machine = g:netrw_machine
1304 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001305
1306 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
1307 let bhkeep = &l:bh
1308 let curbuf = bufnr("%")
1309 setlocal bh=hide
1310 enew
1311
Bram Moolenaar8299df92004-07-10 09:47:34 +00001312 setlocal ff=unix
Bram Moolenaar5c736222010-01-06 20:54:52 +01001313 call setline(1,'put "'.escape(tmpfile,'\').'" '.netrw_fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001314" call Decho("filter input: ".getline('.'))
Bram Moolenaarc236c162008-07-13 17:41:49 +00001315" call Decho("executing: %!".g:netrw_sftp_cmd.' '.shellescape(uid_machine,1))
1316 exe s:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.shellescape(uid_machine,1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01001317 let filtbuf= bufnr("%")
1318 exe curbuf."b!"
1319 let &l:bh = bhkeep
1320 exe filtbuf."bw!"
1321 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001322
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001323 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001324 " NetWrite: Complain {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001325 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001326 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",17)
Bram Moolenaaradc21822011-04-01 18:03:16 +02001327 let leavemod= 1
Bram Moolenaar071d4272004-06-13 20:20:40 +00001328 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001329 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001330
Bram Moolenaar5c736222010-01-06 20:54:52 +01001331 " NetWrite: Cleanup: {{{3
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001332" call Decho("cleanup")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001333 if s:FileReadable(tmpfile)
1334" call Decho("tmpfile<".tmpfile."> readable, will now delete it")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001335 call s:NetrwDelete(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001336 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001337 call s:NetrwOptionRestore("w:")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001338
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001339 if a:firstline == 1 && a:lastline == line("$")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001340 " restore modifiability; usually equivalent to set nomod
1341 let &mod= mod
Bram Moolenaaradc21822011-04-01 18:03:16 +02001342 elseif !exists("leavemod")
1343 " indicate that the buffer has not been modified since last written
1344 set nomod
Bram Moolenaar071d4272004-06-13 20:20:40 +00001345 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001346
Bram Moolenaar9964e462007-05-05 17:54:07 +00001347" call Dret("netrw#NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001348endfun
1349
1350" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001351" netrw#NetSource: source a remotely hosted vim script {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001352" uses NetRead to get a copy of the file into a temporarily file,
1353" then sources that file,
1354" then removes that file.
1355fun! netrw#NetSource(...)
1356" call Dfunc("netrw#NetSource() a:0=".a:0)
1357 if a:0 > 0 && a:1 == '?'
1358 " give help
1359 echomsg 'NetSource Usage:'
1360 echomsg ':Nsource dav://machine[:port]/path uses cadaver'
1361 echomsg ':Nsource fetch://machine/path uses fetch'
1362 echomsg ':Nsource ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
1363 echomsg ':Nsource http://[user@]machine/path uses http wget'
1364 echomsg ':Nsource rcp://[user@]machine/path uses rcp'
1365 echomsg ':Nsource rsync://machine[:port]/path uses rsync'
1366 echomsg ':Nsource scp://[user@]machine[[:#]port]/path uses scp'
1367 echomsg ':Nsource sftp://[user@]machine[[:#]port]/path uses sftp'
1368 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001369 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001370 let i= 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001371 while i <= a:0
Bram Moolenaar9964e462007-05-05 17:54:07 +00001372 call netrw#NetRead(3,a:{i})
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001373" call Decho("(netrw#NetSource) s:netread_tmpfile<".s:netrw_tmpfile.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001374 if s:FileReadable(s:netrw_tmpfile)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001375" call Decho("(netrw#NetSource) exe so ".fnameescape(s:netrw_tmpfile))
1376 exe "so ".fnameescape(s:netrw_tmpfile)
1377" call Decho("(netrw#NetSource) delete(".s:netrw_tmpfile.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001378 call delete(s:netrw_tmpfile)
1379 unlet s:netrw_tmpfile
1380 else
1381 call netrw#ErrorMsg(s:ERROR,"unable to source <".a:{i}.">!",48)
1382 endif
1383 let i= i + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001384 endwhile
Bram Moolenaar9964e462007-05-05 17:54:07 +00001385 endif
1386" call Dret("netrw#NetSource")
1387endfun
1388
1389" ===========================================
Bram Moolenaar446cb832008-06-24 21:56:24 +00001390" s:NetrwGetFile: Function to read temporary file "tfile" with command "readcmd". {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001391" readcmd == %r : replace buffer with newly read file
1392" == 0r : read file at top of buffer
1393" == r : read file after current line
1394" == t : leave file in temporary form (ie. don't read into buffer)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001395fun! s:NetrwGetFile(readcmd, tfile, method)
1396" call Dfunc("NetrwGetFile(readcmd<".a:readcmd.">,tfile<".a:tfile."> method<".a:method.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001397
1398 " readcmd=='t': simply do nothing
1399 if a:readcmd == 't'
Bram Moolenaarc236c162008-07-13 17:41:49 +00001400" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001401" call Dret("NetrwGetFile : skip read of <".a:tfile.">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001402 return
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001403 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001404
Bram Moolenaar9964e462007-05-05 17:54:07 +00001405 " get name of remote filename (ie. url and all)
1406 let rfile= bufname("%")
1407" call Decho("rfile<".rfile.">")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001408
Bram Moolenaar9964e462007-05-05 17:54:07 +00001409 if exists("*NetReadFixup")
1410 " for the use of NetReadFixup (not otherwise used internally)
1411 let line2= line("$")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001412 endif
1413
Bram Moolenaar9964e462007-05-05 17:54:07 +00001414 if a:readcmd[0] == '%'
1415 " get file into buffer
1416" call Decho("get file into buffer")
1417
1418 " rename the current buffer to the temp file (ie. tfile)
1419 if g:netrw_cygwin
1420 let tfile= substitute(a:tfile,'/cygdrive/\(.\)','\1:','')
1421 else
1422 let tfile= a:tfile
1423 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02001424" call Decho("exe sil! keepalt file ".fnameescape(tfile))
1425 exe "sil! keepalt file ".fnameescape(tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001426
1427 " edit temporary file (ie. read the temporary file in)
1428 if rfile =~ '\.zip$'
1429" call Decho("handling remote zip file with zip#Browse(tfile<".tfile.">)")
1430 call zip#Browse(tfile)
1431 elseif rfile =~ '\.tar$'
1432" call Decho("handling remote tar file with tar#Browse(tfile<".tfile.">)")
1433 call tar#Browse(tfile)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02001434 elseif rfile =~ '\.tar\.gz$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00001435" call Decho("handling remote gzip-compressed tar file")
1436 call tar#Browse(tfile)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02001437 elseif rfile =~ '\.tar\.bz2$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00001438" call Decho("handling remote bz2-compressed tar file")
1439 call tar#Browse(tfile)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02001440 elseif rfile =~ '\.tar\.xz$'
1441" call Decho("handling remote xz-compressed tar file")
1442 call tar#Browse(tfile)
1443 elseif rfile =~ '\.txz$'
1444" call Decho("handling remote xz-compressed tar file (.txz)")
1445 call tar#Browse(tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001446 else
1447" call Decho("edit temporary file")
1448 e!
1449 endif
1450
1451 " rename buffer back to remote filename
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02001452" call Decho("exe sil! keepalt file ".fnameescape(rfile))
Bram Moolenaaradc21822011-04-01 18:03:16 +02001453 exe "sil! keepj keepalt file ".fnameescape(rfile)
Bram Moolenaar5c736222010-01-06 20:54:52 +01001454 filetype detect
Bram Moolenaar9964e462007-05-05 17:54:07 +00001455" call Dredir("renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">","ls!")
1456 let line1 = 1
1457 let line2 = line("$")
1458
1459 elseif s:FileReadable(a:tfile)
1460 " read file after current line
1461" call Decho("read file<".a:tfile."> after current line")
1462 let curline = line(".")
1463 let lastline= line("$")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001464" call Decho("exe<".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)."> line#".curline)
Bram Moolenaaradc21822011-04-01 18:03:16 +02001465 exe "keepj ".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001466 let line1= curline + 1
1467 let line2= line("$") - lastline + 1
1468
1469 else
1470 " not readable
Bram Moolenaarc236c162008-07-13 17:41:49 +00001471" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001472" call Decho("tfile<".a:tfile."> not readable")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001473 keepj call netrw#ErrorMsg(s:WARNING,"file <".a:tfile."> not readable",9)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001474" call Dret("NetrwGetFile : tfile<".a:tfile."> not readable")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001475 return
1476 endif
1477
1478 " User-provided (ie. optional) fix-it-up command
1479 if exists("*NetReadFixup")
1480" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001481 keepj call NetReadFixup(a:method, line1, line2)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001482" else " Decho
1483" call Decho("NetReadFixup() not called, doesn't exist (line1=".line1." line2=".line2.")")
1484 endif
1485
Bram Moolenaaradc21822011-04-01 18:03:16 +02001486 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaar446cb832008-06-24 21:56:24 +00001487 " update the Buffers menu
Bram Moolenaaradc21822011-04-01 18:03:16 +02001488 keepj call s:UpdateBuffersMenu()
Bram Moolenaar9964e462007-05-05 17:54:07 +00001489 endif
1490
1491" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> tfile<".a:tfile."> readable=".s:FileReadable(a:tfile))
1492
1493 " make sure file is being displayed
Bram Moolenaar446cb832008-06-24 21:56:24 +00001494" redraw!
1495
Bram Moolenaarc236c162008-07-13 17:41:49 +00001496" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001497" call Dret("NetrwGetFile")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001498endfun
1499
Bram Moolenaar9964e462007-05-05 17:54:07 +00001500" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001501" s:NetrwMethod: determine method of transfer {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +01001502" Input:
1503" choice = url [protocol:]//[userid@]hostname[:port]/[path-to-file]
1504" Output:
1505" b:netrw_method= 1: rcp
1506" 2: ftp + <.netrc>
1507" 3: ftp + machine, id, password, and [path]filename
1508" 4: scp
1509" 5: http (wget)
1510" 6: dav
1511" 7: rsync
1512" 8: fetch
1513" 9: sftp
1514" g:netrw_machine= hostname
1515" b:netrw_fname = filename
1516" g:netrw_port = optional port number (for ftp)
1517" g:netrw_choice = copy of input url (choice)
1518fun! s:NetrwMethod(choice)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001519" call Dfunc("NetrwMethod(a:choice<".a:choice.">)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001520
Bram Moolenaar5c736222010-01-06 20:54:52 +01001521 " record current g:netrw_machine, if any
1522 " curmachine used if protocol == ftp and no .netrc
1523 if exists("g:netrw_machine")
1524 let curmachine= g:netrw_machine
1525" call Decho("curmachine<".curmachine.">")
1526 else
1527 let curmachine= "N O T A HOST"
1528 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02001529 if exists("g:netrw_port")
1530 let netrw_port= g:netrw_port
1531 endif
1532
1533 " insure that netrw_ftp_cmd starts off every method determination
1534 " with the current g:netrw_ftp_cmd
1535 let s:netrw_ftp_cmd= g:netrw_ftp_cmd
Bram Moolenaar5c736222010-01-06 20:54:52 +01001536
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001537 " initialization
1538 let b:netrw_method = 0
1539 let g:netrw_machine = ""
1540 let b:netrw_fname = ""
1541 let g:netrw_port = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001542 let g:netrw_choice = a:choice
1543
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001544 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001545 " mipf : a:machine a:id password filename Use ftp
Bram Moolenaar446cb832008-06-24 21:56:24 +00001546 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
1547 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001548 " rcpurm : rcp://[user@]host/filename Use rcp
1549 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001550 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001551 " httpurm : http://[user@]host/filename Use wget
Bram Moolenaar5c736222010-01-06 20:54:52 +01001552 " davurm : dav[s]://host[:port]/path Use cadaver/curl
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001553 " rsyncurm : rsync://host[:port]/path Use rsync
1554 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
1555 " sftpurm : sftp://[user@]host/filename Use scp
1556 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
1557 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
1558 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
Bram Moolenaar83bab712005-08-01 21:58:57 +00001559 let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001560 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001561 let scpurm = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001562 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001563 let davurm = '^davs\=://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001564 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
1565 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
1566 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001567
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001568" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001569 " Determine Method
Bram Moolenaaradc21822011-04-01 18:03:16 +02001570 " Method#1: rcp://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001571 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001572" call Decho("rcp://...")
Bram Moolenaar83bab712005-08-01 21:58:57 +00001573 let b:netrw_method = 1
1574 let userid = substitute(a:choice,rcpurm,'\1',"")
1575 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
1576 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001577 if userid != ""
1578 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00001579 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001580
Bram Moolenaaradc21822011-04-01 18:03:16 +02001581 " Method#4: scp://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001582 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001583" call Decho("scp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001584 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00001585 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
1586 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
1587 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001588
Bram Moolenaaradc21822011-04-01 18:03:16 +02001589 " Method#5: http://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001590 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001591" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001592 let b:netrw_method = 5
1593 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
1594 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001595
Bram Moolenaaradc21822011-04-01 18:03:16 +02001596 " Method#6: dav://hostname[:port]/..path-to-file.. {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001597 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001598" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001599 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001600 if a:choice =~ '^s'
1601 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
1602 else
1603 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
1604 endif
1605 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001606
Bram Moolenaaradc21822011-04-01 18:03:16 +02001607 " Method#7: rsync://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001608 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001609" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001610 let b:netrw_method = 7
1611 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
1612 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001613
Bram Moolenaaradc21822011-04-01 18:03:16 +02001614 " Methods 2,3: ftp://[user@]hostname[[:#]port]/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001615 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001616" call Decho("ftp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001617 let userid = substitute(a:choice,ftpurm,'\2',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001618 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
1619 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
1620 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001621" call Decho("g:netrw_machine<".g:netrw_machine.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001622 if userid != ""
1623 let g:netrw_uid= userid
1624 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02001625 if curmachine != g:netrw_machine
1626 if exists("s:netrw_passwd")
1627 " if there's a change in hostname, require password re-entry
1628 unlet s:netrw_passwd
1629 endif
1630 if exists("netrw_port")
1631 unlet netrw_port
1632 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001633 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001634 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001635 let b:netrw_method = 3
1636 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02001637 if (has("win32") || has("win95") || has("win64") || has("win16")) && s:netrw_ftp_cmd =~ '-[sS]:'
1638" call Decho("has -s: : s:netrw_ftp_cmd<".s:netrw_ftp_cmd.">")
1639" call Decho(" g:netrw_ftp_cmd<".g:netrw_ftp_cmd.">")
1640 if g:netrw_ftp_cmd =~ '-[sS]:\S*MACHINE\>'
1641 let machine = substitute(g:netrw_machine,'\([^.]\+\)\.\S*','\1','')
1642 let s:netrw_ftp_cmd= substitute(g:netrw_ftp_cmd,'\<MACHINE\>',machine.".ftp",'')
1643" call Decho("s:netrw_ftp_cmd<".s:netrw_ftp_cmd.">")
1644 endif
1645 let b:netrw_method= 2
1646 elseif s:FileReadable(expand("$HOME/.netrc")) && !g:netrw_ignorenetrc
1647" call Decho("using <".expand("$HOME/.netrc")."> (readable)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001648 let b:netrw_method= 2
1649 else
1650 if !exists("g:netrw_uid") || g:netrw_uid == ""
1651 call NetUserPass()
Bram Moolenaar446cb832008-06-24 21:56:24 +00001652 elseif !exists("s:netrw_passwd") || s:netrw_passwd == ""
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001653 call NetUserPass(g:netrw_uid)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001654 " else just use current g:netrw_uid and s:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001655 endif
1656 let b:netrw_method= 3
1657 endif
1658 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001659
Bram Moolenaaradc21822011-04-01 18:03:16 +02001660 " Method#8: fetch {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001661 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001662" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001663 let b:netrw_method = 8
1664 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
1665 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
1666 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
1667 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001668
Bram Moolenaaradc21822011-04-01 18:03:16 +02001669 " Method#3: Issue an ftp : "machine id password [path/]filename" {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001670 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001671" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001672 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001673 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
1674 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001675 let s:netrw_passwd = substitute(a:choice,mipf,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001676 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001677
Bram Moolenaaradc21822011-04-01 18:03:16 +02001678 " Method#3: Issue an ftp: "hostname [path/]filename" {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001679 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001680" call Decho("(ftp) host file")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001681 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001682 let b:netrw_method = 3
1683 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
1684 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001685
Bram Moolenaar9964e462007-05-05 17:54:07 +00001686 elseif s:FileReadable(expand("$HOME/.netrc"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001687 let b:netrw_method = 2
1688 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
1689 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
1690 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001691
Bram Moolenaaradc21822011-04-01 18:03:16 +02001692 " Method#9: sftp://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001693 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001694" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001695 let b:netrw_method = 9
1696 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
1697 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001698
Bram Moolenaaradc21822011-04-01 18:03:16 +02001699 " Method#1: Issue an rcp: hostname:filename" (this one should be last) {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001700 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001701" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001702 let b:netrw_method = 1
1703 let userid = substitute(a:choice,rcphf,'\2',"")
1704 let g:netrw_machine = substitute(a:choice,rcphf,'\3',"")
1705 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001706" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
1707" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
1708" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
1709" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001710 if userid != ""
1711 let g:netrw_uid= userid
1712 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001713
Bram Moolenaaradc21822011-04-01 18:03:16 +02001714 " Cannot Determine Method {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001715 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001716 if !exists("g:netrw_quiet")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001717 call netrw#ErrorMsg(s:WARNING,"cannot determine method (format: protocol://[user@]hostname[:port]/[path])",45)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001718 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001719 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00001720 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02001721 "}}}3
Bram Moolenaar81695252004-12-29 20:58:21 +00001722
Bram Moolenaar81695252004-12-29 20:58:21 +00001723 if g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02001724 " remove any leading [:#] from port number
1725 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
1726 elseif exists("netrw_port")
1727 " retain port number as implicit for subsequent ftp operations
1728 let g:netrw_port= netrw_port
Bram Moolenaar81695252004-12-29 20:58:21 +00001729 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001730
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001731" call Decho("a:choice <".a:choice.">")
1732" call Decho("b:netrw_method <".b:netrw_method.">")
1733" call Decho("g:netrw_machine<".g:netrw_machine.">")
1734" call Decho("g:netrw_port <".g:netrw_port.">")
1735" if exists("g:netrw_uid") "Decho
1736" call Decho("g:netrw_uid <".g:netrw_uid.">")
1737" endif "Decho
Bram Moolenaar446cb832008-06-24 21:56:24 +00001738" if exists("s:netrw_passwd") "Decho
1739" call Decho("s:netrw_passwd <".s:netrw_passwd.">")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001740" endif "Decho
1741" call Decho("b:netrw_fname <".b:netrw_fname.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001742" call Dret("NetrwMethod : b:netrw_method=".b:netrw_method." g:netrw_port=".g:netrw_port)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001743endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001744
1745" ------------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00001746" NetReadFixup: this sort of function is typically written by the user {{{2
1747" to handle extra junk that their system's ftp dumps
1748" into the transfer. This function is provided as an
1749" example and as a fix for a Windows 95 problem: in my
1750" experience, win95's ftp always dumped four blank lines
1751" at the end of the transfer.
1752if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp
1753 fun! NetReadFixup(method, line1, line2)
1754" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001755
1756 " sanity checks -- attempt to convert inputs to integers
1757 let method = a:method + 0
1758 let line1 = a:line1 + 0
1759 let line2 = a:line2 + 0
1760 if type(method) != 0 || type(line1) != 0 || type(line2) != 0 || method < 0 || line1 <= 0 || line2 <= 0
1761" call Dret("NetReadFixup")
1762 return
1763 endif
1764
Bram Moolenaar9964e462007-05-05 17:54:07 +00001765 if method == 3 " ftp (no <.netrc>)
1766 let fourblanklines= line2 - 3
Bram Moolenaar5c736222010-01-06 20:54:52 +01001767 if fourblanklines >= line1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001768 exe "sil keepj ".fourblanklines.",".line2."g/^\s*$/d"
Bram Moolenaar5c736222010-01-06 20:54:52 +01001769 call histdel("/",-1)
1770 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001771 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001772
Bram Moolenaar9964e462007-05-05 17:54:07 +00001773" call Dret("NetReadFixup")
1774 endfun
1775endif
1776
1777" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001778" NetUserPass: set username and password for subsequent ftp transfer {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +00001779" Usage: :call NetUserPass() -- will prompt for userid and password
1780" :call NetUserPass("uid") -- will prompt for password
1781" :call NetUserPass("uid","password") -- sets global userid and password
1782fun! NetUserPass(...)
1783
1784 " get/set userid
1785 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001786" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001787 if !exists("g:netrw_uid") || g:netrw_uid == ""
1788 " via prompt
1789 let g:netrw_uid= input('Enter username: ')
1790 endif
1791 else " from command line
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001792" call Dfunc("NetUserPass(a:1<".a:1.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001793 let g:netrw_uid= a:1
1794 endif
1795
1796 " get password
1797 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001798" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001799 let s:netrw_passwd= inputsecret("Enter Password: ")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001800 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001801" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001802 let s:netrw_passwd=a:2
Bram Moolenaar071d4272004-06-13 20:20:40 +00001803 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001804
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001805" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001806endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001807
Bram Moolenaar9964e462007-05-05 17:54:07 +00001808" ===========================================
1809" Shared Browsing Support: {{{1
1810" ===========================================
Bram Moolenaar071d4272004-06-13 20:20:40 +00001811
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001812" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02001813" s:NetrwMaps: {{{2
1814fun! s:NetrwMaps(islocal)
1815" call Dfunc("s:NetrwMaps(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001816 if a:islocal
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001817" call Decho("make local maps")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001818 inoremap <buffer> <silent> a <c-o>:call <SID>NetrwHide(1)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02001819 inoremap <buffer> <silent> c <c-o>:exe "keepjumps lcd ".fnameescape(b:netrw_curdir)<cr>
1820 inoremap <buffer> <silent> C <c-o>:let g:netrw_chgwin= winnr()<cr>
1821 inoremap <buffer> <silent> % <c-o>:call <SID>NetrwOpenFile(1)<cr>
1822 inoremap <buffer> <silent> - <c-o>:exe "norm! 0"<bar>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,'../'))<cr>
1823 inoremap <buffer> <silent> <cr> <c-o>:call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
1824 inoremap <buffer> <silent> d <c-o>:call <SID>NetrwMakeDir("")<cr>
1825 inoremap <buffer> <silent> gb <c-o>:<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
1826 inoremap <buffer> <silent> gh <c-o>:<c-u>call <SID>NetrwHidden(1)<cr>
1827 inoremap <buffer> <silent> gp <c-o>:<c-u>call <SID>NetrwChgPerm(1,b:netrw_curdir)<cr>
1828 inoremap <buffer> <silent> I <c-o>:call <SID>NetrwBannerCtrl(1)<cr>
1829 inoremap <buffer> <silent> i <c-o>:call <SID>NetrwListStyle(1)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001830 inoremap <buffer> <silent> mb <c-o>:<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02001831 inoremap <buffer> <silent> mB <c-o>:<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001832 inoremap <buffer> <silent> mc <c-o>:<c-u>call <SID>NetrwMarkFileCopy(1)<cr>
1833 inoremap <buffer> <silent> md <c-o>:<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
1834 inoremap <buffer> <silent> me <c-o>:<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
1835 inoremap <buffer> <silent> mf <c-o>:<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
1836 inoremap <buffer> <silent> mg <c-o>:<c-u>call <SID>NetrwMarkFileGrep(1)<cr>
1837 inoremap <buffer> <silent> mh <c-o>:<c-u>call <SID>NetrwMarkHideSfx(1)<cr>
1838 inoremap <buffer> <silent> mm <c-o>:<c-u>call <SID>NetrwMarkFileMove(1)<cr>
1839 inoremap <buffer> <silent> mp <c-o>:<c-u>call <SID>NetrwMarkFilePrint(1)<cr>
1840 inoremap <buffer> <silent> mr <c-o>:<c-u>call <SID>NetrwMarkFileRegexp(1)<cr>
1841 inoremap <buffer> <silent> ms <c-o>:<c-u>call <SID>NetrwMarkFileSource(1)<cr>
1842 inoremap <buffer> <silent> mT <c-o>:<c-u>call <SID>NetrwMarkFileTag(1)<cr>
1843 inoremap <buffer> <silent> mt <c-o>:<c-u>call <SID>NetrwMarkFileTgt(1)<cr>
1844 inoremap <buffer> <silent> mu <c-o>:<c-u>call <SID>NetrwUnMarkFile(1)<cr>
1845 inoremap <buffer> <silent> mx <c-o>:<c-u>call <SID>NetrwMarkFileExe(1)<cr>
1846 inoremap <buffer> <silent> mz <c-o>:<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001847 inoremap <buffer> <silent> O <c-o>:call <SID>NetrwObtain(1)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02001848 inoremap <buffer> <silent> o <c-o>:call <SID>NetrwSplit(3)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001849 inoremap <buffer> <silent> p <c-o>:call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
1850 inoremap <buffer> <silent> P <c-o>:call <SID>NetrwPrevWinOpen(1)<cr>
1851 inoremap <buffer> <silent> qb <c-o>:<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001852 inoremap <buffer> <silent> qf <c-o>:<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
1853 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>
1854 inoremap <buffer> <silent> s <c-o>:call <SID>NetrwSortStyle(1)<cr>
1855 inoremap <buffer> <silent> S <c-o>:call <SID>NetSortSequence(1)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001856 inoremap <buffer> <silent> T <c-o>:call <SID>NetrwSplit(4)<bar>norm! gT<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02001857 inoremap <buffer> <silent> t <c-o>:call <SID>NetrwSplit(4)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001858 inoremap <buffer> <silent> u <c-o>:<c-u>call <SID>NetrwBookHistHandler(4,expand("%"))<cr>
1859 inoremap <buffer> <silent> U <c-o>:<c-u>call <SID>NetrwBookHistHandler(5,expand("%"))<cr>
1860 inoremap <buffer> <silent> v <c-o>:call <SID>NetrwSplit(5)<cr>
1861 inoremap <buffer> <silent> x <c-o>:call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02001862 nnoremap <buffer> <silent> a :call <SID>NetrwHide(1)<cr>
1863 nnoremap <buffer> <silent> % :call <SID>NetrwOpenFile(1)<cr>
1864 nnoremap <buffer> <silent> c :exe "keepjumps lcd ".fnameescape(b:netrw_curdir)<cr>
1865 nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr>
1866 nnoremap <buffer> <silent> <cr> :call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
1867 nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("")<cr>
1868 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,'../'))<cr>
1869 nnoremap <buffer> <silent> gb :<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
1870 nnoremap <buffer> <silent> gd :<c-u>call <SID>NetrwForceChgDir(1,<SID>NetrwGetWord())<cr>
1871 nnoremap <buffer> <silent> gf :<c-u>call <SID>NetrwForceFile(1,<SID>NetrwGetWord())<cr>
1872 nnoremap <buffer> <silent> gh :<c-u>call <SID>NetrwHidden(1)<cr>
1873 nnoremap <buffer> <silent> gp :<c-u>call <SID>NetrwChgPerm(1,b:netrw_curdir)<cr>
1874 nnoremap <buffer> <silent> I :call <SID>NetrwBannerCtrl(1)<cr>
1875 nnoremap <buffer> <silent> i :call <SID>NetrwListStyle(1)<cr>
1876 nnoremap <buffer> <silent> mb :<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
1877 nnoremap <buffer> <silent> mB :<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
1878 nnoremap <buffer> <silent> mc :<c-u>call <SID>NetrwMarkFileCopy(1)<cr>
1879 nnoremap <buffer> <silent> md :<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
1880 nnoremap <buffer> <silent> me :<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
1881 nnoremap <buffer> <silent> mf :<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
1882 nnoremap <buffer> <silent> mg :<c-u>call <SID>NetrwMarkFileGrep(1)<cr>
1883 nnoremap <buffer> <silent> mh :<c-u>call <SID>NetrwMarkHideSfx(1)<cr>
1884 nnoremap <buffer> <silent> mm :<c-u>call <SID>NetrwMarkFileMove(1)<cr>
1885 nnoremap <buffer> <silent> mp :<c-u>call <SID>NetrwMarkFilePrint(1)<cr>
1886 nnoremap <buffer> <silent> mr :<c-u>call <SID>NetrwMarkFileRegexp(1)<cr>
1887 nnoremap <buffer> <silent> ms :<c-u>call <SID>NetrwMarkFileSource(1)<cr>
1888 nnoremap <buffer> <silent> mT :<c-u>call <SID>NetrwMarkFileTag(1)<cr>
1889 nnoremap <buffer> <silent> mt :<c-u>call <SID>NetrwMarkFileTgt(1)<cr>
1890 nnoremap <buffer> <silent> mu :<c-u>call <SID>NetrwUnMarkFile(1)<cr>
1891 nnoremap <buffer> <silent> mx :<c-u>call <SID>NetrwMarkFileExe(1)<cr>
1892 nnoremap <buffer> <silent> mz :<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
1893 nnoremap <buffer> <silent> O :call <SID>NetrwObtain(1)<cr>
1894 nnoremap <buffer> <silent> o :call <SID>NetrwSplit(3)<cr>
1895 nnoremap <buffer> <silent> p :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
1896 nnoremap <buffer> <silent> P :call <SID>NetrwPrevWinOpen(1)<cr>
1897 nnoremap <buffer> <silent> qb :<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
1898 nnoremap <buffer> <silent> qf :<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
1899 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>
1900 nnoremap <buffer> <silent> s :call <SID>NetrwSortStyle(1)<cr>
1901 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
1902 nnoremap <buffer> <silent> T :call <SID>NetrwSplit(4)<bar>norm! gT<cr>
1903 nnoremap <buffer> <silent> t :call <SID>NetrwSplit(4)<cr>
1904 nnoremap <buffer> <silent> u :<c-u>call <SID>NetrwBookHistHandler(4,expand("%"))<cr>
1905 nnoremap <buffer> <silent> U :<c-u>call <SID>NetrwBookHistHandler(5,expand("%"))<cr>
1906 nnoremap <buffer> <silent> v :call <SID>NetrwSplit(5)<cr>
1907 nnoremap <buffer> <silent> x :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001908 if !hasmapto('<Plug>NetrwHideEdit')
1909 nmap <buffer> <unique> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001910 imap <buffer> <unique> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar446cb832008-06-24 21:56:24 +00001911 endif
1912 nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(1)<cr>
1913 if !hasmapto('<Plug>NetrwRefresh')
1914 nmap <buffer> <unique> <c-l> <Plug>NetrwRefresh
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001915 imap <buffer> <unique> <c-l> <Plug>NetrwRefresh
Bram Moolenaar446cb832008-06-24 21:56:24 +00001916 endif
1917 nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,'./'))<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001918 if s:didstarstar || !mapcheck("<s-down>","n")
1919 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001920 inoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001921 endif
1922 if s:didstarstar || !mapcheck("<s-up>","n")
1923 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001924 inoremap <buffer> <silent> <s-up> :Pexplore<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001925 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001926 let mapsafecurdir = escape(b:netrw_curdir, s:netrw_map_escape)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001927 if g:netrw_mousemaps == 1
1928 nnoremap <buffer> <silent> <leftmouse> <leftmouse>:call <SID>NetrwLeftmouse(1)<cr>
1929 nnoremap <buffer> <silent> <middlemouse> <leftmouse>:call <SID>NetrwPrevWinOpen(1)<cr>
1930 nnoremap <buffer> <silent> <s-leftmouse> <leftmouse>:call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02001931 nmap <buffer> <silent> <2-leftmouse> -
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001932 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
1933 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001934 inoremap <buffer> <silent> <leftmouse> <c-o><leftmouse><c-o>:call <SID>NetrwLeftmouse(1)<cr>
1935 inoremap <buffer> <silent> <middlemouse> <c-o><leftmouse><c-o>:call <SID>NetrwPrevWinOpen(1)<cr>
1936 inoremap <buffer> <silent> <s-leftmouse> <c-o><leftmouse><c-o>:call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
1937 exe 'inoremap <buffer> <silent> <rightmouse> <c-o><leftmouse><c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001938 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001939 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001940 exe 'nnoremap <buffer> <silent> D :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001941 exe 'nnoremap <buffer> <silent> R :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001942 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetrwMakeDir("")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001943 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
1944 exe 'vnoremap <buffer> <silent> D :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
1945 exe 'vnoremap <buffer> <silent> R :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
1946 exe 'inoremap <buffer> <silent> <del> <c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
1947 exe 'inoremap <buffer> <silent> D <c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
1948 exe 'inoremap <buffer> <silent> R <c-o>:call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
1949 exe 'inoremap <buffer> <silent> <Leader>m <c-o>:call <SID>NetrwMakeDir("")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001950 nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001951
Bram Moolenaar9964e462007-05-05 17:54:07 +00001952 else " remote
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001953" call Decho("make remote maps")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001954 call s:RemotePathAnalysis(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001955 nnoremap <buffer> <silent> <cr> :call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr>
1956 nnoremap <buffer> <silent> <c-l> :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
1957 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'../'))<cr>
1958 nnoremap <buffer> <silent> a :call <SID>NetrwHide(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01001959 nnoremap <buffer> <silent> mb :<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001960 nnoremap <buffer> <silent> mc :<c-u>call <SID>NetrwMarkFileCopy(0)<cr>
1961 nnoremap <buffer> <silent> md :<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
1962 nnoremap <buffer> <silent> me :<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
1963 nnoremap <buffer> <silent> mf :<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
1964 nnoremap <buffer> <silent> mg :<c-u>call <SID>NetrwMarkFileGrep(0)<cr>
1965 nnoremap <buffer> <silent> mh :<c-u>call <SID>NetrwMarkHideSfx(0)<cr>
1966 nnoremap <buffer> <silent> mm :<c-u>call <SID>NetrwMarkFileMove(0)<cr>
1967 nnoremap <buffer> <silent> mp :<c-u>call <SID>NetrwMarkFilePrint(0)<cr>
1968 nnoremap <buffer> <silent> mr :<c-u>call <SID>NetrwMarkFileRegexp(0)<cr>
1969 nnoremap <buffer> <silent> ms :<c-u>call <SID>NetrwMarkFileSource(0)<cr>
1970 nnoremap <buffer> <silent> mT :<c-u>call <SID>NetrwMarkFileTag(0)<cr>
1971 nnoremap <buffer> <silent> mt :<c-u>call <SID>NetrwMarkFileTgt(0)<cr>
1972 nnoremap <buffer> <silent> mu :<c-u>call <SID>NetrwUnMarkFile(0)<cr>
1973 nnoremap <buffer> <silent> mx :<c-u>call <SID>NetrwMarkFileExe(0)<cr>
1974 nnoremap <buffer> <silent> mz :<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01001975 nnoremap <buffer> <silent> gb :<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_cur)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02001976 nnoremap <buffer> <silent> gd :<c-u>call <SID>NetrwForceChgDir(0,<SID>NetrwGetWord())<cr>
1977 nnoremap <buffer> <silent> gf :<c-u>call <SID>NetrwForceFile(0,<SID>NetrwGetWord())<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001978 nnoremap <buffer> <silent> gh :<c-u>call <SID>NetrwHidden(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01001979 nnoremap <buffer> <silent> gp :<c-u>call <SID>NetrwChgPerm(0,b:netrw_curdir)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001980 nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001981 nnoremap <buffer> <silent> i :call <SID>NetrwListStyle(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01001982 nnoremap <buffer> <silent> I :call <SID>NetrwBannerCtrl(1)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001983 nnoremap <buffer> <silent> o :call <SID>NetrwSplit(0)<cr>
1984 nnoremap <buffer> <silent> O :call <SID>NetrwObtain(0)<cr>
1985 nnoremap <buffer> <silent> p :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
1986 nnoremap <buffer> <silent> P :call <SID>NetrwPrevWinOpen(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01001987 nnoremap <buffer> <silent> qb :<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
1988 nnoremap <buffer> <silent> mB :<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001989 nnoremap <buffer> <silent> qf :<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
1990 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>
1991 nnoremap <buffer> <silent> s :call <SID>NetrwSortStyle(0)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001992 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001993 nnoremap <buffer> <silent> t :call <SID>NetrwSplit(1)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01001994 nnoremap <buffer> <silent> T :call <SID>NetrwSplit(1)<bar>norm! gT<cr>
1995 nnoremap <buffer> <silent> u :<c-u>call <SID>NetrwBookHistHandler(4,b:netrw_curdir)<cr>
1996 nnoremap <buffer> <silent> U :<c-u>call <SID>NetrwBookHistHandler(5,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001997 nnoremap <buffer> <silent> v :call <SID>NetrwSplit(2)<cr>
1998 nnoremap <buffer> <silent> x :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
Bram Moolenaarc236c162008-07-13 17:41:49 +00001999 nnoremap <buffer> <silent> % :call <SID>NetrwOpenFile(0)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002000 inoremap <buffer> <silent> <cr> <c-o>:call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr>
2001 inoremap <buffer> <silent> <c-l> <c-o>:call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
2002 inoremap <buffer> <silent> - <c-o>:exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'../'))<cr>
2003 inoremap <buffer> <silent> a <c-o>:call <SID>NetrwHide(0)<cr>
2004 inoremap <buffer> <silent> mb <c-o>:<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
2005 inoremap <buffer> <silent> mc <c-o>:<c-u>call <SID>NetrwMarkFileCopy(0)<cr>
2006 inoremap <buffer> <silent> md <c-o>:<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
2007 inoremap <buffer> <silent> me <c-o>:<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
2008 inoremap <buffer> <silent> mf <c-o>:<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
2009 inoremap <buffer> <silent> mg <c-o>:<c-u>call <SID>NetrwMarkFileGrep(0)<cr>
2010 inoremap <buffer> <silent> mh <c-o>:<c-u>call <SID>NetrwMarkHideSfx(0)<cr>
2011 inoremap <buffer> <silent> mm <c-o>:<c-u>call <SID>NetrwMarkFileMove(0)<cr>
2012 inoremap <buffer> <silent> mp <c-o>:<c-u>call <SID>NetrwMarkFilePrint(0)<cr>
2013 inoremap <buffer> <silent> mr <c-o>:<c-u>call <SID>NetrwMarkFileRegexp(0)<cr>
2014 inoremap <buffer> <silent> ms <c-o>:<c-u>call <SID>NetrwMarkFileSource(0)<cr>
2015 inoremap <buffer> <silent> mT <c-o>:<c-u>call <SID>NetrwMarkFileTag(0)<cr>
2016 inoremap <buffer> <silent> mt <c-o>:<c-u>call <SID>NetrwMarkFileTgt(0)<cr>
2017 inoremap <buffer> <silent> mu <c-o>:<c-u>call <SID>NetrwUnMarkFile(0)<cr>
2018 inoremap <buffer> <silent> mx <c-o>:<c-u>call <SID>NetrwMarkFileExe(0)<cr>
2019 inoremap <buffer> <silent> mz <c-o>:<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
2020 inoremap <buffer> <silent> gb <c-o>:<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_cur)<cr>
2021 inoremap <buffer> <silent> gh <c-o>:<c-u>call <SID>NetrwHidden(0)<cr>
2022 inoremap <buffer> <silent> gp <c-o>:<c-u>call <SID>NetrwChgPerm(0,b:netrw_curdir)<cr>
2023 inoremap <buffer> <silent> C <c-o>:let g:netrw_chgwin= winnr()<cr>
2024 inoremap <buffer> <silent> i <c-o>:call <SID>NetrwListStyle(0)<cr>
2025 inoremap <buffer> <silent> I <c-o>:call <SID>NetrwBannerCtrl(1)<cr>
2026 inoremap <buffer> <silent> o <c-o>:call <SID>NetrwSplit(0)<cr>
2027 inoremap <buffer> <silent> O <c-o>:call <SID>NetrwObtain(0)<cr>
2028 inoremap <buffer> <silent> p <c-o>:call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
2029 inoremap <buffer> <silent> P <c-o>:call <SID>NetrwPrevWinOpen(0)<cr>
2030 inoremap <buffer> <silent> qb <c-o>:<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
2031 inoremap <buffer> <silent> mB <c-o>:<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
2032 inoremap <buffer> <silent> qf <c-o>:<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
2033 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>
2034 inoremap <buffer> <silent> s <c-o>:call <SID>NetrwSortStyle(0)<cr>
2035 inoremap <buffer> <silent> S <c-o>:call <SID>NetSortSequence(0)<cr>
2036 inoremap <buffer> <silent> t <c-o>:call <SID>NetrwSplit(1)<cr>
2037 inoremap <buffer> <silent> T <c-o>:call <SID>NetrwSplit(1)<bar>norm! gT<cr>
2038 inoremap <buffer> <silent> u <c-o>:<c-u>call <SID>NetrwBookHistHandler(4,b:netrw_curdir)<cr>
2039 inoremap <buffer> <silent> U <c-o>:<c-u>call <SID>NetrwBookHistHandler(5,b:netrw_curdir)<cr>
2040 inoremap <buffer> <silent> v <c-o>:call <SID>NetrwSplit(2)<cr>
2041 inoremap <buffer> <silent> x <c-o>:call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
2042 inoremap <buffer> <silent> % <c-o>:call <SID>NetrwOpenFile(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002043 if !hasmapto('<Plug>NetrwHideEdit')
2044 nmap <buffer> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002045 imap <buffer> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar446cb832008-06-24 21:56:24 +00002046 endif
2047 nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(0)<cr>
2048 if !hasmapto('<Plug>NetrwRefresh')
2049 nmap <buffer> <c-l> <Plug>NetrwRefresh
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002050 imap <buffer> <c-l> <Plug>NetrwRefresh
Bram Moolenaar446cb832008-06-24 21:56:24 +00002051 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002052
2053 let mapsafepath = escape(s:path, s:netrw_map_escape)
2054 let mapsafeusermach = escape(s:user.s:machine, s:netrw_map_escape)
2055
Bram Moolenaar446cb832008-06-24 21:56:24 +00002056 nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
2057 if g:netrw_mousemaps == 1
2058 nnoremap <buffer> <silent> <leftmouse> <leftmouse>:call <SID>NetrwLeftmouse(0)<cr>
2059 nnoremap <buffer> <silent> <middlemouse> <leftmouse>:call <SID>NetrwPrevWinOpen(0)<cr>
2060 nnoremap <buffer> <silent> <s-leftmouse> <leftmouse>:call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02002061 nmap <buffer> <silent> <2-leftmouse> -
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002062 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
2063 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002064 inoremap <buffer> <silent> <leftmouse> <c-o><leftmouse><c-o>:call <SID>NetrwLeftmouse(0)<cr>
2065 inoremap <buffer> <silent> <middlemouse> <c-o><leftmouse><c-o>:call <SID>NetrwPrevWinOpen(0)<cr>
2066 inoremap <buffer> <silent> <s-leftmouse> <c-o><leftmouse><c-o>:call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
2067 exe 'inoremap <buffer> <silent> <rightmouse> <c-o><leftmouse><c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002068 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002069 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002070 exe 'nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("'.mapsafeusermach.'")<cr>'
2071 exe 'nnoremap <buffer> <silent> D :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
2072 exe 'nnoremap <buffer> <silent> R :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002073 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002074 exe 'vnoremap <buffer> <silent> D :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
2075 exe 'vnoremap <buffer> <silent> R :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
2076 exe 'inoremap <buffer> <silent> <del> <c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
2077 exe 'inoremap <buffer> <silent> d <c-o>:call <SID>NetrwMakeDir("'.mapsafeusermach.'")<cr>'
2078 exe 'inoremap <buffer> <silent> D <c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
2079 exe 'inoremap <buffer> <silent> R <c-o>:call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaarc236c162008-07-13 17:41:49 +00002080 nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002081 inoremap <buffer> <F1> <c-o>:he netrw-quickhelp<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00002082 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002083
2084 " set up Rexplore and leftmouse-double-click
2085 com! Rexplore call s:NetrwRexplore(w:netrw_rexlocal,exists("w:netrw_rexdir")? w:netrw_rexdir : ".")
2086 if g:netrw_mousemaps && g:netrw_retmap
2087 if !hasmapto("<Plug>NetrwReturn")
2088 if maparg("<2-leftmouse>","n") == "" || maparg("<2-leftmouse>","n") =~ '^-$'
2089" call Decho("making map for 2-leftmouse")
2090 nmap <unique> <silent> <2-leftmouse> <Plug>NetrwReturn
2091 elseif maparg("<c-leftmouse>","n") == ""
2092" call Decho("making map for c-leftmouse")
2093 nmap <unique> <silent> <c-leftmouse> <Plug>NetrwReturn
2094 endif
2095 endif
2096 exe 'nnoremap <silent> <Plug>NetrwReturn :Rexplore<cr>'
2097" call Decho("made <Plug>NetrwReturn map")
2098 endif
2099
2100 keepj call s:SetRexDir(a:islocal,b:netrw_curdir)
2101" call Dret("s:NetrwMaps")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002102endfun
2103
2104" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002105" s:ExplorePatHls: converts an Explore pattern into a regular expression search pattern {{{2
2106fun! s:ExplorePatHls(pattern)
2107" call Dfunc("s:ExplorePatHls(pattern<".a:pattern.">)")
2108 let repat= substitute(a:pattern,'^**/\{1,2}','','')
2109" call Decho("repat<".repat.">")
2110 let repat= escape(repat,'][.\')
2111" call Decho("repat<".repat.">")
2112 let repat= '\<'.substitute(repat,'\*','\\(\\S\\+ \\)*\\S\\+','g').'\>'
2113" call Dret("s:ExplorePatHls repat<".repat.">")
2114 return repat
Bram Moolenaar9964e462007-05-05 17:54:07 +00002115endfun
2116
2117" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01002118" s:NetrwBookHistHandler: {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00002119" 0: (user: <mb>) bookmark current directory
2120" 1: (user: <gb>) change to the bookmarked directory
2121" 2: (user: <qb>) list bookmarks
2122" 3: (browsing) record current directory history
2123" 4: (user: <u>) go up (previous) bookmark
2124" 5: (user: <U>) go down (next) bookmark
2125" 6: (user: <mB>) delete bookmark
Bram Moolenaar5c736222010-01-06 20:54:52 +01002126fun! s:NetrwBookHistHandler(chg,curdir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002127" call Dfunc("s:NetrwBookHistHandler(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count." histcnt=".g:netrw_dirhist_cnt." histmax=".g:netrw_dirhistmax)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002128
2129 if a:chg == 0
2130 " bookmark the current directory
2131" call Decho("(user: <b>) bookmark the current directory")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002132 if !exists("g:netrw_bookmarklist")
2133 let g:netrw_bookmarklist= []
2134 endif
2135 if index(g:netrw_bookmarklist,a:curdir) == -1
2136 " curdir not currently in g:netrw_bookmarklist, so include it
2137 call add(g:netrw_bookmarklist,a:curdir)
2138 call sort(g:netrw_bookmarklist)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002139 endif
2140 echo "bookmarked the current directory"
2141
2142 elseif a:chg == 1
2143 " change to the bookmarked directory
Bram Moolenaar5c736222010-01-06 20:54:52 +01002144" call Decho("(user: <".v:count."mb>) change to the bookmarked directory")
2145 if exists("g:netrw_bookmarklist[v:count-1]")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002146 exe "keepj e ".fnameescape(g:netrw_bookmarklist[v:count-1])
Bram Moolenaar9964e462007-05-05 17:54:07 +00002147 else
2148 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
2149 endif
2150
2151 elseif a:chg == 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00002152" redraw!
Bram Moolenaar9964e462007-05-05 17:54:07 +00002153 let didwork= 0
2154 " list user's bookmarks
2155" call Decho("(user: <q>) list user's bookmarks")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002156 if exists("g:netrw_bookmarklist")
2157" call Decho('list '.len(g:netrw_bookmarklist).' bookmarks')
2158 let cnt= 1
2159 for bmd in g:netrw_bookmarklist
2160" call Decho("Netrw Bookmark#".cnt.": ".g:netrw_bookmarklist[cnt-1])
2161 echo "Netrw Bookmark#".cnt.": ".g:netrw_bookmarklist[cnt-1]
2162 let didwork = 1
2163 let cnt = cnt + 1
2164 endfor
Bram Moolenaar9964e462007-05-05 17:54:07 +00002165 endif
2166
2167 " list directory history
Bram Moolenaar5c736222010-01-06 20:54:52 +01002168 let cnt = g:netrw_dirhist_cnt
Bram Moolenaar9964e462007-05-05 17:54:07 +00002169 let first = 1
2170 let histcnt = 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02002171 if g:netrw_dirhistmax > 0
2172 while ( first || cnt != g:netrw_dirhist_cnt )
Bram Moolenaar5c736222010-01-06 20:54:52 +01002173" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:netrw_dirhist_cnt)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002174 let histcnt= histcnt + 1
2175 if exists("g:netrw_dirhist_{cnt}")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002176" call Decho("Netrw History#".histcnt.": ".g:netrw_dirhist_{cnt})
Bram Moolenaaradc21822011-04-01 18:03:16 +02002177 echo "Netrw History#".histcnt.": ".g:netrw_dirhist_{cnt}
2178 let didwork= 1
2179 endif
2180 let first = 0
2181 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
2182 if cnt < 0
2183 let cnt= cnt + g:netrw_dirhistmax
2184 endif
2185 endwhile
2186 else
2187 let g:netrw_dirhist_cnt= 0
2188 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002189 if didwork
2190 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2191 endif
2192
2193 elseif a:chg == 3
2194 " saves most recently visited directories (when they differ)
2195" call Decho("(browsing) record curdir history")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002196 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 +02002197 if g:netrw_dirhistmax > 0
2198 let g:netrw_dirhist_cnt = ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
2199 let g:netrw_dirhist_{g:netrw_dirhist_cnt} = a:curdir
2200 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002201" call Decho("save dirhist#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002202 endif
2203
2204 elseif a:chg == 4
2205 " u: change to the previous directory stored on the history list
2206" call Decho("(user: <u>) chg to prev dir from history")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002207 if g:netrw_dirhistmax > 0
2208 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt - 1 ) % g:netrw_dirhistmax
2209 if g:netrw_dirhist_cnt < 0
2210 let g:netrw_dirhist_cnt= g:netrw_dirhist_cnt + g:netrw_dirhistmax
2211 endif
2212 else
2213 let g:netrw_dirhist_cnt= 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00002214 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002215 if exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}")
2216" call Decho("changedir u#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002217 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
2218 setlocal ma noro
Bram Moolenaar446cb832008-06-24 21:56:24 +00002219" call Decho("setlocal ma noro")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002220 sil! keepj %d
Bram Moolenaar9964e462007-05-05 17:54:07 +00002221 setlocal nomod
Bram Moolenaar446cb832008-06-24 21:56:24 +00002222" call Decho("setlocal nomod")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002223 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002224" " call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt}))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002225 exe "keepj e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt})
Bram Moolenaar9964e462007-05-05 17:54:07 +00002226 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02002227 if g:netrw_dirhistmax > 0
2228 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
2229 else
2230 let g:netrw_dirhist_cnt= 0
2231 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002232 echo "Sorry, no predecessor directory exists yet"
2233 endif
2234
2235 elseif a:chg == 5
2236 " U: change to the subsequent directory stored on the history list
2237" call Decho("(user: <U>) chg to next dir from history")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002238 if g:netrw_dirhistmax > 0
2239 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
2240 if exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002241" call Decho("changedir U#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002242 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
2243 setlocal ma noro
Bram Moolenaar446cb832008-06-24 21:56:24 +00002244" call Decho("setlocal ma noro")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002245 sil! keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00002246" call Decho("removed all lines from buffer (%d)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002247 setlocal nomod
Bram Moolenaar446cb832008-06-24 21:56:24 +00002248" call Decho("setlocal nomod")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002249 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002250" call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt}))
Bram Moolenaaradc21822011-04-01 18:03:16 +02002251 exe "keepj e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt})
2252 else
2253 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt - 1 ) % g:netrw_dirhistmax
2254 if g:netrw_dirhist_cnt < 0
2255 let g:netrw_dirhist_cnt= g:netrw_dirhist_cnt + g:netrw_dirhistmax
2256 endif
2257 echo "Sorry, no successor directory exists yet"
Bram Moolenaar9964e462007-05-05 17:54:07 +00002258 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002259 else
2260 let g:netrw_dirhist_cnt= 0
2261 echo "Sorry, no successor directory exists yet (g:netrw_dirhistmax is ".g:netrw_dirhistmax.")"
Bram Moolenaar9964e462007-05-05 17:54:07 +00002262 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002263
2264 elseif a:chg == 6
Bram Moolenaar5c736222010-01-06 20:54:52 +01002265 " delete the v:count'th bookmark
2266" call Decho("delete bookmark#".v:count."<".g:netrw_bookmarklist[v:count-1].">")
2267 let savefile= s:NetrwHome()."/.netrwbook"
2268 if filereadable(savefile)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002269 keepj call s:NetrwBookHistSave() " done here to merge bookmarks first
2270 keepj call delete(savefile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002271 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002272 keepj call remove(g:netrw_bookmarklist,v:count-1)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002273 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002274 call s:NetrwBookmarkMenu()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002275" call Dret("s:NetrwBookHistHandler")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002276endfun
2277
2278" ---------------------------------------------------------------------
2279" s:NetrwBookHistRead: this function reads bookmarks and history {{{2
2280" Sister function: s:NetrwBookHistSave()
2281fun! s:NetrwBookHistRead()
2282" call Dfunc("s:NetrwBookHistRead()")
2283 if !exists("s:netrw_initbookhist")
2284 let home = s:NetrwHome()
2285 let savefile= home."/.netrwbook"
2286 if filereadable(savefile)
2287" call Decho("sourcing .netrwbook")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002288 exe "keepj so ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01002289 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002290 if g:netrw_dirhistmax > 0
2291 let savefile= home."/.netrwhist"
2292 if filereadable(savefile)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002293" call Decho("sourcing .netrwhist")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002294 exe "keepj so ".savefile
2295 endif
2296 let s:netrw_initbookhist= 1
2297 au VimLeave * call s:NetrwBookHistSave()
Bram Moolenaar5c736222010-01-06 20:54:52 +01002298 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002299 endif
2300" call Dret("s:NetrwBookHistRead")
2301endfun
2302
2303" ---------------------------------------------------------------------
2304" s:NetrwBookHistSave: this function saves bookmarks and history {{{2
2305" Sister function: s:NetrwBookHistRead()
2306" I used to do this via viminfo but that appears to
2307" be unreliable for long-term storage
Bram Moolenaar5c736222010-01-06 20:54:52 +01002308fun! s:NetrwBookHistSave()
2309" call Dfunc("s:NetrwBookHistSave() dirhistmax=".g:netrw_dirhistmax)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002310 if g:netrw_dirhistmax <= 0
2311" call Dret("s:NetrwBookHistSave : dirhistmax=".g:netrw_dirhistmax)
2312 return
2313 endif
2314
Bram Moolenaar5c736222010-01-06 20:54:52 +01002315 let savefile= s:NetrwHome()."/.netrwhist"
2316 1split
2317 call s:NetrwEnew()
2318 setlocal cino= com= cpo-=aA fo=nroql2 tw=0 report=10000 noswf
2319 setlocal nocin noai noci magic nospell nohid wig= noaw
2320 setlocal ma noro write
2321 if exists("&acd") | setlocal noacd | endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002322 sil! keepj %d
Bram Moolenaar5c736222010-01-06 20:54:52 +01002323
2324 " save .netrwhist -- no attempt to merge
Bram Moolenaaradc21822011-04-01 18:03:16 +02002325 sil! file .netrwhist
Bram Moolenaar5c736222010-01-06 20:54:52 +01002326 call setline(1,"let g:netrw_dirhistmax =".g:netrw_dirhistmax)
2327 call setline(2,"let g:netrw_dirhist_cnt =".g:netrw_dirhist_cnt)
2328 let lastline = line("$")
2329 let cnt = 1
2330 while cnt <= g:netrw_dirhist_cnt
2331 call setline((cnt+lastline),'let g:netrw_dirhist_'.cnt."='".g:netrw_dirhist_{cnt}."'")
2332 let cnt= cnt + 1
2333 endwhile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002334 exe "sil! w! ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01002335
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002336 sil keepj %d
Bram Moolenaar5c736222010-01-06 20:54:52 +01002337 if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != []
2338 " merge and write .netrwbook
2339 let savefile= s:NetrwHome()."/.netrwbook"
2340
2341 if filereadable(savefile)
2342 let booklist= deepcopy(g:netrw_bookmarklist)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002343 exe "sil keepj so ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01002344 for bdm in booklist
2345 if index(g:netrw_bookmarklist,bdm) == -1
2346 call add(g:netrw_bookmarklist,bdm)
2347 endif
2348 endfor
2349 call sort(g:netrw_bookmarklist)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002350 exe "sil! w! ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01002351 endif
2352
2353 " construct and save .netrwbook
2354 call setline(1,"let g:netrw_bookmarklist= ".string(g:netrw_bookmarklist))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002355 exe "sil! w! ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01002356 endif
2357 let bgone= bufnr("%")
2358 q!
2359 exe bgone."bwipe!"
2360
2361" call Dret("s:NetrwBookHistSave")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002362endfun
2363
2364" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002365" s:NetrwBrowse: This function uses the command in g:netrw_list_cmd to provide a {{{2
2366" list of the contents of a local or remote directory. It is assumed that the
2367" g:netrw_list_cmd has a string, USEPORT HOSTNAME, that needs to be substituted
2368" with the requested remote hostname first.
2369fun! s:NetrwBrowse(islocal,dirname)
2370 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002371" call Dfunc("s:NetrwBrowse(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".w:netrw_liststyle." ".g:loaded_netrw." buf#".bufnr("%")."<".bufname("%")."> win#".winnr())
Bram Moolenaar446cb832008-06-24 21:56:24 +00002372" call Decho("tab#".tabpagenr()." win#".winnr())
2373" call Dredir("ls!")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002374 if !exists("s:netrw_initbookhist")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002375 keepj call s:NetrwBookHistRead()
Bram Moolenaar5c736222010-01-06 20:54:52 +01002376 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002377
2378 " simplify the dirname (especially for ".."s in dirnames)
2379 if a:dirname !~ '^\a\+://'
2380 let dirname= simplify(a:dirname)
2381 else
2382 let dirname= a:dirname
2383 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002384
2385 if exists("s:netrw_skipbrowse")
2386 unlet s:netrw_skipbrowse
Bram Moolenaarc236c162008-07-13 17:41:49 +00002387" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002388" call Dret("s:NetrwBrowse : s:netrw_skipbrowse=".s:netrw_skipbrowse)
2389 return
2390 endif
2391 if !exists("*shellescape")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002392 keepj call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing shellescape()",69)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002393" call Dret("s:NetrwBrowse : missing shellescape()")
2394 return
2395 endif
2396 if !exists("*fnameescape")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002397 keepj call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing fnameescape()",70)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002398" call Dret("s:NetrwBrowse : missing fnameescape()")
2399 return
2400 endif
2401
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002402 call s:NetrwOptionSave("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002403
2404 " re-instate any marked files
2405 if exists("s:netrwmarkfilelist_{bufnr('%')}")
2406" call Decho("clearing marked files")
2407 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
2408 endif
2409
2410 if a:islocal && exists("w:netrw_acdkeep") && w:netrw_acdkeep
2411" call Decho("handle w:netrw_acdkeep:")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002412" call Decho("keepjumps lcd ".fnameescape(dirname)." (due to w:netrw_acdkeep=".w:netrw_acdkeep." - acd=".&acd.")")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002413 exe 'keepj lcd '.fnameescape(dirname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002414 call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00002415" call Decho("getcwd<".getcwd().">")
2416
Bram Moolenaar5c736222010-01-06 20:54:52 +01002417 elseif !a:islocal && dirname !~ '[\/]$' && dirname !~ '^"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002418 " looks like a regular file, attempt transfer
Bram Moolenaar5c736222010-01-06 20:54:52 +01002419" call Decho("attempt transfer as regular file<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002420
2421 " remove any filetype indicator from end of dirname, except for the {{{3
2422 " "this is a directory" indicator (/).
2423 " There shouldn't be one of those here, anyway.
Bram Moolenaar5c736222010-01-06 20:54:52 +01002424 let path= substitute(dirname,'[*=@|]\r\=$','','e')
Bram Moolenaar446cb832008-06-24 21:56:24 +00002425" call Decho("new path<".path.">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002426 call s:RemotePathAnalysis(dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002427
2428 " remote-read the requested file into current buffer {{{3
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002429 keepj mark '
Bram Moolenaar5c736222010-01-06 20:54:52 +01002430 call s:NetrwEnew(dirname)
2431 call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00002432 setlocal ma noro
2433" call Decho("setlocal ma noro")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002434 let b:netrw_curdir= dirname
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002435" call Decho("exe sil! keepalt file ".fnameescape(s:method."://".s:user.s:machine."/".s:path)." (bt=".&bt.")")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002436 exe "sil! keepj keepalt file ".fnameescape(s:method."://".s:user.s:machine."/".s:path)
2437 exe "sil! keepj keepalt doau BufReadPre ".fnameescape(s:fname)
2438 sil call netrw#NetRead(2,s:method."://".s:user.s:machine."/".s:path)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002439 if s:path !~ '.tar.bz2$' && s:path !~ '.tar.gz' && s:path !~ '.tar.xz' && s:path !~ '.txz'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002440 " netrw.vim and tar.vim have already handled decompression of the tarball; avoiding gzip.vim error
Bram Moolenaaradc21822011-04-01 18:03:16 +02002441 exe "sil keepj keepalt doau BufReadPost ".fnameescape(s:fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002442 endif
2443
2444 " save certain window-oriented variables into buffer-oriented variables {{{3
2445 call s:SetBufWinVars()
2446 call s:NetrwOptionRestore("w:")
2447 setlocal ma nomod
2448
Bram Moolenaarc236c162008-07-13 17:41:49 +00002449" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002450" call Dret("s:NetrwBrowse : file<".s:fname.">")
2451 return
2452 endif
2453
Bram Moolenaaradc21822011-04-01 18:03:16 +02002454 " use buffer-oriented WinVars if buffer variables exist but associated window variables don't {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00002455 call s:UseBufWinVars()
2456
2457 " set up some variables {{{3
2458 let b:netrw_browser_active = 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01002459 let dirname = dirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00002460 let s:last_sort_by = g:netrw_sort_by
2461
2462 " set up menu {{{3
Bram Moolenaaradc21822011-04-01 18:03:16 +02002463 keepj call s:NetrwMenu(1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002464
2465 " set up buffer {{{3
2466 let reusing= s:NetrwGetBuffer(a:islocal,dirname)
2467 " maintain markfile highlighting
2468 if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
2469" call Decho("bufnr(%)=".bufnr('%'))
2470" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
2471 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
2472 else
2473" call Decho("2match none")
2474 2match none
2475 endif
2476 if reusing
2477 call s:NetrwOptionRestore("w:")
2478 setlocal noma nomod nowrap
Bram Moolenaarc236c162008-07-13 17:41:49 +00002479" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002480" call Dret("s:NetrwBrowse : re-using buffer")
2481 return
2482 endif
2483
2484 " set b:netrw_curdir to the new directory name {{{3
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002485" call Decho("set b:netrw_curdir to the new directory name: (buf#".bufnr("%").")")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002486 let b:netrw_curdir= dirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00002487 if b:netrw_curdir =~ '[/\\]$'
2488 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
2489 endif
2490 if b:netrw_curdir == ''
2491 if has("amiga")
2492 " On the Amiga, the empty string connotes the current directory
2493 let b:netrw_curdir= getcwd()
2494 else
2495 " under unix, when the root directory is encountered, the result
2496 " from the preceding substitute is an empty string.
2497 let b:netrw_curdir= '/'
2498 endif
2499 endif
2500 if !a:islocal && b:netrw_curdir !~ '/$'
2501 let b:netrw_curdir= b:netrw_curdir.'/'
2502 endif
2503" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
2504
2505 " ------------
2506 " (local only) {{{3
2507 " ------------
2508 if a:islocal
2509" call Decho("local only:")
2510
2511 " Set up ShellCmdPost handling. Append current buffer to browselist
2512 call s:LocalFastBrowser()
2513
2514 " handle g:netrw_keepdir: set vim's current directory to netrw's notion of the current directory {{{3
2515 if !g:netrw_keepdir
2516" call Decho("handle g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
2517" call Decho("l:acd".(exists("&l:acd")? "=".&l:acd : " doesn't exist"))
2518 if !exists("&l:acd") || !&l:acd
2519" call Decho('exe keepjumps lcd '.fnameescape(b:netrw_curdir))
2520 try
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002521 exe 'keepj lcd '.fnameescape(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002522 catch /^Vim\%((\a\+)\)\=:E472/
2523 call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".b:netrw_curdir."> (permissions?)",61)
2524 if exists("w:netrw_prvdir")
2525 let b:netrw_curdir= w:netrw_prvdir
2526 else
2527 call s:NetrwOptionRestore("w:")
2528 setlocal noma nomod nowrap
2529 let b:netrw_curdir= dirname
Bram Moolenaarc236c162008-07-13 17:41:49 +00002530" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002531" call Dret("s:NetrwBrowse : reusing buffer#".(exists("bufnum")? bufnum : 'N/A')."<".dirname."> getcwd<".getcwd().">")
2532 return
2533 endif
2534 endtry
2535 endif
2536 endif
2537
2538 " --------------------------------
2539 " remote handling: {{{3
2540 " --------------------------------
2541 else
2542" call Decho("remote only:")
2543
Bram Moolenaar5c736222010-01-06 20:54:52 +01002544 " analyze dirname and g:netrw_list_cmd {{{4
2545" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist")."> dirname<".dirname.">")
2546 if dirname =~ "^NetrwTreeListing\>"
Bram Moolenaar446cb832008-06-24 21:56:24 +00002547 let dirname= b:netrw_curdir
Bram Moolenaar5c736222010-01-06 20:54:52 +01002548" call Decho("(dirname was ".dirname.") dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002549 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
2550 let dirname= substitute(b:netrw_curdir,'\\','/','g')
2551 if dirname !~ '/$'
2552 let dirname= dirname.'/'
2553 endif
2554 let b:netrw_curdir = dirname
2555" call Decho("(liststyle is TREELIST) dirname<".dirname.">")
2556 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01002557 let dirname = substitute(dirname,'\\','/','g')
Bram Moolenaar446cb832008-06-24 21:56:24 +00002558" call Decho("(normal) dirname<".dirname.">")
2559 endif
2560
2561 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
2562 if dirname !~ dirpat
2563 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002564 keepj call netrw#ErrorMsg(s:ERROR,"netrw doesn't understand your dirname<".dirname.">",20)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002565 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002566 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002567 setlocal noma nomod nowrap
Bram Moolenaarc236c162008-07-13 17:41:49 +00002568" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002569" call Dret("s:NetrwBrowse : badly formatted dirname<".dirname.">")
2570 return
2571 endif
2572 let b:netrw_curdir= dirname
2573" call Decho("b:netrw_curdir<".b:netrw_curdir."> (remote)")
2574 endif " (additional remote handling)
2575
2576 " -----------------------
2577 " Directory Listing: {{{3
2578 " -----------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02002579 keepj call s:NetrwMaps(a:islocal)
2580 keepj call s:PerformListing(a:islocal)
2581 if v:version >= 700 && has("balloon_eval") && &l:bexpr == ""
2582 let &l:bexpr= "netrw#NetrwBalloonHelp()"
2583 set beval
2584 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002585
2586 " The s:LocalBrowseShellCmdRefresh() function is called by an autocmd
2587 " installed by s:LocalFastBrowser() when g:netrw_fastbrowse <= 1 (ie. slow, medium speed).
2588 " However, s:NetrwBrowse() causes the ShellCmdPost event itself to fire once; setting
2589 " the variable below avoids that second refresh of the screen. The s:LocalBrowseShellCmdRefresh()
2590 " function gets called due to that autocmd; it notices that the following variable is set
2591 " and skips the refresh and sets s:locbrowseshellcmd to zero. Oct 13, 2008
2592 let s:locbrowseshellcmd= 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00002593
Bram Moolenaarc236c162008-07-13 17:41:49 +00002594" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002595" call Dret("s:NetrwBrowse : did PerformListing ft<".&ft.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002596 return
2597endfun
2598
2599" ---------------------------------------------------------------------
2600" s:NetrwFileInfo: supports qf (query for file information) {{{2
2601fun! s:NetrwFileInfo(islocal,fname)
2602" call Dfunc("s:NetrwFileInfo(islocal=".a:islocal." fname<".a:fname.">)")
2603 if a:islocal
2604 if (has("unix") || has("macunix")) && executable("/bin/ls")
2605 if exists("b:netrw_curdir")
2606" call Decho('using ls with b:netrw_curdir<'.b:netrw_curdir.'>')
2607 if b:netrw_curdir =~ '/$'
2608 echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir.a:fname))
2609 else
2610 echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir."/".a:fname))
2611 endif
2612 else
2613" call Decho('using ls '.a:fname." using cwd<".getcwd().">")
2614 echo system("/bin/ls -lsad ".shellescape(a:fname))
2615 endif
2616 else
2617 " use vim functions to return information about file below cursor
2618" call Decho("using vim functions to query for file info")
2619 if !isdirectory(a:fname) && !filereadable(a:fname) && a:fname =~ '[*@/]'
2620 let fname= substitute(a:fname,".$","","")
2621 else
2622 let fname= a:fname
2623 endif
2624 let t = getftime(fname)
2625 let sz = getfsize(fname)
2626 echo a:fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname))
2627" call Decho(fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname)))
2628 endif
2629 else
2630 echo "sorry, \"qf\" not supported yet for remote files"
2631 endif
2632" call Dret("s:NetrwFileInfo")
2633endfun
2634
2635" ---------------------------------------------------------------------
2636" s:NetrwGetBuffer: {{{2
2637" returns 0=cleared buffer
2638" 1=re-used buffer
2639fun! s:NetrwGetBuffer(islocal,dirname)
2640" call Dfunc("s:NetrwGetBuffer(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".g:netrw_liststyle)
2641 let dirname= a:dirname
2642
2643 " re-use buffer if possible {{{3
2644" call Decho("--re-use a buffer if possible--")
2645 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2646 " find NetrwTreeList buffer if there is one
Bram Moolenaar5c736222010-01-06 20:54:52 +01002647" call Decho("find NetrwTreeList buffer if there is one")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002648 if exists("w:netrw_treebufnr") && w:netrw_treebufnr > 0
2649" call Decho(" re-use w:netrw_treebufnr=".w:netrw_treebufnr)
2650 let eikeep= &ei
2651 set ei=all
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002652 exe "sil! b ".w:netrw_treebufnr
Bram Moolenaar446cb832008-06-24 21:56:24 +00002653 let &ei= eikeep
Bram Moolenaar5c736222010-01-06 20:54:52 +01002654" call Dret("s:NetrwGetBuffer : bufnum#".w:netrw_treebufnr."<NetrwTreeListing>")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002655 return
2656 endif
2657 let bufnum= -1
2658" call Decho(" liststyle=TREE but w:netrw_treebufnr doesn't exist")
2659
2660 else
2661 " find buffer number of buffer named precisely the same as dirname {{{3
2662" call Decho("--find buffer numnber of buffer named precisely the same as dirname--")
2663" call Dredir("ls!")
2664
2665 " get dirname and associated buffer number
2666 let bufnum = bufnr(escape(dirname,'\'))
2667" call Decho(" find buffer<".dirname.">'s number ")
2668" call Decho(" bufnr(dirname<".escape(dirname,'\').">)=".bufnum)
2669
2670 if bufnum < 0 && dirname !~ '/$'
Bram Moolenaar5c736222010-01-06 20:54:52 +01002671 " try appending a trailing /
Bram Moolenaar446cb832008-06-24 21:56:24 +00002672" call Decho(" try appending a trailing / to dirname<".dirname.">")
2673 let bufnum= bufnr(escape(dirname.'/','\'))
2674 if bufnum > 0
2675 let dirname= dirname.'/'
2676 endif
2677 endif
2678
2679 if bufnum < 0 && dirname =~ '/$'
Bram Moolenaar5c736222010-01-06 20:54:52 +01002680 " try removing a trailing /
Bram Moolenaar446cb832008-06-24 21:56:24 +00002681" call Decho(" try removing a trailing / from dirname<".dirname.">")
2682 let bufnum= bufnr(escape(substitute(dirname,'/$','',''),'\'))
2683 if bufnum > 0
2684 let dirname= substitute(dirname,'/$','','')
2685 endif
2686 endif
2687
2688" call Decho(" findbuf1: bufnum=bufnr('".dirname."')=".bufnum." bufname(".bufnum.")<".bufname(bufnum)."> (initial)")
2689 " note: !~ was used just below, but that means using ../ to go back would match (ie. abc/def/ and abc/ matches)
2690 if bufnum > 0 && bufname(bufnum) != dirname && bufname(bufnum) != '.'
2691 " handle approximate matches
Bram Moolenaar5c736222010-01-06 20:54:52 +01002692" call Decho(" handling approx match: bufnum#".bufnum."<".bufname(bufnum)."> approx-dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002693 let ibuf = 1
2694 let buflast = bufnr("$")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002695" call Decho(" findbuf2: buflast=bufnr($)=".buflast)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002696 while ibuf <= buflast
2697 let bname= substitute(bufname(ibuf),'\\','/','g')
Bram Moolenaarc236c162008-07-13 17:41:49 +00002698 let bname= substitute(bname,'.\zs/$','','')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002699" call Decho(" findbuf3: while [ibuf=",ibuf."]<=[buflast=".buflast."]: dirname<".dirname."> bname=bufname(".ibuf.")<".bname.">")
2700 if bname != '' && dirname =~ '/'.bname.'/\=$' && dirname !~ '^/'
2701 " bname is not empty
2702 " dirname ends with bname,
2703 " dirname doesn't start with /, so its not a absolute path
2704" call Decho(" findbuf3a: passes test 1 : dirname<".dirname.'> =~ /'.bname.'/\=$ && dirname !~ ^/')
Bram Moolenaar5c736222010-01-06 20:54:52 +01002705 break
2706 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002707 if bname =~ '^'.dirname.'/\=$'
2708 " bname begins with dirname
2709" call Decho(' findbuf3b: passes test 2 : bname<'.bname.'>=~^'.dirname.'/\=$')
Bram Moolenaar5c736222010-01-06 20:54:52 +01002710 break
2711 endif
2712 if dirname =~ '^'.bname.'/$'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002713" call Decho(' findbuf3c: passes test 3 : dirname<'.dirname.'>=~^'.bname.'/$')
2714 break
2715 endif
2716 if bname != '' && dirname =~ '/'.bname.'$' && bname == bufname("%") && line("$") == 1
2717" call Decho(' findbuf3d: passes test 4 : dirname<'.dirname.'>=~ /'.bname.'$')
Bram Moolenaar5c736222010-01-06 20:54:52 +01002718 break
2719 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002720 let ibuf= ibuf + 1
2721 endwhile
2722 if ibuf > buflast
2723 let bufnum= -1
2724 else
2725 let bufnum= ibuf
2726 endif
2727" call Decho(" findbuf4: bufnum=".bufnum." (ibuf=".ibuf." buflast=".buflast.")")
2728 endif
2729 endif
2730
2731 " get enew buffer and name it -or- re-use buffer {{{3
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002732 sil! keepj mark '
Bram Moolenaar446cb832008-06-24 21:56:24 +00002733 if bufnum < 0 || !bufexists(bufnum)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002734" call Decho("--get enew buffer and name it (bufexists([bufnum=".bufnum."])=".bufexists(bufnum).")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002735 call s:NetrwEnew(dirname)
2736" call Decho(" got enew buffer#".bufnr("%")." (altbuf<".expand("#").">)")
2737 " name the buffer
2738 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2739 " Got enew buffer; transform into a NetrwTreeListing
2740" call Decho("--transform enew buffer#".bufnr("%")." into a NetrwTreeListing --")
2741 if !exists("s:netrw_treelistnum")
2742 let s:netrw_treelistnum= 1
2743 else
2744 let s:netrw_treelistnum= s:netrw_treelistnum + 1
2745 endif
2746 let w:netrw_treebufnr= bufnr("%")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002747" call Decho(" exe sil! keepalt file NetrwTreeListing ".fnameescape(s:netrw_treelistnum))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002748 exe 'sil! keepalt file NetrwTreeListing\ '.fnameescape(s:netrw_treelistnum)
2749 set bt=nofile noswf
Bram Moolenaaradc21822011-04-01 18:03:16 +02002750 nnoremap <silent> <buffer> [ :sil call <SID>TreeListMove('[')<cr>
2751 nnoremap <silent> <buffer> ] :sil call <SID>TreeListMove(']')<cr>
2752 nnoremap <silent> <buffer> [[ :sil call <SID>TreeListMove('[')<cr>
2753 nnoremap <silent> <buffer> ]] :sil call <SID>TreeListMove(']')<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002754" call Decho(" tree listing#".s:netrw_treelistnum." bufnr=".w:netrw_treebufnr)
2755 else
2756" let v:errmsg= "" " Decho
2757 let escdirname= fnameescape(dirname)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002758" call Decho(" errmsg<".v:errmsg."> bufnr(escdirname<".escdirname.">)=".bufnr(escdirname)." bufname()<".bufname(bufnr(escdirname)).">")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002759" call Decho(' exe sil! keepalt file '.escdirname)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002760" let v:errmsg= "" " Decho
2761 exe 'sil! keepalt file '.escdirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00002762" call Decho(" errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">")
2763 endif
2764" call Decho(" named enew buffer#".bufnr("%")."<".bufname("%").">")
2765
2766 else " Re-use the buffer
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002767" call Decho("--re-use buffer#".bufnum." (bufexists([bufnum=".bufnum."])=".bufexists(bufnum).")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002768 let eikeep= &ei
2769 set ei=all
2770 if getline(2) =~ '^" Netrw Directory Listing'
2771" call Decho(" re-use buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using: keepalt b ".bufnum)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002772 exe "sil! keepalt b ".bufnum
Bram Moolenaar446cb832008-06-24 21:56:24 +00002773 else
2774" call Decho(" reusing buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using: b ".bufnum)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002775 exe "sil! b ".bufnum
Bram Moolenaar446cb832008-06-24 21:56:24 +00002776 endif
2777 if bufname("%") == '.'
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002778" call Decho("exe sil! keepalt file ".fnameescape(getcwd()))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002779 exe "sil! keepalt file ".fnameescape(getcwd())
Bram Moolenaar446cb832008-06-24 21:56:24 +00002780 endif
2781 let &ei= eikeep
2782 if line("$") <= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02002783 keepj call s:NetrwListSettings(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002784" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but its empty, so refresh it")
2785 return 0
2786 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2787" call Decho("--re-use tree listing--")
2788" call Decho(" clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002789 sil keepj %d
Bram Moolenaaradc21822011-04-01 18:03:16 +02002790 keepj call s:NetrwListSettings(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002791" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but treelist mode always needs a refresh")
2792 return 0
2793 else
2794" call Dret("s:NetrwGetBuffer 1 : buf#".bufnr("%"))
2795 return 1
2796 endif
2797 endif
2798
2799 " do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc {{{3
2800 " fastbrowse Local Remote Hiding a buffer implies it may be re-used (fast)
2801 " slow 0 D D Deleting a buffer implies it will not be re-used (slow)
2802 " med 1 D H
2803 " fast 2 H H
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002804" call Decho("--do netrw settings: make this buffer#".bufnr("%")." not-a-file, modifiable, not line-numbered, etc--")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002805 let fname= expand("%")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002806 keepj call s:NetrwListSettings(a:islocal)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002807" call Decho("exe sil! keepalt file ".fnameescape(fname))
Bram Moolenaaradc21822011-04-01 18:03:16 +02002808 exe "sil! keepj keepalt file ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002809
2810 " delete all lines from buffer {{{3
2811" call Decho("--delete all lines from buffer--")
2812" call Decho(" clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002813 sil! keepalt keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00002814
2815" call Dret("s:NetrwGetBuffer 0 : buf#".bufnr("%"))
2816 return 0
2817endfun
2818
2819" ---------------------------------------------------------------------
2820" s:NetrwGetcwd: get the current directory. {{{2
2821" Change backslashes to forward slashes, if any.
2822" If doesc is true, escape certain troublesome characters
2823fun! s:NetrwGetcwd(doesc)
2824" call Dfunc("NetrwGetcwd(doesc=".a:doesc.")")
2825 let curdir= substitute(getcwd(),'\\','/','ge')
2826 if curdir !~ '[\/]$'
2827 let curdir= curdir.'/'
2828 endif
2829 if a:doesc
2830 let curdir= fnameescape(curdir)
2831 endif
2832" call Dret("NetrwGetcwd <".curdir.">")
2833 return curdir
2834endfun
2835
2836" ---------------------------------------------------------------------
2837" s:NetrwGetWord: it gets the directory/file named under the cursor {{{2
2838fun! s:NetrwGetWord()
2839" call Dfunc("s:NetrwGetWord() line#".line(".")." liststyle=".g:netrw_liststyle." virtcol=".virtcol("."))
2840 call s:UseBufWinVars()
2841
2842 " insure that w:netrw_liststyle is set up
2843 if !exists("w:netrw_liststyle")
2844 if exists("g:netrw_liststyle")
2845 let w:netrw_liststyle= g:netrw_liststyle
2846 else
2847 let w:netrw_liststyle= s:THINLIST
2848 endif
2849" call Decho("w:netrw_liststyle=".w:netrw_liststyle)
2850 endif
2851
2852 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
2853 " Active Banner support
2854" call Decho("active banner handling")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002855 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00002856 let dirname= "./"
2857 let curline= getline('.')
2858
2859 if curline =~ '"\s*Sorted by\s'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002860 keepj norm s
Bram Moolenaar446cb832008-06-24 21:56:24 +00002861 let s:netrw_skipbrowse= 1
2862 echo 'Pressing "s" also works'
2863
2864 elseif curline =~ '"\s*Sort sequence:'
2865 let s:netrw_skipbrowse= 1
2866 echo 'Press "S" to edit sorting sequence'
2867
2868 elseif curline =~ '"\s*Quick Help:'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002869 keepj norm ?
Bram Moolenaar446cb832008-06-24 21:56:24 +00002870 let s:netrw_skipbrowse= 1
2871 echo 'Pressing "?" also works'
2872
2873 elseif curline =~ '"\s*\%(Hiding\|Showing\):'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002874 keepj norm a
Bram Moolenaar446cb832008-06-24 21:56:24 +00002875 let s:netrw_skipbrowse= 1
2876 echo 'Pressing "a" also works'
2877
2878 elseif line("$") > w:netrw_bannercnt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002879 exe 'sil keepj '.w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00002880 endif
2881
2882 elseif w:netrw_liststyle == s:THINLIST
2883" call Decho("thin column handling")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002884 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00002885 let dirname= getline('.')
2886
2887 elseif w:netrw_liststyle == s:LONGLIST
2888" call Decho("long column handling")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002889 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00002890 let dirname= substitute(getline('.'),'^\(\%(\S\+ \)*\S\+\).\{-}$','\1','e')
2891
2892 elseif w:netrw_liststyle == s:TREELIST
2893" call Decho("treelist handling")
2894 let dirname= substitute(getline('.'),'^\(| \)*','','e')
2895
2896 else
2897" call Decho("obtain word from wide listing")
2898 let dirname= getline('.')
2899
2900 if !exists("b:netrw_cpf")
2901 let b:netrw_cpf= 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02002902 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 +01002903 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002904" call Decho("computed cpf=".b:netrw_cpf)
2905 endif
2906
2907" call Decho("buf#".bufnr("%")."<".bufname("%").">")
2908 let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf
2909" call Decho("filestart= ([virtcol=".virtcol(".")."]/[b:netrw_cpf=".b:netrw_cpf."])*b:netrw_cpf=".filestart." bannercnt=".w:netrw_bannercnt)
2910" call Decho("1: dirname<".dirname.">")
2911 if filestart == 0
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002912 keepj norm! 0ma
Bram Moolenaar446cb832008-06-24 21:56:24 +00002913 else
2914 call cursor(line("."),filestart+1)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002915 keepj norm! ma
Bram Moolenaar446cb832008-06-24 21:56:24 +00002916 endif
2917 let rega= @a
Bram Moolenaarc236c162008-07-13 17:41:49 +00002918 let eofname= filestart + b:netrw_cpf + 1
2919 if eofname <= col("$")
2920 call cursor(line("."),filestart+b:netrw_cpf+1)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002921 keepj norm! "ay`a
Bram Moolenaarc236c162008-07-13 17:41:49 +00002922 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002923 keepj norm! "ay$
Bram Moolenaarc236c162008-07-13 17:41:49 +00002924 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002925 let dirname = @a
2926 let @a = rega
2927" call Decho("2: dirname<".dirname.">")
2928 let dirname= substitute(dirname,'\s\+$','','e')
2929" call Decho("3: dirname<".dirname.">")
2930 endif
2931
2932 " symlinks are indicated by a trailing "@". Remove it before further processing.
2933 let dirname= substitute(dirname,"@$","","")
2934
2935 " executables are indicated by a trailing "*". Remove it before further processing.
2936 let dirname= substitute(dirname,"\*$","","")
2937
2938" call Dret("s:NetrwGetWord <".dirname.">")
2939 return dirname
2940endfun
2941
2942" ---------------------------------------------------------------------
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002943" s:NetrwListSettings: make standard settings for a netrw listing {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00002944fun! s:NetrwListSettings(islocal)
2945" call Dfunc("s:NetrwListSettings(islocal=".a:islocal.")")
2946 let fname= bufname("%")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002947" call Decho("setlocal bt=nofile nobl ma nonu nowrap noro")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002948 setlocal bt=nofile nobl ma nonu nowrap noro
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002949" call Decho("exe sil! keepalt file ".fnameescape(fname))
2950 exe "sil! keepalt file ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002951 if g:netrw_use_noswf
2952 setlocal noswf
2953 endif
2954" call Dredir("ls!")
2955" call Decho("exe setlocal ts=".g:netrw_maxfilenamelen)
2956 exe "setlocal ts=".g:netrw_maxfilenamelen
2957 setlocal isk+=.,~,-
2958 if g:netrw_fastbrowse > a:islocal
2959 setlocal bh=hide
2960 else
2961 setlocal bh=delete
2962 endif
2963" call Dret("s:NetrwListSettings")
2964endfun
2965
2966" ---------------------------------------------------------------------
2967" s:NetrwListStyle: {{{2
2968" islocal=0: remote browsing
2969" =1: local browsing
2970fun! s:NetrwListStyle(islocal)
2971" call Dfunc("NetrwListStyle(islocal=".a:islocal.") w:netrw_liststyle=".w:netrw_liststyle)
2972 let fname = s:NetrwGetWord()
2973 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
2974 let w:netrw_liststyle = (w:netrw_liststyle + 1) % s:MAXLIST
2975" call Decho("fname<".fname.">")
2976" call Decho("chgd w:netrw_liststyle to ".w:netrw_liststyle)
2977" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist").">")
2978
2979 if w:netrw_liststyle == s:THINLIST
2980 " use one column listing
2981" call Decho("use one column list")
2982 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2983
2984 elseif w:netrw_liststyle == s:LONGLIST
2985 " use long list
2986" call Decho("use long list")
2987 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
2988
2989 elseif w:netrw_liststyle == s:WIDELIST
2990 " give wide list
2991" call Decho("use wide list")
2992 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2993
2994 elseif w:netrw_liststyle == s:TREELIST
2995" call Decho("use tree list")
2996 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2997
2998 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02002999 keepj call netrw#ErrorMsg(s:WARNING,"bad value for g:netrw_liststyle (=".w:netrw_liststyle.")",46)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003000 let g:netrw_liststyle = s:THINLIST
3001 let w:netrw_liststyle = g:netrw_liststyle
3002 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
3003 endif
3004 setlocal ma noro
3005" call Decho("setlocal ma noro")
3006
3007 " clear buffer - this will cause NetrwBrowse/LocalBrowseCheck to do a refresh
3008" call Decho("clear buffer<".expand("%")."> with :%d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003009 sil! keepj %d
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003010 " following prevents tree listing buffer from being marked "modified"
3011 setlocal nomod
Bram Moolenaar446cb832008-06-24 21:56:24 +00003012
3013 " refresh the listing
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003014" call Decho("refresh the listing")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003015 let svpos= netrw#NetrwSavePosn()
Bram Moolenaaradc21822011-04-01 18:03:16 +02003016 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3017 keepj call netrw#NetrwRestorePosn(svpos)
3018 keepj call s:NetrwCursor()
Bram Moolenaar446cb832008-06-24 21:56:24 +00003019
3020 " keep cursor on the filename
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003021 sil! keepj $
Bram Moolenaar446cb832008-06-24 21:56:24 +00003022 let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
3023" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'))
3024 if result <= 0 && exists("w:netrw_bannercnt")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003025 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00003026 endif
3027
3028" call Dret("NetrwListStyle".(exists("w:netrw_liststyle")? ' : w:netrw_liststyle='.w:netrw_liststyle : ""))
3029endfun
3030
3031" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01003032" s:NetrwBannerCtrl: toggles the display of the banner {{{2
3033fun! s:NetrwBannerCtrl(islocal)
3034" call Dfunc("s:NetrwBannerCtrl(islocal=".a:islocal.") g:netrw_banner=".g:netrw_banner)
3035
3036 " toggle the banner (enable/suppress)
3037 let g:netrw_banner= !g:netrw_banner
3038
3039 " refresh the listing
3040 let svpos= netrw#NetrwSavePosn()
3041 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3042
3043 " keep cursor on the filename
3044 let fname= s:NetrwGetWord()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003045 sil keepj $
Bram Moolenaar5c736222010-01-06 20:54:52 +01003046 let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
3047" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'))
3048 if result <= 0 && exists("w:netrw_bannercnt")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003049 exe "keepj ".w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01003050 endif
3051" call Dret("s:NetrwBannerCtrl : g:netrw_banner=".g:netrw_banner)
3052endfun
3053
3054" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003055" s:NetrwBookmarkMenu: Uses menu priorities {{{2
3056" .2.[cnt] for bookmarks, and
3057" .3.[cnt] for history
3058" (see s:NetrwMenu())
3059fun! s:NetrwBookmarkMenu()
Bram Moolenaar9964e462007-05-05 17:54:07 +00003060 if !exists("s:netrw_menucnt")
3061 return
3062 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003063" call Dfunc("NetrwBookmarkMenu() histcnt=".g:netrw_dirhist_cnt." menucnt=".s:netrw_menucnt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003064
3065 " the following test assures that gvim is running, has menus available, and has menus enabled.
Bram Moolenaaradc21822011-04-01 18:03:16 +02003066 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaar9964e462007-05-05 17:54:07 +00003067 if exists("g:NetrwTopLvlMenu")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003068" call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003069 exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Bookmarks'
3070 exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete'
Bram Moolenaar5c736222010-01-06 20:54:52 +01003071 endif
3072 if !exists("s:netrw_initbookhist")
3073 call s:NetrwBookHistRead()
Bram Moolenaar9964e462007-05-05 17:54:07 +00003074 endif
3075
3076 " show bookmarked places
Bram Moolenaar5c736222010-01-06 20:54:52 +01003077 if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != []
3078 let cnt= 1
3079 for bmd in g:netrw_bookmarklist
Bram Moolenaaradc21822011-04-01 18:03:16 +02003080" call Decho('sil! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmark.'.bmd.' :e '.bmd)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003081 let bmd= escape(bmd,g:netrw_menu_escape)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003082
3083 " show bookmarks for goto menu
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003084 exe 'sil! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks.'.bmd.' :e '.bmd."\<cr>"
Bram Moolenaar5c736222010-01-06 20:54:52 +01003085
3086 " show bookmarks for deletion menu
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003087 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 +01003088 let cnt= cnt + 1
3089 endfor
3090
3091 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003092
3093 " show directory browsing history
Bram Moolenaaradc21822011-04-01 18:03:16 +02003094 if g:netrw_dirhistmax > 0
3095 let cnt = g:netrw_dirhist_cnt
3096 let first = 1
3097 let histcnt = 0
3098 while ( first || cnt != g:netrw_dirhist_cnt )
3099 let histcnt = histcnt + 1
3100 let priority = g:netrw_dirhist_cnt + histcnt
3101 if exists("g:netrw_dirhist_{cnt}")
3102 let histdir= escape(g:netrw_dirhist_{cnt},g:netrw_menu_escape)
3103" call Decho('sil! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir)
3104 exe 'sil! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir."\<cr>"
3105 endif
3106 let first = 0
3107 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
3108 if cnt < 0
3109 let cnt= cnt + g:netrw_dirhistmax
3110 endif
3111 endwhile
3112 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003113
Bram Moolenaar9964e462007-05-05 17:54:07 +00003114 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003115" call Dret("NetrwBookmarkMenu")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003116endfun
3117
3118" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003119" s:NetrwBrowseChgDir: constructs a new directory based on the current {{{2
3120" directory and a new directory name. Also, if the
3121" "new directory name" is actually a file,
3122" NetrwBrowseChgDir() edits the file.
3123fun! s:NetrwBrowseChgDir(islocal,newdir,...)
3124" 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 +00003125
Bram Moolenaar446cb832008-06-24 21:56:24 +00003126 if !exists("b:netrw_curdir")
3127 " Don't try to change-directory: this can happen, for example, when netrw#ErrorMsg has been called
3128 " and the current window is the NetrwMessage window.
3129" call Decho("(NetrwBrowseChgDir) b:netrw_curdir doesn't exist!")
3130" call Decho("getcwd<".getcwd().">")
3131" call Dredir("ls!")
3132" call Dret("s:NetrwBrowseChgDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003133 return
Bram Moolenaar9964e462007-05-05 17:54:07 +00003134 endif
3135
Bram Moolenaaradc21822011-04-01 18:03:16 +02003136 keepj call s:NetrwOptionSave("s:")
3137 keepj call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00003138 let nbcd_curpos = netrw#NetrwSavePosn()
3139 let s:nbcd_curpos_{bufnr('%')} = nbcd_curpos
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003140 if (has("win32") || has("win95") || has("win64") || has("win16"))
3141 let dirname = substitute(b:netrw_curdir,'\\','/','ge')
3142 else
3143 let dirname= b:netrw_curdir
3144 endif
3145 let newdir = a:newdir
3146 let dolockout = 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00003147
Bram Moolenaar446cb832008-06-24 21:56:24 +00003148 " set up o/s-dependent directory recognition pattern
3149 if has("amiga")
3150 let dirpat= '[\/:]$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00003151 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003152 let dirpat= '[\/]$'
3153 endif
3154" call Decho("dirname<".dirname."> dirpat<".dirpat.">")
3155
3156 if dirname !~ dirpat
3157 " apparently vim is "recognizing" that it is in a directory and
Bram Moolenaaradc21822011-04-01 18:03:16 +02003158 " is removing the trailing "/". Bad idea, so let's put it back.
Bram Moolenaar446cb832008-06-24 21:56:24 +00003159 let dirname= dirname.'/'
3160" call Decho("adjusting dirname<".dirname.">")
3161 endif
3162
3163 if newdir !~ dirpat
3164 " ------------
3165 " edit a file:
3166 " ------------
3167" call Decho('case "handling a file": newdir<'.newdir.'> !~ dirpat<'.dirpat.">")
3168 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") && newdir !~ '^\(/\|\a:\)'
3169 let dirname= s:NetrwTreeDir()
3170 if dirname =~ '/$'
3171 let dirname= dirname.newdir
3172 else
3173 let dirname= s:NetrwTreeDir()."/".newdir
3174 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003175" call Decho("dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003176" call Decho("tree listing")
3177 elseif newdir =~ '^\(/\|\a:\)'
3178 let dirname= newdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00003179 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003180 let dirname= s:ComposePath(dirname,newdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003181 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003182" call Decho("handling a file: dirname<".dirname."> (a:0=".a:0.")")
3183 " this lets NetrwBrowseX avoid the edit
3184 if a:0 < 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00003185" call Decho("set up windows for editing<".fnameescape(dirname)."> didsplit=".(exists("s:didsplit")? s:didsplit : "doesn't exist"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02003186 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003187 if !exists("s:didsplit")
3188 if g:netrw_browse_split == 1
3189 new
Bram Moolenaar5c736222010-01-06 20:54:52 +01003190 if !&ea
3191 wincmd _
3192 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003193 elseif g:netrw_browse_split == 2
3194 rightb vert new
Bram Moolenaar5c736222010-01-06 20:54:52 +01003195 if !&ea
3196 wincmd |
3197 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003198 elseif g:netrw_browse_split == 3
3199 tabnew
3200 elseif g:netrw_browse_split == 4
3201 if s:NetrwPrevWinOpen(2) == 3
3202" call Dret("s:NetrwBrowseChgDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003203 return
3204 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003205 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003206 " handling a file, didn't split, so remove menu
3207" call Decho("handling a file+didn't split, so remove menu")
3208 call s:NetrwMenu(0)
3209 " optional change to window
3210 if g:netrw_chgwin >= 1
3211 exe "keepjumps ".g:netrw_chgwin."wincmd w"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003212 endif
3213 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003214 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003215
Bram Moolenaar446cb832008-06-24 21:56:24 +00003216 " the point where netrw actually edits the (local) file
3217 " if its local only: LocalBrowseCheck() doesn't edit a file, but NetrwBrowse() will
3218 if a:islocal
3219" call Decho("edit local file: exe e! ".fnameescape(dirname))
3220 exe "e! ".fnameescape(dirname)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003221 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003222" call Decho("remote file: NetrwBrowse will edit it")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003223 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003224 let dolockout= 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01003225
3226 " handle g:Netrw_funcref -- call external-to-netrw functions
3227 " This code will handle g:Netrw_funcref as an individual function reference
3228 " or as a list of function references. It will ignore anything that's not
3229 " a function reference. See :help Funcref for information about function references.
3230 if exists("g:Netrw_funcref")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003231" call Decho("handle optional Funcrefs")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003232 if type(g:Netrw_funcref) == 2
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003233" call Decho("handling a g:Netrw_funcref")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003234 keepj call g:Netrw_funcref()
Bram Moolenaar5c736222010-01-06 20:54:52 +01003235 elseif type(g:Netrw_funcref) == 3
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003236" call Decho("handling a list of g:Netrw_funcrefs")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003237 for Fncref in g:Netrw_funcref
3238 if type(FncRef) == 2
Bram Moolenaaradc21822011-04-01 18:03:16 +02003239 keepj call FncRef()
Bram Moolenaar5c736222010-01-06 20:54:52 +01003240 endif
3241 endfor
3242 endif
3243 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003244 endif
3245
3246 elseif newdir =~ '^/'
3247 " ---------------------------------
3248 " just go to the new directory spec
3249 " ---------------------------------
3250" call Decho('case "just go to new directory spec": newdir<'.newdir.'>')
3251 let dirname= newdir
Bram Moolenaaradc21822011-04-01 18:03:16 +02003252 keepj call s:SetRexDir(a:islocal,dirname)
3253 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003254
3255 elseif newdir == './'
3256 " --------------------------
3257 " refresh the directory list
3258 " --------------------------
3259" call Decho('case "refresh directory listing": newdir == "./"')
Bram Moolenaaradc21822011-04-01 18:03:16 +02003260 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003261
3262 elseif newdir == '../'
3263 " -------------------
3264 " go up one directory
3265 " -------------------
3266" call Decho('case "go up one directory": newdir == "../"')
3267
3268 if w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
3269 " force a refresh
3270" call Decho("clear buffer<".expand("%")."> with :%d")
3271 setlocal noro ma
3272" call Decho("setlocal noro ma")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003273 keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00003274 endif
3275
3276 if has("amiga")
3277 " amiga
3278" call Decho('case "go up one directory": newdir == "../" and amiga')
3279 if a:islocal
3280 let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+$\)','\1','')
3281 let dirname= substitute(dirname,'/$','','')
3282 else
3283 let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+/$\)','\1','')
3284 endif
3285" call Decho("amiga: dirname<".dirname."> (go up one dir)")
3286
3287 else
3288 " unix or cygwin
3289" call Decho('case "go up one directory": newdir == "../" and unix or cygwin')
3290 if a:islocal
3291 let dirname= substitute(dirname,'^\(.*\)/\([^/]\+\)/$','\1','')
3292 if dirname == ""
3293 let dirname= '/'
3294 endif
3295 else
3296 let dirname= substitute(dirname,'^\(\a\+://.\{-}/\{1,2}\)\(.\{-}\)\([^/]\+\)/$','\1\2','')
3297 endif
3298" call Decho("unix: dirname<".dirname."> (go up one dir)")
3299 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003300 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003301
3302 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
3303" call Decho('case liststyle is TREELIST and w:netrw_treedict exists')
3304 " force a refresh (for TREELIST, wait for NetrwTreeDir() to force the refresh)
3305 setlocal noro ma
3306" call Decho("setlocal noro ma")
3307 if !(exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir"))
3308" call Decho("clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003309 keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00003310 endif
3311 let treedir = s:NetrwTreeDir()
3312 let s:treecurpos = nbcd_curpos
3313 let haskey= 0
3314" call Decho("w:netrw_treedict<".string(w:netrw_treedict).">")
3315
3316 " search treedict for tree dir as-is
3317 if has_key(w:netrw_treedict,treedir)
3318" call Decho('....searched for treedir<'.treedir.'> : found it!')
3319 let haskey= 1
3320 else
3321" call Decho('....searched for treedir<'.treedir.'> : not found')
3322 endif
3323
3324 " search treedict for treedir with a / appended
3325 if !haskey && treedir !~ '/$'
3326 if has_key(w:netrw_treedict,treedir."/")
3327 let treedir= treedir."/"
3328" call Decho('....searched.for treedir<'.treedir.'> found it!')
3329 let haskey = 1
3330 else
3331" call Decho('....searched for treedir<'.treedir.'/> : not found')
3332 endif
3333 endif
3334
3335 " search treedict for treedir with any trailing / elided
3336 if !haskey && treedir =~ '/$'
3337 let treedir= substitute(treedir,'/$','','')
3338 if has_key(w:netrw_treedict,treedir)
3339" call Decho('....searched.for treedir<'.treedir.'> found it!')
3340 let haskey = 1
3341 else
3342" call Decho('....searched for treedir<'.treedir.'> : not found')
3343 endif
3344 endif
3345
3346 if haskey
3347 " close tree listing for selected subdirectory
3348" call Decho("closing selected subdirectory<".dirname.">")
3349 call remove(w:netrw_treedict,treedir)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003350" call Decho("removed entry<".treedir."> from treedict")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003351" call Decho("yielding treedict<".string(w:netrw_treedict).">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003352 let dirname= w:netrw_treetop
Bram Moolenaar446cb832008-06-24 21:56:24 +00003353 else
3354 " go down one directory
3355 let dirname= substitute(treedir,'/*$','/','')
3356" call Decho("go down one dir: treedir<".treedir.">")
3357 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003358 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003359 let s:treeforceredraw = 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00003360
3361 else
3362 " go down one directory
3363 let dirname= s:ComposePath(dirname,newdir)
3364" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003365 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003366 endif
3367
Bram Moolenaaradc21822011-04-01 18:03:16 +02003368 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003369 if dolockout
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003370" call Decho("filewritable(dirname<".dirname.">)=".filewritable(dirname))
3371 if filewritable(dirname)
3372" call Decho("doing modification lockout settings: ma nomod noro")
3373 setlocal ma nomod noro
3374 else
3375" call Decho("doing modification lockout settings: ma nomod ro")
3376 setlocal ma nomod ro
3377 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003378" call Decho("setlocal ma nomod noro")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003379 endif
3380
Bram Moolenaar446cb832008-06-24 21:56:24 +00003381" call Dret("s:NetrwBrowseChgDir <".dirname."> : curpos<".string(getpos(".")).">")
3382 return dirname
Bram Moolenaar9964e462007-05-05 17:54:07 +00003383endfun
3384
3385" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01003386" s:NetrwBrowseX: (implements "x") executes a special "viewer" script or program for the {{{2
3387" given filename; typically this means given their extension.
3388" 0=local, 1=remote
Bram Moolenaar446cb832008-06-24 21:56:24 +00003389fun! netrw#NetrwBrowseX(fname,remote)
3390" call Dfunc("NetrwBrowseX(fname<".a:fname."> remote=".a:remote.")")
3391
Bram Moolenaar5c736222010-01-06 20:54:52 +01003392 " special core dump handler
3393 if a:fname =~ '/core\(\.\d\+\)\=$'
3394 if exists("g:Netrw_corehandler")
3395 if type(g:Netrw_corehandler) == 2
3396 " g:Netrw_corehandler is a function reference (see :help Funcref)
3397" call Decho("g:Netrw_corehandler is a funcref")
3398 call g:Netrw_corehandler(a:fname)
3399 elseif type(g:netrw_corehandler) == 3)
3400 " g:Netrw_corehandler is a List of function references (see :help Funcref)
3401" call Decho("g:Netrw_corehandler is a List")
3402 for Fncref in g:Netrw_corehandler
3403 if type(FncRef) == 2
3404 call FncRef(a:fname)
3405 endif
3406 endfor
3407 endif
3408" call Dret("NetrwBrowseX : coredump handler invoked")
3409 return
3410 endif
3411 endif
3412
Bram Moolenaar446cb832008-06-24 21:56:24 +00003413 " set up the filename
3414 " (lower case the extension, make a local copy of a remote file)
3415 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
3416 if has("win32") || has("win95") || has("win64") || has("win16")
3417 let exten= substitute(exten,'^.*$','\L&\E','')
Bram Moolenaar9964e462007-05-05 17:54:07 +00003418 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003419" call Decho("exten<".exten.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003420
3421 " seems kde systems often have gnome-open due to dependencies, even though
3422 " gnome-open's subsidiary display tools are largely absent. Kde systems
3423 " usually have "kdeinit" running, though... (tnx Mikolaj Machowski)
3424 if !exists("s:haskdeinit")
3425 if has("unix")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003426 let s:haskdeinit= system("ps -e") =~ 'kdeinit'
Bram Moolenaar446cb832008-06-24 21:56:24 +00003427 if v:shell_error
3428 let s:haskdeinit = 0
3429 endif
3430 else
3431 let s:haskdeinit= 0
3432 endif
3433" call Decho("setting s:haskdeinit=".s:haskdeinit)
3434 endif
3435
3436 if a:remote == 1
3437 " create a local copy
Bram Moolenaar5c736222010-01-06 20:54:52 +01003438" call Decho("a:remote=".a:remote.": create a local copy of <".a:fname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003439 setlocal bh=delete
Bram Moolenaar5c736222010-01-06 20:54:52 +01003440 call netrw#NetRead(3,a:fname)
3441 " attempt to rename tempfile
3442 let basename= substitute(a:fname,'^\(.*\)/\(.*\)\.\([^.]*\)$','\2','')
3443 let newname= substitute(s:netrw_tmpfile,'^\(.*\)/\(.*\)\.\([^.]*\)$','\1/'.basename.'.\3','')
3444" call Decho("basename<".basename.">")
3445" call Decho("newname <".newname.">")
3446 if rename(s:netrw_tmpfile,newname) == 0
3447 " renaming succeeded
3448 let fname= newname
3449 else
3450 " renaming failed
3451 let fname= s:netrw_tmpfile
3452 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00003453 else
3454 let fname= a:fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003455 " special ~ handler for local
3456 if fname =~ '^\~' && expand("$HOME") != ""
3457" call Decho('invoking special ~ handler')
3458 let fname= substitute(fname,'^\~',expand("$HOME"),'')
3459 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003460 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003461" call Decho("fname<".fname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003462" call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten))
3463
3464 " set up redirection
3465 if &srr =~ "%s"
3466 if (has("win32") || has("win95") || has("win64") || has("win16"))
3467 let redir= substitute(&srr,"%s","nul","")
3468 else
3469 let redir= substitute(&srr,"%s","/dev/null","")
3470 endif
3471 elseif (has("win32") || has("win95") || has("win64") || has("win16"))
3472 let redir= &srr . "nul"
3473 else
3474 let redir= &srr . "/dev/null"
3475 endif
3476" call Decho("redir{".redir."} srr{".&srr."}")
3477
3478 " extract any viewing options. Assumes that they're set apart by quotes.
3479 if exists("g:netrw_browsex_viewer")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003480" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003481 if g:netrw_browsex_viewer =~ '\s'
3482 let viewer = substitute(g:netrw_browsex_viewer,'\s.*$','','')
3483 let viewopt = substitute(g:netrw_browsex_viewer,'^\S\+\s*','','')." "
3484 let oviewer = ''
3485 let cnt = 1
3486 while !executable(viewer) && viewer != oviewer
3487 let viewer = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\1','')
3488 let viewopt = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\3','')." "
3489 let cnt = cnt + 1
3490 let oviewer = viewer
3491" call Decho("!exe: viewer<".viewer."> viewopt<".viewopt.">")
3492 endwhile
3493 else
3494 let viewer = g:netrw_browsex_viewer
3495 let viewopt = ""
3496 endif
3497" call Decho("viewer<".viewer."> viewopt<".viewopt.">")
3498 endif
3499
3500 " execute the file handler
3501 if exists("g:netrw_browsex_viewer") && g:netrw_browsex_viewer == '-'
3502" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
3503 let ret= netrwFileHandlers#Invoke(exten,fname)
3504
3505 elseif exists("g:netrw_browsex_viewer") && executable(viewer)
3506" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003507" call Decho("exe sil !".viewer." ".viewopt.shellescape(fname,1).redir)
3508 exe "sil !".viewer." ".viewopt.shellescape(fname,1).redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003509 let ret= v:shell_error
3510
3511 elseif has("win32") || has("win64")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003512 if executable("start")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003513" call Decho('exe sil !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1))
3514 exe 'sil !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003515 elseif executable("rundll32")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003516" call Decho('exe sil !rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1))
3517 exe 'sil !rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003518 else
3519 call netrw#ErrorMsg(s:WARNING,"rundll32 not on path",74)
3520 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003521 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3522 let ret= v:shell_error
3523
3524 elseif has("unix") && executable("gnome-open") && !s:haskdeinit
Bram Moolenaaradc21822011-04-01 18:03:16 +02003525" call Decho("exe sil !gnome-open ".shellescape(fname,1)." ".redir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003526 exe "sil !gnome-open ".shellescape(fname,1).redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003527 let ret= v:shell_error
3528
3529 elseif has("unix") && executable("kfmclient") && s:haskdeinit
Bram Moolenaaradc21822011-04-01 18:03:16 +02003530" call Decho("exe sil !kfmclient exec ".shellescape(fname,1)." ".redir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003531 exe "sil !kfmclient exec ".shellescape(fname,1)." ".redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003532 let ret= v:shell_error
3533
3534 elseif has("macunix") && executable("open")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003535" call Decho("exe sil !open ".shellescape(fname,1)." ".redir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003536 exe "sil !open ".shellescape(fname,1)." ".redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003537 let ret= v:shell_error
3538
3539 else
3540 " netrwFileHandlers#Invoke() always returns 0
3541 let ret= netrwFileHandlers#Invoke(exten,fname)
3542 endif
3543
3544 " if unsuccessful, attempt netrwFileHandlers#Invoke()
3545 if ret
3546 let ret= netrwFileHandlers#Invoke(exten,fname)
3547 endif
3548
Bram Moolenaarc236c162008-07-13 17:41:49 +00003549 " restoring redraw! after external file handlers
3550 redraw!
Bram Moolenaar446cb832008-06-24 21:56:24 +00003551
3552 " cleanup: remove temporary file,
3553 " delete current buffer if success with handler,
3554 " return to prior buffer (directory listing)
3555 " Feb 12, 2008: had to de-activiate removal of
3556 " temporary file because it wasn't getting seen.
3557" if a:remote == 1 && fname != a:fname
3558" call Decho("deleting temporary file<".fname.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003559" call s:NetrwDelete(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003560" endif
3561
3562 if a:remote == 1
3563 setlocal bh=delete bt=nofile
3564 if g:netrw_use_noswf
3565 setlocal noswf
3566 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003567 exe "sil! keepj norm! \<c-o>"
Bram Moolenaar446cb832008-06-24 21:56:24 +00003568" redraw!
3569 endif
3570
3571" call Dret("NetrwBrowseX")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003572endfun
3573
3574" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01003575" s:NetrwChgPerm: (implements "gp") change file permission {{{2
3576fun! s:NetrwChgPerm(islocal,curdir)
3577" call Dfunc("s:NetrwChgPerm(islocal=".a:islocal." curdir<".a:curdir.">)")
3578 call inputsave()
3579 let newperm= input("Enter new permission: ")
3580 call inputrestore()
3581 let chgperm= substitute(g:netrw_chgperm,'\<FILENAME\>',shellescape(expand("<cfile>")),'')
3582 let chgperm= substitute(chgperm,'\<PERM\>',shellescape(newperm),'')
3583" call Decho("chgperm<".chgperm.">")
3584 call system(chgperm)
3585 if v:shell_error != 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02003586 keepj call netrw#ErrorMsg(1,"changing permission on file<".expand("<cfile>")."> seems to have failed",75)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003587 endif
3588 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02003589 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaar5c736222010-01-06 20:54:52 +01003590 endif
3591" call Dret("s:NetrwChgPerm")
3592endfun
3593
3594" ---------------------------------------------------------------------
3595" s:NetrwClearExplore: clear explore variables (if any) {{{2
3596fun! s:NetrwClearExplore()
3597" call Dfunc("s:NetrwClearExplore()")
3598 2match none
3599 if exists("s:explore_match") |unlet s:explore_match |endif
3600 if exists("s:explore_indx") |unlet s:explore_indx |endif
3601 if exists("s:netrw_explore_prvdir") |unlet s:netrw_explore_prvdir |endif
3602 if exists("s:dirstarstar") |unlet s:dirstarstar |endif
3603 if exists("s:explore_prvdir") |unlet s:explore_prvdir |endif
3604 if exists("w:netrw_explore_indx") |unlet w:netrw_explore_indx |endif
3605 if exists("w:netrw_explore_listlen")|unlet w:netrw_explore_listlen|endif
3606 if exists("w:netrw_explore_list") |unlet w:netrw_explore_list |endif
3607 if exists("w:netrw_explore_bufnr") |unlet w:netrw_explore_bufnr |endif
3608" redraw!
3609 echo " "
3610 echo " "
3611" call Dret("s:NetrwClearExplore")
3612endfun
3613
3614" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00003615" netrw#Explore: launch the local browser in the directory of the current file {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +01003616" indx: == -1: Nexplore
3617" == -2: Pexplore
3618" == +: this is overloaded:
3619" * If Nexplore/Pexplore is in use, then this refers to the
3620" indx'th item in the w:netrw_explore_list[] of items which
3621" matched the */pattern **/pattern *//pattern **//pattern
3622" * If Hexplore or Vexplore, then this will override
3623" g:netrw_winsize to specify the qty of rows or columns the
3624" newly split window should have.
3625" dosplit==0: the window will be split iff the current file has been modified
3626" dosplit==1: the window will be split before running the local browser
3627" style == 0: Explore style == 1: Explore!
3628" == 2: Hexplore style == 3: Hexplore!
3629" == 4: Vexplore style == 5: Vexplore!
3630" == 6: Texplore
Bram Moolenaar9964e462007-05-05 17:54:07 +00003631fun! netrw#Explore(indx,dosplit,style,...)
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003632" call Dfunc("netrw#Explore(indx=".a:indx." dosplit=".a:dosplit." style=".a:style.",a:1<".a:1.">) &modified=".&modified." a:0=".a:0)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003633 if !exists("b:netrw_curdir")
3634 let b:netrw_curdir= getcwd()
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003635" call Decho("set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003636 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003637 let curdir = simplify(b:netrw_curdir)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003638 let curfiledir = substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
3639" call Decho("curdir<".curdir."> curfiledir<".curfiledir.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003640
3641 " save registers
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003642 sil! let keepregstar = @*
3643 sil! let keepregplus = @+
3644 sil! let keepregslash= @/
Bram Moolenaar9964e462007-05-05 17:54:07 +00003645
3646 " if dosplit or file has been modified
3647 if a:dosplit || &modified || a:style == 6
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003648" call Decho("case dosplit=".a:dosplit." modified=".&modified." a:style=".a:style.": dosplit or file has been modified")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003649 call s:SaveWinVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +01003650 let winsize= g:netrw_winsize
3651 if a:indx > 0
3652 let winsize= a:indx
3653 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003654
3655 if a:style == 0 " Explore, Sexplore
3656" call Decho("style=0: Explore or Sexplore")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003657 exe winsize."wincmd s"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003658
3659 elseif a:style == 1 "Explore!, Sexplore!
3660" call Decho("style=1: Explore! or Sexplore!")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003661 exe winsize."wincmd v"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003662
3663 elseif a:style == 2 " Hexplore
3664" call Decho("style=2: Hexplore")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003665 exe "bel ".winsize."wincmd s"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003666
3667 elseif a:style == 3 " Hexplore!
3668" call Decho("style=3: Hexplore!")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003669 exe "abo ".winsize."wincmd s"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003670
3671 elseif a:style == 4 " Vexplore
3672" call Decho("style=4: Vexplore")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003673 exe "lefta ".winsize."wincmd v"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003674
3675 elseif a:style == 5 " Vexplore!
3676" call Decho("style=5: Vexplore!")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003677 exe "rightb ".winsize."wincmd v"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003678
3679 elseif a:style == 6 " Texplore
3680 call s:SaveBufVars()
3681" call Decho("style = 6: Texplore")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003682 exe "tabnew ".fnameescape(curdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003683 call s:RestoreBufVars()
3684 endif
3685 call s:RestoreWinVars()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003686" else " Decho
3687" call Decho("case a:dosplit=".a:dosplit." AND modified=".&modified." AND a:style=".a:style." is not 6")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003688 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003689 keepj norm! 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00003690
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003691 if a:0 > 0
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003692" call Decho("case [a:0=".a:0."] > 0: a:1<".a:1.">")
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003693 if a:1 =~ '^\~' && (has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003694" call Decho("case a:1: ~ and unix or cygwin")
3695 let dirname= simplify(substitute(a:1,'\~',expand("$HOME"),''))
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003696" call Decho("using dirname<".dirname."> (case: ~ && unix||cygwin)")
3697 elseif a:1 == '.'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003698" call Decho("case a:1: .")
3699 let dirname= simplify(exists("b:netrw_curdir")? b:netrw_curdir : getcwd())
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003700 if dirname !~ '/$'
3701 let dirname= dirname."/"
3702 endif
3703" call Decho("using dirname<".dirname."> (case: ".(exists("b:netrw_curdir")? "b:netrw_curdir" : "getcwd()").")")
3704 elseif a:1 =~ '\$'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003705" call Decho("case a:1: $")
3706 let dirname= simplify(expand(a:1))
Bram Moolenaar5c736222010-01-06 20:54:52 +01003707" call Decho("using user-specified dirname<".dirname."> with $env-var")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003708 elseif a:1 !~ '^\*/'
3709" call Decho("case a:1: other, not pattern or filepattern")
3710 let dirname= simplify(a:1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003711" call Decho("using user-specified dirname<".dirname.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003712 else
3713" call Decho("case a:1: pattern or filepattern")
3714 let dirname= a:1
Bram Moolenaar9964e462007-05-05 17:54:07 +00003715 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003716 else
3717 " clear explore
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003718" call Decho("case a:0=".a:0.": clearing Explore list")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003719 call s:NetrwClearExplore()
Bram Moolenaar446cb832008-06-24 21:56:24 +00003720" call Dret("netrw#Explore : cleared list")
3721 return
Bram Moolenaar9964e462007-05-05 17:54:07 +00003722 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003723
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003724" call Decho("dirname<".dirname.">")
3725 if dirname =~ '\.\./\=$'
3726 let dirname= simplify(fnamemodify(dirname,':p:h'))
3727 elseif dirname =~ '\.\.' || dirname == '.'
3728 let dirname= simplify(fnamemodify(dirname,':p'))
3729 endif
3730" call Decho("dirname<".dirname."> (after simplify)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003731
Bram Moolenaar446cb832008-06-24 21:56:24 +00003732 if dirname =~ '/\*\*/'
3733 " handle .../**/.../filepat
3734" call Decho("case Explore .../**/.../filepat")
3735 let prefixdir= substitute(dirname,'^\(.\{-}\)\*\*.*$','\1','')
3736 if prefixdir =~ '^/' || (prefixdir =~ '^\a:/' && (has("win32") || has("win95") || has("win64") || has("win16")))
3737 let b:netrw_curdir = prefixdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00003738 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003739 let b:netrw_curdir= getcwd().'/'.prefixdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00003740 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003741 let dirname= substitute(dirname,'^.\{-}\(\*\*/.*\)$','\1','')
3742 let starpat= 4;
3743" call Decho("pwd<".getcwd()."> dirname<".dirname.">")
3744" call Decho("case Explore ../**/../filepat (starpat=".starpat.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003745
Bram Moolenaar446cb832008-06-24 21:56:24 +00003746 elseif dirname =~ '^\*//'
3747 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
3748" call Decho("case Explore *//pattern")
3749 let pattern= substitute(dirname,'^\*//\(.*\)$','\1','')
3750 let starpat= 1
3751" call Decho("Explore *//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
3752 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
3753
3754 elseif dirname =~ '^\*\*//'
3755 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
3756" call Decho("case Explore **//pattern")
3757 let pattern= substitute(dirname,'^\*\*//','','')
3758 let starpat= 2
3759" call Decho("Explore **//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
3760
3761 elseif dirname =~ '^\*/'
3762 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
3763 let starpat= 3
3764" call Decho("case Explore */filepat (starpat=".starpat.")")
3765
3766 elseif dirname=~ '^\*\*/'
3767 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
3768 let starpat= 4
3769" call Decho("case Explore **/filepat (starpat=".starpat.")")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003770
Bram Moolenaar446cb832008-06-24 21:56:24 +00003771 else
3772 let starpat= 0
Bram Moolenaar5c736222010-01-06 20:54:52 +01003773" call Decho("default case: starpat=".starpat)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003774 endif
3775
3776 if starpat == 0 && a:indx >= 0
3777 " [Explore Hexplore Vexplore Sexplore] [dirname]
Bram Moolenaar5c736222010-01-06 20:54:52 +01003778" call Decho("case starpat==0 && a:indx=".a:indx.": dirname<".dirname."> Explore Hexplore Vexplore Sexplore")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003779 if dirname == ""
Bram Moolenaar5c736222010-01-06 20:54:52 +01003780 let dirname= curfiledir
3781" call Decho("empty dirname, using current file's directory<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003782 endif
3783 if dirname =~ '^scp:' || dirname =~ '^ftp:'
3784" call Decho("calling NetrwBrowse(0,dirname<".dirname.">)")
3785 call s:NetrwBrowse(0,dirname)
3786 else
3787 if dirname == ""|let dirname= getcwd()|endif
3788" call Decho("calling LocalBrowseCheck(dirname<".dirname.">)")
3789 call netrw#LocalBrowseCheck(dirname)
3790 endif
3791
Bram Moolenaar5c736222010-01-06 20:54:52 +01003792" call Decho("curdir<".curdir.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003793 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003794 keepj call search('\<'.substitute(curdir,'^.*[/\\]','','e').'\>','cW')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003795 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003796 keepj call search('\<'.substitute(curdir,'^.*/','','e').'\>','cW')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003797 endif
3798
3799 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
3800 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
3801 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
3802 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
3803 elseif a:indx <= 0
3804 " Nexplore, Pexplore, Explore: handle starpat
Bram Moolenaar5c736222010-01-06 20:54:52 +01003805" call Decho("case a:indx<=0: Nexplore, Pexplore, <s-down>, <s-up> starpat=".starpat." a:indx=".a:indx)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003806 if !mapcheck("<s-up>","n") && !mapcheck("<s-down>","n") && exists("b:netrw_curdir")
3807" call Decho("set up <s-up> and <s-down> maps")
3808 let s:didstarstar= 1
3809 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
3810 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
3811 endif
3812
3813 if has("path_extra")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003814" call Decho("starpat=".starpat.": has +path_extra")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003815 if !exists("w:netrw_explore_indx")
3816 let w:netrw_explore_indx= 0
3817 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003818
Bram Moolenaar9964e462007-05-05 17:54:07 +00003819 let indx = a:indx
Bram Moolenaar446cb832008-06-24 21:56:24 +00003820" call Decho("starpat=".starpat.": set indx= [a:indx=".indx."]")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003821
Bram Moolenaar9964e462007-05-05 17:54:07 +00003822 if indx == -1
Bram Moolenaar446cb832008-06-24 21:56:24 +00003823 " Nexplore
3824" call Decho("case Nexplore with starpat=".starpat.": (indx=".indx.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003825 if !exists("w:netrw_explore_list") " sanity check
Bram Moolenaaradc21822011-04-01 18:03:16 +02003826 keepj call netrw#ErrorMsg(s:WARNING,"using Nexplore or <s-down> improperly; see help for netrw-starstar",40)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003827 sil! let @* = keepregstar
3828 sil! let @+ = keepregstar
3829 sil! let @/ = keepregslash
Bram Moolenaar9964e462007-05-05 17:54:07 +00003830" call Dret("netrw#Explore")
3831 return
3832 endif
3833 let indx= w:netrw_explore_indx
3834 if indx < 0 | let indx= 0 | endif
3835 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
3836 let curfile= w:netrw_explore_list[indx]
3837" call Decho("indx=".indx." curfile<".curfile.">")
3838 while indx < w:netrw_explore_listlen && curfile == w:netrw_explore_list[indx]
3839 let indx= indx + 1
3840" call Decho("indx=".indx." (Nexplore while loop)")
3841 endwhile
3842 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
3843" call Decho("Nexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
3844
3845 elseif indx == -2
Bram Moolenaar446cb832008-06-24 21:56:24 +00003846 " Pexplore
3847" call Decho("case Pexplore with starpat=".starpat.": (indx=".indx.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003848 if !exists("w:netrw_explore_list") " sanity check
Bram Moolenaaradc21822011-04-01 18:03:16 +02003849 keepj call netrw#ErrorMsg(s:WARNING,"using Pexplore or <s-up> improperly; see help for netrw-starstar",41)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003850 sil! let @* = keepregstar
3851 sil! let @+ = keepregstar
3852 sil! let @/ = keepregslash
Bram Moolenaar9964e462007-05-05 17:54:07 +00003853" call Dret("netrw#Explore")
3854 return
3855 endif
3856 let indx= w:netrw_explore_indx
3857 if indx < 0 | let indx= 0 | endif
3858 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
3859 let curfile= w:netrw_explore_list[indx]
3860" call Decho("indx=".indx." curfile<".curfile.">")
3861 while indx >= 0 && curfile == w:netrw_explore_list[indx]
3862 let indx= indx - 1
3863" call Decho("indx=".indx." (Pexplore while loop)")
3864 endwhile
3865 if indx < 0 | let indx= 0 | endif
3866" call Decho("Pexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
3867
3868 else
3869 " Explore -- initialize
3870 " build list of files to Explore with Nexplore/Pexplore
Bram Moolenaar446cb832008-06-24 21:56:24 +00003871" call Decho("starpat=".starpat.": case Explore: initialize (indx=".indx.")")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003872 keepj call s:NetrwClearExplore()
Bram Moolenaar9964e462007-05-05 17:54:07 +00003873 let w:netrw_explore_indx= 0
3874 if !exists("b:netrw_curdir")
3875 let b:netrw_curdir= getcwd()
3876 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003877" call Decho("starpat=".starpat.": b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003878
Bram Moolenaar446cb832008-06-24 21:56:24 +00003879 " switch on starpat to build the w:netrw_explore_list of files
3880 if starpat == 1
3881 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
3882" call Decho("starpat=".starpat.": build *//pattern list")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003883" call Decho("pattern<".pattern.">")
3884 try
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003885 exe "keepj noautocmd vimgrep /".pattern."/gj ".fnameescape(b:netrw_curdir)."/*"
Bram Moolenaar5c736222010-01-06 20:54:52 +01003886 catch /^Vim\%((\a\+)\)\=:E480/
3887 call netrw#ErrorMsg(s:WARNING,"no match with pattern<".pattern.">",76)
3888" call Dret("netrw#Explore : unable to find pattern<".pattern.">")
3889 return
3890 endtry
3891 let w:netrw_explore_list = s:NetrwExploreListUniq(map(getqflist(),'bufname(v:val.bufnr)'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003892 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
3893
3894 elseif starpat == 2
3895 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
3896" call Decho("starpat=".starpat.": build **//pattern list")
3897 try
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003898 exe "sil keepj noautocmd vimgrep /".pattern."/gj "."**/*"
Bram Moolenaar446cb832008-06-24 21:56:24 +00003899 catch /^Vim\%((\a\+)\)\=:E480/
Bram Moolenaar5c736222010-01-06 20:54:52 +01003900 call netrw#ErrorMsg(s:WARNING,'no files matched pattern<'.pattern.'>',45)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003901 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003902 sil! let @* = keepregstar
3903 sil! let @+ = keepregstar
3904 sil! let @/ = keepregslash
Bram Moolenaar446cb832008-06-24 21:56:24 +00003905" call Dret("netrw#Explore : no files matched pattern")
3906 return
3907 endtry
3908 let s:netrw_curdir = b:netrw_curdir
3909 let w:netrw_explore_list = getqflist()
Bram Moolenaar5c736222010-01-06 20:54:52 +01003910 let w:netrw_explore_list = s:NetrwExploreListUniq(map(w:netrw_explore_list,'s:netrw_curdir."/".bufname(v:val.bufnr)'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003911
3912 elseif starpat == 3
3913 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
3914" call Decho("starpat=".starpat.": build */filepat list")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003915 let filepat= substitute(dirname,'^\*/','','')
3916 let filepat= substitute(filepat,'^[%#<]','\\&','')
3917" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
3918" call Decho("filepat<".filepat.">")
3919 let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".filepat),'\n'))
3920 if &hls | let keepregslash= s:ExplorePatHls(filepat) | endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003921
3922 elseif starpat == 4
3923 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
3924" call Decho("starpat=".starpat.": build **/filepat list")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003925 let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".dirname),'\n'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003926 if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif
3927 endif " switch on starpat to build w:netrw_explore_list
Bram Moolenaar9964e462007-05-05 17:54:07 +00003928
3929 let w:netrw_explore_listlen = len(w:netrw_explore_list)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003930" call Decho("w:netrw_explore_list<".string(w:netrw_explore_list).">")
3931" call Decho("w:netrw_explore_listlen=".w:netrw_explore_listlen)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003932
3933 if w:netrw_explore_listlen == 0 || (w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/')
Bram Moolenaaradc21822011-04-01 18:03:16 +02003934 keepj call netrw#ErrorMsg(s:WARNING,"no files matched",42)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003935 sil! let @* = keepregstar
3936 sil! let @+ = keepregstar
3937 sil! let @/ = keepregslash
Bram Moolenaar9964e462007-05-05 17:54:07 +00003938" call Dret("netrw#Explore : no files matched")
3939 return
3940 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003941 endif " if indx ... endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003942
3943 " NetrwStatusLine support - for exploring support
3944 let w:netrw_explore_indx= indx
Bram Moolenaar5c736222010-01-06 20:54:52 +01003945" call Decho("w:netrw_explore_list<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003946
3947 " wrap the indx around, but issue a note
3948 if indx >= w:netrw_explore_listlen || indx < 0
3949" call Decho("wrap indx (indx=".indx." listlen=".w:netrw_explore_listlen.")")
3950 let indx = (indx < 0)? ( w:netrw_explore_listlen - 1 ) : 0
3951 let w:netrw_explore_indx= indx
Bram Moolenaaradc21822011-04-01 18:03:16 +02003952 keepj call netrw#ErrorMsg(s:NOTE,"no more files match Explore pattern",43)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003953 endif
3954
3955 exe "let dirfile= w:netrw_explore_list[".indx."]"
3956" call Decho("dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">")
3957 let newdir= substitute(dirfile,'/[^/]*$','','e')
3958" call Decho("newdir<".newdir.">")
3959
3960" call Decho("calling LocalBrowseCheck(newdir<".newdir.">)")
3961 call netrw#LocalBrowseCheck(newdir)
3962 if !exists("w:netrw_liststyle")
3963 let w:netrw_liststyle= g:netrw_liststyle
3964 endif
3965 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:LONGLIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003966 keepj call search('^'.substitute(dirfile,"^.*/","","").'\>',"W")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003967 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003968 keepj call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003969 endif
3970 let w:netrw_explore_mtchcnt = indx + 1
3971 let w:netrw_explore_bufnr = bufnr("%")
3972 let w:netrw_explore_line = line(".")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003973 keepj call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}')
Bram Moolenaar9964e462007-05-05 17:54:07 +00003974" call Decho("explore: mtchcnt=".w:netrw_explore_mtchcnt." bufnr=".w:netrw_explore_bufnr." line#".w:netrw_explore_line)
3975
3976 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003977" call Decho("your vim does not have +path_extra")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003978 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003979 keepj call netrw#ErrorMsg(s:WARNING,"your vim needs the +path_extra feature for Exploring with **!",44)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003980 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003981 sil! let @* = keepregstar
3982 sil! let @+ = keepregstar
3983 sil! let @/ = keepregslash
Bram Moolenaar9964e462007-05-05 17:54:07 +00003984" call Dret("netrw#Explore : missing +path_extra")
3985 return
3986 endif
3987
3988 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01003989" call Decho("default case: Explore newdir<".dirname.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003990 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && dirname =~ '/'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003991 sil! unlet w:netrw_treedict
3992 sil! unlet w:netrw_treetop
Bram Moolenaar9964e462007-05-05 17:54:07 +00003993 endif
3994 let newdir= dirname
3995 if !exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003996 keepj call netrw#LocalBrowseCheck(getcwd())
Bram Moolenaar9964e462007-05-05 17:54:07 +00003997 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02003998 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,newdir))
Bram Moolenaar9964e462007-05-05 17:54:07 +00003999 endif
4000 endif
4001
Bram Moolenaar446cb832008-06-24 21:56:24 +00004002 " visual display of **/ **// */ Exploration files
Bram Moolenaar5c736222010-01-06 20:54:52 +01004003" call Decho("w:netrw_explore_indx=".(exists("w:netrw_explore_indx")? w:netrw_explore_indx : "doesn't exist"))
4004" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "n/a").">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004005 if exists("w:netrw_explore_indx") && exists("b:netrw_curdir")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004006" call Decho("s:explore_prvdir<".(exists("s:explore_prvdir")? s:explore_prvdir : "-doesn't exist-"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004007 if !exists("s:explore_prvdir") || s:explore_prvdir != b:netrw_curdir
4008 " only update match list if current directory isn't the same as before
Bram Moolenaar5c736222010-01-06 20:54:52 +01004009" call Decho("only update match list if current directory not the same as before")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004010 let s:explore_prvdir = b:netrw_curdir
4011 let s:explore_match = ""
Bram Moolenaar5c736222010-01-06 20:54:52 +01004012 let dirlen = s:Strlen(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004013 if b:netrw_curdir !~ '/$'
4014 let dirlen= dirlen + 1
4015 endif
4016 let prvfname= ""
4017 for fname in w:netrw_explore_list
4018" call Decho("fname<".fname.">")
4019 if fname =~ '^'.b:netrw_curdir
4020 if s:explore_match == ""
Bram Moolenaar5c736222010-01-06 20:54:52 +01004021 let s:explore_match= '\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004022 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01004023 let s:explore_match= s:explore_match.'\|\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004024 endif
4025 elseif fname !~ '^/' && fname != prvfname
4026 if s:explore_match == ""
Bram Moolenaar5c736222010-01-06 20:54:52 +01004027 let s:explore_match= '\<'.escape(fname,g:netrw_markfileesc).'\>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004028 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01004029 let s:explore_match= s:explore_match.'\|\<'.escape(fname,g:netrw_markfileesc).'\>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004030 endif
4031 endif
4032 let prvfname= fname
4033 endfor
4034" call Decho("explore_match<".s:explore_match.">")
4035 exe "2match netrwMarkFile /".s:explore_match."/"
4036 endif
4037 echo "<s-up>==Pexplore <s-down>==Nexplore"
4038 else
4039 2match none
4040 if exists("s:explore_match") | unlet s:explore_match | endif
4041 if exists("s:explore_prvdir") | unlet s:explore_prvdir | endif
4042 echo " "
4043" call Decho("cleared explore match list")
4044 endif
4045
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004046 sil! let @* = keepregstar
4047 sil! let @+ = keepregstar
4048 sil! let @/ = keepregslash
Bram Moolenaar9964e462007-05-05 17:54:07 +00004049" call Dret("netrw#Explore : @/<".@/.">")
4050endfun
4051
4052" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01004053" s:NetrwExploreListUniq: {{{2
4054fun! s:NetrwExploreListUniq(explist)
4055" call Dfunc("s:NetrwExploreListUniq(explist)")
4056
4057 " this assumes that the list is already sorted
4058 let newexplist= []
4059 for member in a:explist
4060 if !exists("uniqmember") || member != uniqmember
4061 let uniqmember = member
4062 let newexplist = newexplist + [ member ]
4063 endif
4064 endfor
4065
4066" call Dret("s:NetrwExploreListUniq")
4067 return newexplist
4068endfun
4069
4070" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02004071" s:NetrwForceChgDir: (gd support) Force treatment as a directory {{{2
4072fun! s:NetrwForceChgDir(islocal,newdir)
4073" call Dfunc("s:NetrwForceChgDir(islocal=".a:islocal." newdir<".a:newdir.">)")
4074 if a:newdir !~ '/$'
4075 " ok, looks like force is needed to get directory-style treatment
4076 if a:newdir =~ '@$'
4077 let newdir= substitute(a:newdir,'@$','/','')
4078 elseif a:newdir =~ '[*=|\\]$'
4079 let newdir= substitute(a:newdir,'.$','/','')
4080 else
4081 let newdir= a:newdir.'/'
4082 endif
4083" call Decho("adjusting newdir<".newdir."> due to gd")
4084 else
4085 " should already be getting treatment as a directory
4086 let newdir= a:newdir
4087 endif
4088 call s:NetrwBrowseChgDir(a:islocal,newdir)
4089 call s:NetrwBrowse(a:islocal,newdir)
4090" call Dret("s:NetrwForceChgDir")
4091endfun
4092
4093" ---------------------------------------------------------------------
4094" s:NetrwForceFile: (gf support) Force treatment as a file {{{2
4095fun! s:NetrwForceFile(islocal,newfile)
4096" " call Dfunc("s:NetrwForceFile(islocal=".a:islocal." newdir<".a:newdir.">)")
4097 if a:newfile =~ '[/@*=|\\]$'
4098 let newfile= substitute(a:newfile,'.$','','')
4099 else
4100 let newfile= a:newfile
4101 endif
4102 call s:NetrwBrowseChgDir(a:islocal,newfile)
4103" call Dret("s:NetrwForceFile")
4104endfun
4105
4106" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004107" s:NetrwHide: this function is invoked by the "a" map for browsing {{{2
4108" and switches the hiding mode. The actual hiding is done by
4109" s:NetrwListHide().
4110" g:netrw_hide= 0: show all
4111" 1: show not-hidden files
4112" 2: show hidden files only
4113fun! s:NetrwHide(islocal)
4114" call Dfunc("NetrwHide(islocal=".a:islocal.") g:netrw_hide=".g:netrw_hide)
4115 let svpos= netrw#NetrwSavePosn()
4116
4117 if exists("s:netrwmarkfilelist_{bufnr('%')}")
4118" call Decho(((g:netrw_hide == 1)? "unhide" : "hide")." files in markfilelist<".string(s:netrwmarkfilelist_{bufnr("%")}).">")
4119" call Decho("g:netrw_list_hide<".g:netrw_list_hide.">")
4120
4121 " hide the files in the markfile list
4122 for fname in s:netrwmarkfilelist_{bufnr("%")}
4123" call Decho("match(g:netrw_list_hide<".g:netrw_list_hide.'> fname<\<'.fname.'\>>)='.match(g:netrw_list_hide,'\<'.fname.'\>')." isk=".&isk)
4124 if match(g:netrw_list_hide,'\<'.fname.'\>') != -1
4125 " remove fname from hiding list
4126 let g:netrw_list_hide= substitute(g:netrw_list_hide,'..\<'.escape(fname,g:netrw_fname_escape).'\>..','','')
4127 let g:netrw_list_hide= substitute(g:netrw_list_hide,',,',',','g')
4128 let g:netrw_list_hide= substitute(g:netrw_list_hide,'^,\|,$','','')
4129" call Decho("unhide: g:netrw_list_hide<".g:netrw_list_hide.">")
4130 else
4131 " append fname to hiding list
4132 if exists("g:netrw_list_hide") && g:netrw_list_hide != ""
4133 let g:netrw_list_hide= g:netrw_list_hide.',\<'.escape(fname,g:netrw_fname_escape).'\>'
4134 else
4135 let g:netrw_list_hide= '\<'.escape(fname,g:netrw_fname_escape).'\>'
4136 endif
4137" call Decho("hide: g:netrw_list_hide<".g:netrw_list_hide.">")
4138 endif
4139 endfor
Bram Moolenaaradc21822011-04-01 18:03:16 +02004140 keepj call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004141 let g:netrw_hide= 1
4142
4143 else
4144
4145 " switch between show-all/show-not-hidden/show-hidden
4146 let g:netrw_hide=(g:netrw_hide+1)%3
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004147 exe "keepj norm! 0"
Bram Moolenaar446cb832008-06-24 21:56:24 +00004148 if g:netrw_hide && g:netrw_list_hide == ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02004149 keepj call netrw#ErrorMsg(s:WARNING,"your hiding list is empty!",49)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004150" call Dret("NetrwHide")
4151 return
4152 endif
4153 endif
4154
Bram Moolenaaradc21822011-04-01 18:03:16 +02004155 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4156 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004157" call Dret("NetrwHide")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004158endfun
4159
4160" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004161" s:NetrwHidden: invoked by "gh" {{{2
4162fun! s:NetrwHidden(islocal)
4163" call Dfunc("s:NetrwHidden()")
4164 " save current position
4165 let svpos= netrw#NetrwSavePosn()
4166
4167 if g:netrw_list_hide =~ '\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+'
4168 " remove pattern from hiding list
4169 let g:netrw_list_hide= substitute(g:netrw_list_hide,'\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+','','')
Bram Moolenaar5c736222010-01-06 20:54:52 +01004170 elseif s:Strlen(g:netrw_list_hide) >= 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00004171 let g:netrw_list_hide= g:netrw_list_hide . ',\(^\|\s\s\)\zs\.\S\+'
4172 else
4173 let g:netrw_list_hide= '\(^\|\s\s\)\zs\.\S\+'
4174 endif
4175
4176 " refresh screen and return to saved position
Bram Moolenaaradc21822011-04-01 18:03:16 +02004177 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4178 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004179" call Dret("s:NetrwHidden")
4180endfun
4181
4182" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01004183" s:NetrwHome: this function determines a "home" for saving bookmarks and history {{{2
4184fun! s:NetrwHome()
4185 if exists("g:netrw_home")
4186 let home= g:netrw_home
4187 else
4188 " go to vim plugin home
4189 for home in split(&rtp,',') + ['']
4190 if isdirectory(home) && filewritable(home) | break | endif
4191 let basehome= substitute(home,'[/\\]\.vim$','','')
4192 if isdirectory(basehome) && filewritable(basehome)
4193 let home= basehome."/.vim"
4194 break
4195 endif
4196 endfor
4197 if home == ""
4198 " just pick the first directory
4199 let home= substitute(&rtp,',.*$','','')
4200 endif
4201 if (has("win32") || has("win95") || has("win64") || has("win16"))
4202 let home= substitute(home,'/','\\','g')
4203 endif
4204 endif
4205 " insure that the home directory exists
4206 if !isdirectory(home)
4207 if exists("g:netrw_mkdir")
4208 call system(g:netrw_mkdir." ".shellescape(home))
4209 else
4210 call mkdir(home)
4211 endif
4212 endif
4213 let g:netrw_home= home
4214 return home
4215endfun
4216
4217" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004218" s:NetrwLeftmouse: handles the <leftmouse> when in a netrw browsing window {{{2
4219fun! s:NetrwLeftmouse(islocal)
4220" call Dfunc("s:NetrwLeftmouse(islocal=".a:islocal.")")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004221
4222 " check if the status bar was clicked on instead of a file/directory name
Bram Moolenaaradc21822011-04-01 18:03:16 +02004223 while getchar(0) != 0
4224 "clear the input stream
4225 endwhile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004226 call feedkeys("\<LeftMouse>")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004227 let c = getchar()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004228 let mouse_lnum = v:mouse_lnum
4229 let wlastline = line('w$')
4230 let lastline = line('$')
4231" call Decho("v:mouse_lnum=".mouse_lnum." line(w$)=".wlastline." line($)=".lastline." v:mouse_win=".v:mouse_win." winnr#".winnr())
4232" call Decho("v:mouse_col =".v:mouse_col." col=".col(".")." wincol =".wincol()." winwidth =".winwidth(0))
4233 if mouse_lnum >= wlastline + 1 || v:mouse_win != winnr()
4234 " appears to be a status bar leftmouse click
4235" call Dret("s:NetrwLeftmouse : detected a status bar leftmouse click")
4236 return
4237 endif
4238 if v:mouse_col != col('.')
4239" call Dret("s:NetrwLeftmouse : detected a vertical separator bar leftmouse click")
4240 return
4241 endif
4242
Bram Moolenaar446cb832008-06-24 21:56:24 +00004243 if a:islocal
4244 if exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004245 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004246 endif
4247 else
4248 if exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004249 keepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004250 endif
4251 endif
4252" call Dret("s:NetrwLeftmouse")
4253endfun
4254
4255" ---------------------------------------------------------------------
4256" s:NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
4257" separated patterns given in g:netrw_list_hide
4258fun! s:NetrwListHide()
Bram Moolenaaradc21822011-04-01 18:03:16 +02004259" call Dfunc("NetrwListHide() g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004260
4261 " find a character not in the "hide" string to use as a separator for :g and :v commands
4262 " How-it-works: take the hiding command, convert it into a range. Duplicate
4263 " characters don't matter. Remove all such characters from the '/~...90'
4264 " string. Use the first character left as a separator character.
4265 let listhide= g:netrw_list_hide
4266 let sep = strpart(substitute('/~@#$%^&*{};:,<.>?|1234567890','['.escape(listhide,'-]^\').']','','ge'),1,1)
4267" call Decho("sep=".sep)
4268
4269 while listhide != ""
4270 if listhide =~ ','
4271 let hide = substitute(listhide,',.*$','','e')
4272 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
4273 else
4274 let hide = listhide
4275 let listhide = ""
4276 endif
4277
4278 " Prune the list by hiding any files which match
4279 if g:netrw_hide == 1
4280" call Decho("hiding<".hide."> listhide<".listhide.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004281 exe 'sil keepj '.w:netrw_bannercnt.',$g'.sep.hide.sep.'d'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004282 elseif g:netrw_hide == 2
4283" call Decho("showing<".hide."> listhide<".listhide.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004284 exe 'sil keepj '.w:netrw_bannercnt.',$g'.sep.hide.sep.'s@^@ /-KEEP-/ @'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004285 endif
4286 endwhile
4287 if g:netrw_hide == 2
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004288 exe 'sil keepj '.w:netrw_bannercnt.',$v@^ /-KEEP-/ @d'
4289 exe 'sil keepj '.w:netrw_bannercnt.',$s@^\%( /-KEEP-/ \)\+@@e'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004290 endif
4291
Bram Moolenaaradc21822011-04-01 18:03:16 +02004292 " remove any blank lines that have somehow remained.
4293 " This seems to happen under Windows.
4294 exe 'sil! keepj 1,$g@^\s*$@d'
4295
Bram Moolenaar446cb832008-06-24 21:56:24 +00004296" call Dret("NetrwListHide")
4297endfun
4298
4299" ---------------------------------------------------------------------
4300" NetrwHideEdit: allows user to edit the file/directory hiding list
4301fun! s:NetrwHideEdit(islocal)
4302" call Dfunc("NetrwHideEdit(islocal=".a:islocal.")")
4303
4304 " save current cursor position
4305 let svpos= netrw#NetrwSavePosn()
4306
4307 " get new hiding list from user
4308 call inputsave()
4309 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
4310 call inputrestore()
4311 let g:netrw_list_hide= newhide
4312" call Decho("new g:netrw_list_hide<".g:netrw_list_hide.">")
4313
4314 " refresh the listing
Bram Moolenaaradc21822011-04-01 18:03:16 +02004315 sil keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,"./"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004316
4317 " restore cursor position
4318 call netrw#NetrwRestorePosn(svpos)
4319
4320" call Dret("NetrwHideEdit")
4321endfun
4322
4323" ---------------------------------------------------------------------
4324" NetSortSequence: allows user to edit the sorting sequence
4325fun! s:NetSortSequence(islocal)
4326" call Dfunc("NetSortSequence(islocal=".a:islocal.")")
4327
4328 let svpos= netrw#NetrwSavePosn()
4329 call inputsave()
4330 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
4331 call inputrestore()
4332
4333 " refresh the listing
4334 let g:netrw_sort_sequence= newsortseq
Bram Moolenaaradc21822011-04-01 18:03:16 +02004335 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4336 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004337
4338" call Dret("NetSortSequence")
4339endfun
4340
4341" ---------------------------------------------------------------------
4342" s:NetrwMakeDir: this function makes a directory (both local and remote) {{{2
4343fun! s:NetrwMakeDir(usrhost)
4344" call Dfunc("NetrwMakeDir(usrhost<".a:usrhost.">)")
4345
4346 " get name of new directory from user. A bare <CR> will skip.
4347 " if its currently a directory, also request will be skipped, but with
4348 " a message.
4349 call inputsave()
4350 let newdirname= input("Please give directory name: ")
4351 call inputrestore()
4352" call Decho("newdirname<".newdirname.">")
4353
4354 if newdirname == ""
4355" call Dret("NetrwMakeDir : user aborted with bare <cr>")
4356 return
4357 endif
4358
4359 if a:usrhost == ""
4360" call Decho("local mkdir")
4361
4362 " Local mkdir:
4363 " sanity checks
4364 let fullnewdir= b:netrw_curdir.'/'.newdirname
4365" call Decho("fullnewdir<".fullnewdir.">")
4366 if isdirectory(fullnewdir)
4367 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004368 keepj call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a directory!",24)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004369 endif
4370" call Dret("NetrwMakeDir : directory<".newdirname."> exists previously")
4371 return
4372 endif
4373 if s:FileReadable(fullnewdir)
4374 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004375 keepj call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a file!",25)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004376 endif
4377" call Dret("NetrwMakeDir : file<".newdirname."> exists previously")
4378 return
4379 endif
4380
4381 " requested new local directory is neither a pre-existing file or
4382 " directory, so make it!
4383 if exists("*mkdir")
4384 call mkdir(fullnewdir,"p")
4385 else
4386 let netrw_origdir= s:NetrwGetcwd(1)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004387 exe 'keepj lcd '.fnameescape(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004388" call Decho("netrw_origdir<".netrw_origdir.">: lcd b:netrw_curdir<".fnameescape(b:netrw_curdir).">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004389" call Decho("exe sil! !".g:netrw_local_mkdir.' '.shellescape(newdirname,1))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004390 exe "sil! !".g:netrw_local_mkdir.' '.shellescape(newdirname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004391 if !g:netrw_keepdir
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004392 exe 'keepj lcd '.fnameescape(netrw_origdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004393" call Decho("netrw_keepdir=".g:netrw_keepdir.": keepjumps lcd ".fnameescape(netrw_origdir)." getcwd<".getcwd().">")
4394 endif
4395 endif
4396
4397 if v:shell_error == 0
4398 " refresh listing
4399" call Decho("refresh listing")
4400 let svpos= netrw#NetrwSavePosn()
4401 call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
4402 call netrw#NetrwRestorePosn(svpos)
4403 elseif !exists("g:netrw_quiet")
4404 call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",26)
4405 endif
4406" redraw!
4407
4408 elseif !exists("b:netrw_method") || b:netrw_method == 4
4409 " Remote mkdir:
4410" call Decho("remote mkdir")
4411 let mkdircmd = s:MakeSshCmd(g:netrw_mkdir_cmd)
4412 let newdirname= substitute(b:netrw_curdir,'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname
Bram Moolenaaradc21822011-04-01 18:03:16 +02004413" call Decho("exe sil! !".mkdircmd." ".shellescape(newdirname,1))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004414 exe "sil! !".mkdircmd." ".shellescape(newdirname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004415 if v:shell_error == 0
4416 " refresh listing
4417 let svpos= netrw#NetrwSavePosn()
Bram Moolenaaradc21822011-04-01 18:03:16 +02004418 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
4419 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004420 elseif !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004421 keepj call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",27)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004422 endif
4423" redraw!
4424
4425 elseif b:netrw_method == 2
4426 " COMBAK -- future work
Bram Moolenaaradc21822011-04-01 18:03:16 +02004427 keepj call netrw#ErrorMsg(s:ERROR,"making directories via ftp not currently supported",68)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004428 elseif b:netrw_method == 3
4429 " COMBAK -- future work
Bram Moolenaaradc21822011-04-01 18:03:16 +02004430 keepj call netrw#ErrorMsg(s:ERROR,"making directories via ftp not currently supported",68)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004431 endif
4432
4433" call Dret("NetrwMakeDir")
4434endfun
4435
4436" ---------------------------------------------------------------------
4437" s:NetrwMarkFile: (invoked by mf) This function is used to both {{{2
4438" mark and unmark files. If a markfile list exists,
4439" then the rename and delete functions will use it instead
4440" of whatever may happen to be under the cursor at that
4441" moment. When the mouse and gui are available,
4442" shift-leftmouse may also be used to mark files.
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004443"
4444" Creates two lists
4445" s:netrwmarkfilelist -- holds complete paths to all marked files
4446" s:netrwmarkfilelist_# -- holds list of marked files in current-buffer's directory (#==bufnr())
4447"
4448" Creates a marked file match string
4449" s:netrwmarfilemtch_# -- used with 2match to display marked files
4450"
Bram Moolenaared39e1d2008-08-09 17:55:22 +00004451" Creates a buffer version of islocal
4452" b:netrw_islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00004453fun! s:NetrwMarkFile(islocal,fname)
4454" call Dfunc("s:NetrwMarkFile(islocal=".a:islocal." fname<".a:fname.">)")
4455 let curbufnr= bufnr("%")
4456 let curdir = b:netrw_curdir
Bram Moolenaar5c736222010-01-06 20:54:52 +01004457 let trailer = '[@=|\/\*]\=\>'
Bram Moolenaaradc21822011-04-01 18:03:16 +02004458
Bram Moolenaar446cb832008-06-24 21:56:24 +00004459 if exists("s:netrwmarkfilelist_{curbufnr}")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004460 " markfile list pre-exists
Bram Moolenaar446cb832008-06-24 21:56:24 +00004461" call Decho("starting s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
4462" call Decho("starting s:netrwmarkfilemtch_{curbufnr}<".s:netrwmarkfilemtch_{curbufnr}.">")
Bram Moolenaared39e1d2008-08-09 17:55:22 +00004463 let b:netrw_islocal= a:islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00004464
4465 if index(s:netrwmarkfilelist_{curbufnr},a:fname) == -1
Bram Moolenaared39e1d2008-08-09 17:55:22 +00004466 " append filename to buffer's markfilelist
Bram Moolenaar446cb832008-06-24 21:56:24 +00004467" call Decho("append filename<".a:fname."> to local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
4468 call add(s:netrwmarkfilelist_{curbufnr},a:fname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004469 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(a:fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00004470
4471 else
Bram Moolenaared39e1d2008-08-09 17:55:22 +00004472 " remove filename from buffer's markfilelist
Bram Moolenaar446cb832008-06-24 21:56:24 +00004473" call Decho("remove filename<".a:fname."> from local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
4474 call filter(s:netrwmarkfilelist_{curbufnr},'v:val != a:fname')
4475 if s:netrwmarkfilelist_{curbufnr} == []
4476 " local markfilelist is empty; remove it entirely
Bram Moolenaar5c736222010-01-06 20:54:52 +01004477" call Decho("markfile list now empty")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004478 call s:NetrwUnmarkList(curbufnr,curdir)
4479 else
4480 " rebuild match list to display markings correctly
4481" call Decho("rebuild s:netrwmarkfilemtch_".curbufnr)
4482 let s:netrwmarkfilemtch_{curbufnr}= ""
4483 let first = 1
4484 for fname in s:netrwmarkfilelist_{curbufnr}
4485 if first
Bram Moolenaar5c736222010-01-06 20:54:52 +01004486 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00004487 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01004488 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00004489 endif
4490 let first= 0
4491 endfor
4492" call Decho("ending s:netrwmarkfilelist_"curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
4493" call Decho("ending s:netrwmarkfilemtch_"curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">")
4494 endif
4495 endif
4496
4497 else
4498 " initialize new markfilelist
4499
4500" call Decho("add fname<".a:fname."> to new markfilelist_".curbufnr)
4501 let s:netrwmarkfilelist_{curbufnr}= []
4502 call add(s:netrwmarkfilelist_{curbufnr},a:fname)
4503" call Decho("ending s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
4504
4505 " build initial markfile matching pattern
4506 if a:fname =~ '/$'
4507 let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc)
4508 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01004509 let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc).trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00004510 endif
4511" call Decho("ending s:netrwmarkfilemtch_".curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">")
4512 endif
4513
4514 " handle global markfilelist
4515 if exists("s:netrwmarkfilelist")
4516 let dname= s:ComposePath(b:netrw_curdir,a:fname)
4517 if index(s:netrwmarkfilelist,dname) == -1
4518 " append new filename to global markfilelist
4519 call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
4520" call Decho("append filename<".a:fname."> to global markfilelist<".string(s:netrwmarkfilelist).">")
4521 else
4522 " remove new filename from global markfilelist
4523" call Decho("filter(".string(s:netrwmarkfilelist).",'v:val != '.".dname.")")
4524 call filter(s:netrwmarkfilelist,'v:val != "'.dname.'"')
4525" call Decho("ending s:netrwmarkfilelist <".string(s:netrwmarkfilelist).">")
4526 if s:netrwmarkfilelist == []
4527 unlet s:netrwmarkfilelist
4528 endif
4529 endif
4530 else
4531 " initialize new global-directory markfilelist
4532 let s:netrwmarkfilelist= []
4533 call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
4534" call Decho("init s:netrwmarkfilelist<".string(s:netrwmarkfilelist).">")
4535 endif
4536
4537 " set up 2match'ing to netrwmarkfilemtch list
4538 if exists("s:netrwmarkfilemtch_{curbufnr}") && s:netrwmarkfilemtch_{curbufnr} != ""
4539" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004540 if exists("g:did_drchip_netrwlist_syntax")
4541 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/"
4542 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004543 else
4544" call Decho("2match none")
4545 2match none
4546 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02004547" 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 +00004548endfun
4549
4550" ---------------------------------------------------------------------
4551" s:NetrwMarkFileCompress: (invoked by mz) This function is used to {{{2
4552" compress/decompress files using the programs
4553" in g:netrw_compress and g:netrw_uncompress,
4554" using g:netrw_compress_suffix to know which to
4555" do. By default:
4556" g:netrw_compress = "gzip"
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004557" g:netrw_decompress = { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf", ".xz" : "unxz"}
Bram Moolenaar446cb832008-06-24 21:56:24 +00004558fun! s:NetrwMarkFileCompress(islocal)
4559" call Dfunc("s:NetrwMarkFileCompress(islocal=".a:islocal.")")
4560 let svpos = netrw#NetrwSavePosn()
4561 let curdir = b:netrw_curdir
4562 let curbufnr = bufnr("%")
4563
4564 if exists("s:netrwmarkfilelist_{curbufnr}") && exists("g:netrw_compress") && exists("g:netrw_decompress")
4565 for fname in s:netrwmarkfilelist_{curbufnr}
4566 " for every filename in the marked list
4567 for sfx in sort(keys(g:netrw_decompress))
4568 if fname =~ '\'.sfx.'$'
4569 " fname has a suffix indicating that its compressed; apply associated decompression routine
Bram Moolenaar5c736222010-01-06 20:54:52 +01004570 let exe= netrw#WinPath(g:netrw_decompress[sfx])
Bram Moolenaar446cb832008-06-24 21:56:24 +00004571" call Decho("fname<".fname."> is compressed so decompress with <".exe.">")
4572 if a:islocal
4573 if g:netrw_keepdir
Bram Moolenaarc236c162008-07-13 17:41:49 +00004574 let fname= shellescape(s:ComposePath(curdir,fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004575 endif
4576 else
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004577 let fname= shellescape(b:netrw_curdir.fname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004578 endif
4579 if executable(exe)
4580 if a:islocal
4581 call system(exe." ".fname)
4582 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02004583 keepj call s:RemoteSystem(exe." ".fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004584 endif
4585 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02004586 keepj call netrw#ErrorMsg(s:WARNING,"unable to apply<".exe."> to file<".fname.">",50)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004587 endif
4588 break
4589 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004590 unlet sfx
Bram Moolenaar446cb832008-06-24 21:56:24 +00004591 endfor
4592 if exists("exe")
4593 unlet exe
4594 elseif a:islocal
4595 " fname not a compressed file, so compress it
Bram Moolenaar5c736222010-01-06 20:54:52 +01004596 call system(netrw#WinPath(g:netrw_compress)." ".shellescape(s:ComposePath(b:netrw_curdir,fname)))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004597 else
4598 " fname not a compressed file, so compress it
Bram Moolenaaradc21822011-04-01 18:03:16 +02004599 keepj call s:RemoteSystem(netrw#WinPath(g:netrw_compress)." ".shellescape(fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004600 endif
4601 endfor
4602 call s:NetrwUnmarkList(curbufnr,curdir)
Bram Moolenaaradc21822011-04-01 18:03:16 +02004603 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4604 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004605 endif
4606" call Dret("s:NetrwMarkFileCompress")
4607endfun
4608
4609" ---------------------------------------------------------------------
4610" s:NetrwMarkFileCopy: (invoked by mc) copy marked files to target {{{2
4611" If no marked files, then set up directory as the
4612" target. Currently does not support copying entire
4613" directories. Uses the local-buffer marked file list.
4614" Returns 1=success (used by NetrwMarkFileMove())
4615" 0=failure
4616fun! s:NetrwMarkFileCopy(islocal)
4617" call Dfunc("s:NetrwMarkFileCopy(islocal=".a:islocal.") target<".(exists("s:netrwmftgt")? s:netrwmftgt : '---').">")
4618
4619 " sanity checks
4620 if !exists("s:netrwmarkfilelist_{bufnr('%')}") || empty(s:netrwmarkfilelist_{bufnr('%')})
Bram Moolenaaradc21822011-04-01 18:03:16 +02004621 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004622" call Dret("s:NetrwMarkFileCopy 0")
4623 return 0
4624 endif
4625" call Decho("sanity chk passed: s:netrwmarkfilelist_".bufnr('%')."<".string(s:netrwmarkfilelist_{bufnr('%')}))
4626 if !exists("s:netrwmftgt")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004627 keepj call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004628" call Dret("s:NetrwMarkFileCopy 0")
4629 return 0
4630 endif
4631" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
4632 let curdir = b:netrw_curdir
4633 let curbufnr = bufnr("%")
4634
4635 if a:islocal && s:netrwmftgt_islocal
4636 " Copy marked files, local directory to local directory
4637" call Decho("copy from local to local")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004638 let args= join(map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),"shellescape(b:netrw_curdir.\"/\".v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004639" call Decho("system(".g:netrw_localcopycmd." ".args." ".shellescape(s:netrwmftgt).")")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004640 call system(netrw#WinPath(g:netrw_localcopycmd)." ".args." ".shellescape(s:netrwmftgt))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004641
4642 elseif a:islocal && !s:netrwmftgt_islocal
4643 " Copy marked files, local directory to remote directory
4644" call Decho("copy from local to remote")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004645 keepj call s:NetrwUpload(s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004646
4647 elseif !a:islocal && s:netrwmftgt_islocal
4648" call Decho("copy from remote to local")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004649 keepj call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004650
4651 elseif !a:islocal && !s:netrwmftgt_islocal
4652" call Decho("copy from remote to remote")
4653 let curdir = getcwd()
4654 let tmpdir = s:GetTempfile("")
4655 if tmpdir !~ '/'
4656 let tmpdir= curdir."/".tmpdir
4657 endif
4658 if exists("*mkdir")
4659 call mkdir(tmpdir)
4660 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004661 exe "sil! !".g:netrw_local_mkdir.' '.shellescape(tmpdir,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004662 endif
4663 if isdirectory(tmpdir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004664 exe "keepj lcd ".fnameescape(tmpdir)
Bram Moolenaaradc21822011-04-01 18:03:16 +02004665 keepj call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},tmpdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004666 let localfiles= map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),'substitute(v:val,"^.*/","","")')
Bram Moolenaaradc21822011-04-01 18:03:16 +02004667 keepj call s:NetrwUpload(localfiles,s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004668 if getcwd() == tmpdir
4669 for fname in s:netrwmarkfilelist_{bufnr('%')}
Bram Moolenaaradc21822011-04-01 18:03:16 +02004670 keepj call s:NetrwDelete(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004671 endfor
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004672 exe "keepj lcd ".fnameescape(curdir)
4673 exe "sil !".g:netrw_local_rmdir." ".shellescape(tmpdir,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004674 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004675 exe "keepj lcd ".fnameescape(curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004676 endif
4677 endif
4678 endif
4679
4680 " -------
4681 " cleanup
4682 " -------
4683" call Decho("cleanup")
4684
4685 " remove markings from local buffer
4686 call s:NetrwUnmarkList(curbufnr,curdir)
4687
4688 " refresh buffers
4689 if !s:netrwmftgt_islocal
4690 call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
4691 endif
4692 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02004693 keepj call s:NetrwRefreshDir(a:islocal,curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004694 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01004695 if g:netrw_fastbrowse <= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02004696 keepj call s:LocalBrowseShellCmdRefresh()
Bram Moolenaar5c736222010-01-06 20:54:52 +01004697 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004698
4699" call Dret("s:NetrwMarkFileCopy 1")
4700 return 1
4701endfun
4702
4703" ---------------------------------------------------------------------
4704" s:NetrwMarkFileDiff: (invoked by md) This function is used to {{{2
4705" invoke vim's diff mode on the marked files.
4706" Either two or three files can be so handled.
4707" Uses the global marked file list.
4708fun! s:NetrwMarkFileDiff(islocal)
4709" call Dfunc("s:NetrwMarkFileDiff(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
4710 let curbufnr= bufnr("%")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004711
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004712 if exists("s:netrwmarkfilelist_{curbufnr}")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004713 let cnt = 0
4714 let curdir = b:netrw_curdir
4715 for fname in s:netrwmarkfilelist
4716 let cnt= cnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00004717 if cnt == 1
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004718" call Decho("diffthis: fname<".fname.">")
4719 exe "e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004720 diffthis
4721 elseif cnt == 2 || cnt == 3
4722 vsplit
4723 wincmd l
4724" call Decho("diffthis: ".fname)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004725 exe "e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004726 diffthis
4727 else
4728 break
4729 endif
4730 endfor
4731 call s:NetrwUnmarkList(curbufnr,curdir)
4732 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004733
Bram Moolenaar446cb832008-06-24 21:56:24 +00004734" call Dret("s:NetrwMarkFileDiff")
4735endfun
4736
4737" ---------------------------------------------------------------------
4738" s:NetrwMarkFileEdit: (invoked by me) put marked files on arg list and start editing them {{{2
4739" Uses global markfilelist
4740fun! s:NetrwMarkFileEdit(islocal)
4741" call Dfunc("s:NetrwMarkFileEdit(islocal=".a:islocal.")")
4742
4743 let curdir = b:netrw_curdir
4744 let curbufnr = bufnr("%")
4745 if exists("s:netrwmarkfilelist_{curbufnr}")
4746 call s:SetRexDir(a:islocal,curdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004747 let flist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004748 " unmark markedfile list
4749" call s:NetrwUnmarkList(curbufnr,curdir)
4750 call s:NetrwUnmarkAll()
Bram Moolenaaradc21822011-04-01 18:03:16 +02004751" call Decho("exe sil args ".flist)
4752 exe "sil args ".flist
Bram Moolenaar446cb832008-06-24 21:56:24 +00004753 endif
4754
4755" call Dret("s:NetrwMarkFileEdit")
4756endfun
4757
4758" ---------------------------------------------------------------------
4759" s:NetrwMarkFileExe: (invoked by mx) execute arbitrary command on marked files, one at a time {{{2
4760" Uses the local marked-file list.
4761fun! s:NetrwMarkFileExe(islocal)
4762" call Dfunc("s:NetrwMarkFileExe(islocal=".a:islocal.")")
4763 let svpos = netrw#NetrwSavePosn()
4764 let curdir = b:netrw_curdir
4765 let curbufnr = bufnr("%")
4766
4767 if exists("s:netrwmarkfilelist_{curbufnr}")
4768 " get the command
4769 call inputsave()
4770 let cmd= input("Enter command: ","","file")
4771 call inputrestore()
4772" call Decho("cmd<".cmd.">")
4773
4774 " apply command to marked files. Substitute: filename -> %
4775 " If no %, then append a space and the filename to the command
4776 for fname in s:netrwmarkfilelist_{curbufnr}
4777 if a:islocal
4778 if g:netrw_keepdir
Bram Moolenaar5c736222010-01-06 20:54:52 +01004779 let fname= shellescape(netrw#WinPath(s:ComposePath(curdir,fname)))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004780 endif
4781 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01004782 let fname= shellescape(netrw#WinPath(b:netrw_curdir.fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004783 endif
4784 if cmd =~ '%'
4785 let xcmd= substitute(cmd,'%',fname,'g')
4786 else
4787 let xcmd= cmd.' '.fname
4788 endif
4789 if a:islocal
4790" call Decho("local: xcmd<".xcmd.">")
4791 let ret= system(xcmd)
4792 else
4793" call Decho("remote: xcmd<".xcmd.">")
4794 let ret= s:RemoteSystem(xcmd)
4795 endif
4796 if v:shell_error < 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02004797 keepj call netrw#ErrorMsg(s:ERROR,"command<".xcmd."> failed, aborting",54)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004798 break
4799 else
4800 echo ret
4801 endif
4802 endfor
4803
4804 " unmark marked file list
4805 call s:NetrwUnmarkList(curbufnr,curdir)
4806
4807 " refresh the listing
Bram Moolenaaradc21822011-04-01 18:03:16 +02004808 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4809 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004810 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02004811 keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004812 endif
4813
4814" call Dret("s:NetrwMarkFileExe")
4815endfun
4816
4817" ---------------------------------------------------------------------
4818" s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix
4819" as the marked file(s) (toggles suffix presence)
4820" Uses the local marked file list.
4821fun! s:NetrwMarkHideSfx(islocal)
4822" call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")")
4823 let svpos = netrw#NetrwSavePosn()
4824 let curbufnr = bufnr("%")
4825
4826 " s:netrwmarkfilelist_{curbufnr}: the List of marked files
4827 if exists("s:netrwmarkfilelist_{curbufnr}")
4828
4829 for fname in s:netrwmarkfilelist_{curbufnr}
4830" call Decho("s:NetrwMarkFileCopy: fname<".fname.">")
4831 " construct suffix pattern
4832 if fname =~ '\.'
4833 let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','')
4834 else
4835 let sfxpat= '^\%(\%(\.\)\@!.\)*$'
4836 endif
4837 " determine if its in the hiding list or not
4838 let inhidelist= 0
4839 if g:netrw_list_hide != ""
4840 let itemnum = 0
4841 let hidelist= split(g:netrw_list_hide,',')
4842 for hidepat in hidelist
4843 if sfxpat == hidepat
4844 let inhidelist= 1
4845 break
4846 endif
4847 let itemnum= itemnum + 1
4848 endfor
4849 endif
4850" call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">")
4851 if inhidelist
4852 " remove sfxpat from list
4853 call remove(hidelist,itemnum)
4854 let g:netrw_list_hide= join(hidelist,",")
4855 elseif g:netrw_list_hide != ""
4856 " append sfxpat to non-empty list
4857 let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat
4858 else
4859 " set hiding list to sfxpat
4860 let g:netrw_list_hide= sfxpat
4861 endif
4862 endfor
4863
4864 " refresh the listing
Bram Moolenaaradc21822011-04-01 18:03:16 +02004865 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4866 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004867 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02004868 keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004869 endif
4870
4871" call Dret("s:NetrwMarkHideSfx")
4872endfun
4873
4874" ---------------------------------------------------------------------
4875" s:NetrwMarkFileGrep: (invoked by mg) This function applies vimgrep to marked files {{{2
4876" Uses the global markfilelist
4877fun! s:NetrwMarkFileGrep(islocal)
4878" call Dfunc("s:NetrwMarkFileGrep(islocal=".a:islocal.")")
4879 let svpos = netrw#NetrwSavePosn()
Bram Moolenaar446cb832008-06-24 21:56:24 +00004880 let curbufnr = bufnr("%")
4881
4882 if exists("s:netrwmarkfilelist")
4883" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004884 let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004885 call s:NetrwUnmarkAll()
4886
4887 " ask user for pattern
4888 call inputsave()
4889 let pat= input("Enter pattern: ","")
4890 call inputrestore()
4891 if pat !~ '^\s'
4892 if pat !~ '^/'
4893 let pat= '/'.pat.'/'
4894 endif
4895 let pat= " ".pat
4896 endif
4897
4898 " use vimgrep for both local and remote
4899" call Decho("exe vimgrep".pat." ".netrwmarkfilelist)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004900 try
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004901 exe "keepj noautocmd vimgrep".pat." ".netrwmarkfilelist
Bram Moolenaar5c736222010-01-06 20:54:52 +01004902 catch /^Vim\%((\a\+)\)\=:E480/
Bram Moolenaaradc21822011-04-01 18:03:16 +02004903 keepj call netrw#ErrorMsg(s:WARNING,"no match with pattern<".pattern.">",76)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004904" call Dret("s:NetrwMarkFileGrep : unable to find pattern<".pattern.">")
4905 return
4906 endtry
Bram Moolenaar446cb832008-06-24 21:56:24 +00004907
4908 2match none
Bram Moolenaaradc21822011-04-01 18:03:16 +02004909 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004910 endif
4911
4912" call Dret("s:NetrwMarkFileGrep")
4913endfun
4914
4915" ---------------------------------------------------------------------
4916" s:NetrwMarkFileMove: (invoked by mm) execute arbitrary command on marked files, one at a time {{{2
4917" uses the global marked file list
4918" s:netrwmfloc= 0: target directory is remote
4919" = 1: target directory is local
4920fun! s:NetrwMarkFileMove(islocal)
4921" call Dfunc("s:NetrwMarkFileMove(islocal=".a:islocal.")")
4922 let curdir = b:netrw_curdir
4923 let curbufnr = bufnr("%")
4924
4925 " sanity check
4926 if !exists("s:netrwmarkfilelist_{bufnr('%')}") || empty(s:netrwmarkfilelist_{bufnr('%')})
Bram Moolenaaradc21822011-04-01 18:03:16 +02004927 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004928" call Dret("s:NetrwMarkFileMove")
4929 return
4930 endif
4931" call Decho("sanity chk passed: s:netrwmarkfilelist_".bufnr('%')."<".string(s:netrwmarkfilelist_{bufnr('%')}))
4932 if !exists("s:netrwmftgt")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004933 keepj call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004934" call Dret("s:NetrwMarkFileCopy 0")
4935 return 0
4936 endif
4937" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
4938
4939 if a:islocal && s:netrwmftgt_islocal
4940 " move: local -> local
4941" call Decho("move from local to local")
4942" call Decho("(s:NetrwMarkFileMove) local to local move")
4943 if executable(g:netrw_localmovecmd)
4944 for fname in s:netrwmarkfilelist_{bufnr("%")}
4945" call Decho("system(".g:netrw_localmovecmd." ".shellescape(fname)." ".shellescape(s:netrwmftgt).")")
4946 let ret= system(g:netrw_localmovecmd." ".shellescape(fname)." ".shellescape(s:netrwmftgt))
4947 if v:shell_error < 0
4948 call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> failed, aborting",54)
4949 break
4950 endif
4951 endfor
4952 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02004953 keepj call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> is not executable!",57)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004954 endif
4955
4956 elseif a:islocal && !s:netrwmftgt_islocal
4957 " move: local -> remote
4958" call Decho("move from local to remote")
4959" call Decho("copy")
4960 let mflist= s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaaradc21822011-04-01 18:03:16 +02004961 keepj call s:NetrwMarkFileCopy(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004962" call Decho("remove")
4963 for fname in mflist
4964 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
4965 let ok = s:NetrwLocalRmFile(b:netrw_curdir,barefname,1)
4966 endfor
4967 unlet mflist
4968
4969 elseif !a:islocal && s:netrwmftgt_islocal
4970 " move: remote -> local
4971" call Decho("move from remote to local")
4972" call Decho("copy")
4973 let mflist= s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaaradc21822011-04-01 18:03:16 +02004974 keepj call s:NetrwMarkFileCopy(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004975" call Decho("remove")
4976 for fname in mflist
4977 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
4978 let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
4979 endfor
4980 unlet mflist
4981
4982 elseif !a:islocal && !s:netrwmftgt_islocal
4983 " move: remote -> remote
4984" call Decho("move from remote to remote")
4985" call Decho("copy")
4986 let mflist= s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaaradc21822011-04-01 18:03:16 +02004987 keepj call s:NetrwMarkFileCopy(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004988" call Decho("remove")
4989 for fname in mflist
4990 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
4991 let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
4992 endfor
4993 unlet mflist
4994 endif
4995
4996 " -------
4997 " cleanup
4998 " -------
4999" call Decho("cleanup")
5000
5001 " remove markings from local buffer
5002 call s:NetrwUnmarkList(curbufnr,curdir) " remove markings from local buffer
5003
5004 " refresh buffers
5005 if !s:netrwmftgt_islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02005006" call Decho("refresh netrwmftgt<".s:netrwmftgt.">")
5007 keepj call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005008 endif
5009 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02005010" call Decho("refresh b:netrw_curdir<".b:netrw_curdir.">")
5011 keepj call s:NetrwRefreshDir(a:islocal,b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005012 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01005013 if g:netrw_fastbrowse <= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02005014" call Decho("since g:netrw_fastbrowse=".g:netrw_fastbrowse.", perform shell cmd refresh")
5015 keepj call s:LocalBrowseShellCmdRefresh()
Bram Moolenaar5c736222010-01-06 20:54:52 +01005016 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005017
5018" call Dret("s:NetrwMarkFileMove")
5019endfun
5020
5021" ---------------------------------------------------------------------
5022" s:NetrwMarkFilePrint: (invoked by mp) This function prints marked files {{{2
5023" using the hardcopy command. Local marked-file list only.
5024fun! s:NetrwMarkFilePrint(islocal)
5025" call Dfunc("s:NetrwMarkFilePrint(islocal=".a:islocal.")")
5026 let curbufnr= bufnr("%")
5027 if exists("s:netrwmarkfilelist_{curbufnr}")
5028 let netrwmarkfilelist = s:netrwmarkfilelist_{curbufnr}
5029 let curdir = b:netrw_curdir
5030 call s:NetrwUnmarkList(curbufnr,curdir)
5031 for fname in netrwmarkfilelist
5032 if a:islocal
5033 if g:netrw_keepdir
5034 let fname= s:ComposePath(curdir,fname)
5035 endif
5036 else
5037 let fname= curdir.fname
5038 endif
5039 1split
5040 " the autocmds will handle both local and remote files
Bram Moolenaaradc21822011-04-01 18:03:16 +02005041" call Decho("exe sil e ".escape(fname,' '))
5042 exe "sil e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005043" call Decho("hardcopy")
5044 hardcopy
5045 q
5046 endfor
5047 2match none
5048 endif
5049" call Dret("s:NetrwMarkFilePrint")
5050endfun
5051
5052" ---------------------------------------------------------------------
5053" s:NetrwMarkFileRegexp: (invoked by mr) This function is used to mark {{{2
5054" files when given a regexp (for which a prompt is
5055" issued).
5056fun! s:NetrwMarkFileRegexp(islocal)
5057" call Dfunc("s:NetrwMarkFileRegexp(islocal=".a:islocal.")")
5058
5059 " get the regular expression
5060 call inputsave()
5061 let regexp= input("Enter regexp: ","","file")
5062 call inputrestore()
5063
5064 if a:islocal
5065 " get the matching list of files using local glob()
5066" call Decho("handle local regexp")
5067 let dirname = escape(b:netrw_curdir,g:netrw_glob_escape)
Bram Moolenaar5c736222010-01-06 20:54:52 +01005068 let files = glob(s:ComposePath(dirname,regexp))
5069" call Decho("files<".files.">")
5070 let filelist= split(files,"\n")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005071
5072 " mark the list of files
Bram Moolenaar5c736222010-01-06 20:54:52 +01005073 for fname in filelist
5074" call Decho("fname<".fname.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005075 keepj call s:NetrwMarkFile(a:islocal,substitute(fname,'^.*/','',''))
Bram Moolenaar5c736222010-01-06 20:54:52 +01005076 endfor
Bram Moolenaar446cb832008-06-24 21:56:24 +00005077
5078 else
5079" call Decho("handle remote regexp")
5080
5081 " convert displayed listing into a filelist
5082 let eikeep = &ei
5083 let areg = @a
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005084 sil keepj %y a
Bram Moolenaar446cb832008-06-24 21:56:24 +00005085 set ei=all ma
5086" call Decho("set ei=all ma")
5087 1split
Bram Moolenaaradc21822011-04-01 18:03:16 +02005088 keepj call s:NetrwEnew()
5089 keepj call s:NetrwSafeOptions()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005090 sil keepj norm! "ap
5091 keepj 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00005092 let bannercnt= search('^" =====','W')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005093 exe "sil keepj 1,".bannercnt."d"
Bram Moolenaar446cb832008-06-24 21:56:24 +00005094 set bt=nofile
5095 if g:netrw_liststyle == s:LONGLIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005096 sil keepj %s/\s\{2,}\S.*$//e
Bram Moolenaar5c736222010-01-06 20:54:52 +01005097 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005098 elseif g:netrw_liststyle == s:WIDELIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005099 sil keepj %s/\s\{2,}/\r/ge
Bram Moolenaar5c736222010-01-06 20:54:52 +01005100 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005101 elseif g:netrw_liststyle == s:TREELIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005102 sil keepj %s/^| //e
5103 sil! keepj g/^ .*$/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01005104 call histdel("/",-1)
5105 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005106 endif
5107 " convert regexp into the more usual glob-style format
5108 let regexp= substitute(regexp,'\*','.*','g')
5109" call Decho("regexp<".regexp.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005110 exe "sil! keepj v/".escape(regexp,'/')."/d"
Bram Moolenaar5c736222010-01-06 20:54:52 +01005111 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005112 let filelist= getline(1,line("$"))
5113 q!
5114 for filename in filelist
Bram Moolenaaradc21822011-04-01 18:03:16 +02005115 keepj call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','',''))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005116 endfor
5117 unlet filelist
5118 let @a = areg
5119 let &ei = eikeep
5120 endif
5121
5122" call Dret("s:NetrwMarkFileRegexp")
5123endfun
5124
5125" ---------------------------------------------------------------------
5126" s:NetrwMarkFileSource: (invoked by ms) This function sources marked files {{{2
5127" Uses the local marked file list.
5128fun! s:NetrwMarkFileSource(islocal)
5129" call Dfunc("s:NetrwMarkFileSource(islocal=".a:islocal.")")
5130 let curbufnr= bufnr("%")
5131 if exists("s:netrwmarkfilelist_{curbufnr}")
5132 let netrwmarkfilelist = s:netrwmarkfilelist_{bufnr("%")}
5133 let curdir = b:netrw_curdir
5134 call s:NetrwUnmarkList(curbufnr,curdir)
5135 for fname in netrwmarkfilelist
5136 if a:islocal
5137 if g:netrw_keepdir
5138 let fname= s:ComposePath(curdir,fname)
5139 endif
5140 else
5141 let fname= curdir.fname
5142 endif
5143 " the autocmds will handle sourcing both local and remote files
Bram Moolenaarc236c162008-07-13 17:41:49 +00005144" call Decho("exe so ".fnameescape(fname))
5145 exe "so ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005146 endfor
5147 2match none
5148 endif
5149" call Dret("s:NetrwMarkFileSource")
5150endfun
5151
5152" ---------------------------------------------------------------------
5153" s:NetrwMarkFileTag: (invoked by mT) This function applies g:netrw_ctags to marked files {{{2
5154" Uses the global markfilelist
5155fun! s:NetrwMarkFileTag(islocal)
5156" call Dfunc("s:NetrwMarkFileTag(islocal=".a:islocal.")")
5157 let svpos = netrw#NetrwSavePosn()
5158 let curdir = b:netrw_curdir
5159 let curbufnr = bufnr("%")
5160
5161 if exists("s:netrwmarkfilelist")
5162" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005163 let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "shellescape(v:val,".!a:islocal.")"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005164 call s:NetrwUnmarkAll()
5165
5166 if a:islocal
5167 if executable(g:netrw_ctags)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005168" call Decho("call system(".g:netrw_ctags." ".netrwmarkfilelist.")")
5169 call system(g:netrw_ctags." ".netrwmarkfilelist)
5170 else
5171 call netrw#ErrorMsg(s:ERROR,"g:netrw_ctags<".g:netrw_ctags."> is not executable!",51)
5172 endif
5173 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00005174 let cmd = s:RemoteSystem(g:netrw_ctags." ".netrwmarkfilelist)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005175 call netrw#NetrwObtain(a:islocal,"tags")
5176 let curdir= b:netrw_curdir
5177 1split
5178 e tags
5179 let path= substitute(curdir,'^\(.*\)/[^/]*$','\1/','')
5180" call Decho("curdir<".curdir."> path<".path.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005181 exe 'keepj %s/\t\(\S\+\)\t/\t'.escape(path,"/\n\r\\").'\1\t/e'
Bram Moolenaar5c736222010-01-06 20:54:52 +01005182 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005183 wq!
5184 endif
5185 2match none
5186 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5187 call netrw#NetrwRestorePosn(svpos)
5188 endif
5189
5190" call Dret("s:NetrwMarkFileTag")
5191endfun
5192
5193" ---------------------------------------------------------------------
5194" s:NetrwMarkFileTgt: (invoked by mt) This function sets up a marked file target {{{2
5195" Sets up two variables,
5196" s:netrwmftgt : holds the target directory
5197" s:netrwmftgt_islocal : 0=target directory is remote
5198" 1=target directory is local
5199fun! s:NetrwMarkFileTgt(islocal)
5200" call Dfunc("s:NetrwMarkFileTgt(islocal=".a:islocal.")")
5201 let svpos = netrw#NetrwSavePosn()
5202 let curdir = b:netrw_curdir
5203 let hadtgt = exists("s:netrwmftgt")
5204 if !exists("w:netrw_bannercnt")
5205 let w:netrw_bannercnt= b:netrw_bannercnt
5206 endif
5207
5208 " set up target
5209 if line(".") < w:netrw_bannercnt
5210 " if cursor in banner region, use b:netrw_curdir for the target
5211 let s:netrwmftgt= b:netrw_curdir
5212" call Decho("inbanner: s:netrwmftgt<".s:netrwmftgt.">")
5213
5214 else
5215 " get word under cursor.
5216 " * If directory, use it for the target.
5217 " * If file, use b:netrw_curdir for the target
5218 let curword= s:NetrwGetWord()
5219 let tgtdir = s:ComposePath(curdir,curword)
5220 if a:islocal && isdirectory(tgtdir)
5221 let s:netrwmftgt = tgtdir
5222" call Decho("local isdir: s:netrwmftgt<".s:netrwmftgt.">")
5223 elseif !a:islocal && tgtdir =~ '/$'
5224 let s:netrwmftgt = tgtdir
5225" call Decho("remote isdir: s:netrwmftgt<".s:netrwmftgt.">")
5226 else
5227 let s:netrwmftgt = curdir
5228" call Decho("isfile: s:netrwmftgt<".s:netrwmftgt.">")
5229 endif
5230 endif
5231 if a:islocal
5232 " simplify the target (eg. /abc/def/../ghi -> /abc/ghi)
5233 let s:netrwmftgt= simplify(s:netrwmftgt)
5234" call Decho("simplify: s:netrwmftgt<".s:netrwmftgt.">")
5235 endif
5236 if g:netrw_cygwin
5237 let s:netrwmftgt= substitute(system("cygpath ".shellescape(s:netrwmftgt)),'\n$','','')
5238 let s:netrwmftgt= substitute(s:netrwmftgt,'\n$','','')
5239 endif
5240 let s:netrwmftgt_islocal= a:islocal
5241
Bram Moolenaar5c736222010-01-06 20:54:52 +01005242 if g:netrw_fastbrowse <= 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00005243 call s:LocalBrowseShellCmdRefresh()
5244 endif
5245 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5246 call netrw#NetrwRestorePosn(svpos)
5247 if !hadtgt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005248 sil! keepj norm! j
Bram Moolenaar446cb832008-06-24 21:56:24 +00005249 endif
5250
5251" call Dret("s:NetrwMarkFileTgt : netrwmftgt<".(exists("s:netrwmftgt")? s:netrwmftgt : "").">")
5252endfun
5253
5254" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00005255" s:NetrwOpenFile: query user for a filename and open it {{{2
5256fun! s:NetrwOpenFile(islocal)
5257" call Dfunc("s:NetrwOpenFile(islocal=".a:islocal.")")
5258 call inputsave()
5259 let fname= input("Enter filename: ")
5260 call inputrestore()
5261 if fname !~ '[/\\]'
5262 if exists("b:netrw_curdir")
5263 if exists("g:netrw_quiet")
5264 let netrw_quiet_keep = g:netrw_quiet
5265 endif
5266 let g:netrw_quiet = 1
5267 if b:netrw_curdir =~ '/$'
5268 exe "e ".fnameescape(b:netrw_curdir.fname)
5269 else
5270 exe "e ".fnameescape(b:netrw_curdir."/".fname)
5271 endif
5272 if exists("netrw_quiet_keep")
5273 let g:netrw_quiet= netrw_quiet_keep
5274 else
5275 unlet g:netrw_quiet
5276 endif
5277 endif
5278 else
5279 exe "e ".fnameescape(fname)
5280 endif
5281" call Dret("s:NetrwOpenFile")
5282endfun
5283
5284" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00005285" s:NetrwUnmarkList: delete local marked file lists and remove their contents from the global marked-file list {{{2
5286fun! s:NetrwUnmarkList(curbufnr,curdir)
5287" call Dfunc("s:NetrwUnmarkList(curbufnr=".a:curbufnr." curdir<".a:curdir.">)")
5288
5289 " remove all files in local marked-file list from global list
5290 if exists("s:netrwmarkfilelist_{a:curbufnr}")
5291 for mfile in s:netrwmarkfilelist_{a:curbufnr}
5292 let dfile = s:ComposePath(a:curdir,mfile) " prepend directory to mfile
5293 let idx = index(s:netrwmarkfilelist,dfile) " get index in list of dfile
5294 call remove(s:netrwmarkfilelist,idx) " remove from global list
5295 endfor
5296 if s:netrwmarkfilelist == []
5297 unlet s:netrwmarkfilelist
5298 endif
5299
5300 " getting rid of the local marked-file lists is easy
5301 unlet s:netrwmarkfilelist_{a:curbufnr}
5302 endif
5303 if exists("s:netrwmarkfilemtch_{a:curbufnr}")
5304 unlet s:netrwmarkfilemtch_{a:curbufnr}
5305 endif
5306 2match none
5307" call Dret("s:NetrwUnmarkList")
5308endfun
5309
5310" ---------------------------------------------------------------------
5311" s:NetrwUnmarkAll: remove the global marked file list and all local ones {{{2
5312fun! s:NetrwUnmarkAll()
5313" call Dfunc("s:NetrwUnmarkAll()")
5314 if exists("s:netrwmarkfilelist")
5315 unlet s:netrwmarkfilelist
5316 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02005317 sil call s:NetrwUnmarkAll2()
Bram Moolenaar446cb832008-06-24 21:56:24 +00005318 2match none
5319" call Dret("s:NetrwUnmarkAll")
5320endfun
5321
5322" ---------------------------------------------------------------------
5323" s:NetrwUnmarkAll2: {{{2
5324fun! s:NetrwUnmarkAll2()
5325" call Dfunc("s:NetrwUnmarkAll2()")
5326 redir => netrwmarkfilelist_let
5327 let
5328 redir END
5329 let netrwmarkfilelist_list= split(netrwmarkfilelist_let,'\n') " convert let string into a let list
5330 call filter(netrwmarkfilelist_list,"v:val =~ '^s:netrwmarkfilelist_'") " retain only those vars that start as s:netrwmarkfilelist_
5331 call map(netrwmarkfilelist_list,"substitute(v:val,'\\s.*$','','')") " remove what the entries are equal to
5332 for flist in netrwmarkfilelist_list
5333 let curbufnr= substitute(flist,'s:netrwmarkfilelist_','','')
5334 unlet s:netrwmarkfilelist_{curbufnr}
5335 unlet s:netrwmarkfilemtch_{curbufnr}
5336 endfor
5337" call Dret("s:NetrwUnmarkAll2")
5338endfun
5339
5340" ---------------------------------------------------------------------
5341" s:NetrwUnMarkFile: {{{2
5342fun! s:NetrwUnMarkFile(islocal)
5343" call Dfunc("s:NetrwUnMarkFile(islocal=".a:islocal.")")
5344 let svpos = netrw#NetrwSavePosn()
5345 let curbufnr = bufnr("%")
5346
5347 " unmark marked file list (although I expect s:NetrwUpload()
5348 " to do it, I'm just making sure)
5349 if exists("s:netrwmarkfilelist_{bufnr('%')}")
5350" call Decho("unlet'ing: s:netrwmarkfile[list|mtch]_".bufnr("%"))
5351 unlet s:netrwmarkfilelist
5352 unlet s:netrwmarkfilelist_{curbufnr}
5353 unlet s:netrwmarkfilemtch_{curbufnr}
5354 2match none
5355 endif
5356
5357" call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5358 call netrw#NetrwRestorePosn(svpos)
5359" call Dret("s:NetrwUnMarkFile")
5360endfun
5361
5362" ---------------------------------------------------------------------
5363" s:NetrwMenu: generates the menu for gvim and netrw {{{2
5364fun! s:NetrwMenu(domenu)
5365
5366 if !exists("g:NetrwMenuPriority")
5367 let g:NetrwMenuPriority= 80
5368 endif
5369
Bram Moolenaaradc21822011-04-01 18:03:16 +02005370 if has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaar446cb832008-06-24 21:56:24 +00005371" call Dfunc("NetrwMenu(domenu=".a:domenu.")")
5372
5373 if !exists("s:netrw_menu_enabled") && a:domenu
5374" call Decho("initialize menu")
5375 let s:netrw_menu_enabled= 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005376 exe 'sil! menu '.g:NetrwMenuPriority.'.1 '.g:NetrwTopLvlMenu.'Help<tab><F1> <F1>'
5377 exe 'sil! menu '.g:NetrwMenuPriority.'.5 '.g:NetrwTopLvlMenu.'-Sep1- :'
5378 exe 'sil! menu '.g:NetrwMenuPriority.'.6 '.g:NetrwTopLvlMenu.'Go\ Up\ Directory<tab>- -'
5379 exe 'sil! menu '.g:NetrwMenuPriority.'.7 '.g:NetrwTopLvlMenu.'Apply\ Special\ Viewer<tab>x x'
5380 exe 'sil! menu '.g:NetrwMenuPriority.'.8.1 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Current\ Directory<tab>mb mb'
5381 exe 'sil! menu '.g:NetrwMenuPriority.'.8.4 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Prev\ Dir\ (History)<tab>u u'
5382 exe 'sil! menu '.g:NetrwMenuPriority.'.8.5 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Next\ Dir\ (History)<tab>U U'
5383 exe 'sil! menu '.g:NetrwMenuPriority.'.8.6 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.List<tab>qb qb'
5384 exe 'sil! menu '.g:NetrwMenuPriority.'.9.1 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ File\ Hiding\ List<tab><ctrl-h>'." \<c-h>'"
5385 exe 'sil! menu '.g:NetrwMenuPriority.'.9.2 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ Sorting\ Sequence<tab>S S'
5386 exe 'sil! menu '.g:NetrwMenuPriority.'.9.3 '.g:NetrwTopLvlMenu.'Browsing\ Control.Quick\ Hide/Unhide\ Dot\ Files<tab>'."gh gh"
5387 exe 'sil! menu '.g:NetrwMenuPriority.'.9.4 '.g:NetrwTopLvlMenu.'Browsing\ Control.Refresh\ Listing<tab>'."<ctrl-l> \<c-l>"
5388 exe 'sil! menu '.g:NetrwMenuPriority.'.9.5 '.g:NetrwTopLvlMenu.'Browsing\ Control.Settings/Options<tab>:NetrwSettings '.":NetrwSettings\<cr>"
5389 exe 'sil! menu '.g:NetrwMenuPriority.'.10 '.g:NetrwTopLvlMenu.'Delete\ File/Directory<tab>D D'
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02005390 exe 'sil! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Create\ New\ File<tab>% %'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005391 exe 'sil! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Current\ Window<tab><cr> '."\<cr>"
5392 exe 'sil! menu '.g:NetrwMenuPriority.'.11.2 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Preview\ File/Directory<tab>p p'
5393 exe 'sil! menu '.g:NetrwMenuPriority.'.11.3 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Previous\ Window<tab>P P'
5394 exe 'sil! menu '.g:NetrwMenuPriority.'.11.4 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Window<tab>o o'
5395 exe 'sil! menu '.g:NetrwMenuPriority.'.11.5 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Vertical\ Window<tab>v v'
5396 exe 'sil! menu '.g:NetrwMenuPriority.'.12.1 '.g:NetrwTopLvlMenu.'Explore.Directory\ Name :Explore '
5397 exe 'sil! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (curdir\ only)<tab>:Explore\ */ :Explore */'
5398 exe 'sil! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (+subdirs)<tab>:Explore\ **/ :Explore **/'
5399 exe 'sil! menu '.g:NetrwMenuPriority.'.12.3 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ String\ Pattern\ (curdir\ only)<tab>:Explore\ *// :Explore *//'
5400 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ String\ Pattern\ (+subdirs)<tab>:Explore\ **// :Explore **//'
5401 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Next\ Match<tab>:Nexplore :Nexplore<cr>'
5402 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Prev\ Match<tab>:Pexplore :Pexplore<cr>'
5403 exe 'sil! menu '.g:NetrwMenuPriority.'.13 '.g:NetrwTopLvlMenu.'Make\ Subdirectory<tab>d d'
5404 exe 'sil! menu '.g:NetrwMenuPriority.'.14.1 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ File<tab>mf mf'
5405 exe 'sil! menu '.g:NetrwMenuPriority.'.14.2 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ Files\ by\ Regexp<tab>mr mr'
5406 exe 'sil! menu '.g:NetrwMenuPriority.'.14.3 '.g:NetrwTopLvlMenu.'Marked\ Files.Hide-Show-List\ Control<tab>a a'
5407 exe 'sil! menu '.g:NetrwMenuPriority.'.14.4 '.g:NetrwTopLvlMenu.'Marked\ Files.Copy\ To\ Target<tab>mc mc'
5408 exe 'sil! menu '.g:NetrwMenuPriority.'.14.5 '.g:NetrwTopLvlMenu.'Marked\ Files.Delete<tab>D D'
5409 exe 'sil! menu '.g:NetrwMenuPriority.'.14.6 '.g:NetrwTopLvlMenu.'Marked\ Files.Diff<tab>md md'
5410 exe 'sil! menu '.g:NetrwMenuPriority.'.14.7 '.g:NetrwTopLvlMenu.'Marked\ Files.Edit<tab>me me'
5411 exe 'sil! menu '.g:NetrwMenuPriority.'.14.8 '.g:NetrwTopLvlMenu.'Marked\ Files.Exe\ Cmd<tab>mx mx'
5412 exe 'sil! menu '.g:NetrwMenuPriority.'.14.9 '.g:NetrwTopLvlMenu.'Marked\ Files.Move\ To\ Target<tab>mm mm'
5413 exe 'sil! menu '.g:NetrwMenuPriority.'.14.10 '.g:NetrwTopLvlMenu.'Marked\ Files.Obtain<tab>O O'
5414 exe 'sil! menu '.g:NetrwMenuPriority.'.14.11 '.g:NetrwTopLvlMenu.'Marked\ Files.Print<tab>mp mp'
5415 exe 'sil! menu '.g:NetrwMenuPriority.'.14.12 '.g:NetrwTopLvlMenu.'Marked\ Files.Replace<tab>R R'
5416 exe 'sil! menu '.g:NetrwMenuPriority.'.14.13 '.g:NetrwTopLvlMenu.'Marked\ Files.Set\ Target<tab>mt mt'
5417 exe 'sil! menu '.g:NetrwMenuPriority.'.14.14 '.g:NetrwTopLvlMenu.'Marked\ Files.Tag<tab>mT mT'
5418 exe 'sil! menu '.g:NetrwMenuPriority.'.14.15 '.g:NetrwTopLvlMenu.'Marked\ Files.Zip/Unzip/Compress/Uncompress<tab>mz mz'
5419 exe 'sil! menu '.g:NetrwMenuPriority.'.15 '.g:NetrwTopLvlMenu.'Obtain\ File<tab>O O'
5420 exe 'sil! menu '.g:NetrwMenuPriority.'.16.1 '.g:NetrwTopLvlMenu.'Style.Listing\ Style\ (thin-long-wide-tree)<tab>i i'
5421 exe 'sil! menu '.g:NetrwMenuPriority.'.16.2 '.g:NetrwTopLvlMenu.'Style.Normal-Hide-Show<tab>a a'
5422 exe 'sil! menu '.g:NetrwMenuPriority.'.16.3 '.g:NetrwTopLvlMenu.'Style.Reverse\ Sorting\ Order<tab>'."r r"
5423 exe 'sil! menu '.g:NetrwMenuPriority.'.16.4 '.g:NetrwTopLvlMenu.'Style.Sorting\ Method\ (name-time-size)<tab>s s'
5424 exe 'sil! menu '.g:NetrwMenuPriority.'.17 '.g:NetrwTopLvlMenu.'Rename\ File/Directory<tab>R R'
5425 exe 'sil! menu '.g:NetrwMenuPriority.'.18 '.g:NetrwTopLvlMenu.'Set\ Current\ Directory<tab>c c'
Bram Moolenaar5c736222010-01-06 20:54:52 +01005426 call s:NetrwBookmarkMenu() " provide some history! uses priorities 2,3, reserves 4, 8.2.x
Bram Moolenaar446cb832008-06-24 21:56:24 +00005427 let s:netrw_menucnt= 28
5428
5429 elseif !a:domenu
5430 let s:netrwcnt = 0
5431 let curwin = winnr()
5432 windo if getline(2) =~ "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif
5433 exe curwin."wincmd w"
5434
5435 if s:netrwcnt <= 1
5436" call Decho("clear menus")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005437 exe 'sil! unmenu '.g:NetrwTopLvlMenu
Bram Moolenaaradc21822011-04-01 18:03:16 +02005438" call Decho('exe sil! unmenu '.g:NetrwTopLvlMenu.'*')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005439 sil! unlet s:netrw_menu_enabled
Bram Moolenaar446cb832008-06-24 21:56:24 +00005440 endif
5441 endif
5442" call Dret("NetrwMenu")
5443 endif
5444
5445endfun
5446
5447" ---------------------------------------------------------------------
5448" s:NetrwObtain: obtain file under cursor or from markfile list {{{2
5449" Used by the O maps (as <SID>NetrwObtain())
5450fun! s:NetrwObtain(islocal)
5451" call Dfunc("NetrwObtain(islocal=".a:islocal.")")
5452
5453 if exists("s:netrwmarkfilelist_{bufnr('%')}")
Bram Moolenaar5c736222010-01-06 20:54:52 +01005454 let islocal= s:netrwmarkfilelist_{bufnr('%')}[1] !~ '^\a\+://'
5455 call netrw#NetrwObtain(islocal,s:netrwmarkfilelist_{bufnr('%')})
Bram Moolenaar446cb832008-06-24 21:56:24 +00005456 call s:NetrwUnmarkList(bufnr('%'),b:netrw_curdir)
5457 else
5458 call netrw#NetrwObtain(a:islocal,expand("<cWORD>"))
5459 endif
5460
5461" call Dret("NetrwObtain")
5462endfun
5463
5464" ---------------------------------------------------------------------
5465" netrw#NetrwObtain: {{{2
5466" netrw#NetrwObtain(islocal,fname[,tgtdirectory])
5467" islocal=0 obtain from remote source
5468" =1 obtain from local source
5469" fname : a filename or a list of filenames
5470" tgtdir : optional place where files are to go (not present, uses getcwd())
5471fun! netrw#NetrwObtain(islocal,fname,...)
5472" call Dfunc("netrw#NetrwObtain(islocal=".a:islocal." fname<".((type(a:fname) == 1)? a:fname : string(a:fname)).">) a:0=".a:0)
5473 " NetrwStatusLine support - for obtaining support
5474
5475 if type(a:fname) == 1
5476 let fnamelist= [ a:fname ]
5477 elseif type(a:fname) == 3
5478 let fnamelist= a:fname
5479 else
5480 call netrw#ErrorMsg(s:ERROR,"attempting to use NetrwObtain on something not a filename or a list",62)
5481" call Dret("netrw#NetrwObtain")
5482 return
5483 endif
5484" call Decho("fnamelist<".string(fnamelist).">")
5485 if a:0 > 0
5486 let tgtdir= a:1
5487 else
5488 let tgtdir= getcwd()
5489 endif
5490" call Decho("tgtdir<".tgtdir.">")
5491
Bram Moolenaar5c736222010-01-06 20:54:52 +01005492 if exists("b:netrw_islocal") && b:netrw_islocal
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005493 " obtain a file from local b:netrw_curdir to (local) tgtdir
5494" call Decho("obtain a file from local ".b:netrw_curdir." to ".tgtdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005495 if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir
5496 let topath= s:ComposePath(tgtdir,"")
5497 if (has("win32") || has("win95") || has("win64") || has("win16"))
5498 " transfer files one at time
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005499" call Decho("transfer files one at a time")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005500 for fname in fnamelist
Bram Moolenaarc236c162008-07-13 17:41:49 +00005501" call Decho("system(".g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath).")")
5502 call system(g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005503 endfor
5504 else
5505 " transfer files with one command
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005506" call Decho("transfer files with one command")
5507 let filelist= join(map(deepcopy(fnamelist),"shellescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005508" call Decho("system(".g:netrw_localcopycmd." ".filelist." ".shellescape(topath).")")
5509 call system(g:netrw_localcopycmd." ".filelist." ".shellescape(topath))
5510 endif
5511 elseif !exists("b:netrw_curdir")
5512 call netrw#ErrorMsg(s:ERROR,"local browsing directory doesn't exist!",36)
5513 else
5514 call netrw#ErrorMsg(s:WARNING,"local browsing directory and current directory are identical",37)
5515 endif
5516
5517 else
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005518 " obtain files from remote b:netrw_curdir to local tgtdir
5519" call Decho("obtain a file from remote ".b:netrw_curdir." to ".tgtdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005520 if type(a:fname) == 1
5521 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.a:fname)
5522 endif
5523 call s:NetrwMethod(b:netrw_curdir)
5524
5525 if b:netrw_method == 4
5526 " obtain file using scp
5527" call Decho("obtain via scp (method#4)")
5528 if exists("g:netrw_port") && g:netrw_port != ""
5529 let useport= " ".g:netrw_scpport." ".g:netrw_port
5530 else
5531 let useport= ""
5532 endif
5533 if b:netrw_fname =~ '/'
5534 let path= substitute(b:netrw_fname,'^\(.*/\).\{-}$','\1','')
5535 else
5536 let path= ""
5537 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005538 let filelist= join(map(deepcopy(fnamelist),'shellescape(g:netrw_machine.":".path.v:val,1)'))
Bram Moolenaarc236c162008-07-13 17:41:49 +00005539" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1))
5540 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005541
5542 elseif b:netrw_method == 2
5543 " obtain file using ftp + .netrc
5544" call Decho("obtain via ftp+.netrc (method #2)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005545 call s:SaveBufVars()|sil keepjumps new|call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00005546 let tmpbufnr= bufnr("%")
5547 setlocal ff=unix
5548 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005549 keepj put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +00005550" call Decho("filter input: ".getline('$'))
5551 endif
5552
5553 if exists("b:netrw_fname") && b:netrw_fname != ""
5554 call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
5555" call Decho("filter input: ".getline('$'))
5556 endif
5557
5558 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005559 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00005560" call Decho("filter input: ".getline('$'))
5561 endif
5562 for fname in fnamelist
5563 call setline(line("$")+1,'get "'.fname.'"')
5564" call Decho("filter input: ".getline('$'))
5565 endfor
5566 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02005567" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
5568 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 +00005569 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02005570" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
5571 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005572 endif
5573 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
5574 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
5575 let debugkeep= &debug
5576 setlocal debug=msg
5577 call netrw#ErrorMsg(s:ERROR,getline(1),4)
5578 let &debug= debugkeep
5579 endif
5580
5581 elseif b:netrw_method == 3
5582 " obtain with ftp + machine, id, passwd, and fname (ie. no .netrc)
5583" call Decho("obtain via ftp+mipf (method #3)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005584 call s:SaveBufVars()|sil keepjumps new|call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00005585 let tmpbufnr= bufnr("%")
5586 setlocal ff=unix
5587
5588 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005589 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00005590" call Decho("filter input: ".getline('$'))
5591 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005592 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00005593" call Decho("filter input: ".getline('$'))
5594 endif
5595
5596 if exists("g:netrw_ftp") && g:netrw_ftp == 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005597 keepj put =g:netrw_uid
Bram Moolenaar446cb832008-06-24 21:56:24 +00005598" call Decho("filter input: ".getline('$'))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005599 keepj put ='\"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00005600" call Decho("filter input: ".getline('$'))
5601 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005602 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00005603" call Decho("filter input: ".getline('$'))
5604 endif
5605
5606 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005607 keepj put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +00005608" call Decho("filter input: ".getline('$'))
5609 endif
5610
5611 if exists("b:netrw_fname") && b:netrw_fname != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005612 keepj call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005613" call Decho("filter input: ".getline('$'))
5614 endif
5615
5616 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005617 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00005618" call Decho("filter input: ".getline('$'))
5619 endif
5620
5621 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005622 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00005623" call Decho("filter input: ".getline('$'))
5624 endif
5625 for fname in fnamelist
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005626 keepj call setline(line("$")+1,'get "'.fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005627 endfor
5628" call Decho("filter input: ".getline('$'))
5629
5630 " perform ftp:
5631 " -i : turns off interactive prompting from ftp
5632 " -n unix : DON'T use <.netrc>, even though it exists
5633 " -n win32: quit being obnoxious about password
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005634 keepj norm! 1Gdd
Bram Moolenaaradc21822011-04-01 18:03:16 +02005635" call Decho("executing: %!".s:netrw_ftp_cmd." -i -n")
5636 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i -n"
Bram Moolenaar446cb832008-06-24 21:56:24 +00005637 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
5638 if getline(1) !~ "^$"
5639" call Decho("error<".getline(1).">")
5640 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005641 keepj call netrw#ErrorMsg(s:ERROR,getline(1),5)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005642 endif
5643 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01005644 elseif !exists("b:netrw_method") || b:netrw_method < 0
5645" call Dfunc("netrw#NetrwObtain : unsupported method")
5646 return
5647 endif
5648
5649 " restore status line
5650 if type(a:fname) == 1 && exists("s:netrw_users_stl")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005651 keepj call s:SetupNetrwStatusLine(s:netrw_users_stl)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005652 endif
5653
5654 endif
5655
5656 " cleanup
5657 if exists("tmpbufnr")
5658 if bufnr("%") != tmpbufnr
5659 exe tmpbufnr."bw!"
5660 else
5661 q!
5662 endif
5663 endif
5664
5665" call Dret("netrw#NetrwObtain")
5666endfun
5667
5668" ---------------------------------------------------------------------
5669" s:NetrwPrevWinOpen: open file/directory in previous window. {{{2
5670" If there's only one window, then the window will first be split.
5671" Returns:
5672" choice = 0 : didn't have to choose
5673" choice = 1 : saved modified file in window first
5674" choice = 2 : didn't save modified file, opened window
5675" choice = 3 : cancel open
5676fun! s:NetrwPrevWinOpen(islocal)
5677" call Dfunc("NetrwPrevWinOpen(islocal=".a:islocal.")")
5678
5679 " grab a copy of the b:netrw_curdir to pass it along to newly split windows
5680 let curdir = b:netrw_curdir
5681
5682 " get last window number and the word currently under the cursor
5683 let lastwinnr = winnr("$")
5684 let curword = s:NetrwGetWord()
5685 let choice = 0
5686" call Decho("lastwinnr=".lastwinnr." curword<".curword.">")
5687
5688 let didsplit = 0
5689 if lastwinnr == 1
5690 " if only one window, open a new one first
5691" call Decho("only one window, so open a new one (g:netrw_alto=".g:netrw_alto.")")
5692 if g:netrw_preview
5693" call Decho("exe ".(g:netrw_alto? "top " : "bot ")."vert ".g:netrw_winsize."wincmd s")
5694 exe (g:netrw_alto? "top " : "bot ")."vert ".g:netrw_winsize."wincmd s"
5695 else
5696" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s")
5697 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
5698 endif
5699 let didsplit = 1
5700
5701 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02005702 keepj call s:SaveBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00005703" call Decho("wincmd p")
5704 wincmd p
Bram Moolenaaradc21822011-04-01 18:03:16 +02005705 keepj call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00005706 " if the previous window's buffer has been changed (is modified),
5707 " and it doesn't appear in any other extant window, then ask the
5708 " user if s/he wants to abandon modifications therein.
5709 let bnr = winbufnr(0)
5710 let bnrcnt = 0
5711 if &mod
5712" call Decho("detected: prev window's buffer has been modified: bnr=".bnr." winnr#".winnr())
5713 let eikeep= &ei
5714 set ei=all
5715 windo if winbufnr(0) == bnr | let bnrcnt=bnrcnt+1 | endif
5716 exe bnr."wincmd p"
5717 let &ei= eikeep
5718" call Decho("bnr=".bnr." bnrcnt=".bnrcnt." buftype=".&bt." winnr#".winnr())
5719 if bnrcnt == 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01005720 let bufname = bufname(winbufnr(winnr()))
5721 let choice = confirm("Save modified file<".bufname.">?","&Yes\n&No\n&Cancel")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005722" call Decho("bufname<".bufname."> choice=".choice." winnr#".winnr())
5723
5724 if choice == 1
5725 " Yes -- write file & then browse
5726 let v:errmsg= ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02005727 sil w
Bram Moolenaar446cb832008-06-24 21:56:24 +00005728 if v:errmsg != ""
5729 call netrw#ErrorMsg(s:ERROR,"unable to write <".bufname.">!",30)
5730 if didsplit
5731 q
5732 else
5733 wincmd p
5734 endif
5735" call Dret("NetrwPrevWinOpen ".choice." : unable to write <".bufname.">")
5736 return choice
5737 endif
5738
5739 elseif choice == 2
5740 " No -- don't worry about changed file, just browse anyway
5741 setlocal nomod
Bram Moolenaaradc21822011-04-01 18:03:16 +02005742 keepj call netrw#ErrorMsg(s:WARNING,bufname." changes to ".bufname." abandoned",31)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005743 wincmd p
5744
5745 else
5746 " Cancel -- don't do this
5747 if didsplit
5748 q
5749 else
5750 wincmd p
5751 endif
5752" call Dret("NetrwPrevWinOpen ".choice." : cancelled")
5753 return choice
5754 endif
5755 endif
5756 endif
5757 endif
5758
5759 " restore b:netrw_curdir (window split/enew may have lost it)
5760 let b:netrw_curdir= curdir
5761 if a:islocal < 2
5762 if a:islocal
5763 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(a:islocal,curword))
5764 else
5765 call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,curword))
5766 endif
5767 endif
5768" call Dret("NetrwPrevWinOpen ".choice)
5769 return choice
5770endfun
5771
5772" ---------------------------------------------------------------------
5773" s:NetrwUpload: load fname to tgt (used by NetrwMarkFileCopy()) {{{2
5774" Always assumed to be local -> remote
5775" call s:NetrwUpload(filename, target)
5776" call s:NetrwUpload(filename, target, fromdirectory)
5777fun! s:NetrwUpload(fname,tgt,...)
5778" call Dfunc("s:NetrwUpload(fname<".((type(a:fname) == 1)? a:fname : string(a:fname))."> tgt<".a:tgt.">) a:0=".a:0)
5779
5780 if a:tgt =~ '^\a\+://'
5781 let tgtdir= substitute(a:tgt,'^\a\+://[^/]\+/\(.\{-}\)$','\1','')
5782 else
5783 let tgtdir= substitute(a:tgt,'^\(.*\)/[^/]*$','\1','')
5784 endif
5785" call Decho("tgtdir<".tgtdir.">")
5786
5787 if a:0 > 0
5788 let fromdir= a:1
5789 else
5790 let fromdir= getcwd()
5791 endif
5792" call Decho("fromdir<".fromdir.">")
5793
5794 if type(a:fname) == 1
5795 " handle uploading a single file using NetWrite
5796" call Decho("handle uploading a single file via NetWrite")
5797 1split
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005798" call Decho("exe e ".fnameescape(a:fname))
5799 exe "e ".fnameescape(a:fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005800" call Decho("now locally editing<".expand("%").">, has ".line("$")." lines")
5801 if a:tgt =~ '/$'
5802 let wfname= substitute(a:fname,'^.*/','','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00005803" call Decho("exe w! ".fnameescape(wfname))
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005804 exe "w! ".fnameescape(a:tgt.wfname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005805 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00005806" call Decho("writing local->remote: exe w ".fnameescape(a:tgt))
5807 exe "w ".fnameescape(a:tgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005808" call Decho("done writing local->remote")
5809 endif
5810 q!
5811
5812 elseif type(a:fname) == 3
5813 " handle uploading a list of files via scp
5814" call Decho("handle uploading a list of files via scp")
5815 let curdir= getcwd()
5816 if a:tgt =~ '^scp:'
Bram Moolenaaradc21822011-04-01 18:03:16 +02005817 exe "keepjumps sil lcd ".fnameescape(fromdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005818 let filelist= deepcopy(s:netrwmarkfilelist_{bufnr('%')})
5819 let args = join(map(filelist,"shellescape(v:val, 1)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005820 if exists("g:netrw_port") && g:netrw_port != ""
5821 let useport= " ".g:netrw_scpport." ".g:netrw_port
5822 else
5823 let useport= ""
5824 endif
5825 let machine = substitute(a:tgt,'^scp://\([^/:]\+\).*$','\1','')
5826 let tgt = substitute(a:tgt,'^scp://[^/]\+/\(.*\)$','\1','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00005827" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1))
5828 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1)
Bram Moolenaaradc21822011-04-01 18:03:16 +02005829 exe "keepjumps sil lcd ".fnameescape(curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005830
5831 elseif a:tgt =~ '^ftp:'
5832 call s:NetrwMethod(a:tgt)
5833
5834 if b:netrw_method == 2
5835 " handle uploading a list of files via ftp+.netrc
5836 let netrw_fname = b:netrw_fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005837 sil keepj new
Bram Moolenaar446cb832008-06-24 21:56:24 +00005838" call Decho("filter input window#".winnr())
5839
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005840 keepj put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +00005841" call Decho("filter input: ".getline('$'))
5842
5843 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005844 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00005845" call Decho("filter input: ".getline('$'))
5846 endif
5847
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005848 keepj call setline(line("$")+1,'lcd "'.fromdir.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005849" call Decho("filter input: ".getline('$'))
5850
Bram Moolenaaradc21822011-04-01 18:03:16 +02005851 if tgtdir == ""
5852 let tgtdir= '/'
5853 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005854 keepj call setline(line("$")+1,'cd "'.tgtdir.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005855" call Decho("filter input: ".getline('$'))
5856
5857 for fname in a:fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005858 keepj call setline(line("$")+1,'put "'.fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005859" call Decho("filter input: ".getline('$'))
5860 endfor
5861
5862 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02005863" call Decho("executing: ".s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
5864 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 +00005865 else
5866" call Decho("filter input window#".winnr())
Bram Moolenaaradc21822011-04-01 18:03:16 +02005867" call Decho("executing: ".s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
5868 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005869 endif
5870 " 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 +02005871 sil keepj g/Local directory now/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01005872 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005873 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
5874 call netrw#ErrorMsg(s:ERROR,getline(1),14)
5875 else
5876 bw!|q
5877 endif
5878
5879 elseif b:netrw_method == 3
5880 " upload with ftp + machine, id, passwd, and fname (ie. no .netrc)
5881 let netrw_fname= b:netrw_fname
Bram Moolenaaradc21822011-04-01 18:03:16 +02005882 keepj call s:SaveBufVars()|sil keepj new|keepj call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00005883 let tmpbufnr= bufnr("%")
5884 setlocal ff=unix
5885
5886 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005887 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00005888" call Decho("filter input: ".getline('$'))
5889 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005890 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00005891" call Decho("filter input: ".getline('$'))
5892 endif
5893
5894 if exists("g:netrw_ftp") && g:netrw_ftp == 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005895 keepj put =g:netrw_uid
Bram Moolenaar446cb832008-06-24 21:56:24 +00005896" call Decho("filter input: ".getline('$'))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005897 keepj call setline(line("$")+1,'"'.s:netrw_passwd.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005898" call Decho("filter input: ".getline('$'))
5899 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005900 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00005901" call Decho("filter input: ".getline('$'))
5902 endif
5903
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005904 keepj call setline(line("$")+1,'lcd "'.fromdir.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005905" call Decho("filter input: ".getline('$'))
5906
5907 if exists("b:netrw_fname") && b:netrw_fname != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005908 keepj call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005909" call Decho("filter input: ".getline('$'))
5910 endif
5911
5912 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005913 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00005914" call Decho("filter input: ".getline('$'))
5915 endif
5916
5917 for fname in a:fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005918 keepj call setline(line("$")+1,'put "'.fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005919" call Decho("filter input: ".getline('$'))
5920 endfor
5921
5922 " perform ftp:
5923 " -i : turns off interactive prompting from ftp
5924 " -n unix : DON'T use <.netrc>, even though it exists
5925 " -n win32: quit being obnoxious about password
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005926 keepj norm! 1Gdd
Bram Moolenaaradc21822011-04-01 18:03:16 +02005927" call Decho("executing: ".s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i -n")
5928 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i -n"
Bram Moolenaar446cb832008-06-24 21:56:24 +00005929 " 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 +02005930 sil keepj g/Local directory now/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01005931 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005932 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
5933 let debugkeep= &debug
5934 setlocal debug=msg
5935 call netrw#ErrorMsg(s:ERROR,getline(1),15)
5936 let &debug = debugkeep
5937 let mod = 1
5938 else
5939 bw!|q
5940 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01005941 elseif !exists("b:netrw_method") || b:netrw_method < 0
5942" call Dfunc("netrw#NetrwUpload : unsupported method")
5943 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00005944 endif
5945 else
5946 call netrw#ErrorMsg(s:ERROR,"can't obtain files with protocol from<".a:tgt.">",63)
5947 endif
5948 endif
5949
5950" call Dret("s:NetrwUpload")
5951endfun
5952
5953" ---------------------------------------------------------------------
5954" s:NetrwPreview: {{{2
5955fun! s:NetrwPreview(path) range
5956" call Dfunc("NetrwPreview(path<".a:path.">)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005957 keepj call s:NetrwOptionSave("s:")
5958 keepj call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00005959 if has("quickfix")
5960 if !isdirectory(a:path)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005961 if g:netrw_preview && !g:netrw_alto
5962 let pvhkeep= &pvh
5963 let &pvh = winwidth(0) - g:netrw_winsize
5964 endif
5965 exe (g:netrw_alto? "top " : "bot ").(g:netrw_preview? "vert " : "")."pedit ".fnameescape(a:path)
5966 if exists("pvhkeep")
5967 let &pvh= pvhkeep
5968 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005969 elseif !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005970 keepj call netrw#ErrorMsg(s:WARNING,"sorry, cannot preview a directory such as <".a:path.">",38)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005971 endif
5972 elseif !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005973 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 +00005974 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02005975 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005976" call Dret("NetrwPreview")
5977endfun
5978
5979" ---------------------------------------------------------------------
5980" s:NetrwRefresh: {{{2
5981fun! s:NetrwRefresh(islocal,dirname)
5982" call Dfunc("NetrwRefresh(islocal<".a:islocal.">,dirname=".a:dirname.") hide=".g:netrw_hide." sortdir=".g:netrw_sort_direction)
5983 " at the current time (Mar 19, 2007) all calls to NetrwRefresh() call NetrwBrowseChgDir() first.
5984 " NetrwBrowseChgDir() may clear the display; hence a NetrwSavePosn() may not work if its placed here.
5985 " Also, NetrwBrowseChgDir() now does a NetrwSavePosn() itself.
5986 setlocal ma noro
5987" call Decho("setlocal ma noro")
5988" call Decho("clear buffer<".expand("%")."> with :%d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02005989 sil! keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00005990 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02005991 keepj call netrw#LocalBrowseCheck(a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005992 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02005993 keepj call s:NetrwBrowse(a:islocal,a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005994 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02005995 keepj call netrw#NetrwRestorePosn()
Bram Moolenaar446cb832008-06-24 21:56:24 +00005996
5997 " restore file marks
5998 if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
5999" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
6000 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
6001 else
6002" call Decho("2match none")
6003 2match none
6004 endif
6005
6006" redraw!
6007" call Dret("NetrwRefresh")
6008endfun
6009
6010" ---------------------------------------------------------------------
6011" s:NetrwRefreshDir: refreshes a directory by name {{{2
6012" Called by NetrwMarkFileCopy()
6013" Interfaces to s:NetrwRefresh() and s:LocalBrowseShellCmdRefresh()
6014fun! s:NetrwRefreshDir(islocal,dirname)
6015" call Dfunc("s:NetrwRefreshDir(islocal=".a:islocal." dirname<".a:dirname.">) fastbrowse=".g:netrw_fastbrowse)
6016 if g:netrw_fastbrowse == 0
6017 " slowest mode (keep buffers refreshed, local or remote)
6018" call Decho("slowest mode: keep buffers refreshed, local or remote")
6019 let tgtwin= bufwinnr(a:dirname)
6020" call Decho("tgtwin= bufwinnr(".a:dirname.")=".tgtwin)
6021
6022 if tgtwin > 0
6023 " tgtwin is being displayed, so refresh it
6024 let curwin= winnr()
6025" call Decho("refresh tgtwin#".tgtwin." (curwin#".curwin.")")
6026 exe tgtwin."wincmd w"
Bram Moolenaaradc21822011-04-01 18:03:16 +02006027 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006028 exe curwin."wincmd w"
6029
6030 elseif bufnr(a:dirname) > 0
6031 let bn= bufnr(a:dirname)
6032" call Decho("bd bufnr(".a:dirname.")=".bn)
Bram Moolenaaradc21822011-04-01 18:03:16 +02006033 exe "sil bd ".bn
Bram Moolenaar446cb832008-06-24 21:56:24 +00006034 endif
6035
6036 elseif g:netrw_fastbrowse <= 1
6037" call Decho("medium-speed mode: refresh local buffers only")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006038 keepj call s:LocalBrowseShellCmdRefresh()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006039 endif
6040" call Dret("s:NetrwRefreshDir")
6041endfun
6042
6043" ---------------------------------------------------------------------
6044" s:NetrwSetSort: sets up the sort based on the g:netrw_sort_sequence {{{2
6045" What this function does is to compute a priority for the patterns
6046" in the g:netrw_sort_sequence. It applies a substitute to any
6047" "files" that satisfy each pattern, putting the priority / in
6048" front. An "*" pattern handles the default priority.
6049fun! s:NetrwSetSort()
6050" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
6051 if w:netrw_liststyle == s:LONGLIST
6052 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
6053 else
6054 let seqlist = g:netrw_sort_sequence
6055 endif
6056 " sanity check -- insure that * appears somewhere
6057 if seqlist == ""
6058 let seqlist= '*'
6059 elseif seqlist !~ '\*'
6060 let seqlist= seqlist.',*'
6061 endif
6062 let priority = 1
6063 while seqlist != ""
6064 if seqlist =~ ','
6065 let seq = substitute(seqlist,',.*$','','e')
6066 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
6067 else
6068 let seq = seqlist
6069 let seqlist = ""
6070 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006071 if priority < 10
Bram Moolenaar5c736222010-01-06 20:54:52 +01006072 let spriority= "00".priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00006073 elseif priority < 100
Bram Moolenaar5c736222010-01-06 20:54:52 +01006074 let spriority= "0".priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00006075 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01006076 let spriority= priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00006077 endif
6078" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
6079
6080 " sanity check
6081 if w:netrw_bannercnt > line("$")
6082 " apparently no files were left after a Hiding pattern was used
6083" call Dret("SetSort : no files left after hiding")
6084 return
6085 endif
6086 if seq == '*'
6087 let starpriority= spriority
6088 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006089 exe 'sil keepj '.w:netrw_bannercnt.',$g/'.seq.'/s/^/'.spriority.'/'
Bram Moolenaar5c736222010-01-06 20:54:52 +01006090 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006091 " sometimes multiple sorting patterns will match the same file or directory.
6092 " The following substitute is intended to remove the excess matches.
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006093 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 +02006094 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006095 endif
6096 let priority = priority + 1
6097 endwhile
6098 if exists("starpriority")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006099 exe 'sil keepj '.w:netrw_bannercnt.',$v/^\d\{3}'.g:netrw_sepchr.'/s/^/'.starpriority.'/'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006100 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006101 endif
6102
6103 " Following line associated with priority -- items that satisfy a priority
6104 " pattern get prefixed by ###/ which permits easy sorting by priority.
6105 " Sometimes files can satisfy multiple priority patterns -- only the latest
6106 " priority pattern needs to be retained. So, at this point, these excess
6107 " priority prefixes need to be removed, but not directories that happen to
6108 " be just digits themselves.
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006109 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 +02006110 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006111
6112" call Dret("SetSort")
6113endfun
6114
6115" =====================================================================
6116" s:NetrwSortStyle: change sorting style (name - time - size) and refresh display {{{2
6117fun! s:NetrwSortStyle(islocal)
6118" call Dfunc("s:NetrwSortStyle(islocal=".a:islocal.") netrw_sort_by<".g:netrw_sort_by.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006119 keepj call s:NetrwSaveWordPosn()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006120 let svpos= netrw#NetrwSavePosn()
6121
6122 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 +02006123 keepj norm! 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02006124 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
6125 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006126
6127" call Dret("s:NetrwSortStyle : netrw_sort_by<".g:netrw_sort_by.">")
6128endfun
6129
6130" ---------------------------------------------------------------------
6131" s:NetrwSplit: mode {{{2
6132" =0 : net and o
6133" =1 : net and t
6134" =2 : net and v
6135" =3 : local and o
6136" =4 : local and t
6137" =5 : local and v
6138fun! s:NetrwSplit(mode)
6139" call Dfunc("s:NetrwSplit(mode=".a:mode.") alto=".g:netrw_alto." altv=".g:netrw_altv)
6140
6141 call s:SaveWinVars()
6142
6143 if a:mode == 0
6144 " remote and o
6145" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s")
6146 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
6147 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006148 keepj call s:RestoreWinVars()
6149 keepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006150 unlet s:didsplit
6151
6152 elseif a:mode == 1
6153 " remote and t
Bram Moolenaar5c736222010-01-06 20:54:52 +01006154 let newdir = s:NetrwBrowseChgDir(0,s:NetrwGetWord())
Bram Moolenaar446cb832008-06-24 21:56:24 +00006155" call Decho("tabnew")
6156 tabnew
6157 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006158 keepj call s:RestoreWinVars()
6159 keepj call s:NetrwBrowse(0,newdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006160 unlet s:didsplit
6161
6162 elseif a:mode == 2
6163 " remote and v
6164" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v")
6165 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
6166 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006167 keepj call s:RestoreWinVars()
6168 keepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006169 unlet s:didsplit
6170
6171 elseif a:mode == 3
6172 " local and o
6173" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s")
6174 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
6175 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006176 keepj call s:RestoreWinVars()
6177 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006178 unlet s:didsplit
6179
6180 elseif a:mode == 4
6181 " local and t
Bram Moolenaar446cb832008-06-24 21:56:24 +00006182 let cursorword = s:NetrwGetWord()
Bram Moolenaar5c736222010-01-06 20:54:52 +01006183 let netrw_curdir= s:NetrwTreeDir()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006184" call Decho("tabnew")
6185 tabnew
6186 let b:netrw_curdir= netrw_curdir
6187 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006188 keepj call s:RestoreWinVars()
6189 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,cursorword))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006190 unlet s:didsplit
6191
6192 elseif a:mode == 5
6193 " local and v
6194" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v")
6195 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
6196 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006197 keepj call s:RestoreWinVars()
6198 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006199 unlet s:didsplit
6200
6201 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02006202 keepj call netrw#ErrorMsg(s:ERROR,"(NetrwSplit) unsupported mode=".a:mode,45)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006203 endif
6204
6205" call Dret("s:NetrwSplit")
6206endfun
6207
6208" ---------------------------------------------------------------------
6209" NetrwStatusLine: {{{2
6210fun! NetrwStatusLine()
6211
6212" vvv NetrwStatusLine() debugging vvv
6213" let g:stlmsg=""
6214" if !exists("w:netrw_explore_bufnr")
6215" let g:stlmsg="!X<explore_bufnr>"
6216" elseif w:netrw_explore_bufnr != bufnr("%")
6217" let g:stlmsg="explore_bufnr!=".bufnr("%")
6218" endif
6219" if !exists("w:netrw_explore_line")
6220" let g:stlmsg=" !X<explore_line>"
6221" elseif w:netrw_explore_line != line(".")
6222" let g:stlmsg=" explore_line!={line(.)<".line(".").">"
6223" endif
6224" if !exists("w:netrw_explore_list")
6225" let g:stlmsg=" !X<explore_list>"
6226" endif
6227" ^^^ NetrwStatusLine() debugging ^^^
6228
6229 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")
6230 " restore user's status line
6231 let &stl = s:netrw_users_stl
6232 let &laststatus = s:netrw_users_ls
6233 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
6234 if exists("w:netrw_explore_line") |unlet w:netrw_explore_line |endif
6235 return ""
6236 else
6237 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
6238 endif
6239endfun
6240
6241" ---------------------------------------------------------------------
6242" s:NetrwTreeDir: determine tree directory given current cursor position {{{2
6243" (full path directory with trailing slash returned)
6244fun! s:NetrwTreeDir()
6245" call Dfunc("NetrwTreeDir() curline#".line(".")."<".getline('.')."> b:netrw_curdir<".b:netrw_curdir."> tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%").">")
6246
6247 let treedir= b:netrw_curdir
6248" call Decho("set initial treedir<".treedir.">")
6249 let s:treecurpos= netrw#NetrwSavePosn()
6250
6251 if w:netrw_liststyle == s:TREELIST
6252" call Decho("w:netrrw_liststyle is TREELIST:")
6253" call Decho("line#".line(".")." getline(.)<".getline('.')."> treecurpos<".string(s:treecurpos).">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01006254
6255 " extract tree directory if on a line specifying a subdirectory (ie. ends with "/")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006256 if getline('.') =~ '/$'
6257 let treedir= substitute(getline('.'),'^\%(| \)*\([^|].\{-}\)$','\1','e')
6258 else
6259 let treedir= ""
6260 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006261" call Decho("treedir<".treedir.">")
6262
6263 " detect user attempting to close treeroot
6264 if getline('.') !~ '|' && getline('.') != '..'
6265" call Decho("user attempted to close treeroot")
6266 " now force a refresh
6267" call Decho("clear buffer<".expand("%")."> with :%d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006268 sil! keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00006269" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
6270 return b:netrw_curdir
6271 endif
6272
6273 " elide all non-depth information
6274 let depth = substitute(getline('.'),'^\(\%(| \)*\)[^|].\{-}$','\1','e')
Bram Moolenaar5c736222010-01-06 20:54:52 +01006275" call Decho("depth<".depth."> 1st subst (non-depth info removed)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006276
6277 " elide first depth
6278 let depth = substitute(depth,'^| ','','')
Bram Moolenaar5c736222010-01-06 20:54:52 +01006279" call Decho("depth<".depth."> 2nd subst (first depth removed)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006280
6281 " construct treedir by searching backwards at correct depth
6282" call Decho("constructing treedir<".treedir."> depth<".depth.">")
6283 while depth != "" && search('^'.depth.'[^|].\{-}/$','bW')
6284 let dirname= substitute(getline('.'),'^\(| \)*','','e')
6285 let treedir= dirname.treedir
6286 let depth = substitute(depth,'^| ','','')
6287" call Decho("constructing treedir<".treedir.">: dirname<".dirname."> while depth<".depth.">")
6288 endwhile
6289 if w:netrw_treetop =~ '/$'
6290 let treedir= w:netrw_treetop.treedir
6291 else
6292 let treedir= w:netrw_treetop.'/'.treedir
6293 endif
6294" call Decho("bufnr(.)=".bufnr("%")." line($)=".line("$")." line(.)=".line("."))
6295 endif
6296 let treedir= substitute(treedir,'//$','/','')
6297
Bram Moolenaar446cb832008-06-24 21:56:24 +00006298" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
6299 return treedir
6300endfun
6301
6302" ---------------------------------------------------------------------
6303" s:NetrwTreeDisplay: recursive tree display {{{2
6304fun! s:NetrwTreeDisplay(dir,depth)
6305" call Dfunc("NetrwTreeDisplay(dir<".a:dir."> depth<".a:depth.">)")
6306
6307 " insure that there are no folds
6308 setlocal nofen
6309
6310 " install ../ and shortdir
6311 if a:depth == ""
6312 call setline(line("$")+1,'../')
6313" call Decho("setline#".line("$")." ../ (depth is zero)")
6314 endif
6315 if a:dir =~ '^\a\+://'
6316 if a:dir == w:netrw_treetop
6317 let shortdir= a:dir
6318 else
6319 let shortdir= substitute(a:dir,'^.*/\([^/]\+\)/$','\1/','e')
6320 endif
6321 call setline(line("$")+1,a:depth.shortdir)
6322 else
6323 let shortdir= substitute(a:dir,'^.*/','','e')
6324 call setline(line("$")+1,a:depth.shortdir.'/')
6325 endif
6326" call Decho("setline#".line("$")." shortdir<".a:depth.shortdir.">")
6327
6328 " append a / to dir if its missing one
6329 let dir= a:dir
6330 if dir !~ '/$'
6331 let dir= dir.'/'
6332 endif
6333
6334 " display subtrees (if any)
6335 let depth= "| ".a:depth
6336
6337" call Decho("display subtrees with depth<".depth."> and current leaves")
6338 for entry in w:netrw_treedict[a:dir]
6339 let direntry= substitute(dir.entry,'/$','','e')
6340" call Decho("dir<".dir."> entry<".entry."> direntry<".direntry.">")
6341 if entry =~ '/$' && has_key(w:netrw_treedict,direntry)
6342" call Decho("<".direntry."> is a key in treedict - display subtree for it")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006343 keepj call s:NetrwTreeDisplay(direntry,depth)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006344 elseif entry =~ '/$' && has_key(w:netrw_treedict,direntry.'/')
6345" call Decho("<".direntry."/> is a key in treedict - display subtree for it")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006346 keepj call s:NetrwTreeDisplay(direntry.'/',depth)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006347 else
6348" call Decho("<".entry."> is not a key in treedict (no subtree)")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006349 sil! keepj call setline(line("$")+1,depth.entry)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006350 endif
6351 endfor
6352" call Dret("NetrwTreeDisplay")
6353endfun
6354
6355" ---------------------------------------------------------------------
6356" s:NetrwTreeListing: displays tree listing from treetop on down, using NetrwTreeDisplay() {{{2
6357fun! s:NetrwTreeListing(dirname)
6358 if w:netrw_liststyle == s:TREELIST
6359" call Dfunc("NetrwTreeListing() bufname<".expand("%").">")
6360" call Decho("curdir<".a:dirname.">")
6361" 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"))
6362
6363 " update the treetop
6364" call Decho("update the treetop")
6365 if !exists("w:netrw_treetop")
6366 let w:netrw_treetop= a:dirname
6367" call Decho("w:netrw_treetop<".w:netrw_treetop."> (reusing)")
6368 elseif (w:netrw_treetop =~ ('^'.a:dirname) && s:Strlen(a:dirname) < s:Strlen(w:netrw_treetop)) || a:dirname !~ ('^'.w:netrw_treetop)
6369 let w:netrw_treetop= a:dirname
6370" call Decho("w:netrw_treetop<".w:netrw_treetop."> (went up)")
6371 endif
6372
6373 " insure that we have at least an empty treedict
6374 if !exists("w:netrw_treedict")
6375 let w:netrw_treedict= {}
6376 endif
6377
6378 " update the directory listing for the current directory
6379" call Decho("updating dictionary with ".a:dirname.":[..directory listing..]")
6380" call Decho("bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006381 exe "sil! keepj ".w:netrw_bannercnt.',$g@^\.\.\=/$@d'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006382 let w:netrw_treedict[a:dirname]= getline(w:netrw_bannercnt,line("$"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006383" call Decho("w:treedict[".a:dirname."]= ".string(w:netrw_treedict[a:dirname]))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006384 exe "sil! keepj ".w:netrw_bannercnt.",$d"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006385
6386 " if past banner, record word
6387 if exists("w:netrw_bannercnt") && line(".") > w:netrw_bannercnt
6388 let fname= expand("<cword>")
6389 else
6390 let fname= ""
6391 endif
6392" call Decho("fname<".fname.">")
6393
6394 " display from treetop on down
Bram Moolenaaradc21822011-04-01 18:03:16 +02006395 keepj call s:NetrwTreeDisplay(w:netrw_treetop,"")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006396
6397" call Dret("NetrwTreeListing : bufname<".expand("%").">")
6398 endif
6399endfun
6400
6401" ---------------------------------------------------------------------
6402" s:NetrwWideListing: {{{2
6403fun! s:NetrwWideListing()
6404
6405 if w:netrw_liststyle == s:WIDELIST
6406" call Dfunc("NetrwWideListing() w:netrw_liststyle=".w:netrw_liststyle.' fo='.&fo.' l:fo='.&l:fo)
6407 " look for longest filename (cpf=characters per filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01006408 " cpf: characters per filename
6409 " fpl: filenames per line
6410 " fpc: filenames per column
Bram Moolenaar446cb832008-06-24 21:56:24 +00006411 setlocal ma noro
6412" call Decho("setlocal ma noro")
6413 let b:netrw_cpf= 0
6414 if line("$") >= w:netrw_bannercnt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006415 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 +02006416 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006417 else
6418" call Dret("NetrwWideListing")
6419 return
6420 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006421 let b:netrw_cpf= b:netrw_cpf + 2
6422" call Decho("b:netrw_cpf=max_filename_length+2=".b:netrw_cpf)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006423
6424 " determine qty files per line (fpl)
6425 let w:netrw_fpl= winwidth(0)/b:netrw_cpf
6426 if w:netrw_fpl <= 0
6427 let w:netrw_fpl= 1
6428 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006429" call Decho("fpl= [winwidth=".winwidth(0)."]/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006430
6431 " make wide display
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006432 exe 'sil keepj '.w:netrw_bannercnt.',$s/^.*$/\=escape(printf("%-'.b:netrw_cpf.'s",submatch(0)),"\\")/'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006433 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006434 let fpc = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl
6435 let newcolstart = w:netrw_bannercnt + fpc
6436 let newcolend = newcolstart + fpc - 1
6437" call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006438 sil! let keepregstar = @*
Bram Moolenaar446cb832008-06-24 21:56:24 +00006439 while line("$") >= newcolstart
6440 if newcolend > line("$") | let newcolend= line("$") | endif
6441 let newcolqty= newcolend - newcolstart
6442 exe newcolstart
6443 if newcolqty == 0
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006444 exe "sil! keepj norm! 0\<c-v>$hx".w:netrw_bannercnt."G$p"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006445 else
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006446 exe "sil! keepj norm! 0\<c-v>".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006447 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006448 exe "sil! keepj ".newcolstart.','.newcolend.'d'
6449 exe 'sil! keepj '.w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006450 endwhile
Bram Moolenaaradc21822011-04-01 18:03:16 +02006451 sil! let @*= keepregstar
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006452 exe "sil! keepj ".w:netrw_bannercnt.',$s/\s\+$//e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006453 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006454 setlocal noma nomod ro
6455" call Dret("NetrwWideListing")
6456 endif
6457
6458endfun
6459
6460" ---------------------------------------------------------------------
6461" s:PerformListing: {{{2
6462fun! s:PerformListing(islocal)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006463" call Dfunc("s:PerformListing(islocal=".a:islocal.") bufnr(%)=".bufnr("%")."<".bufname("%").">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006464
Bram Moolenaaradc21822011-04-01 18:03:16 +02006465 keepj call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006466 setlocal noro ma
6467" call Decho("setlocal noro ma")
6468
6469" if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 " Decho
6470" call Decho("(netrw) Processing your browsing request...")
6471" endif " Decho
6472
6473" call Decho('w:netrw_liststyle='.(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a'))
6474 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
6475 " force a refresh for tree listings
6476" call Decho("force refresh for treelisting: clear buffer<".expand("%")."> with :%d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006477 sil! keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00006478 endif
6479
6480 " save current directory on directory history list
Bram Moolenaaradc21822011-04-01 18:03:16 +02006481 keepj call s:NetrwBookHistHandler(3,b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006482
6483 " Set up the banner {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01006484 if g:netrw_banner
6485" call Decho("set up banner")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006486 keepj call setline(1,'" ============================================================================')
6487 keepj call setline(2,'" Netrw Directory Listing (netrw '.g:loaded_netrw.')')
6488 keepj call setline(3,'" '.b:netrw_curdir)
Bram Moolenaar5c736222010-01-06 20:54:52 +01006489 let w:netrw_bannercnt= 3
Bram Moolenaaradc21822011-04-01 18:03:16 +02006490 keepj exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01006491 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006492 keepj 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01006493 let w:netrw_bannercnt= 1
6494 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006495
6496 let sortby= g:netrw_sort_by
6497 if g:netrw_sort_direction =~ "^r"
6498 let sortby= sortby." reversed"
6499 endif
6500
6501 " Sorted by... {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01006502 if g:netrw_banner
6503" call Decho("handle specified sorting: g:netrw_sort_by<".g:netrw_sort_by.">")
6504 if g:netrw_sort_by =~ "^n"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006505" call Decho("directories will be sorted by name")
Bram Moolenaar5c736222010-01-06 20:54:52 +01006506 " sorted by name
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006507 keepj put ='\" Sorted by '.sortby
6508 keepj put ='\" Sort sequence: '.g:netrw_sort_sequence
Bram Moolenaar5c736222010-01-06 20:54:52 +01006509 let w:netrw_bannercnt= w:netrw_bannercnt + 2
6510 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00006511" call Decho("directories will be sorted by size or time")
Bram Moolenaar5c736222010-01-06 20:54:52 +01006512 " sorted by size or date
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006513 keepj put ='\" Sorted by '.sortby
Bram Moolenaar5c736222010-01-06 20:54:52 +01006514 let w:netrw_bannercnt= w:netrw_bannercnt + 1
6515 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006516 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006517 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006518
6519 " show copy/move target, if any
Bram Moolenaar5c736222010-01-06 20:54:52 +01006520 if g:netrw_banner
6521 if exists("s:netrwmftgt") && exists("s:netrwmftgt_islocal")
6522" call Decho("show copy/move target<".s:netrwmftgt.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006523 keepj put =''
Bram Moolenaar5c736222010-01-06 20:54:52 +01006524 if s:netrwmftgt_islocal
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006525 sil! keepj call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (local)')
Bram Moolenaar5c736222010-01-06 20:54:52 +01006526 else
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006527 sil! keepj call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (remote)')
Bram Moolenaar5c736222010-01-06 20:54:52 +01006528 endif
6529 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00006530 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01006531" call Decho("s:netrwmftgt does not exist, don't make Copy/Move Tgt")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006532 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006533 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006534 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006535
6536 " Hiding... -or- Showing... {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01006537 if g:netrw_banner
6538" call Decho("handle hiding/showing (g:netrw_hide=".g:netrw_list_hide." g:netrw_list_hide<".g:netrw_list_hide.">)")
6539 if g:netrw_list_hide != "" && g:netrw_hide
6540 if g:netrw_hide == 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006541 keepj put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaar5c736222010-01-06 20:54:52 +01006542 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006543 keepj put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaar5c736222010-01-06 20:54:52 +01006544 endif
6545 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00006546 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006547 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006548 keepj put ='\" Quick Help: <F1>:help -:go up dir D:delete R:rename s:sort-by x:exec'
6549 keepj put ='\" ============================================================================'
Bram Moolenaar5c736222010-01-06 20:54:52 +01006550 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00006551 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006552
6553 " bannercnt should index the line just after the banner
Bram Moolenaar5c736222010-01-06 20:54:52 +01006554 if g:netrw_banner
6555 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006556 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01006557" call Decho("bannercnt=".w:netrw_bannercnt." (should index line just after banner) line($)=".line("$"))
6558 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006559
6560 " set up syntax highlighting {{{3
6561" call Decho("set up syntax highlighting")
6562 if has("syntax")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006563 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaaradc21822011-04-01 18:03:16 +02006564" call Decho("but g:syntax_on".(exists("g:syntax_on")? "=".g:syntax_on : "<doesn't exist>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006565 setlocal ft=
Bram Moolenaaradc21822011-04-01 18:03:16 +02006566 elseif &ft != "netrw"
6567 setlocal ft=netrw
Bram Moolenaar446cb832008-06-24 21:56:24 +00006568 endif
6569 endif
6570
6571 " get list of files
6572" call Decho("Get list of files - islocal=".a:islocal)
6573 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02006574 keepj call s:LocalListing()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006575 else " remote
Bram Moolenaaradc21822011-04-01 18:03:16 +02006576 keepj call s:NetrwRemoteListing()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006577 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006578" call Decho("g:netrw_banner=".g:netrw_banner." w:netrw_bannercnt=".w:netrw_bannercnt." (banner complete)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006579
6580 " manipulate the directory listing (hide, sort) {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01006581 if !g:netrw_banner || line("$") >= w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006582" call Decho("manipulate directory listing (hide)")
6583" call Decho("g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">")
6584 if g:netrw_hide && g:netrw_list_hide != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02006585 keepj call s:NetrwListHide()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006586 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006587 if !g:netrw_banner || line("$") >= w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006588" call Decho("manipulate directory listing (sort) : g:netrw_sort_by<".g:netrw_sort_by.">")
6589
6590 if g:netrw_sort_by =~ "^n"
6591 " sort by name
Bram Moolenaaradc21822011-04-01 18:03:16 +02006592 keepj call s:NetrwSetSort()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006593
Bram Moolenaar5c736222010-01-06 20:54:52 +01006594 if !g:netrw_banner || w:netrw_bannercnt < line("$")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006595" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction." (bannercnt=".w:netrw_bannercnt.")")
6596 if g:netrw_sort_direction =~ 'n'
6597 " normal direction sorting
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006598 exe 'sil keepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00006599 else
6600 " reverse direction sorting
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006601 exe 'sil keepj '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00006602 endif
6603 endif
6604 " remove priority pattern prefix
6605" call Decho("remove priority pattern prefix")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006606 exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\d\{3}'.g:netrw_sepchr.'//e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006607 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006608
6609 elseif a:islocal
Bram Moolenaar5c736222010-01-06 20:54:52 +01006610 if !g:netrw_banner || w:netrw_bannercnt < line("$")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006611" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction)
6612 if g:netrw_sort_direction =~ 'n'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006613" call Decho('exe sil keepjumps '.w:netrw_bannercnt.',$sort')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006614 exe 'sil! keepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00006615 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02006616" call Decho('exe sil keepjumps '.w:netrw_bannercnt.',$sort!')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006617 exe 'sil! keepj '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00006618 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006619 exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006620 keepj call histdel("/",-1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01006621 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006622 endif
6623
6624 elseif g:netrw_sort_direction =~ 'r'
6625" call Decho('reverse the sorted listing')
Bram Moolenaar5c736222010-01-06 20:54:52 +01006626 if !g:netrw_banner || w:netrw_bannercnt < line('$')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006627 exe 'sil! keepj '.w:netrw_bannercnt.',$g/^/m '.w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01006628 call histdel("/",-1)
6629 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006630 endif
6631 endif
6632
6633 " convert to wide/tree listing {{{3
6634" call Decho("modify display if wide/tree listing style")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006635 keepj call s:NetrwWideListing()
6636 keepj call s:NetrwTreeListing(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006637
Bram Moolenaar5c736222010-01-06 20:54:52 +01006638 if exists("w:netrw_bannercnt") && (line("$") > w:netrw_bannercnt || !g:netrw_banner)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006639 " place cursor on the top-left corner of the file listing
6640" call Decho("place cursor on top-left corner of file listing")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006641 exe 'sil! keepj '.w:netrw_bannercnt
6642 sil! keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00006643 endif
6644
6645 " record previous current directory
6646 let w:netrw_prvdir= b:netrw_curdir
6647" call Decho("record netrw_prvdir<".w:netrw_prvdir.">")
6648
6649 " save certain window-oriented variables into buffer-oriented variables {{{3
Bram Moolenaaradc21822011-04-01 18:03:16 +02006650 keepj call s:SetBufWinVars()
6651 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006652
6653 " set display to netrw display settings
6654" call Decho("set display to netrw display settings (noma nomod etc)")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006655 exe "setl ".g:netrw_bufsettings
Bram Moolenaar446cb832008-06-24 21:56:24 +00006656 if exists("s:treecurpos")
6657
Bram Moolenaaradc21822011-04-01 18:03:16 +02006658 keepj call netrw#NetrwRestorePosn(s:treecurpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006659 unlet s:treecurpos
6660 endif
6661
6662" call Dret("s:PerformListing : curpos<".string(getpos(".")).">")
6663endfun
6664
6665" ---------------------------------------------------------------------
6666" s:SetupNetrwStatusLine: {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00006667fun! s:SetupNetrwStatusLine(statline)
6668" call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)")
6669
6670 if !exists("s:netrw_setup_statline")
6671 let s:netrw_setup_statline= 1
6672" call Decho("do first-time status line setup")
6673
6674 if !exists("s:netrw_users_stl")
6675 let s:netrw_users_stl= &stl
6676 endif
6677 if !exists("s:netrw_users_ls")
6678 let s:netrw_users_ls= &laststatus
6679 endif
6680
6681 " set up User9 highlighting as needed
6682 let keepa= @a
6683 redir @a
6684 try
6685 hi User9
6686 catch /^Vim\%((\a\+)\)\=:E411/
6687 if &bg == "dark"
6688 hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue
6689 else
6690 hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue
6691 endif
6692 endtry
6693 redir END
6694 let @a= keepa
6695 endif
6696
6697 " set up status line (may use User9 highlighting)
6698 " insure that windows have a statusline
6699 " make sure statusline is displayed
6700 let &stl=a:statline
6701 setlocal laststatus=2
6702" call Decho("stl=".&stl)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006703 redraw
Bram Moolenaar9964e462007-05-05 17:54:07 +00006704
6705" call Dret("SetupNetrwStatusLine : stl=".&stl)
6706endfun
6707
6708" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00006709" Remote Directory Browsing Support: {{{1
6710" ===========================================
Bram Moolenaar9964e462007-05-05 17:54:07 +00006711
6712" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00006713" s:NetrwRemoteListing: {{{2
6714fun! s:NetrwRemoteListing()
6715" call Dfunc("s:NetrwRemoteListing() b:netrw_curdir<".b:netrw_curdir.">)")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00006716
Bram Moolenaar446cb832008-06-24 21:56:24 +00006717 call s:RemotePathAnalysis(b:netrw_curdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00006718
Bram Moolenaar446cb832008-06-24 21:56:24 +00006719 " sanity check:
6720 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
6721" call Decho("b:netrw_method=".b:netrw_method)
6722 if !executable("ftp")
6723 if !exists("g:netrw_quiet")
6724 call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ftp",18)
6725 endif
6726 call s:NetrwOptionRestore("w:")
6727" call Dret("s:NetrwRemoteListing")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00006728 return
6729 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006730
6731 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
6732 if !exists("g:netrw_quiet")
6733 if g:netrw_list_cmd == ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02006734 keepj call netrw#ErrorMsg(s:ERROR,g:netrw_ssh_cmd." is not executable on your system",47)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006735 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02006736 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 +00006737 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00006738 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00006739
Bram Moolenaaradc21822011-04-01 18:03:16 +02006740 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006741" call Dret("s:NetrwRemoteListing")
6742 return
6743 endif " (remote handling sanity check)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00006744
Bram Moolenaar446cb832008-06-24 21:56:24 +00006745 if exists("b:netrw_method")
6746" call Decho("setting w:netrw_method<".b:netrw_method.">")
6747 let w:netrw_method= b:netrw_method
6748 endif
6749
6750 if s:method == "ftp"
Bram Moolenaaradc21822011-04-01 18:03:16 +02006751 " use ftp to get remote file listing {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00006752" call Decho("use ftp to get remote file listing")
6753 let s:method = "ftp"
6754 let listcmd = g:netrw_ftp_list_cmd
6755 if g:netrw_sort_by =~ '^t'
6756 let listcmd= g:netrw_ftp_timelist_cmd
6757 elseif g:netrw_sort_by =~ '^s'
6758 let listcmd= g:netrw_ftp_sizelist_cmd
6759 endif
6760" call Decho("listcmd<".listcmd."> (using g:netrw_ftp_list_cmd)")
6761 call s:NetrwRemoteFtpCmd(s:path,listcmd)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006762" exe "sil! keepalt keepj ".w:netrw_bannercnt.',$g/^./call Decho("raw listing: ".getline("."))'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006763
6764 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
6765 " shorten the listing
6766" call Decho("generate short listing")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006767 exe "sil! keepalt keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006768
6769 " cleanup
6770 if g:netrw_ftp_browse_reject != ""
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006771 exe "sil! keepalt keepj g/".g:netrw_ftp_browse_reject."/keepj d"
Bram Moolenaaradc21822011-04-01 18:03:16 +02006772 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006773 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006774 sil! keepj %s/\r$//e
Bram Moolenaaradc21822011-04-01 18:03:16 +02006775 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006776
6777 " if there's no ../ listed, then put ./ and ../ in
6778 let line1= line(".")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006779 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006780 let line2= search('^\.\.\/\%(\s\|$\)','cnW')
6781 if line2 == 0
6782" call Decho("netrw is putting ./ and ../ into listing")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006783 sil! keepj put='../'
6784 sil! keepj put='./'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006785 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006786 exe "sil! keepj ".line1
6787 sil! keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00006788
6789" call Decho("line1=".line1." line2=".line2." line(.)=".line("."))
6790 if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
6791" call Decho("M$ ftp cleanup")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006792 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 +02006793 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006794 else " normal ftp cleanup
6795" call Decho("normal ftp cleanup")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006796 exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
6797 exe "sil! keepj ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
6798 exe "sil! keepj ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006799 keepj call histdel("/",-1)
6800 keepj call histdel("/",-1)
6801 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006802 endif
6803 endif
6804
6805 else
6806 " use ssh to get remote file listing {{{3
6807" call Decho("use ssh to get remote file listing: s:path<".s:path.">")
6808 let listcmd= s:MakeSshCmd(g:netrw_list_cmd)
6809" call Decho("listcmd<".listcmd."> (using g:netrw_list_cmd)")
6810 if g:netrw_scp_cmd =~ '^pscp'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006811" call Decho("1: exe sil r! ".shellescape(listcmd.s:path, 1))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006812 exe "sil! keepj r! ".listcmd.shellescape(s:path, 1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006813 " remove rubbish and adjust listing format of 'pscp' to 'ssh ls -FLa' like
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006814 sil! keepj g/^Listing directory/keepj d
6815 sil! keepj g/^d[-rwx][-rwx][-rwx]/keepj s+$+/+e
6816 sil! keepj g/^l[-rwx][-rwx][-rwx]/keepj s+$+@+e
Bram Moolenaaradc21822011-04-01 18:03:16 +02006817 keepj call histdel("/",-1)
6818 keepj call histdel("/",-1)
6819 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006820 if g:netrw_liststyle != s:LONGLIST
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006821 sil! keepj g/^[dlsp-][-rwx][-rwx][-rwx]/keepj s/^.*\s\(\S\+\)$/\1/e
Bram Moolenaaradc21822011-04-01 18:03:16 +02006822 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006823 endif
6824 else
6825 if s:path == ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02006826" call Decho("2: exe sil r! ".listcmd)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006827 exe "sil! keepalt r! ".listcmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00006828 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02006829" call Decho("3: exe sil r! ".listcmd.' '.shellescape(s:path,1))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006830 exe "sil! keepalt r! ".listcmd.' '.shellescape(s:path,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006831" call Decho("listcmd<".listcmd."> path<".s:path.">")
6832 endif
6833 endif
6834
6835 " cleanup
6836 if g:netrw_ftp_browse_reject != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02006837" call Decho("(cleanup) exe sil! g/".g:netrw_ssh_browse_reject."/keepjumps d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006838 exe "sil! g/".g:netrw_ssh_browse_reject."/keepj d"
Bram Moolenaaradc21822011-04-01 18:03:16 +02006839 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006840 endif
6841 endif
6842
6843 if w:netrw_liststyle == s:LONGLIST
6844 " do a long listing; these substitutions need to be done prior to sorting {{{3
6845" call Decho("fix long listing:")
6846
6847 if s:method == "ftp"
6848 " cleanup
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006849 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006850 while getline('.') =~ g:netrw_ftp_browse_reject
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006851 sil! keepj d
Bram Moolenaar446cb832008-06-24 21:56:24 +00006852 endwhile
6853 " if there's no ../ listed, then put ./ and ../ in
6854 let line1= line(".")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006855 sil! keepj 1
6856 sil! keepj call search('^\.\.\/\%(\s\|$\)','W')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006857 let line2= line(".")
6858 if line2 == 0
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006859 exe 'sil! keepj '.w:netrw_bannercnt."put='./'"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006860 if b:netrw_curdir != '/'
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006861 exe 'sil! keepj '.w:netrw_bannercnt."put='../'"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006862 endif
6863 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006864 exe "sil! keepj ".line1
6865 sil! keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00006866 endif
6867
6868 if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
6869" call Decho("M$ ftp site listing cleanup")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006870 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 +00006871 elseif exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$")
6872" call Decho("normal ftp site listing cleanup: bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006873 exe 'sil keepj '.w:netrw_bannercnt.',$s/ -> .*$//e'
6874 exe 'sil keepj '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
6875 exe 'sil keepj '.w:netrw_bannercnt
Bram Moolenaaradc21822011-04-01 18:03:16 +02006876 keepj call histdel("/",-1)
6877 keepj call histdel("/",-1)
6878 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006879 endif
6880 endif
6881
6882" if exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$") " Decho
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006883" exe "keepj ".w:netrw_bannercnt.',$g/^./call Decho("listing: ".getline("."))'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006884" endif " Decho
6885" call Dret("s:NetrwRemoteListing")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00006886endfun
6887
Bram Moolenaar446cb832008-06-24 21:56:24 +00006888" ---------------------------------------------------------------------
6889" s:NetrwRemoteRm: remove/delete a remote file or directory {{{2
6890fun! s:NetrwRemoteRm(usrhost,path) range
6891" call Dfunc("s:NetrwRemoteRm(usrhost<".a:usrhost."> path<".a:path.">) virtcol=".virtcol("."))
6892" call Decho("firstline=".a:firstline." lastline=".a:lastline)
6893 let svpos= netrw#NetrwSavePosn()
6894
6895 let all= 0
6896 if exists("s:netrwmarkfilelist_{bufnr('%')}")
6897 " remove all marked files
Bram Moolenaar5c736222010-01-06 20:54:52 +01006898" call Decho("remove all marked files with bufnr#".bufnr("%"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006899 for fname in s:netrwmarkfilelist_{bufnr("%")}
6900 let ok= s:NetrwRemoteRmFile(a:path,fname,all)
6901 if ok =~ 'q\%[uit]'
6902 break
6903 elseif ok =~ 'a\%[ll]'
6904 let all= 1
6905 endif
6906 endfor
Bram Moolenaar5c736222010-01-06 20:54:52 +01006907 call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006908
6909 else
6910 " remove files specified by range
Bram Moolenaar5c736222010-01-06 20:54:52 +01006911" call Decho("remove files specified by range")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006912
6913 " preparation for removing multiple files/directories
6914 let ctr= a:firstline
6915
6916 " remove multiple files and directories
6917 while ctr <= a:lastline
6918 exe ctr
6919 let ok= s:NetrwRemoteRmFile(a:path,s:NetrwGetWord(),all)
6920 if ok =~ 'q\%[uit]'
6921 break
6922 elseif ok =~ 'a\%[ll]'
6923 let all= 1
6924 endif
6925 let ctr= ctr + 1
6926 endwhile
6927 endif
6928
6929 " refresh the (remote) directory listing
6930" call Decho("refresh remote directory listing")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006931 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
6932 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006933
6934" call Dret("s:NetrwRemoteRm")
6935endfun
6936
6937" ---------------------------------------------------------------------
6938" s:NetrwRemoteRmFile: {{{2
6939fun! s:NetrwRemoteRmFile(path,rmfile,all)
6940" call Dfunc("s:NetrwRemoteRmFile(path<".a:path."> rmfile<".a:rmfile.">) all=".a:all)
6941
6942 let all= a:all
6943 let ok = ""
6944
6945 if a:rmfile !~ '^"' && (a:rmfile =~ '@$' || a:rmfile !~ '[\/]$')
6946 " attempt to remove file
6947" call Decho("attempt to remove file (all=".all.")")
6948 if !all
6949 echohl Statement
6950" call Decho("case all=0:")
6951 call inputsave()
6952 let ok= input("Confirm deletion of file<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
6953 call inputrestore()
6954 echohl NONE
6955 if ok == ""
6956 let ok="no"
6957 endif
6958 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
6959 if ok =~ 'a\%[ll]'
6960 let all= 1
6961 endif
6962 endif
6963
6964 if all || ok =~ 'y\%[es]' || ok == ""
6965" call Decho("case all=".all." or ok<".ok.">".(exists("w:netrw_method")? ': netrw_method='.w:netrw_method : ""))
6966 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
6967" call Decho("case ftp:")
6968 let path= a:path
6969 if path =~ '^\a\+://'
6970 let path= substitute(path,'^\a\+://[^/]\+/','','')
6971 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006972 sil! keepj .,$d
Bram Moolenaar446cb832008-06-24 21:56:24 +00006973 call s:NetrwRemoteFtpCmd(path,"delete ".'"'.a:rmfile.'"')
6974 else
6975" call Decho("case ssh: g:netrw_rm_cmd<".g:netrw_rm_cmd.">")
6976 let netrw_rm_cmd= s:MakeSshCmd(g:netrw_rm_cmd)
6977" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">")
6978 if !exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006979 keepj call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006980 let ok="q"
6981 else
6982 let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
6983" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">")
6984" call Decho("remotedir<".remotedir.">")
6985" call Decho("rmfile<".a:rmfile.">")
6986 if remotedir != ""
6987 let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(remotedir.a:rmfile))
6988 else
6989 let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(a:rmfile))
6990 endif
6991" call Decho("call system(".netrw_rm_cmd.")")
6992 let ret= system(netrw_rm_cmd)
6993 if ret != 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02006994 keepj call netrw#ErrorMsg(s:WARNING,"cmd<".netrw_rm_cmd."> failed",60)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006995 endif
6996" call Decho("returned=".ret." errcode=".v:shell_error)
6997 endif
6998 endif
6999 elseif ok =~ 'q\%[uit]'
7000" call Decho("ok==".ok)
7001 break
7002 endif
7003
7004 else
7005 " attempt to remove directory
7006" call Decho("attempt to remove directory")
7007 if !all
7008 call inputsave()
7009 let ok= input("Confirm deletion of directory<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
7010 call inputrestore()
7011 if ok == ""
7012 let ok="no"
7013 endif
7014 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
7015 if ok =~ 'a\%[ll]'
7016 let all= 1
7017 endif
7018 endif
7019
7020 if all || ok =~ 'y\%[es]' || ok == ""
7021 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaaradc21822011-04-01 18:03:16 +02007022 keepj call s:NetrwRemoteFtpCmd(a:path,"rmdir ".a:rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007023 else
7024 let rmfile = substitute(a:path.a:rmfile,'/$','','')
Bram Moolenaar5c736222010-01-06 20:54:52 +01007025 let netrw_rmdir_cmd = s:MakeSshCmd(netrw#WinPath(g:netrw_rmdir_cmd)).' '.shellescape(netrw#WinPath(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007026" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
Bram Moolenaarc236c162008-07-13 17:41:49 +00007027 let ret= system(netrw_rmdir_cmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007028" call Decho("returned=".ret." errcode=".v:shell_error)
7029
7030 if v:shell_error != 0
Bram Moolenaarc236c162008-07-13 17:41:49 +00007031" call Decho("v:shell_error not 0")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007032 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 +00007033" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
7034 let ret= system(netrw_rmf_cmd)
7035" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007036
7037 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007038 keepj call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",22)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007039 endif
7040 endif
7041 endif
7042
7043 elseif ok =~ 'q\%[uit]'
7044 break
7045 endif
7046 endif
7047
7048" call Dret("s:NetrwRemoteRmFile ".ok)
7049 return ok
7050endfun
7051
7052" ---------------------------------------------------------------------
7053" s:NetrwRemoteFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
7054" This function assumes that a long listing will be received. Size, time,
7055" and reverse sorts will be requested of the server but not otherwise
7056" enforced here.
7057fun! s:NetrwRemoteFtpCmd(path,listcmd)
7058" call Dfunc("NetrwRemoteFtpCmd(path<".a:path."> listcmd<".a:listcmd.">) netrw_method=".w:netrw_method)
7059" call Decho("line($)=".line("$")." bannercnt=".w:netrw_bannercnt)
7060
7061 " because WinXX ftp uses unix style input
7062 let ffkeep= &ff
7063 setlocal ma ff=unix noro
7064" call Decho("setlocal ma ff=unix noro")
7065
7066 " clear off any older non-banner lines
7067 " note that w:netrw_bannercnt indexes the line after the banner
Bram Moolenaaradc21822011-04-01 18:03:16 +02007068" call Decho('exe sil! keepjumps '.w:netrw_bannercnt.",$d (clear off old non-banner lines)")
7069 exe "sil! keepjumps ".w:netrw_bannercnt.",$d"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007070
7071 ".........................................
7072 if w:netrw_method == 2 || w:netrw_method == 5
7073 " ftp + <.netrc>: Method #2
7074 if a:path != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007075 keepj put ='cd \"'.a:path.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007076 endif
7077 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007078 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00007079" call Decho("filter input: ".getline('.'))
7080 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02007081 keepj call setline(line("$")+1,a:listcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007082" exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
7083 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02007084" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
7085 exe s:netrw_silentxfer." keepjumps ".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 +00007086 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02007087" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
7088 exe s:netrw_silentxfer." keepjumps ".w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007089 endif
7090
7091 ".........................................
7092 elseif w:netrw_method == 3
7093 " ftp + machine,id,passwd,filename: Method #3
7094 setlocal ff=unix
7095 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007096 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00007097 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007098 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00007099 endif
7100
7101 if exists("g:netrw_ftp") && g:netrw_ftp == 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007102 keepj put =g:netrw_uid
7103 keepj put ='\"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007104 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007105 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007106 endif
7107
7108 if a:path != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007109 keepj put ='cd \"'.a:path.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007110 endif
7111 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007112 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00007113" call Decho("filter input: ".getline('.'))
7114 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007115 keepj call setline(line("$")+1,a:listcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007116
7117 " perform ftp:
7118 " -i : turns off interactive prompting from ftp
7119 " -n unix : DON'T use <.netrc>, even though it exists
7120 " -n win32: quit being obnoxious about password
7121" exe w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007122" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i -n")
7123 exe s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i -n"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007124
7125 ".........................................
7126 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02007127 keepj call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",23)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007128 endif
7129
7130 " cleanup for Windows
7131 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007132 sil! keepj %s/\r$//e
Bram Moolenaaradc21822011-04-01 18:03:16 +02007133 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007134 endif
7135 if a:listcmd == "dir"
7136 " infer directory/link based on the file permission string
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007137 sil! keepj g/d\%([-r][-w][-x]\)\{3}/keepj s@$@/@
7138 sil! keepj g/l\%([-r][-w][-x]\)\{3}/keepj s/$/@/
Bram Moolenaaradc21822011-04-01 18:03:16 +02007139 keepj call histdel("/",-1)
7140 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007141 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007142 exe "sil! keepj ".w:netrw_bannercnt.',$s/^\%(\S\+\s\+\)\{8}//e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007143 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007144 endif
7145 endif
7146
7147 " ftp's listing doesn't seem to include ./ or ../
7148 if !search('^\.\/$\|\s\.\/$','wn')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007149 exe 'keepj '.w:netrw_bannercnt
7150 keepj put ='./'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007151 endif
7152 if !search('^\.\.\/$\|\s\.\.\/$','wn')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007153 exe 'keepj '.w:netrw_bannercnt
7154 keepj put ='../'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007155 endif
7156
7157 " restore settings
7158 let &ff= ffkeep
7159" call Dret("NetrwRemoteFtpCmd")
7160endfun
7161
7162" ---------------------------------------------------------------------
7163" s:NetrwRemoteRename: rename a remote file or directory {{{2
7164fun! s:NetrwRemoteRename(usrhost,path) range
7165" call Dfunc("NetrwRemoteRename(usrhost<".a:usrhost."> path<".a:path.">)")
7166
7167 " preparation for removing multiple files/directories
7168 let svpos = netrw#NetrwSavePosn()
7169 let ctr = a:firstline
7170 let rename_cmd = s:MakeSshCmd(g:netrw_rename_cmd)
7171
7172 " rename files given by the markfilelist
7173 if exists("s:netrwmarkfilelist_{bufnr('%')}")
7174 for oldname in s:netrwmarkfilelist_{bufnr("%")}
7175" call Decho("oldname<".oldname.">")
7176 if exists("subfrom")
7177 let newname= substitute(oldname,subfrom,subto,'')
7178" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
7179 else
7180 call inputsave()
7181 let newname= input("Moving ".oldname." to : ",oldname)
7182 call inputrestore()
7183 if newname =~ '^s/'
7184 let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
7185 let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
7186 let newname = substitute(oldname,subfrom,subto,'')
7187" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
7188 endif
7189 endif
7190
7191 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaaradc21822011-04-01 18:03:16 +02007192 keepj call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007193 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00007194 let oldname= shellescape(a:path.oldname)
7195 let newname= shellescape(a:path.newname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007196" call Decho("system(netrw#WinPath(".rename_cmd.") ".oldname.' '.newname.")")
7197 let ret = system(netrw#WinPath(rename_cmd).' '.oldname.' '.newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007198 endif
7199
7200 endfor
7201 call s:NetrwUnMarkFile(1)
7202
7203 else
7204
7205 " attempt to rename files/directories
7206 while ctr <= a:lastline
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007207 exe "keepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00007208
7209 let oldname= s:NetrwGetWord()
7210" call Decho("oldname<".oldname.">")
7211
7212 call inputsave()
7213 let newname= input("Moving ".oldname." to : ",oldname)
7214 call inputrestore()
7215
7216 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
7217 call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
7218 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00007219 let oldname= shellescape(a:path.oldname)
7220 let newname= shellescape(a:path.newname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007221" call Decho("system(netrw#WinPath(".rename_cmd.") ".oldname.' '.newname.")")
7222 let ret = system(netrw#WinPath(rename_cmd).' '.oldname.' '.newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007223 endif
7224
7225 let ctr= ctr + 1
7226 endwhile
7227 endif
7228
7229 " refresh the directory
Bram Moolenaaradc21822011-04-01 18:03:16 +02007230 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
7231 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007232
7233" call Dret("NetrwRemoteRename")
7234endfun
7235
7236" ---------------------------------------------------------------------
7237" Local Directory Browsing Support: {{{1
7238" ==========================================
7239
7240" ---------------------------------------------------------------------
7241" netrw#LocalBrowseCheck: {{{2
7242fun! netrw#LocalBrowseCheck(dirname)
7243 " unfortunate interaction -- split window debugging can't be
7244 " used here, must use D-echoRemOn or D-echoTabOn -- the BufEnter
7245 " event triggers another call to LocalBrowseCheck() when attempts
7246 " to write to the DBG buffer are made.
7247 " The &ft == "netrw" test was installed because the BufEnter event
7248 " would hit when re-entering netrw windows, creating unexpected
7249 " refreshes (and would do so in the middle of NetrwSaveOptions(), too)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007250" call Decho("netrw#LocalBrowseCheck: isdir<".a:dirname.">=".isdirectory(a:dirname).((exists("s:treeforceredraw")? " treeforceredraw" : "")))
Bram Moolenaaradc21822011-04-01 18:03:16 +02007251" call Dredir("LocalBrowseCheck","ls!")|redraw!|sleep 3
Bram Moolenaar446cb832008-06-24 21:56:24 +00007252 if isdirectory(a:dirname)
7253" call Decho(" ft<".&ft."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : " doesn't exist")."> dirname<".a:dirname.">"." line($)=".line("$"))
7254 if &ft != "netrw" || (exists("b:netrw_curdir") && b:netrw_curdir != a:dirname)
Bram Moolenaaradc21822011-04-01 18:03:16 +02007255 sil! keepj call s:NetrwBrowse(1,a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007256 elseif &ft == "netrw" && line("$") == 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02007257 sil! keepj call s:NetrwBrowse(1,a:dirname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007258 elseif exists("s:treeforceredraw")
7259 unlet s:treeforceredraw
Bram Moolenaaradc21822011-04-01 18:03:16 +02007260 sil! keepj call s:NetrwBrowse(1,a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007261 endif
7262 endif
7263 " not a directory, ignore it
7264endfun
7265
7266" ---------------------------------------------------------------------
7267" s:LocalListing: does the job of "ls" for local directories {{{2
7268fun! s:LocalListing()
7269" call Dfunc("s:LocalListing()")
7270" call Decho("&ma=".&ma)
7271" call Decho("&mod=".&mod)
7272" call Decho("&ro=".&ro)
7273" call Decho("bufname(%)<".bufname("%").">")
7274
7275" if exists("b:netrw_curdir") |call Decho('b:netrw_curdir<'.b:netrw_curdir.">") |else|call Decho("b:netrw_curdir doesn't exist") |endif
7276" if exists("g:netrw_sort_by")|call Decho('g:netrw_sort_by<'.g:netrw_sort_by.">")|else|call Decho("g:netrw_sort_by doesn't exist")|endif
7277
7278 " get the list of files contained in the current directory
Bram Moolenaaradc21822011-04-01 18:03:16 +02007279 let dirname = b:netrw_curdir
Bram Moolenaar5c736222010-01-06 20:54:52 +01007280 let dirnamelen = s:Strlen(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007281 let filelist = glob(s:ComposePath(dirname,"*"))
7282" call Decho("glob(dirname<".dirname."/*>)=".filelist)
7283 if filelist != ""
7284 let filelist= filelist."\n"
7285 endif
7286 let filelist= filelist.glob(s:ComposePath(dirname,".*"))
7287" call Decho("glob(dirname<".dirname."/.*>)=".filelist)
7288
7289 " Coding choice: either elide ./ if present
7290 " or include ./ if not present
7291 if filelist =~ '[\\/]\.[\\/]\=\(\n\|$\)'
7292 " elide /path/. from glob() entries if present
7293" call Decho("elide /path/. from glob entries if present")
7294 let filelist = substitute(filelist,'\n','\t','g')
7295 let filelist = substitute(filelist,'^[^\t]\+[/\\]\.\t','','')
7296 let filelist = substitute(filelist,'[^\t]\+[/\\]\.$','','')
7297 let filelist = substitute(filelist,'\t\zs[^\t]\+[/\\]\.\t','','')
7298 let filelist = substitute(filelist,'\t','\n','g')
7299 endif
7300" call Decho("filelist<".filelist.">")
7301 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
7302 " include ../ in the glob() entry if its missing
7303" call Decho("forcibly tacking on ..")
7304 let filelist= filelist."\n".s:ComposePath(b:netrw_curdir,"../")
7305" call Decho("filelist<".filelist.">")
7306 endif
7307 if b:netrw_curdir == '/'
7308 " remove .. from filelist when current directory is root directory
7309" call Decho("remove .. from filelist")
7310 let filelist= substitute(filelist,'/\.\.\n','','')
7311 endif
7312 " remove multiple contiguous newlines
7313 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
7314 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
7315 " change all \s to /s
7316" call Decho('change all \s to /s')
7317 let filelist= substitute(filelist,'\','/','g')
7318 else
7319 " escape all \s to \\
7320" call Decho('escape all \s to \\')
7321 let filelist= substitute(filelist,'\','\\','g')
7322 endif
7323
7324" call Decho("(before while) dirname<".dirname.">")
7325" call Decho("(before while) dirnamelen<".dirnamelen.">")
7326" call Decho("(before while) filelist<".filelist.">")
7327
7328 while filelist != ""
7329 if filelist =~ '\n'
7330 let filename = substitute(filelist,'\n.*$','','e')
7331 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
7332 else
7333 let filename = filelist
7334 let filelist = ""
7335 endif
7336" call Decho(" ")
7337" call Decho("(while) filelist<".filelist.">")
7338" call Decho("(while) filename<".filename.">")
7339
7340 if getftype(filename) == "link"
7341 " indicate a symbolic link
7342" call Decho("indicate <".filename."> is a symbolic link with trailing @")
7343 let pfile= filename."@"
7344
7345 elseif getftype(filename) == "socket"
7346 " indicate a socket
7347" call Decho("indicate <".filename."> is a socket with trailing =")
7348 let pfile= filename."="
7349
7350 elseif getftype(filename) == "fifo"
7351 " indicate a fifo
7352" call Decho("indicate <".filename."> is a fifo with trailing |")
7353 let pfile= filename."|"
7354
7355 elseif isdirectory(filename)
7356 " indicate a directory
7357" call Decho("indicate <".filename."> is a directory with trailing /")
7358 let pfile= filename."/"
7359
7360 elseif exists("b:netrw_curdir") && b:netrw_curdir !~ '^.*://' && !isdirectory(filename)
7361 if (has("win32") || has("win95") || has("win64") || has("win16"))
7362 if filename =~ '\.[eE][xX][eE]$' || filename =~ '\.[cC][oO][mM]$' || filename =~ '\.[bB][aA][tT]$'
7363 " indicate an executable
7364" call Decho("indicate <".filename."> is executable with trailing *")
7365 let pfile= filename."*"
7366 else
7367 " normal file
7368 let pfile= filename
7369 endif
7370 elseif executable(filename)
7371 " indicate an executable
7372" call Decho("indicate <".filename."> is executable with trailing *")
7373 let pfile= filename."*"
7374 else
7375 " normal file
7376 let pfile= filename
7377 endif
7378
7379 else
7380 " normal file
7381 let pfile= filename
7382 endif
7383" call Decho("pfile<".pfile."> (after *@/ appending)")
7384
7385 if pfile =~ '//$'
7386 let pfile= substitute(pfile,'//$','/','e')
7387" call Decho("change // to /: pfile<".pfile.">")
7388 endif
7389 let pfile= strpart(pfile,dirnamelen)
7390 let pfile= substitute(pfile,'^[/\\]','','e')
7391" call Decho("filename<".filename.">")
7392" call Decho("pfile <".pfile.">")
7393
7394 if w:netrw_liststyle == s:LONGLIST
7395 let sz = getfsize(filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007396 let fsz = strpart(" ",1,15-strlen(sz)).sz
Bram Moolenaar446cb832008-06-24 21:56:24 +00007397 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
7398" call Decho("sz=".sz." fsz=".fsz)
7399 endif
7400
7401 if g:netrw_sort_by =~ "^t"
7402 " sort by time (handles time up to 1 quintillion seconds, US)
7403" call Decho("getftime(".filename.")=".getftime(filename))
7404 let t = getftime(filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007405 let ft = strpart("000000000000000000",1,18-strlen(t)).t
Bram Moolenaar446cb832008-06-24 21:56:24 +00007406" call Decho("exe keepjumps put ='".ft.'/'.filename."'")
7407 let ftpfile= ft.'/'.pfile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007408 sil! keepj put=ftpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00007409
7410 elseif g:netrw_sort_by =~ "^s"
7411 " sort by size (handles file sizes up to 1 quintillion bytes, US)
7412" call Decho("getfsize(".filename.")=".getfsize(filename))
7413 let sz = getfsize(filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007414 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
Bram Moolenaar446cb832008-06-24 21:56:24 +00007415" call Decho("exe keepjumps put ='".fsz.'/'.filename."'")
7416 let fszpfile= fsz.'/'.pfile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007417 sil! keepj put =fszpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00007418
7419 else
7420 " sort by name
7421" call Decho("exe keepjumps put ='".pfile."'")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007422 sil! keepj put=pfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00007423 endif
7424 endwhile
7425
7426 " cleanup any windows mess at end-of-line
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007427 sil! keepj g/^$/d
7428 sil! keepj %s/\r$//e
Bram Moolenaar5c736222010-01-06 20:54:52 +01007429 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007430 exe "setlocal ts=".g:netrw_maxfilenamelen
7431" call Decho("setlocal ts=".g:netrw_maxfilenamelen)
7432
7433" call Dret("s:LocalListing")
7434endfun
7435
7436" ---------------------------------------------------------------------
7437" s:LocalBrowseShellCmdRefresh: this function is called after a user has {{{2
7438" performed any shell command. The idea is to cause all local-browsing
7439" buffers to be refreshed after a user has executed some shell command,
7440" on the chance that s/he removed/created a file/directory with it.
7441fun! s:LocalBrowseShellCmdRefresh()
7442" call Dfunc("LocalBrowseShellCmdRefresh() browselist=".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "empty")." ".tabpagenr("$")." tabs")
7443 " determine which buffers currently reside in a tab
7444 if !exists("s:netrw_browselist")
7445" call Dret("LocalBrowseShellCmdRefresh : browselist is empty")
7446 return
7447 endif
7448 if !exists("w:netrw_bannercnt")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007449" call Dret("LocalBrowseShellCmdRefresh : don't refresh when focus not on netrw window")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007450 return
7451 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007452 if exists("s:locbrowseshellcmd")
7453 if s:locbrowseshellcmd
7454 let s:locbrowseshellcmd= 0
7455" call Dret("LocalBrowseShellCmdRefresh : NetrwBrowse itself caused the refresh")
7456 return
7457 endif
7458 let s:locbrowseshellcmd= 0
7459 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007460 let itab = 1
7461 let buftablist = []
7462 while itab <= tabpagenr("$")
7463 let buftablist = buftablist + tabpagebuflist()
7464 let itab = itab + 1
7465 tabn
7466 endwhile
7467" call Decho("buftablist".string(buftablist))
7468" call Decho("s:netrw_browselist<".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "").">")
7469 " GO through all buffers on netrw_browselist (ie. just local-netrw buffers):
7470 " | refresh any netrw window
7471 " | wipe out any non-displaying netrw buffer
7472 let curwin = winnr()
7473 let ibl = 0
7474 for ibuf in s:netrw_browselist
7475" call Decho("bufwinnr(".ibuf.") index(buftablist,".ibuf.")=".index(buftablist,ibuf))
7476 if bufwinnr(ibuf) == -1 && index(buftablist,ibuf) == -1
7477 " wipe out any non-displaying netrw buffer
7478" call Decho("wiping buf#".ibuf,"<".bufname(ibuf).">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007479 exe "sil! bd ".fnameescape(ibuf)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007480 call remove(s:netrw_browselist,ibl)
7481" call Decho("browselist=".string(s:netrw_browselist))
7482 continue
7483 elseif index(tabpagebuflist(),ibuf) != -1
7484 " refresh any netrw buffer
7485" call Decho("refresh buf#".ibuf.'-> win#'.bufwinnr(ibuf))
7486 exe bufwinnr(ibuf)."wincmd w"
Bram Moolenaaradc21822011-04-01 18:03:16 +02007487 keepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007488 endif
7489 let ibl= ibl + 1
7490 endfor
7491 exe curwin."wincmd w"
7492
7493" call Dret("LocalBrowseShellCmdRefresh")
7494endfun
7495
7496" ---------------------------------------------------------------------
7497" s:NetrwLocalRm: {{{2
7498fun! s:NetrwLocalRm(path) range
7499" call Dfunc("s:NetrwLocalRm(path<".a:path.">)")
7500" call Decho("firstline=".a:firstline." lastline=".a:lastline)
7501
7502 " preparation for removing multiple files/directories
7503 let ret = 0
7504 let all = 0
7505 let svpos = netrw#NetrwSavePosn()
7506
7507 if exists("s:netrwmarkfilelist_{bufnr('%')}")
7508 " remove all marked files
7509" call Decho("remove all marked files")
7510 for fname in s:netrwmarkfilelist_{bufnr("%")}
7511 let ok= s:NetrwLocalRmFile(a:path,fname,all)
7512 if ok =~ 'q\%[uit]' || ok == "no"
7513 break
7514 elseif ok =~ 'a\%[ll]'
7515 let all= 1
7516 endif
7517 endfor
7518 call s:NetrwUnMarkFile(1)
7519
7520 else
7521 " remove (multiple) files and directories
7522" call Decho("remove files in range [".a:firstline.",".a:lastline."]")
7523
7524 let ctr = a:firstline
7525 while ctr <= a:lastline
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007526 exe "keepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00007527
7528 " sanity checks
7529 if line(".") < w:netrw_bannercnt
7530 let ctr= ctr + 1
7531 continue
7532 endif
7533 let curword= s:NetrwGetWord()
7534 if curword == "./" || curword == "../"
7535 let ctr= ctr + 1
7536 continue
7537 endif
7538 let ok= s:NetrwLocalRmFile(a:path,curword,all)
7539 if ok =~ 'q\%[uit]' || ok == "no"
7540 break
7541 elseif ok =~ 'a\%[ll]'
7542 let all= 1
7543 endif
7544 let ctr= ctr + 1
7545 endwhile
7546 endif
7547
7548 " refresh the directory
7549" call Decho("bufname<".bufname("%").">")
7550 if bufname("%") != "NetrwMessage"
Bram Moolenaaradc21822011-04-01 18:03:16 +02007551 keepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
7552 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007553 endif
7554
7555" call Dret("s:NetrwLocalRm")
7556endfun
7557
7558" ---------------------------------------------------------------------
7559" s:NetrwLocalRmFile: remove file fname given the path {{{2
7560" Give confirmation prompt unless all==1
7561fun! s:NetrwLocalRmFile(path,fname,all)
7562" call Dfunc("s:NetrwLocalRmFile(path<".a:path."> fname<".a:fname."> all=".a:all)
7563
7564 let all= a:all
7565 let ok = ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007566 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00007567 let rmfile= s:ComposePath(a:path,a:fname)
7568" call Decho("rmfile<".rmfile.">")
7569
7570 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
7571 " attempt to remove file
7572" call Decho("attempt to remove file<".rmfile.">")
7573 if !all
7574 echohl Statement
7575 call inputsave()
7576 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
7577 call inputrestore()
7578 echohl NONE
7579 if ok == ""
7580 let ok="no"
7581 endif
7582" call Decho("response: ok<".ok.">")
7583 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
7584" call Decho("response: ok<".ok."> (after sub)")
7585 if ok =~ 'a\%[ll]'
7586 let all= 1
7587 endif
7588 endif
7589
7590 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00007591 let ret= s:NetrwDelete(rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007592" call Decho("errcode=".v:shell_error." ret=".ret)
7593 endif
7594
7595 else
7596 " attempt to remove directory
7597 if !all
7598 echohl Statement
7599 call inputsave()
7600 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
7601 call inputrestore()
7602 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
7603 if ok == ""
7604 let ok="no"
7605 endif
7606 if ok =~ 'a\%[ll]'
7607 let all= 1
7608 endif
7609 endif
7610 let rmfile= substitute(rmfile,'[\/]$','','e')
7611
7612 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar5c736222010-01-06 20:54:52 +01007613" call Decho("1st attempt: system(netrw#WinPath(".g:netrw_local_rmdir.') '.shellescape(rmfile).')')
7614 call system(netrw#WinPath(g:netrw_local_rmdir).' '.shellescape(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007615" call Decho("v:shell_error=".v:shell_error)
7616
7617 if v:shell_error != 0
7618" call Decho("2nd attempt to remove directory<".rmfile.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00007619 let errcode= s:NetrwDelete(rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007620" call Decho("errcode=".errcode)
7621
7622 if errcode != 0
7623 if has("unix")
7624" call Decho("3rd attempt to remove directory<".rmfile.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00007625 call system("rm ".shellescape(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007626 if v:shell_error != 0 && !exists("g:netrw_quiet")
7627 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",34)
7628 let ok="no"
7629 endif
7630 elseif !exists("g:netrw_quiet")
7631 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",35)
7632 let ok="no"
7633 endif
7634 endif
7635 endif
7636 endif
7637 endif
7638
7639" call Dret("s:NetrwLocalRmFile ".ok)
7640 return ok
7641endfun
7642
7643" ---------------------------------------------------------------------
7644" s:NetrwLocalRename: rename a remote file or directory {{{2
7645fun! s:NetrwLocalRename(path) range
7646" call Dfunc("NetrwLocalRename(path<".a:path.">)")
7647
7648 " preparation for removing multiple files/directories
7649 let ctr = a:firstline
7650 let svpos= netrw#NetrwSavePosn()
7651
7652 " rename files given by the markfilelist
7653 if exists("s:netrwmarkfilelist_{bufnr('%')}")
7654 for oldname in s:netrwmarkfilelist_{bufnr("%")}
7655" call Decho("oldname<".oldname.">")
7656 if exists("subfrom")
7657 let newname= substitute(oldname,subfrom,subto,'')
7658" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
7659 else
7660 call inputsave()
7661 let newname= input("Moving ".oldname." to : ",oldname)
7662 call inputrestore()
7663 if newname =~ '^s/'
7664 let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
7665 let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
7666" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
7667 let newname = substitute(oldname,subfrom,subto,'')
7668 endif
7669 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00007670 call rename(oldname,newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007671 endfor
Bram Moolenaar5c736222010-01-06 20:54:52 +01007672 call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007673
7674 else
7675
7676 " attempt to rename files/directories
7677 while ctr <= a:lastline
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007678 exe "keepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00007679
7680 " sanity checks
7681 if line(".") < w:netrw_bannercnt
7682 let ctr= ctr + 1
7683 continue
7684 endif
7685 let curword= s:NetrwGetWord()
7686 if curword == "./" || curword == "../"
7687 let ctr= ctr + 1
7688 continue
7689 endif
7690
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007691 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00007692 let oldname= s:ComposePath(a:path,curword)
7693" call Decho("oldname<".oldname.">")
7694
7695 call inputsave()
7696 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
7697 call inputrestore()
7698
Bram Moolenaare37d50a2008-08-06 17:06:04 +00007699 call rename(oldname,newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007700" call Decho("renaming <".oldname."> to <".newname.">")
7701
7702 let ctr= ctr + 1
7703 endwhile
7704 endif
7705
7706 " refresh the directory
7707" call Decho("refresh the directory listing")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007708 keepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
7709 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007710
7711" call Dret("NetrwLocalRename")
7712endfun
7713
7714" ---------------------------------------------------------------------
7715" s:LocalFastBrowser: handles setting up/taking down fast browsing for the local browser {{{2
7716"
7717" g:netrw_ Directory Is
7718" fastbrowse Local Remote
7719" slow 0 D D D=Deleting a buffer implies it will not be re-used (slow)
7720" med 1 D H H=Hiding a buffer implies it may be re-used (fast)
7721" fast 2 H H
7722"
7723" Deleting a buffer means that it will be re-loaded when examined, hence "slow".
7724" Hiding a buffer means that it will be re-used when examined, hence "fast".
7725" (re-using a buffer may not be as accurate)
7726fun! s:LocalFastBrowser()
7727" call Dfunc("LocalFastBrowser() g:netrw_fastbrowse=".g:netrw_fastbrowse)
7728
7729 " initialize browselist, a list of buffer numbers that the local browser has used
7730 if !exists("s:netrw_browselist")
7731" call Decho("initialize s:netrw_browselist")
7732 let s:netrw_browselist= []
7733 endif
7734
7735 " append current buffer to fastbrowse list
7736 if empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1]
7737" call Decho("appendng current buffer to browselist")
7738 call add(s:netrw_browselist,bufnr("%"))
7739" call Decho("browselist=".string(s:netrw_browselist))
7740 endif
7741
7742 " enable autocmd events to handle refreshing/removing local browser buffers
7743 " If local browse buffer is currently showing: refresh it
7744 " If local browse buffer is currently hidden : wipe it
7745 if !exists("s:netrw_browser_shellcmd") && g:netrw_fastbrowse <= 1
7746" call Decho("setting up local-browser shell command refresh")
7747 let s:netrw_browser_shellcmd= 1
7748 augroup AuNetrwShellCmd
7749 au!
7750 if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01007751" call Decho("autocmd: ShellCmdPost * call s:LocalBrowseShellCmdRefresh()")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007752 au ShellCmdPost * call s:LocalBrowseShellCmdRefresh()
7753 else
7754 au ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()
Bram Moolenaar5c736222010-01-06 20:54:52 +01007755" call Decho("autocmd: ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007756 endif
7757 augroup END
7758 endif
7759
7760 " user must have changed fastbrowse to its fast setting, so remove
7761 " the associated autocmd events
7762 if g:netrw_fastbrowse > 1 && exists("s:netrw_browser_shellcmd")
7763" call Decho("remove AuNetrwShellCmd autcmd group")
7764 unlet s:netrw_browser_shellcmd
7765 augroup AuNetrwShellCmd
7766 au!
7767 augroup END
7768 augroup! AuNetrwShellCmd
7769 endif
7770
7771" call Dret("LocalFastBrowser : browselist<".string(s:netrw_browselist).">")
7772endfun
7773
7774" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02007775" netrw#FileUrlRead: handles reading file:///* files {{{2
7776fun! netrw#FileUrlRead(fname)
7777" call Dfunc("netrw#FileUrlRead()")
7778 let fname2396 = netrw#RFC2396(a:fname)
7779 let fname2396e= fnameescape(fname2396)
7780 let plainfname= substitute(fname2396,'file://\(.*\)','\1',"")
7781" call Decho("fname2396<".fname2396.">")
7782" call Decho("plainfname<".plainfname.">")
7783 exe "sil doau BufReadPre ".fname2396e
7784 exe 'r '.plainfname
7785 exe 'file! '.plainfname
7786 1d
7787 setlocal nomod
7788" call Dret("netrw#FileUrlRead")
7789 exe "sil doau BufReadPost ".fname2396e
7790endfun
7791
7792" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00007793" Support Functions: {{{1
7794
Bram Moolenaar488c6512005-08-11 20:09:58 +00007795" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00007796" netrw#ErrorMsg: {{{2
7797" 0=note = s:NOTE
7798" 1=warning = s:WARNING
7799" 2=error = s:ERROR
Bram Moolenaaradc21822011-04-01 18:03:16 +02007800" Dec 03, 2009 : max errnum currently is 77
Bram Moolenaar9964e462007-05-05 17:54:07 +00007801fun! netrw#ErrorMsg(level,msg,errnum)
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007802" call Dfunc("netrw#ErrorMsg(level=".a:level." msg<".a:msg."> errnum=".a:errnum.") g:netrw_use_errorwindow=".g:netrw_use_errorwindow)
Bram Moolenaar9964e462007-05-05 17:54:07 +00007803
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007804 if a:level == 1
7805 let level= "**warning** (netrw) "
7806 elseif a:level == 2
7807 let level= "**error** (netrw) "
7808 else
7809 let level= "**note** (netrw) "
Bram Moolenaar9964e462007-05-05 17:54:07 +00007810 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007811" call Decho("level=".level)
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007812
7813 if g:netrw_use_errorwindow
7814 " (default) netrw creates a one-line window to show error/warning
7815 " messages (reliably displayed)
7816
Bram Moolenaar446cb832008-06-24 21:56:24 +00007817 " record current window number for NetrwRestorePosn()'s benefit
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007818 let s:winBeforeErr= winnr()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007819" call Decho("s:winBeforeErr=".s:winBeforeErr)
7820
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007821 " getting messages out reliably is just plain difficult!
7822 " This attempt splits the current window, creating a one line window.
7823 if bufexists("NetrwMessage") && bufwinnr("NetrwMessage") > 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00007824" call Decho("write to NetrwMessage buffer")
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007825 exe bufwinnr("NetrwMessage")."wincmd w"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007826" call Decho("setlocal ma noro")
7827 setlocal ma noro
Bram Moolenaaradc21822011-04-01 18:03:16 +02007828 keepj call setline(line("$")+1,level.a:msg)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007829 keepj $
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007830 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00007831" call Decho("create a NetrwMessage buffer window")
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007832 bo 1split
Bram Moolenaar5c736222010-01-06 20:54:52 +01007833 call s:NetrwEnew()
Bram Moolenaaradc21822011-04-01 18:03:16 +02007834 keepj call s:NetrwSafeOptions()
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007835 setlocal bt=nofile
Bram Moolenaaradc21822011-04-01 18:03:16 +02007836 keepj file NetrwMessage
Bram Moolenaar446cb832008-06-24 21:56:24 +00007837" call Decho("setlocal ma noro")
7838 setlocal ma noro
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007839 call setline(line("$"),level.a:msg)
7840 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007841" call Decho("wrote msg<".level.a:msg."> to NetrwMessage win#".winnr())
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007842 if &fo !~ '[ta]'
7843 syn clear
7844 syn match netrwMesgNote "^\*\*note\*\*"
7845 syn match netrwMesgWarning "^\*\*warning\*\*"
7846 syn match netrwMesgError "^\*\*error\*\*"
7847 hi link netrwMesgWarning WarningMsg
7848 hi link netrwMesgError Error
7849 endif
7850 setlocal noma ro bh=wipe
7851
7852 else
7853 " (optional) netrw will show messages using echomsg. Even if the
7854 " message doesn't appear, at least it'll be recallable via :messages
Bram Moolenaar446cb832008-06-24 21:56:24 +00007855" redraw!
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007856 if a:level == s:WARNING
7857 echohl WarningMsg
7858 elseif a:level == s:ERROR
7859 echohl Error
7860 endif
7861 echomsg level.a:msg
7862" call Decho("echomsg ***netrw*** ".a:msg)
7863 echohl None
7864 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00007865
7866" call Dret("netrw#ErrorMsg")
7867endfun
7868
7869" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00007870" netrw#NetrwRestorePosn: restores the cursor and file position as saved by NetrwSavePosn() {{{2
7871fun! netrw#NetrwRestorePosn(...)
7872" 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))
7873 let eikeep= &ei
7874 set ei=all
7875 if expand("%") == "NetrwMessage"
7876 exe s:winBeforeErr."wincmd w"
7877 endif
7878
7879 if a:0 > 0
7880 exe a:1
7881 endif
7882
7883 " restore window
7884 if exists("w:netrw_winnr")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007885" call Decho("restore window: exe sil! ".w:netrw_winnr."wincmd w")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007886 exe "sil! ".w:netrw_winnr."wincmd w"
Bram Moolenaarc236c162008-07-13 17:41:49 +00007887 endif
7888 if v:shell_error == 0
7889 " as suggested by Bram M: redraw on no error
7890 " allows protocol error messages to remain visible
7891" redraw!
7892 endif
7893
7894 " restore top-of-screen line
7895 if exists("w:netrw_hline")
7896" call Decho("restore topofscreen: exe norm! ".w:netrw_hline."G0z")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007897 exe "keepj norm! ".w:netrw_hline."G0z\<CR>"
Bram Moolenaarc236c162008-07-13 17:41:49 +00007898 endif
7899
7900 " restore position
7901 if exists("w:netrw_line") && exists("w:netrw_col")
7902" call Decho("restore posn: exe norm! ".w:netrw_line."G0".w:netrw_col."|")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007903 exe "keepj norm! ".w:netrw_line."G0".w:netrw_col."\<bar>"
Bram Moolenaarc236c162008-07-13 17:41:49 +00007904 endif
7905
7906 let &ei= eikeep
7907" call Dret("netrw#NetrwRestorePosn")
7908endfun
7909
7910" ---------------------------------------------------------------------
7911" netrw#NetrwSavePosn: saves position of cursor on screen {{{2
7912fun! netrw#NetrwSavePosn()
7913" call Dfunc("netrw#NetrwSavePosn()")
7914 " Save current line and column
7915 let w:netrw_winnr= winnr()
7916 let w:netrw_line = line(".")
7917 let w:netrw_col = virtcol(".")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007918" call Decho("currently, win#".w:netrw_winnr." line#".w:netrw_line." col#".w:netrw_col)
Bram Moolenaarc236c162008-07-13 17:41:49 +00007919
7920 " Save top-of-screen line
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007921 keepj norm! H0
Bram Moolenaarc236c162008-07-13 17:41:49 +00007922 let w:netrw_hline= line(".")
7923
7924 " set up string holding position parameters
7925 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
7926
Bram Moolenaaradc21822011-04-01 18:03:16 +02007927 keepj call netrw#NetrwRestorePosn()
Bram Moolenaarc236c162008-07-13 17:41:49 +00007928" call Dret("netrw#NetrwSavePosn : winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline)
7929 return ret
7930endfun
7931
7932" ------------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00007933" netrw#RFC2396: converts %xx into characters {{{2
7934fun! netrw#RFC2396(fname)
7935" call Dfunc("netrw#RFC2396(fname<".a:fname.">)")
7936 let fname = escape(substitute(a:fname,'%\(\x\x\)','\=nr2char("0x".submatch(1))','ge')," \t")
7937" call Dret("netrw#RFC2396 ".fname)
7938 return fname
7939endfun
7940
7941" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00007942" s:ComposePath: Appends a new part to a path taking different systems into consideration {{{2
7943fun! s:ComposePath(base,subdir)
7944" call Dfunc("s:ComposePath(base<".a:base."> subdir<".a:subdir.">)")
7945
7946 if(has("amiga"))
7947" call Decho("amiga")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007948 let ec = a:base[s:Strlen(a:base)-1]
Bram Moolenaarc236c162008-07-13 17:41:49 +00007949 if ec != '/' && ec != ':'
7950 let ret = a:base . "/" . a:subdir
7951 else
7952 let ret = a:base . a:subdir
7953 endif
7954
7955 elseif a:subdir =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16"))
7956" call Decho("windows")
7957 let ret= a:subdir
7958
Bram Moolenaar5c736222010-01-06 20:54:52 +01007959 elseif a:base =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16"))
7960" call Decho("windows")
7961 if a:base =~ '[/\\]$'
7962 let ret= a:base.a:subdir
7963 else
7964 let ret= a:base."/".a:subdir
7965 endif
7966
Bram Moolenaarc236c162008-07-13 17:41:49 +00007967 elseif a:base =~ '^\a\+://'
7968" call Decho("remote linux/macos")
7969 let urlbase = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\1','')
7970 let curpath = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\2','')
7971 if a:subdir == '../'
7972 if curpath =~ '[^/]/[^/]\+/$'
7973 let curpath= substitute(curpath,'[^/]\+/$','','')
7974 else
7975 let curpath=""
7976 endif
7977 let ret= urlbase.curpath
7978 else
7979 let ret= urlbase.curpath.a:subdir
7980 endif
7981" call Decho("urlbase<".urlbase.">")
7982" call Decho("curpath<".curpath.">")
7983" call Decho("ret<".ret.">")
7984
7985 else
7986" call Decho("local linux/macos")
7987 let ret = substitute(a:base."/".a:subdir,"//","/","g")
7988 if a:base =~ '^//'
7989 " keeping initial '//' for the benefit of network share listing support
7990 let ret= '/'.ret
7991 endif
7992 let ret= simplify(ret)
7993 endif
7994
7995" call Dret("s:ComposePath ".ret)
7996 return ret
7997endfun
7998
7999" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008000" s:FileReadable: o/s independent filereadable {{{2
8001fun! s:FileReadable(fname)
8002" call Dfunc("s:FileReadable(fname<".a:fname.">)")
8003
8004 if g:netrw_cygwin
8005 let ret= filereadable(substitute(a:fname,'/cygdrive/\(.\)','\1:/',''))
8006 else
8007 let ret= filereadable(a:fname)
8008 endif
8009
8010" call Dret("s:FileReadable ".ret)
8011 return ret
8012endfun
8013
8014" ---------------------------------------------------------------------
8015" s:GetTempfile: gets a tempname that'll work for various o/s's {{{2
8016" Places correct suffix on end of temporary filename,
8017" using the suffix provided with fname
8018fun! s:GetTempfile(fname)
8019" call Dfunc("s:GetTempfile(fname<".a:fname.">)")
8020
8021 if !exists("b:netrw_tmpfile")
8022 " get a brand new temporary filename
8023 let tmpfile= tempname()
8024" call Decho("tmpfile<".tmpfile."> : from tempname()")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008025
Bram Moolenaarc236c162008-07-13 17:41:49 +00008026 let tmpfile= substitute(tmpfile,'\','/','ge')
Bram Moolenaar9964e462007-05-05 17:54:07 +00008027" call Decho("tmpfile<".tmpfile."> : chgd any \\ -> /")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008028
Bram Moolenaar9964e462007-05-05 17:54:07 +00008029 " sanity check -- does the temporary file's directory exist?
8030 if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
Bram Moolenaarc236c162008-07-13 17:41:49 +00008031" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaaradc21822011-04-01 18:03:16 +02008032 keepj call netrw#ErrorMsg(s:ERROR,"your <".substitute(tmpfile,'[^/]\+$','','e')."> directory is missing!",2)
Bram Moolenaar9964e462007-05-05 17:54:07 +00008033" call Dret("s:GetTempfile getcwd<".getcwd().">")
8034 return ""
8035 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008036
Bram Moolenaar9964e462007-05-05 17:54:07 +00008037 " let netrw#NetSource() know about the tmpfile
Bram Moolenaar5c736222010-01-06 20:54:52 +01008038 let s:netrw_tmpfile= tmpfile " used by netrw#NetSource() and netrw#NetrwBrowseX()
Bram Moolenaar9964e462007-05-05 17:54:07 +00008039" call Decho("tmpfile<".tmpfile."> s:netrw_tmpfile<".s:netrw_tmpfile.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008040
Bram Moolenaar9964e462007-05-05 17:54:07 +00008041 " o/s dependencies
Bram Moolenaar446cb832008-06-24 21:56:24 +00008042 if g:netrw_cygwin != 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00008043 let tmpfile = substitute(tmpfile,'^\(\a\):','/cygdrive/\1','e')
8044 elseif has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008045 if !exists("+shellslash") || !&ssl
8046 let tmpfile = substitute(tmpfile,'/','\','g')
8047 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00008048 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00008049 let tmpfile = tmpfile
Bram Moolenaar9964e462007-05-05 17:54:07 +00008050 endif
8051 let b:netrw_tmpfile= tmpfile
8052" call Decho("o/s dependent fixed tempname<".tmpfile.">")
8053 else
8054 " re-use temporary filename
8055 let tmpfile= b:netrw_tmpfile
8056" call Decho("tmpfile<".tmpfile."> re-using")
8057 endif
8058
8059 " use fname's suffix for the temporary file
8060 if a:fname != ""
8061 if a:fname =~ '\.[^./]\+$'
8062" call Decho("using fname<".a:fname.">'s suffix")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008063 if a:fname =~ '\.tar\.gz$' || a:fname =~ '\.tar\.bz2$' || a:fname =~ '\.tar\.xz$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00008064 let suffix = ".tar".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008065 elseif a:fname =~ '.txz$'
8066 let suffix = ".txz".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
Bram Moolenaar9964e462007-05-05 17:54:07 +00008067 else
8068 let suffix = substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
8069 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00008070" call Decho("suffix<".suffix.">")
8071 let tmpfile= substitute(tmpfile,'\.tmp$','','e')
8072" call Decho("chgd tmpfile<".tmpfile."> (removed any .tmp suffix)")
8073 let tmpfile .= suffix
8074" call Decho("chgd tmpfile<".tmpfile."> (added ".suffix." suffix) netrw_fname<".b:netrw_fname.">")
8075 let s:netrw_tmpfile= tmpfile " supports netrw#NetSource()
8076 endif
8077 endif
8078
Bram Moolenaarc236c162008-07-13 17:41:49 +00008079" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar9964e462007-05-05 17:54:07 +00008080" call Dret("s:GetTempfile <".tmpfile.">")
8081 return tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00008082endfun
Bram Moolenaar9964e462007-05-05 17:54:07 +00008083
8084" ---------------------------------------------------------------------
8085" s:MakeSshCmd: transforms input command using USEPORT HOSTNAME into {{{2
Bram Moolenaarc236c162008-07-13 17:41:49 +00008086" a correct command for use with a system() call
Bram Moolenaar9964e462007-05-05 17:54:07 +00008087fun! s:MakeSshCmd(sshcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008088" call Dfunc("s:MakeSshCmd(sshcmd<".a:sshcmd.">) user<".s:user."> machine<".s:machine.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008089 let sshcmd = substitute(a:sshcmd,'\<HOSTNAME\>',s:user.s:machine,'')
8090 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00008091 let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.g:netrw_port,'')
Bram Moolenaar9964e462007-05-05 17:54:07 +00008092 elseif exists("s:port") && s:port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00008093 let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.s:port,'')
Bram Moolenaar9964e462007-05-05 17:54:07 +00008094 else
8095 let sshcmd= substitute(sshcmd,"USEPORT ",'','')
8096 endif
8097" call Dret("s:MakeSshCmd <".sshcmd.">")
8098 return sshcmd
8099endfun
8100
8101" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008102" s:NetrwBMShow: {{{2
8103fun! s:NetrwBMShow()
8104" call Dfunc("s:NetrwBMShow()")
8105 redir => bmshowraw
8106 menu
8107 redir END
8108 let bmshowlist = split(bmshowraw,'\n')
8109 if bmshowlist != []
8110 let bmshowfuncs= filter(bmshowlist,'v:val =~ "<SNR>\\d\\+_BMShow()"')
8111 if bmshowfuncs != []
8112 let bmshowfunc = substitute(bmshowfuncs[0],'^.*:\(call.*BMShow()\).*$','\1','')
8113 if bmshowfunc =~ '^call.*BMShow()'
Bram Moolenaaradc21822011-04-01 18:03:16 +02008114 exe "sil! keepj ".bmshowfunc
Bram Moolenaarc236c162008-07-13 17:41:49 +00008115 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008116 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008117 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00008118" call Dret("s:NetrwBMShow : bmshowfunc<".(exists("bmshowfunc")? bmshowfunc : 'n/a').">")
8119endfun
8120
8121" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02008122" s:NetrwCursor: responsible for setting cursorline/cursorcolumn based upon g:netrw_cursor {{{2
8123fun! s:NetrwCursor()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008124 if !exists("w:netrw_liststyle")
8125 let w:netrw_liststyle= g:netrw_liststyle
8126 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02008127" call Dfunc("s:NetrwCursor() liststyle=".w:netrw_liststyle." g:netrw_cursor=".g:netrw_cursor." s:netrw_usercuc=".s:netrw_usercuc." s:netrw_usercul=".s:netrw_usercul)
8128
8129 if &ft != "netrw"
8130 " if the current window isn't a netrw directory listing window, then use user cursorline/column
8131 " settings. Affects when netrw is used to read/write a file using scp/ftp/etc.
8132 let &l:cursorline = s:netrw_usercul
8133 let &l:cursorcolumn = s:netrw_usercuc
8134
8135 elseif g:netrw_cursor == 4
8136 " all styles: cursorline, cursorcolumn
8137 setlocal cursorline
8138 setlocal cursorcolumn
8139
8140 elseif g:netrw_cursor == 3
8141 " thin-long-tree: cursorline, user's cursorcolumn
8142 " wide : cursorline, cursorcolumn
8143 if w:netrw_liststyle == s:WIDELIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008144 setlocal cursorline
Bram Moolenaaradc21822011-04-01 18:03:16 +02008145 setlocal cursorcolumn
8146 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008147 setlocal cursorline
Bram Moolenaaradc21822011-04-01 18:03:16 +02008148 let &l:cursorcolumn = s:netrw_usercuc
8149 endif
8150
8151 elseif g:netrw_cursor == 2
8152 " thin-long-tree: cursorline, user's cursorcolumn
8153 " wide : cursorline, user's cursorcolumn
8154 let &l:cursorcolumn = s:netrw_usercuc
8155 setlocal cursorline
8156
8157 elseif g:netrw_cursor == 1
8158 " thin-long-tree: user's cursorline, user's cursorcolumn
8159 " wide : cursorline, user's cursorcolumn
8160 let &l:cursorcolumn = s:netrw_usercuc
8161 if w:netrw_liststyle == s:WIDELIST
8162 setlocal cursorline
8163 else
8164 let &l:cursorline = s:netrw_usercul
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008165 endif
8166
8167 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02008168 " all styles: user's cursorline, user's cursorcolumn
8169 let &l:cursorline = s:netrw_usercul
8170 let &l:cursorcolumn = s:netrw_usercuc
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008171 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02008172
8173" call Dret("s:NetrwCursor : l:cursorline=".&l:cursorline." l:cursorcolumn=".&l:cursorcolumn)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008174endfun
8175
8176" ---------------------------------------------------------------------
8177" s:RestoreCursorline: restores cursorline/cursorcolumn to original user settings {{{2
8178fun! s:RestoreCursorline()
8179" call Dfunc("s:RestoreCursorline() currently, cul=".&l:cursorline." cuc=".&l:cursorcolumn." win#".winnr()." buf#".bufnr("%"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02008180 if exists("s:netrw_usercul")
8181 let &l:cursorline = s:netrw_usercul
8182 endif
8183 if exists("s:netrw_usercuc")
8184 let &l:cursorcolumn = s:netrw_usercuc
8185 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008186" call Dret("s:RestoreCursorline : restored cul=".&l:cursorline." cuc=".&l:cursorcolumn)
8187endfun
8188
8189" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008190" s:NetrwDelete: Deletes a file. {{{2
8191" Uses Steve Hall's idea to insure that Windows paths stay
8192" acceptable. No effect on Unix paths.
8193" Examples of use: let result= s:NetrwDelete(path)
8194fun! s:NetrwDelete(path)
8195" call Dfunc("s:NetrwDelete(path<".a:path.">)")
8196
Bram Moolenaar5c736222010-01-06 20:54:52 +01008197 let path = netrw#WinPath(a:path)
Bram Moolenaarc236c162008-07-13 17:41:49 +00008198 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
8199 if exists("+shellslash")
8200 let sskeep= &shellslash
8201 setlocal noshellslash
8202 let result = delete(path)
8203 let &shellslash = sskeep
8204 else
8205" call Decho("exe let result= ".a:cmd."('".path."')")
8206 let result= delete(path)
8207 endif
8208 else
8209" call Decho("let result= delete(".path.")")
8210 let result= delete(path)
8211 endif
8212 if result < 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02008213 keepj call netrw#ErrorMsg(s:WARNING,"delete(".path.") failed!",71)
Bram Moolenaarc236c162008-07-13 17:41:49 +00008214 endif
8215
8216" call Dret("s:NetrwDelete ".result)
8217 return result
Bram Moolenaar446cb832008-06-24 21:56:24 +00008218endfun
8219
8220" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008221" s:NetrwEnew: opens a new buffer, passes netrw buffer variables through {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +01008222fun! s:NetrwEnew(...)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008223" call Dfunc("s:NetrwEnew() a:0=".a:0." bufnr($)=".bufnr("$"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01008224" call Decho("curdir<".((a:0>0)? a:1 : "")."> buf#".bufnr("%")."<".bufname("%").">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008225
Bram Moolenaar446cb832008-06-24 21:56:24 +00008226 " grab a function-local-variable copy of buffer variables
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008227" call Decho("make function-local copy of netrw variables")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008228 if exists("b:netrw_bannercnt") |let netrw_bannercnt = b:netrw_bannercnt |endif
8229 if exists("b:netrw_browser_active") |let netrw_browser_active = b:netrw_browser_active |endif
8230 if exists("b:netrw_cpf") |let netrw_cpf = b:netrw_cpf |endif
8231 if exists("b:netrw_curdir") |let netrw_curdir = b:netrw_curdir |endif
8232 if exists("b:netrw_explore_bufnr") |let netrw_explore_bufnr = b:netrw_explore_bufnr |endif
8233 if exists("b:netrw_explore_indx") |let netrw_explore_indx = b:netrw_explore_indx |endif
8234 if exists("b:netrw_explore_line") |let netrw_explore_line = b:netrw_explore_line |endif
8235 if exists("b:netrw_explore_list") |let netrw_explore_list = b:netrw_explore_list |endif
8236 if exists("b:netrw_explore_listlen")|let netrw_explore_listlen = b:netrw_explore_listlen|endif
8237 if exists("b:netrw_explore_mtchcnt")|let netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
8238 if exists("b:netrw_fname") |let netrw_fname = b:netrw_fname |endif
8239 if exists("b:netrw_lastfile") |let netrw_lastfile = b:netrw_lastfile |endif
8240 if exists("b:netrw_liststyle") |let netrw_liststyle = b:netrw_liststyle |endif
8241 if exists("b:netrw_method") |let netrw_method = b:netrw_method |endif
8242 if exists("b:netrw_option") |let netrw_option = b:netrw_option |endif
8243 if exists("b:netrw_prvdir") |let netrw_prvdir = b:netrw_prvdir |endif
8244
Bram Moolenaaradc21822011-04-01 18:03:16 +02008245 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008246" call Decho("generate a buffer with keepjumps keepalt enew!")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008247 let netrw_keepdiff= &l:diff
Bram Moolenaaradc21822011-04-01 18:03:16 +02008248 " COMBAK: Benzinger: using tree mode, vim -o Foo/ file shows Foo/ Foo/ instead. Place return here, problem goes away (beeps result, but who knows)
8249" call Dredir("Benzinger 1:","ls!")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008250 keepj keepalt enew!
Bram Moolenaaradc21822011-04-01 18:03:16 +02008251" call Dredir("Benzinger 2:","ls!")
8252 " 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 +02008253 let &l:diff= netrw_keepdiff
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008254" call Decho("bufnr($)=".bufnr("$"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02008255 keepj call s:NetrwOptionSave("w:")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008256
Bram Moolenaar446cb832008-06-24 21:56:24 +00008257 " copy function-local-variables to buffer variable equivalents
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008258" call Decho("copy function-local variables back to buffer netrw variables")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008259 if exists("netrw_bannercnt") |let b:netrw_bannercnt = netrw_bannercnt |endif
8260 if exists("netrw_browser_active") |let b:netrw_browser_active = netrw_browser_active |endif
8261 if exists("netrw_cpf") |let b:netrw_cpf = netrw_cpf |endif
8262 if exists("netrw_curdir") |let b:netrw_curdir = netrw_curdir |endif
8263 if exists("netrw_explore_bufnr") |let b:netrw_explore_bufnr = netrw_explore_bufnr |endif
8264 if exists("netrw_explore_indx") |let b:netrw_explore_indx = netrw_explore_indx |endif
8265 if exists("netrw_explore_line") |let b:netrw_explore_line = netrw_explore_line |endif
8266 if exists("netrw_explore_list") |let b:netrw_explore_list = netrw_explore_list |endif
8267 if exists("netrw_explore_listlen")|let b:netrw_explore_listlen = netrw_explore_listlen|endif
8268 if exists("netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = netrw_explore_mtchcnt|endif
8269 if exists("netrw_fname") |let b:netrw_fname = netrw_fname |endif
8270 if exists("netrw_lastfile") |let b:netrw_lastfile = netrw_lastfile |endif
8271 if exists("netrw_liststyle") |let b:netrw_liststyle = netrw_liststyle |endif
8272 if exists("netrw_method") |let b:netrw_method = netrw_method |endif
8273 if exists("netrw_option") |let b:netrw_option = netrw_option |endif
8274 if exists("netrw_prvdir") |let b:netrw_prvdir = netrw_prvdir |endif
8275
Bram Moolenaar5c736222010-01-06 20:54:52 +01008276 if a:0 > 0
8277 let b:netrw_curdir= a:1
8278 if b:netrw_curdir =~ '/$'
8279 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
8280 file NetrwTreeListing
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008281 set bt=nowrite noswf
Bram Moolenaaradc21822011-04-01 18:03:16 +02008282 nno <silent> <buffer> [ :sil call <SID>TreeListMove('[')<cr>
8283 nno <silent> <buffer> ] :sil call <SID>TreeListMove(']')<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01008284 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008285 exe "sil! keepalt file ".fnameescape(b:netrw_curdir)
Bram Moolenaar5c736222010-01-06 20:54:52 +01008286 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00008287 endif
8288 endif
8289
Bram Moolenaar446cb832008-06-24 21:56:24 +00008290" call Dret("s:NetrwEnew : buf#".bufnr("%")."<".bufname("%")."> expand(%)<".expand("%")."> expand(#)<".expand("#").">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008291endfun
8292
8293" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008294" s:NetrwSaveWordPosn: used to keep cursor on same word after refresh, {{{2
8295" changed sorting, etc. Also see s:NetrwRestoreWordPosn().
8296fun! s:NetrwSaveWordPosn()
8297" call Dfunc("NetrwSaveWordPosn()")
8298 let s:netrw_saveword= '^'.fnameescape(getline('.')).'$'
8299" call Dret("NetrwSaveWordPosn : saveword<".s:netrw_saveword.">")
8300endfun
8301
8302" ---------------------------------------------------------------------
8303" s:NetrwRestoreWordPosn: used to keep cursor on same word after refresh, {{{2
8304" changed sorting, etc. Also see s:NetrwSaveWordPosn().
8305fun! s:NetrwRestoreWordPosn()
8306" call Dfunc("NetrwRestoreWordPosn()")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008307 sil! call search(s:netrw_saveword,'w')
Bram Moolenaar446cb832008-06-24 21:56:24 +00008308" call Dret("NetrwRestoreWordPosn")
8309endfun
8310
8311" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008312" s:RestoreBufVars: {{{2
8313fun! s:RestoreBufVars()
8314" call Dfunc("s:RestoreBufVars()")
8315
8316 if exists("s:netrw_curdir") |let b:netrw_curdir = s:netrw_curdir |endif
8317 if exists("s:netrw_lastfile") |let b:netrw_lastfile = s:netrw_lastfile |endif
8318 if exists("s:netrw_method") |let b:netrw_method = s:netrw_method |endif
8319 if exists("s:netrw_fname") |let b:netrw_fname = s:netrw_fname |endif
8320 if exists("s:netrw_machine") |let b:netrw_machine = s:netrw_machine |endif
8321 if exists("s:netrw_browser_active")|let b:netrw_browser_active = s:netrw_browser_active|endif
8322
8323" call Dret("s:RestoreBufVars")
8324endfun
8325
8326" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008327" s:RemotePathAnalysis: {{{2
8328fun! s:RemotePathAnalysis(dirname)
8329" call Dfunc("s:RemotePathAnalysis()")
8330
8331 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/:#]\+\)\%([:#]\(\d\+\)\)\=/\(.*\)$'
8332 let s:method = substitute(a:dirname,dirpat,'\1','')
8333 let s:user = substitute(a:dirname,dirpat,'\2','')
8334 let s:machine = substitute(a:dirname,dirpat,'\3','')
8335 let s:port = substitute(a:dirname,dirpat,'\4','')
8336 let s:path = substitute(a:dirname,dirpat,'\5','')
8337 let s:fname = substitute(a:dirname,'^.*/\ze.','','')
8338
8339" call Decho("set up s:method <".s:method .">")
8340" call Decho("set up s:user <".s:user .">")
8341" call Decho("set up s:machine<".s:machine.">")
8342" call Decho("set up s:port <".s:port.">")
8343" call Decho("set up s:path <".s:path .">")
8344" call Decho("set up s:fname <".s:fname .">")
8345
8346" call Dret("s:RemotePathAnalysis")
8347endfun
8348
8349" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008350" s:RemoteSystem: runs a command on a remote host using ssh {{{2
8351" Returns status
8352" Runs system() on
8353" [cd REMOTEDIRPATH;] a:cmd
8354" Note that it doesn't do shellescape(a:cmd)!
8355fun! s:RemoteSystem(cmd)
8356" call Dfunc("s:RemoteSystem(cmd<".a:cmd.">)")
8357 if !executable(g:netrw_ssh_cmd)
Bram Moolenaaradc21822011-04-01 18:03:16 +02008358 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 +00008359 elseif !exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008360 keepj call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
Bram Moolenaarc236c162008-07-13 17:41:49 +00008361 else
8362 let cmd = s:MakeSshCmd(g:netrw_ssh_cmd." USEPORT HOSTNAME")
8363 let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
8364 if remotedir != ""
8365 let cmd= cmd.' cd '.shellescape(remotedir).";"
8366 else
8367 let cmd= cmd.' '
8368 endif
8369 let cmd= cmd.a:cmd
8370" call Decho("call system(".cmd.")")
8371 let ret= system(cmd)
8372 endif
8373" call Dret("s:RemoteSystem ".ret)
8374 return ret
Bram Moolenaar9964e462007-05-05 17:54:07 +00008375endfun
8376
8377" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008378" s:RestoreWinVars: (used by Explore() and NetrwSplit()) {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00008379fun! s:RestoreWinVars()
8380" call Dfunc("s:RestoreWinVars()")
Bram Moolenaar488c6512005-08-11 20:09:58 +00008381 if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00008382 if exists("s:col") |let w:netrw_col = s:col |unlet s:col |endif
8383 if exists("s:curdir") |let w:netrw_curdir = s:curdir |unlet s:curdir |endif
8384 if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif
8385 if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif
8386 if exists("s:explore_line") |let w:netrw_explore_line = s:explore_line |unlet s:explore_line |endif
8387 if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
8388 if exists("s:explore_list") |let w:netrw_explore_list = s:explore_list |unlet s:explore_list |endif
8389 if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
8390 if exists("s:fpl") |let w:netrw_fpl = s:fpl |unlet s:fpl |endif
8391 if exists("s:hline") |let w:netrw_hline = s:hline |unlet s:hline |endif
8392 if exists("s:line") |let w:netrw_line = s:line |unlet s:line |endif
8393 if exists("s:liststyle") |let w:netrw_liststyle = s:liststyle |unlet s:liststyle |endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00008394 if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif
8395 if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00008396 if exists("s:treedict") |let w:netrw_treedict = s:treedict |unlet s:treedict |endif
8397 if exists("s:treetop") |let w:netrw_treetop = s:treetop |unlet s:treetop |endif
8398 if exists("s:winnr") |let w:netrw_winnr = s:winnr |unlet s:winnr |endif
8399" call Dret("s:RestoreWinVars")
Bram Moolenaar488c6512005-08-11 20:09:58 +00008400endfun
8401
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008402" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008403" s:Rexplore: implements returning from a buffer to a netrw directory {{{2
8404"
8405" s:SetRexDir() sets up <2-leftmouse> maps (if g:netrw_retmap
8406" is true) and a command, :Rexplore, which call this function.
8407"
8408" s:nbcd_curpos_{bufnr('%')} is set up by s:NetrwBrowseChgDir()
8409fun! s:NetrwRexplore(islocal,dirname)
Bram Moolenaaradc21822011-04-01 18:03:16 +02008410" call Dfunc("s:NetrwRexplore() w:netrw_rexlocal=".w:netrw_rexlocal." w:netrw_rexdir<".w:netrw_rexdir.">")
8411 if w:netrw_rexlocal
8412 keepj call netrw#LocalBrowseCheck(w:netrw_rexdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008413 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02008414 keepj call s:NetrwBrowse(0,w:netrw_rexdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008415 endif
8416 if exists("s:nbcd_curpos_{bufnr('%')}")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008417 keepj call netrw#NetrwRestorePosn(s:nbcd_curpos_{bufnr('%')})
Bram Moolenaar446cb832008-06-24 21:56:24 +00008418 unlet s:nbcd_curpos_{bufnr('%')}
8419 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01008420 if exists("s:explore_match")
8421 exe "2match netrwMarkFile /".s:explore_match."/"
8422 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008423" call Dret("s:NetrwRexplore")
8424endfun
8425
8426" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008427" s:SaveBufVars: {{{2
8428fun! s:SaveBufVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +01008429" call Dfunc("s:SaveBufVars() buf#".bufnr("%"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00008430
8431 if exists("b:netrw_curdir") |let s:netrw_curdir = b:netrw_curdir |endif
8432 if exists("b:netrw_lastfile") |let s:netrw_lastfile = b:netrw_lastfile |endif
8433 if exists("b:netrw_method") |let s:netrw_method = b:netrw_method |endif
8434 if exists("b:netrw_fname") |let s:netrw_fname = b:netrw_fname |endif
8435 if exists("b:netrw_machine") |let s:netrw_machine = b:netrw_machine |endif
8436 if exists("b:netrw_browser_active")|let s:netrw_browser_active = b:netrw_browser_active|endif
8437
8438" call Dret("s:SaveBufVars")
8439endfun
8440
8441" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008442" s:SaveWinVars: (used by Explore() and NetrwSplit()) {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00008443fun! s:SaveWinVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +01008444" call Dfunc("s:SaveWinVars() win#".winnr())
Bram Moolenaar9964e462007-05-05 17:54:07 +00008445 if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif
8446 if exists("w:netrw_col") |let s:col = w:netrw_col |endif
8447 if exists("w:netrw_curdir") |let s:curdir = w:netrw_curdir |endif
8448 if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif
8449 if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif
8450 if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif
8451 if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
8452 if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif
8453 if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
8454 if exists("w:netrw_fpl") |let s:fpl = w:netrw_fpl |endif
8455 if exists("w:netrw_hline") |let s:hline = w:netrw_hline |endif
8456 if exists("w:netrw_line") |let s:line = w:netrw_line |endif
8457 if exists("w:netrw_liststyle") |let s:liststyle = w:netrw_liststyle |endif
8458 if exists("w:netrw_method") |let s:method = w:netrw_method |endif
8459 if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif
8460 if exists("w:netrw_treedict") |let s:treedict = w:netrw_treedict |endif
8461 if exists("w:netrw_treetop") |let s:treetop = w:netrw_treetop |endif
8462 if exists("w:netrw_winnr") |let s:winnr = w:netrw_winnr |endif
8463" call Dret("s:SaveWinVars")
8464endfun
8465
8466" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008467" s:SetBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck()) {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008468" To allow separate windows to have their own activities, such as
8469" Explore **/pattern, several variables have been made window-oriented.
8470" However, when the user splits a browser window (ex: ctrl-w s), these
Bram Moolenaar1afcace2005-11-25 19:54:28 +00008471" variables are not inherited by the new window. SetBufWinVars() and
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008472" UseBufWinVars() get around that.
Bram Moolenaar1afcace2005-11-25 19:54:28 +00008473fun! s:SetBufWinVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +01008474" call Dfunc("s:SetBufWinVars() win#".winnr())
Bram Moolenaar9964e462007-05-05 17:54:07 +00008475 if exists("w:netrw_liststyle") |let b:netrw_liststyle = w:netrw_liststyle |endif
8476 if exists("w:netrw_bannercnt") |let b:netrw_bannercnt = w:netrw_bannercnt |endif
8477 if exists("w:netrw_method") |let b:netrw_method = w:netrw_method |endif
8478 if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif
8479 if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif
8480 if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen= w:netrw_explore_listlen|endif
8481 if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt= w:netrw_explore_mtchcnt|endif
8482 if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif
8483 if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif
8484 if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif
8485" call Dret("s:SetBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008486endfun
8487
8488" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008489" s:SetRexDir: set directory for :Rexplore {{{2
8490fun! s:SetRexDir(islocal,dirname)
8491" call Dfunc("s:SetRexDir(islocal=".a:islocal." dirname<".a:dirname.">)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008492 let w:netrw_rexdir = a:dirname
8493 let w:netrw_rexlocal = a:islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00008494" call Dret("s:SetRexDir")
8495endfun
8496
8497" ---------------------------------------------------------------------
8498" s:Strlen: this function returns the length of a string, even if its {{{2
8499" using two-byte etc characters.
Bram Moolenaar5c736222010-01-06 20:54:52 +01008500" Solution from Nicolai Weibull, vim docs (:help strlen()), Tony Mechelynck,
8501" and a bit from me.
8502" if g:netrw_xstrlen is zero (default), then the builtin strlen() function is used.
Bram Moolenaar446cb832008-06-24 21:56:24 +00008503fun! s:Strlen(x)
8504" call Dfunc("s:Strlen(x<".a:x.">")
8505 if g:netrw_xstrlen == 1
8506 " number of codepoints (Latin a + combining circumflex is two codepoints)
8507 " (comment from TM, solution from NW)
8508 let ret= strlen(substitute(a:x,'.','c','g'))
8509
8510 elseif g:netrw_xstrlen == 2
8511 " number of spacing codepoints (Latin a + combining circumflex is one spacing
8512 " codepoint; a hard tab is one; wide and narrow CJK are one each; etc.)
8513 " (comment from TM, solution from TM)
8514 let ret=strlen(substitute(a:x, '.\Z', 'x', 'g'))
8515
8516 elseif g:netrw_xstrlen == 3
8517 " virtual length (counting, for instance, tabs as anything between 1 and
8518 " 'tabstop', wide CJK as 2 rather than 1, Arabic alif as zero when immediately
8519 " preceded by lam, one otherwise, etc.)
8520 " (comment from TM, solution from me)
8521 let modkeep= &mod
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008522 exe "keepj norm! o\<esc>"
Bram Moolenaar446cb832008-06-24 21:56:24 +00008523 call setline(line("."),a:x)
8524 let ret= virtcol("$") - 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008525 keepj d
Bram Moolenaar446cb832008-06-24 21:56:24 +00008526 let &mod= modkeep
8527
8528 else
8529 " at least give a decent default
Bram Moolenaar5c736222010-01-06 20:54:52 +01008530 let ret= strlen(a:x)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008531 endif
8532" call Dret("s:Strlen ".ret)
8533 return ret
8534endfun
8535
8536" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008537" s:TreeListMove: {{{2
8538fun! s:TreeListMove(dir)
8539" call Dfunc("s:TreeListMove(dir<".a:dir.">)")
8540 let curline = getline('.')
8541 let prvline = (line(".") > 1)? getline(line(".")-1) : ''
8542 let nxtline = (line(".") < line("$"))? getline(line(".")+1) : ''
8543 let curindent= substitute(curline,'^\([| ]*\).\{-}$','\1','')
8544 let indentm1 = substitute(curindent,'^| ','','')
8545" call Decho("prvline <".prvline."> #".line(".")-1)
8546" call Decho("curline <".curline."> #".line("."))
8547" call Decho("nxtline <".nxtline."> #".line(".")+1)
8548" call Decho("curindent<".curindent.">")
8549" call Decho("indentm1 <".indentm1.">")
8550
8551 if curline !~ '/$'
8552" call Decho('regfile')
8553 if a:dir == '[' && prvline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008554 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00008555 let nl = search('^'.indentm1.'[^|]','bWe') " search backwards from regular file
8556" call Decho("regfile srch back: ".nl)
8557 elseif a:dir == ']' && nxtline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008558 keepj norm! $
Bram Moolenaar446cb832008-06-24 21:56:24 +00008559 let nl = search('^'.indentm1.'[^|]','We') " search forwards from regular file
8560" call Decho("regfile srch fwd: ".nl)
8561 endif
8562
8563 elseif a:dir == '[' && prvline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008564 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00008565 let curline= line(".")
8566 let nl = search('^'.curindent.'[^|]','bWe') " search backwards From directory, same indentation
8567" call Decho("dir srch back ind: ".nl)
8568 if nl != 0
8569 if line(".") == curline-1
8570 let nl= search('^'.indentm1.'[^|]','bWe') " search backwards from directory, indentation - 1
8571" call Decho("dir srch back ind-1: ".nl)
8572 endif
8573 endif
8574
8575 elseif a:dir == ']' && nxtline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008576 keepj norm! $
Bram Moolenaar446cb832008-06-24 21:56:24 +00008577 let curline = line(".")
8578 let nl = search('^'.curindent.'[^|]','We') " search forwards from directory, same indentation
8579" call Decho("dir srch fwd ind: ".nl)
8580 if nl != 0
8581 if line(".") == curline+1
8582 let nl= search('^'.indentm1.'[^|]','We') " search forwards from directory, indentation - 1
8583" call Decho("dir srch fwd ind-1: ".nl)
8584 endif
8585 endif
8586
8587 endif
8588
8589" call Dret("s:TreeListMove")
8590endfun
8591
8592" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008593" s:UpdateBuffersMenu: does emenu Buffers.Refresh (but due to locale, the menu item may not be called that) {{{2
8594" The Buffers.Refresh menu calls s:BMShow(); unfortunately, that means that that function
8595" can't be called except via emenu. But due to locale, that menu line may not be called
8596" Buffers.Refresh; hence, s:NetrwBMShow() utilizes a "cheat" to call that function anyway.
8597fun! s:UpdateBuffersMenu()
8598" call Dfunc("s:UpdateBuffersMenu()")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008599 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaarc236c162008-07-13 17:41:49 +00008600 try
Bram Moolenaaradc21822011-04-01 18:03:16 +02008601 sil emenu Buffers.Refresh\ menu
Bram Moolenaarc236c162008-07-13 17:41:49 +00008602 catch /^Vim\%((\a\+)\)\=:E/
8603 let v:errmsg= ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02008604 sil keepj call s:NetrwBMShow()
Bram Moolenaarc236c162008-07-13 17:41:49 +00008605 endtry
8606 endif
8607" call Dret("s:UpdateBuffersMenu")
8608endfun
8609
8610" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008611" s:UseBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck() {{{2
Bram Moolenaaradc21822011-04-01 18:03:16 +02008612" Matching function to s:SetBufWinVars()
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008613fun! s:UseBufWinVars()
Bram Moolenaar9964e462007-05-05 17:54:07 +00008614" call Dfunc("s:UseBufWinVars()")
8615 if exists("b:netrw_liststyle") && !exists("w:netrw_liststyle") |let w:netrw_liststyle = b:netrw_liststyle |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008616 if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif
8617 if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif
8618 if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif
8619 if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif
8620 if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
8621 if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
8622 if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif
8623 if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif
8624 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 +00008625" call Dret("s:UseBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008626endfun
8627
Bram Moolenaar1afcace2005-11-25 19:54:28 +00008628" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01008629" netrw#WinPath: tries to insure that the path is windows-acceptable, whether cygwin is used or not {{{2
8630fun! netrw#WinPath(path)
8631" call Dfunc("netrw#WinPath(path<".a:path.">)")
8632 if (!g:netrw_cygwin || &shell !~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$') && (has("win32") || has("win95") || has("win64") || has("win16"))
8633 " remove cygdrive prefix, if present
8634 let path = substitute(a:path,'/cygdrive/\(.\)','\1:','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00008635 " remove trailing slash (Win95)
Bram Moolenaar5c736222010-01-06 20:54:52 +01008636 let path = substitute(path, '\(\\\|/\)$', '', 'g')
Bram Moolenaarc236c162008-07-13 17:41:49 +00008637 " remove escaped spaces
8638 let path = substitute(path, '\ ', ' ', 'g')
8639 " convert slashes to backslashes
8640 let path = substitute(path, '/', '\', 'g')
8641 else
8642 let path= a:path
8643 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01008644" call Dret("netrw#WinPath <".path.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00008645 return path
8646endfun
8647
8648" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00008649" Settings Restoration: {{{2
Bram Moolenaar83bab712005-08-01 21:58:57 +00008650let &cpo= s:keepcpo
8651unlet s:keepcpo
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00008652
Bram Moolenaar071d4272004-06-13 20:20:40 +00008653" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00008654" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +00008655" vim:ts=8 fdm=marker