blob: ab6370a8e9fafcebf5d54e71754c49bbc00f3cd8 [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 Moolenaar251e1912011-06-19 05:09:16 +02003" Date: May 31, 2011
4" Version: 142
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 Moolenaar251e1912011-06-19 05:09:16 +020025let g:loaded_netrw = "v142"
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 Moolenaar251e1912011-06-19 05:09:16 +0200294call s:NetrwInit("g:netrw_winsize",50)
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 Moolenaar251e1912011-06-19 05:09:16 +02001521 " sanity check: choice should have at least three slashes in it
1522 if strlen(substitute(a:choice,'[^/]','','g')) < 3
1523 call netrw#ErrorMsg(s:ERROR,"not a netrw-style url; netrw uses protocol://[user@]hostname[:port]/[path])",78)
1524 let b:netrw_method = -1
1525" call Dret("NetrwMethod : incorrect url format<".a:choice.">")
1526 return
1527 endif
1528
Bram Moolenaar5c736222010-01-06 20:54:52 +01001529 " record current g:netrw_machine, if any
1530 " curmachine used if protocol == ftp and no .netrc
1531 if exists("g:netrw_machine")
1532 let curmachine= g:netrw_machine
1533" call Decho("curmachine<".curmachine.">")
1534 else
1535 let curmachine= "N O T A HOST"
1536 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02001537 if exists("g:netrw_port")
1538 let netrw_port= g:netrw_port
1539 endif
1540
1541 " insure that netrw_ftp_cmd starts off every method determination
1542 " with the current g:netrw_ftp_cmd
1543 let s:netrw_ftp_cmd= g:netrw_ftp_cmd
Bram Moolenaar5c736222010-01-06 20:54:52 +01001544
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001545 " initialization
1546 let b:netrw_method = 0
1547 let g:netrw_machine = ""
1548 let b:netrw_fname = ""
1549 let g:netrw_port = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001550 let g:netrw_choice = a:choice
1551
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001552 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001553 " mipf : a:machine a:id password filename Use ftp
Bram Moolenaar446cb832008-06-24 21:56:24 +00001554 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
1555 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001556 " rcpurm : rcp://[user@]host/filename Use rcp
1557 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001558 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001559 " httpurm : http://[user@]host/filename Use wget
Bram Moolenaar5c736222010-01-06 20:54:52 +01001560 " davurm : dav[s]://host[:port]/path Use cadaver/curl
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001561 " rsyncurm : rsync://host[:port]/path Use rsync
1562 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
1563 " sftpurm : sftp://[user@]host/filename Use scp
1564 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
1565 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
1566 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
Bram Moolenaar83bab712005-08-01 21:58:57 +00001567 let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001568 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001569 let scpurm = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001570 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001571 let davurm = '^davs\=://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001572 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
1573 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
1574 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001575
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001576" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001577 " Determine Method
Bram Moolenaaradc21822011-04-01 18:03:16 +02001578 " Method#1: rcp://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001579 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001580" call Decho("rcp://...")
Bram Moolenaar83bab712005-08-01 21:58:57 +00001581 let b:netrw_method = 1
1582 let userid = substitute(a:choice,rcpurm,'\1',"")
1583 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
1584 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001585 if userid != ""
1586 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00001587 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001588
Bram Moolenaaradc21822011-04-01 18:03:16 +02001589 " Method#4: scp://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001590 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001591" call Decho("scp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001592 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00001593 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
1594 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
1595 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001596
Bram Moolenaaradc21822011-04-01 18:03:16 +02001597 " Method#5: http://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001598 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001599" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001600 let b:netrw_method = 5
1601 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
1602 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001603
Bram Moolenaaradc21822011-04-01 18:03:16 +02001604 " Method#6: dav://hostname[:port]/..path-to-file.. {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001605 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001606" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001607 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001608 if a:choice =~ '^s'
1609 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
1610 else
1611 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
1612 endif
1613 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001614
Bram Moolenaaradc21822011-04-01 18:03:16 +02001615 " Method#7: rsync://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001616 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001617" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001618 let b:netrw_method = 7
1619 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
1620 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001621
Bram Moolenaaradc21822011-04-01 18:03:16 +02001622 " Methods 2,3: ftp://[user@]hostname[[:#]port]/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001623 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001624" call Decho("ftp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001625 let userid = substitute(a:choice,ftpurm,'\2',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001626 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
1627 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
1628 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001629" call Decho("g:netrw_machine<".g:netrw_machine.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001630 if userid != ""
1631 let g:netrw_uid= userid
1632 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02001633 if curmachine != g:netrw_machine
1634 if exists("s:netrw_passwd")
1635 " if there's a change in hostname, require password re-entry
1636 unlet s:netrw_passwd
1637 endif
1638 if exists("netrw_port")
1639 unlet netrw_port
1640 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001641 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001642 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001643 let b:netrw_method = 3
1644 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02001645 if (has("win32") || has("win95") || has("win64") || has("win16")) && s:netrw_ftp_cmd =~ '-[sS]:'
1646" call Decho("has -s: : s:netrw_ftp_cmd<".s:netrw_ftp_cmd.">")
1647" call Decho(" g:netrw_ftp_cmd<".g:netrw_ftp_cmd.">")
1648 if g:netrw_ftp_cmd =~ '-[sS]:\S*MACHINE\>'
1649 let machine = substitute(g:netrw_machine,'\([^.]\+\)\.\S*','\1','')
1650 let s:netrw_ftp_cmd= substitute(g:netrw_ftp_cmd,'\<MACHINE\>',machine.".ftp",'')
1651" call Decho("s:netrw_ftp_cmd<".s:netrw_ftp_cmd.">")
1652 endif
1653 let b:netrw_method= 2
1654 elseif s:FileReadable(expand("$HOME/.netrc")) && !g:netrw_ignorenetrc
1655" call Decho("using <".expand("$HOME/.netrc")."> (readable)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001656 let b:netrw_method= 2
1657 else
1658 if !exists("g:netrw_uid") || g:netrw_uid == ""
1659 call NetUserPass()
Bram Moolenaar446cb832008-06-24 21:56:24 +00001660 elseif !exists("s:netrw_passwd") || s:netrw_passwd == ""
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001661 call NetUserPass(g:netrw_uid)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001662 " else just use current g:netrw_uid and s:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001663 endif
1664 let b:netrw_method= 3
1665 endif
1666 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001667
Bram Moolenaaradc21822011-04-01 18:03:16 +02001668 " Method#8: fetch {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001669 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001670" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001671 let b:netrw_method = 8
1672 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
1673 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
1674 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
1675 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001676
Bram Moolenaaradc21822011-04-01 18:03:16 +02001677 " Method#3: Issue an ftp : "machine id password [path/]filename" {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001678 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001679" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001680 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001681 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
1682 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001683 let s:netrw_passwd = substitute(a:choice,mipf,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001684 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001685
Bram Moolenaaradc21822011-04-01 18:03:16 +02001686 " Method#3: Issue an ftp: "hostname [path/]filename" {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001687 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001688" call Decho("(ftp) host file")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001689 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001690 let b:netrw_method = 3
1691 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
1692 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001693
Bram Moolenaar9964e462007-05-05 17:54:07 +00001694 elseif s:FileReadable(expand("$HOME/.netrc"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001695 let b:netrw_method = 2
1696 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
1697 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
1698 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001699
Bram Moolenaaradc21822011-04-01 18:03:16 +02001700 " Method#9: sftp://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001701 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001702" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001703 let b:netrw_method = 9
1704 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
1705 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001706
Bram Moolenaaradc21822011-04-01 18:03:16 +02001707 " Method#1: Issue an rcp: hostname:filename" (this one should be last) {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001708 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001709" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001710 let b:netrw_method = 1
1711 let userid = substitute(a:choice,rcphf,'\2',"")
1712 let g:netrw_machine = substitute(a:choice,rcphf,'\3',"")
1713 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001714" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
1715" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
1716" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
1717" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001718 if userid != ""
1719 let g:netrw_uid= userid
1720 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001721
Bram Moolenaaradc21822011-04-01 18:03:16 +02001722 " Cannot Determine Method {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001723 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001724 if !exists("g:netrw_quiet")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001725 call netrw#ErrorMsg(s:WARNING,"cannot determine method (format: protocol://[user@]hostname[:port]/[path])",45)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001726 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001727 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00001728 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02001729 "}}}3
Bram Moolenaar81695252004-12-29 20:58:21 +00001730
Bram Moolenaar81695252004-12-29 20:58:21 +00001731 if g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02001732 " remove any leading [:#] from port number
1733 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
1734 elseif exists("netrw_port")
1735 " retain port number as implicit for subsequent ftp operations
1736 let g:netrw_port= netrw_port
Bram Moolenaar81695252004-12-29 20:58:21 +00001737 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001738
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001739" call Decho("a:choice <".a:choice.">")
1740" call Decho("b:netrw_method <".b:netrw_method.">")
1741" call Decho("g:netrw_machine<".g:netrw_machine.">")
1742" call Decho("g:netrw_port <".g:netrw_port.">")
1743" if exists("g:netrw_uid") "Decho
1744" call Decho("g:netrw_uid <".g:netrw_uid.">")
1745" endif "Decho
Bram Moolenaar446cb832008-06-24 21:56:24 +00001746" if exists("s:netrw_passwd") "Decho
1747" call Decho("s:netrw_passwd <".s:netrw_passwd.">")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001748" endif "Decho
1749" call Decho("b:netrw_fname <".b:netrw_fname.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001750" call Dret("NetrwMethod : b:netrw_method=".b:netrw_method." g:netrw_port=".g:netrw_port)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001751endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001752
1753" ------------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00001754" NetReadFixup: this sort of function is typically written by the user {{{2
1755" to handle extra junk that their system's ftp dumps
1756" into the transfer. This function is provided as an
1757" example and as a fix for a Windows 95 problem: in my
1758" experience, win95's ftp always dumped four blank lines
1759" at the end of the transfer.
1760if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp
1761 fun! NetReadFixup(method, line1, line2)
1762" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001763
1764 " sanity checks -- attempt to convert inputs to integers
1765 let method = a:method + 0
1766 let line1 = a:line1 + 0
1767 let line2 = a:line2 + 0
1768 if type(method) != 0 || type(line1) != 0 || type(line2) != 0 || method < 0 || line1 <= 0 || line2 <= 0
1769" call Dret("NetReadFixup")
1770 return
1771 endif
1772
Bram Moolenaar9964e462007-05-05 17:54:07 +00001773 if method == 3 " ftp (no <.netrc>)
1774 let fourblanklines= line2 - 3
Bram Moolenaar5c736222010-01-06 20:54:52 +01001775 if fourblanklines >= line1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001776 exe "sil keepj ".fourblanklines.",".line2."g/^\s*$/d"
Bram Moolenaar5c736222010-01-06 20:54:52 +01001777 call histdel("/",-1)
1778 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001779 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001780
Bram Moolenaar9964e462007-05-05 17:54:07 +00001781" call Dret("NetReadFixup")
1782 endfun
1783endif
1784
1785" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001786" NetUserPass: set username and password for subsequent ftp transfer {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +00001787" Usage: :call NetUserPass() -- will prompt for userid and password
1788" :call NetUserPass("uid") -- will prompt for password
1789" :call NetUserPass("uid","password") -- sets global userid and password
1790fun! NetUserPass(...)
1791
1792 " get/set userid
1793 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001794" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001795 if !exists("g:netrw_uid") || g:netrw_uid == ""
1796 " via prompt
1797 let g:netrw_uid= input('Enter username: ')
1798 endif
1799 else " from command line
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001800" call Dfunc("NetUserPass(a:1<".a:1.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001801 let g:netrw_uid= a:1
1802 endif
1803
1804 " get password
1805 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001806" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001807 let s:netrw_passwd= inputsecret("Enter Password: ")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001808 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001809" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001810 let s:netrw_passwd=a:2
Bram Moolenaar071d4272004-06-13 20:20:40 +00001811 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001812
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001813" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001814endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001815
Bram Moolenaar9964e462007-05-05 17:54:07 +00001816" ===========================================
1817" Shared Browsing Support: {{{1
1818" ===========================================
Bram Moolenaar071d4272004-06-13 20:20:40 +00001819
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001820" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02001821" s:NetrwMaps: {{{2
1822fun! s:NetrwMaps(islocal)
1823" call Dfunc("s:NetrwMaps(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar251e1912011-06-19 05:09:16 +02001824
1825 " set up Rexplore and [ 2-leftmouse-click -or- c-leftmouse ]
1826" call Decho("set up Rexplore command")
1827 com! Rexplore call s:NetrwRexplore(w:netrw_rexlocal,exists("w:netrw_rexdir")? w:netrw_rexdir : ".")
1828 if g:netrw_mousemaps && g:netrw_retmap
1829" call Decho("set up Rexplore 2-leftmouse")
1830 if !hasmapto("<Plug>NetrwReturn")
1831 if maparg("<2-leftmouse>","n") == "" || maparg("<2-leftmouse>","n") =~ '^-$'
1832" call Decho("making map for 2-leftmouse")
1833 nmap <unique> <silent> <2-leftmouse> <Plug>NetrwReturn
1834 elseif maparg("<c-leftmouse>","n") == ""
1835" call Decho("making map for c-leftmouse")
1836 nmap <unique> <silent> <c-leftmouse> <Plug>NetrwReturn
1837 endif
1838 endif
1839 nno <silent> <Plug>NetrwReturn :Rexplore<cr>
1840" call Decho("made <Plug>NetrwReturn map")
1841 endif
1842
Bram Moolenaar9964e462007-05-05 17:54:07 +00001843 if a:islocal
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001844" call Decho("make local maps")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001845 inoremap <buffer> <silent> a <c-o>:call <SID>NetrwHide(1)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02001846 inoremap <buffer> <silent> c <c-o>:exe "keepjumps lcd ".fnameescape(b:netrw_curdir)<cr>
1847 inoremap <buffer> <silent> C <c-o>:let g:netrw_chgwin= winnr()<cr>
1848 inoremap <buffer> <silent> % <c-o>:call <SID>NetrwOpenFile(1)<cr>
1849 inoremap <buffer> <silent> - <c-o>:exe "norm! 0"<bar>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,'../'))<cr>
1850 inoremap <buffer> <silent> <cr> <c-o>:call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
1851 inoremap <buffer> <silent> d <c-o>:call <SID>NetrwMakeDir("")<cr>
1852 inoremap <buffer> <silent> gb <c-o>:<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
1853 inoremap <buffer> <silent> gh <c-o>:<c-u>call <SID>NetrwHidden(1)<cr>
1854 inoremap <buffer> <silent> gp <c-o>:<c-u>call <SID>NetrwChgPerm(1,b:netrw_curdir)<cr>
1855 inoremap <buffer> <silent> I <c-o>:call <SID>NetrwBannerCtrl(1)<cr>
1856 inoremap <buffer> <silent> i <c-o>:call <SID>NetrwListStyle(1)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001857 inoremap <buffer> <silent> mb <c-o>:<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02001858 inoremap <buffer> <silent> mB <c-o>:<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001859 inoremap <buffer> <silent> mc <c-o>:<c-u>call <SID>NetrwMarkFileCopy(1)<cr>
1860 inoremap <buffer> <silent> md <c-o>:<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
1861 inoremap <buffer> <silent> me <c-o>:<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
1862 inoremap <buffer> <silent> mf <c-o>:<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
1863 inoremap <buffer> <silent> mg <c-o>:<c-u>call <SID>NetrwMarkFileGrep(1)<cr>
1864 inoremap <buffer> <silent> mh <c-o>:<c-u>call <SID>NetrwMarkHideSfx(1)<cr>
1865 inoremap <buffer> <silent> mm <c-o>:<c-u>call <SID>NetrwMarkFileMove(1)<cr>
1866 inoremap <buffer> <silent> mp <c-o>:<c-u>call <SID>NetrwMarkFilePrint(1)<cr>
1867 inoremap <buffer> <silent> mr <c-o>:<c-u>call <SID>NetrwMarkFileRegexp(1)<cr>
1868 inoremap <buffer> <silent> ms <c-o>:<c-u>call <SID>NetrwMarkFileSource(1)<cr>
1869 inoremap <buffer> <silent> mT <c-o>:<c-u>call <SID>NetrwMarkFileTag(1)<cr>
1870 inoremap <buffer> <silent> mt <c-o>:<c-u>call <SID>NetrwMarkFileTgt(1)<cr>
1871 inoremap <buffer> <silent> mu <c-o>:<c-u>call <SID>NetrwUnMarkFile(1)<cr>
1872 inoremap <buffer> <silent> mx <c-o>:<c-u>call <SID>NetrwMarkFileExe(1)<cr>
1873 inoremap <buffer> <silent> mz <c-o>:<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001874 inoremap <buffer> <silent> O <c-o>:call <SID>NetrwObtain(1)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02001875 inoremap <buffer> <silent> o <c-o>:call <SID>NetrwSplit(3)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001876 inoremap <buffer> <silent> p <c-o>:call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
1877 inoremap <buffer> <silent> P <c-o>:call <SID>NetrwPrevWinOpen(1)<cr>
1878 inoremap <buffer> <silent> qb <c-o>:<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001879 inoremap <buffer> <silent> qf <c-o>:<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
1880 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>
1881 inoremap <buffer> <silent> s <c-o>:call <SID>NetrwSortStyle(1)<cr>
1882 inoremap <buffer> <silent> S <c-o>:call <SID>NetSortSequence(1)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001883 inoremap <buffer> <silent> T <c-o>:call <SID>NetrwSplit(4)<bar>norm! gT<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02001884 inoremap <buffer> <silent> t <c-o>:call <SID>NetrwSplit(4)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001885 inoremap <buffer> <silent> u <c-o>:<c-u>call <SID>NetrwBookHistHandler(4,expand("%"))<cr>
1886 inoremap <buffer> <silent> U <c-o>:<c-u>call <SID>NetrwBookHistHandler(5,expand("%"))<cr>
1887 inoremap <buffer> <silent> v <c-o>:call <SID>NetrwSplit(5)<cr>
1888 inoremap <buffer> <silent> x <c-o>:call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02001889 nnoremap <buffer> <silent> a :call <SID>NetrwHide(1)<cr>
1890 nnoremap <buffer> <silent> % :call <SID>NetrwOpenFile(1)<cr>
1891 nnoremap <buffer> <silent> c :exe "keepjumps lcd ".fnameescape(b:netrw_curdir)<cr>
1892 nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr>
1893 nnoremap <buffer> <silent> <cr> :call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
1894 nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("")<cr>
1895 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,'../'))<cr>
1896 nnoremap <buffer> <silent> gb :<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
1897 nnoremap <buffer> <silent> gd :<c-u>call <SID>NetrwForceChgDir(1,<SID>NetrwGetWord())<cr>
1898 nnoremap <buffer> <silent> gf :<c-u>call <SID>NetrwForceFile(1,<SID>NetrwGetWord())<cr>
1899 nnoremap <buffer> <silent> gh :<c-u>call <SID>NetrwHidden(1)<cr>
1900 nnoremap <buffer> <silent> gp :<c-u>call <SID>NetrwChgPerm(1,b:netrw_curdir)<cr>
1901 nnoremap <buffer> <silent> I :call <SID>NetrwBannerCtrl(1)<cr>
1902 nnoremap <buffer> <silent> i :call <SID>NetrwListStyle(1)<cr>
1903 nnoremap <buffer> <silent> mb :<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
1904 nnoremap <buffer> <silent> mB :<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
1905 nnoremap <buffer> <silent> mc :<c-u>call <SID>NetrwMarkFileCopy(1)<cr>
1906 nnoremap <buffer> <silent> md :<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
1907 nnoremap <buffer> <silent> me :<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
1908 nnoremap <buffer> <silent> mf :<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
1909 nnoremap <buffer> <silent> mg :<c-u>call <SID>NetrwMarkFileGrep(1)<cr>
1910 nnoremap <buffer> <silent> mh :<c-u>call <SID>NetrwMarkHideSfx(1)<cr>
1911 nnoremap <buffer> <silent> mm :<c-u>call <SID>NetrwMarkFileMove(1)<cr>
1912 nnoremap <buffer> <silent> mp :<c-u>call <SID>NetrwMarkFilePrint(1)<cr>
1913 nnoremap <buffer> <silent> mr :<c-u>call <SID>NetrwMarkFileRegexp(1)<cr>
1914 nnoremap <buffer> <silent> ms :<c-u>call <SID>NetrwMarkFileSource(1)<cr>
1915 nnoremap <buffer> <silent> mT :<c-u>call <SID>NetrwMarkFileTag(1)<cr>
1916 nnoremap <buffer> <silent> mt :<c-u>call <SID>NetrwMarkFileTgt(1)<cr>
1917 nnoremap <buffer> <silent> mu :<c-u>call <SID>NetrwUnMarkFile(1)<cr>
1918 nnoremap <buffer> <silent> mx :<c-u>call <SID>NetrwMarkFileExe(1)<cr>
1919 nnoremap <buffer> <silent> mz :<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
1920 nnoremap <buffer> <silent> O :call <SID>NetrwObtain(1)<cr>
1921 nnoremap <buffer> <silent> o :call <SID>NetrwSplit(3)<cr>
1922 nnoremap <buffer> <silent> p :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
1923 nnoremap <buffer> <silent> P :call <SID>NetrwPrevWinOpen(1)<cr>
1924 nnoremap <buffer> <silent> qb :<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
1925 nnoremap <buffer> <silent> qf :<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
1926 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>
1927 nnoremap <buffer> <silent> s :call <SID>NetrwSortStyle(1)<cr>
1928 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
1929 nnoremap <buffer> <silent> T :call <SID>NetrwSplit(4)<bar>norm! gT<cr>
1930 nnoremap <buffer> <silent> t :call <SID>NetrwSplit(4)<cr>
1931 nnoremap <buffer> <silent> u :<c-u>call <SID>NetrwBookHistHandler(4,expand("%"))<cr>
1932 nnoremap <buffer> <silent> U :<c-u>call <SID>NetrwBookHistHandler(5,expand("%"))<cr>
1933 nnoremap <buffer> <silent> v :call <SID>NetrwSplit(5)<cr>
1934 nnoremap <buffer> <silent> x :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001935 if !hasmapto('<Plug>NetrwHideEdit')
1936 nmap <buffer> <unique> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001937 imap <buffer> <unique> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar446cb832008-06-24 21:56:24 +00001938 endif
1939 nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(1)<cr>
1940 if !hasmapto('<Plug>NetrwRefresh')
1941 nmap <buffer> <unique> <c-l> <Plug>NetrwRefresh
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001942 imap <buffer> <unique> <c-l> <Plug>NetrwRefresh
Bram Moolenaar446cb832008-06-24 21:56:24 +00001943 endif
1944 nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,'./'))<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001945 if s:didstarstar || !mapcheck("<s-down>","n")
1946 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001947 inoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001948 endif
1949 if s:didstarstar || !mapcheck("<s-up>","n")
1950 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001951 inoremap <buffer> <silent> <s-up> :Pexplore<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001952 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001953 let mapsafecurdir = escape(b:netrw_curdir, s:netrw_map_escape)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001954 if g:netrw_mousemaps == 1
Bram Moolenaar251e1912011-06-19 05:09:16 +02001955 nmap <buffer> <leftmouse> <Plug>NetrwLeftmouse
1956 nno <buffer> <silent> <Plug>NetrwLeftmouse <leftmouse>:call <SID>NetrwLeftmouse(1)<cr>
1957 nmap <buffer> <middlemouse> <Plug>NetrwMiddlemouse
1958 nno <buffer> <silent> <Plug>NetrwMiddlemouse <leftmouse>:call <SID>NetrwPrevWinOpen(1)<cr>
1959 nmap <buffer> <s-leftmouse> <Plug>NetrwSLeftmouse
1960 nno <buffer> <silent> <Plug>NetrwSLeftmouse <leftmouse>:call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
1961 nmap <buffer> <2-leftmouse> <Plug>Netrw2Leftmouse
1962 nmap <buffer> <silent> <Plug>Netrw2Leftmouse -
1963 imap <buffer> <leftmouse> <Plug>ILeftmouse
1964 ino <buffer> <silent> <Plug>ILeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwLeftmouse(1)<cr>
1965 imap <buffer> <middlemouse> <Plug>IMiddlemouse
1966 ino <buffer> <silent> <Plug>IMiddlemouse <c-o><leftmouse><c-o>:call <SID>NetrwPrevWinOpen(1)<cr>
1967 imap <buffer> <s-leftmouse> <Plug>ISLeftmouse
1968 ino <buffer> <silent> <Plug>ISLeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001969 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
1970 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001971 exe 'inoremap <buffer> <silent> <rightmouse> <c-o><leftmouse><c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001972 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001973 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001974 exe 'nnoremap <buffer> <silent> D :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001975 exe 'nnoremap <buffer> <silent> R :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001976 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetrwMakeDir("")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001977 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
1978 exe 'vnoremap <buffer> <silent> D :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
1979 exe 'vnoremap <buffer> <silent> R :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
1980 exe 'inoremap <buffer> <silent> <del> <c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
1981 exe 'inoremap <buffer> <silent> D <c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
1982 exe 'inoremap <buffer> <silent> R <c-o>:call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
1983 exe 'inoremap <buffer> <silent> <Leader>m <c-o>:call <SID>NetrwMakeDir("")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001984 nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001985
Bram Moolenaar9964e462007-05-05 17:54:07 +00001986 else " remote
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001987" call Decho("make remote maps")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001988 call s:RemotePathAnalysis(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001989 nnoremap <buffer> <silent> <cr> :call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr>
1990 nnoremap <buffer> <silent> <c-l> :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
1991 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'../'))<cr>
1992 nnoremap <buffer> <silent> a :call <SID>NetrwHide(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01001993 nnoremap <buffer> <silent> mb :<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001994 nnoremap <buffer> <silent> mc :<c-u>call <SID>NetrwMarkFileCopy(0)<cr>
1995 nnoremap <buffer> <silent> md :<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
1996 nnoremap <buffer> <silent> me :<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
1997 nnoremap <buffer> <silent> mf :<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
1998 nnoremap <buffer> <silent> mg :<c-u>call <SID>NetrwMarkFileGrep(0)<cr>
1999 nnoremap <buffer> <silent> mh :<c-u>call <SID>NetrwMarkHideSfx(0)<cr>
2000 nnoremap <buffer> <silent> mm :<c-u>call <SID>NetrwMarkFileMove(0)<cr>
2001 nnoremap <buffer> <silent> mp :<c-u>call <SID>NetrwMarkFilePrint(0)<cr>
2002 nnoremap <buffer> <silent> mr :<c-u>call <SID>NetrwMarkFileRegexp(0)<cr>
2003 nnoremap <buffer> <silent> ms :<c-u>call <SID>NetrwMarkFileSource(0)<cr>
2004 nnoremap <buffer> <silent> mT :<c-u>call <SID>NetrwMarkFileTag(0)<cr>
2005 nnoremap <buffer> <silent> mt :<c-u>call <SID>NetrwMarkFileTgt(0)<cr>
2006 nnoremap <buffer> <silent> mu :<c-u>call <SID>NetrwUnMarkFile(0)<cr>
2007 nnoremap <buffer> <silent> mx :<c-u>call <SID>NetrwMarkFileExe(0)<cr>
2008 nnoremap <buffer> <silent> mz :<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01002009 nnoremap <buffer> <silent> gb :<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_cur)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02002010 nnoremap <buffer> <silent> gd :<c-u>call <SID>NetrwForceChgDir(0,<SID>NetrwGetWord())<cr>
2011 nnoremap <buffer> <silent> gf :<c-u>call <SID>NetrwForceFile(0,<SID>NetrwGetWord())<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002012 nnoremap <buffer> <silent> gh :<c-u>call <SID>NetrwHidden(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01002013 nnoremap <buffer> <silent> gp :<c-u>call <SID>NetrwChgPerm(0,b:netrw_curdir)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00002014 nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002015 nnoremap <buffer> <silent> i :call <SID>NetrwListStyle(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01002016 nnoremap <buffer> <silent> I :call <SID>NetrwBannerCtrl(1)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002017 nnoremap <buffer> <silent> o :call <SID>NetrwSplit(0)<cr>
2018 nnoremap <buffer> <silent> O :call <SID>NetrwObtain(0)<cr>
2019 nnoremap <buffer> <silent> p :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
2020 nnoremap <buffer> <silent> P :call <SID>NetrwPrevWinOpen(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01002021 nnoremap <buffer> <silent> qb :<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
2022 nnoremap <buffer> <silent> mB :<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002023 nnoremap <buffer> <silent> qf :<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
2024 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>
2025 nnoremap <buffer> <silent> s :call <SID>NetrwSortStyle(0)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00002026 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002027 nnoremap <buffer> <silent> t :call <SID>NetrwSplit(1)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01002028 nnoremap <buffer> <silent> T :call <SID>NetrwSplit(1)<bar>norm! gT<cr>
2029 nnoremap <buffer> <silent> u :<c-u>call <SID>NetrwBookHistHandler(4,b:netrw_curdir)<cr>
2030 nnoremap <buffer> <silent> U :<c-u>call <SID>NetrwBookHistHandler(5,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002031 nnoremap <buffer> <silent> v :call <SID>NetrwSplit(2)<cr>
2032 nnoremap <buffer> <silent> x :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
Bram Moolenaarc236c162008-07-13 17:41:49 +00002033 nnoremap <buffer> <silent> % :call <SID>NetrwOpenFile(0)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002034 inoremap <buffer> <silent> <cr> <c-o>:call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr>
2035 inoremap <buffer> <silent> <c-l> <c-o>:call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
2036 inoremap <buffer> <silent> - <c-o>:exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'../'))<cr>
2037 inoremap <buffer> <silent> a <c-o>:call <SID>NetrwHide(0)<cr>
2038 inoremap <buffer> <silent> mb <c-o>:<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
2039 inoremap <buffer> <silent> mc <c-o>:<c-u>call <SID>NetrwMarkFileCopy(0)<cr>
2040 inoremap <buffer> <silent> md <c-o>:<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
2041 inoremap <buffer> <silent> me <c-o>:<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
2042 inoremap <buffer> <silent> mf <c-o>:<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
2043 inoremap <buffer> <silent> mg <c-o>:<c-u>call <SID>NetrwMarkFileGrep(0)<cr>
2044 inoremap <buffer> <silent> mh <c-o>:<c-u>call <SID>NetrwMarkHideSfx(0)<cr>
2045 inoremap <buffer> <silent> mm <c-o>:<c-u>call <SID>NetrwMarkFileMove(0)<cr>
2046 inoremap <buffer> <silent> mp <c-o>:<c-u>call <SID>NetrwMarkFilePrint(0)<cr>
2047 inoremap <buffer> <silent> mr <c-o>:<c-u>call <SID>NetrwMarkFileRegexp(0)<cr>
2048 inoremap <buffer> <silent> ms <c-o>:<c-u>call <SID>NetrwMarkFileSource(0)<cr>
2049 inoremap <buffer> <silent> mT <c-o>:<c-u>call <SID>NetrwMarkFileTag(0)<cr>
2050 inoremap <buffer> <silent> mt <c-o>:<c-u>call <SID>NetrwMarkFileTgt(0)<cr>
2051 inoremap <buffer> <silent> mu <c-o>:<c-u>call <SID>NetrwUnMarkFile(0)<cr>
2052 inoremap <buffer> <silent> mx <c-o>:<c-u>call <SID>NetrwMarkFileExe(0)<cr>
2053 inoremap <buffer> <silent> mz <c-o>:<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
2054 inoremap <buffer> <silent> gb <c-o>:<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_cur)<cr>
2055 inoremap <buffer> <silent> gh <c-o>:<c-u>call <SID>NetrwHidden(0)<cr>
2056 inoremap <buffer> <silent> gp <c-o>:<c-u>call <SID>NetrwChgPerm(0,b:netrw_curdir)<cr>
2057 inoremap <buffer> <silent> C <c-o>:let g:netrw_chgwin= winnr()<cr>
2058 inoremap <buffer> <silent> i <c-o>:call <SID>NetrwListStyle(0)<cr>
2059 inoremap <buffer> <silent> I <c-o>:call <SID>NetrwBannerCtrl(1)<cr>
2060 inoremap <buffer> <silent> o <c-o>:call <SID>NetrwSplit(0)<cr>
2061 inoremap <buffer> <silent> O <c-o>:call <SID>NetrwObtain(0)<cr>
2062 inoremap <buffer> <silent> p <c-o>:call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
2063 inoremap <buffer> <silent> P <c-o>:call <SID>NetrwPrevWinOpen(0)<cr>
2064 inoremap <buffer> <silent> qb <c-o>:<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
2065 inoremap <buffer> <silent> mB <c-o>:<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
2066 inoremap <buffer> <silent> qf <c-o>:<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
2067 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>
2068 inoremap <buffer> <silent> s <c-o>:call <SID>NetrwSortStyle(0)<cr>
2069 inoremap <buffer> <silent> S <c-o>:call <SID>NetSortSequence(0)<cr>
2070 inoremap <buffer> <silent> t <c-o>:call <SID>NetrwSplit(1)<cr>
2071 inoremap <buffer> <silent> T <c-o>:call <SID>NetrwSplit(1)<bar>norm! gT<cr>
2072 inoremap <buffer> <silent> u <c-o>:<c-u>call <SID>NetrwBookHistHandler(4,b:netrw_curdir)<cr>
2073 inoremap <buffer> <silent> U <c-o>:<c-u>call <SID>NetrwBookHistHandler(5,b:netrw_curdir)<cr>
2074 inoremap <buffer> <silent> v <c-o>:call <SID>NetrwSplit(2)<cr>
2075 inoremap <buffer> <silent> x <c-o>:call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
2076 inoremap <buffer> <silent> % <c-o>:call <SID>NetrwOpenFile(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002077 if !hasmapto('<Plug>NetrwHideEdit')
2078 nmap <buffer> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002079 imap <buffer> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar446cb832008-06-24 21:56:24 +00002080 endif
2081 nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(0)<cr>
2082 if !hasmapto('<Plug>NetrwRefresh')
2083 nmap <buffer> <c-l> <Plug>NetrwRefresh
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002084 imap <buffer> <c-l> <Plug>NetrwRefresh
Bram Moolenaar446cb832008-06-24 21:56:24 +00002085 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002086
2087 let mapsafepath = escape(s:path, s:netrw_map_escape)
2088 let mapsafeusermach = escape(s:user.s:machine, s:netrw_map_escape)
2089
Bram Moolenaar251e1912011-06-19 05:09:16 +02002090 nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002091 if g:netrw_mousemaps == 1
Bram Moolenaar251e1912011-06-19 05:09:16 +02002092 nmap <leftmouse> <Plug>NetrwLeftmouse
2093 nno <buffer> <silent> <Plug>NetrwLeftmouse <leftmouse>:call <SID>NetrwLeftmouse(0)<cr>
2094 nmap <middlemouse> <Plug>NetrwMiddlemouse
2095 nno <buffer> <silent> <middlemouse> <Plug>NetrwMiddlemouse <leftmouse>:call <SID>NetrwPrevWinOpen(0)<cr>
2096 nmap <buffer> <s-leftmouse> <Plug>NetrwSLeftmouse
2097 nno <buffer> <silent> <Plug>NetrwSLeftmouse <leftmouse>:call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
2098 nmap <buffer> <2-leftmouse> <Plug>Netrw2Leftmouse
2099 nmap <buffer> <silent> <Plug>Netrw2Leftmouse -
2100 imap <buffer> <leftmouse> <Plug>ILeftmouse
2101 ino <buffer> <silent> <Plug>ILeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwLeftmouse(0)<cr>
2102 imap <buffer> <middlemouse> <Plug>IMiddlemouse
2103 ino <buffer> <silent> <Plug>IMiddlemouse <c-o><leftmouse><c-o>:call <SID>NetrwPrevWinOpen(0)<cr>
2104 imap <buffer> <s-leftmouse> <Plug>ISLeftmouse
2105 ino <buffer> <silent> <Plug>ISLeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002106 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
2107 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002108 exe 'inoremap <buffer> <silent> <rightmouse> <c-o><leftmouse><c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002109 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002110 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002111 exe 'nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("'.mapsafeusermach.'")<cr>'
2112 exe 'nnoremap <buffer> <silent> D :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
2113 exe 'nnoremap <buffer> <silent> R :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002114 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002115 exe 'vnoremap <buffer> <silent> D :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
2116 exe 'vnoremap <buffer> <silent> R :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
2117 exe 'inoremap <buffer> <silent> <del> <c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
2118 exe 'inoremap <buffer> <silent> d <c-o>:call <SID>NetrwMakeDir("'.mapsafeusermach.'")<cr>'
2119 exe 'inoremap <buffer> <silent> D <c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
2120 exe 'inoremap <buffer> <silent> R <c-o>:call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaarc236c162008-07-13 17:41:49 +00002121 nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002122 inoremap <buffer> <F1> <c-o>:he netrw-quickhelp<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00002123 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002124
Bram Moolenaaradc21822011-04-01 18:03:16 +02002125 keepj call s:SetRexDir(a:islocal,b:netrw_curdir)
Bram Moolenaar251e1912011-06-19 05:09:16 +02002126
Bram Moolenaaradc21822011-04-01 18:03:16 +02002127" call Dret("s:NetrwMaps")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002128endfun
2129
2130" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002131" s:ExplorePatHls: converts an Explore pattern into a regular expression search pattern {{{2
2132fun! s:ExplorePatHls(pattern)
2133" call Dfunc("s:ExplorePatHls(pattern<".a:pattern.">)")
2134 let repat= substitute(a:pattern,'^**/\{1,2}','','')
2135" call Decho("repat<".repat.">")
2136 let repat= escape(repat,'][.\')
2137" call Decho("repat<".repat.">")
2138 let repat= '\<'.substitute(repat,'\*','\\(\\S\\+ \\)*\\S\\+','g').'\>'
2139" call Dret("s:ExplorePatHls repat<".repat.">")
2140 return repat
Bram Moolenaar9964e462007-05-05 17:54:07 +00002141endfun
2142
2143" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01002144" s:NetrwBookHistHandler: {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00002145" 0: (user: <mb>) bookmark current directory
2146" 1: (user: <gb>) change to the bookmarked directory
2147" 2: (user: <qb>) list bookmarks
2148" 3: (browsing) record current directory history
2149" 4: (user: <u>) go up (previous) bookmark
2150" 5: (user: <U>) go down (next) bookmark
2151" 6: (user: <mB>) delete bookmark
Bram Moolenaar5c736222010-01-06 20:54:52 +01002152fun! s:NetrwBookHistHandler(chg,curdir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002153" 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 +00002154
2155 if a:chg == 0
2156 " bookmark the current directory
2157" call Decho("(user: <b>) bookmark the current directory")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002158 if !exists("g:netrw_bookmarklist")
2159 let g:netrw_bookmarklist= []
2160 endif
2161 if index(g:netrw_bookmarklist,a:curdir) == -1
2162 " curdir not currently in g:netrw_bookmarklist, so include it
2163 call add(g:netrw_bookmarklist,a:curdir)
2164 call sort(g:netrw_bookmarklist)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002165 endif
2166 echo "bookmarked the current directory"
2167
2168 elseif a:chg == 1
2169 " change to the bookmarked directory
Bram Moolenaar5c736222010-01-06 20:54:52 +01002170" call Decho("(user: <".v:count."mb>) change to the bookmarked directory")
2171 if exists("g:netrw_bookmarklist[v:count-1]")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002172 exe "keepj e ".fnameescape(g:netrw_bookmarklist[v:count-1])
Bram Moolenaar9964e462007-05-05 17:54:07 +00002173 else
2174 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
2175 endif
2176
2177 elseif a:chg == 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00002178" redraw!
Bram Moolenaar9964e462007-05-05 17:54:07 +00002179 let didwork= 0
2180 " list user's bookmarks
2181" call Decho("(user: <q>) list user's bookmarks")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002182 if exists("g:netrw_bookmarklist")
2183" call Decho('list '.len(g:netrw_bookmarklist).' bookmarks')
2184 let cnt= 1
2185 for bmd in g:netrw_bookmarklist
2186" call Decho("Netrw Bookmark#".cnt.": ".g:netrw_bookmarklist[cnt-1])
2187 echo "Netrw Bookmark#".cnt.": ".g:netrw_bookmarklist[cnt-1]
2188 let didwork = 1
2189 let cnt = cnt + 1
2190 endfor
Bram Moolenaar9964e462007-05-05 17:54:07 +00002191 endif
2192
2193 " list directory history
Bram Moolenaar5c736222010-01-06 20:54:52 +01002194 let cnt = g:netrw_dirhist_cnt
Bram Moolenaar9964e462007-05-05 17:54:07 +00002195 let first = 1
2196 let histcnt = 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02002197 if g:netrw_dirhistmax > 0
2198 while ( first || cnt != g:netrw_dirhist_cnt )
Bram Moolenaar5c736222010-01-06 20:54:52 +01002199" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:netrw_dirhist_cnt)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002200 let histcnt= histcnt + 1
2201 if exists("g:netrw_dirhist_{cnt}")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002202" call Decho("Netrw History#".histcnt.": ".g:netrw_dirhist_{cnt})
Bram Moolenaaradc21822011-04-01 18:03:16 +02002203 echo "Netrw History#".histcnt.": ".g:netrw_dirhist_{cnt}
2204 let didwork= 1
2205 endif
2206 let first = 0
2207 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
2208 if cnt < 0
2209 let cnt= cnt + g:netrw_dirhistmax
2210 endif
2211 endwhile
2212 else
2213 let g:netrw_dirhist_cnt= 0
2214 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002215 if didwork
2216 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2217 endif
2218
2219 elseif a:chg == 3
2220 " saves most recently visited directories (when they differ)
2221" call Decho("(browsing) record curdir history")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002222 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 +02002223 if g:netrw_dirhistmax > 0
2224 let g:netrw_dirhist_cnt = ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
2225 let g:netrw_dirhist_{g:netrw_dirhist_cnt} = a:curdir
2226 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002227" call Decho("save dirhist#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002228 endif
2229
2230 elseif a:chg == 4
2231 " u: change to the previous directory stored on the history list
2232" call Decho("(user: <u>) chg to prev dir from history")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002233 if g:netrw_dirhistmax > 0
2234 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt - 1 ) % g:netrw_dirhistmax
2235 if g:netrw_dirhist_cnt < 0
2236 let g:netrw_dirhist_cnt= g:netrw_dirhist_cnt + g:netrw_dirhistmax
2237 endif
2238 else
2239 let g:netrw_dirhist_cnt= 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00002240 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002241 if exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}")
2242" call Decho("changedir u#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002243 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
2244 setlocal ma noro
Bram Moolenaar446cb832008-06-24 21:56:24 +00002245" call Decho("setlocal ma noro")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002246 sil! keepj %d
Bram Moolenaar9964e462007-05-05 17:54:07 +00002247 setlocal nomod
Bram Moolenaar446cb832008-06-24 21:56:24 +00002248" call Decho("setlocal nomod")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002249 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002250" " call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt}))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002251 exe "keepj e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt})
Bram Moolenaar9964e462007-05-05 17:54:07 +00002252 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02002253 if g:netrw_dirhistmax > 0
2254 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
2255 else
2256 let g:netrw_dirhist_cnt= 0
2257 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002258 echo "Sorry, no predecessor directory exists yet"
2259 endif
2260
2261 elseif a:chg == 5
2262 " U: change to the subsequent directory stored on the history list
2263" call Decho("(user: <U>) chg to next dir from history")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002264 if g:netrw_dirhistmax > 0
2265 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
2266 if exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002267" call Decho("changedir U#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002268 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
2269 setlocal ma noro
Bram Moolenaar446cb832008-06-24 21:56:24 +00002270" call Decho("setlocal ma noro")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002271 sil! keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00002272" call Decho("removed all lines from buffer (%d)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002273 setlocal nomod
Bram Moolenaar446cb832008-06-24 21:56:24 +00002274" call Decho("setlocal nomod")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002275 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002276" call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt}))
Bram Moolenaaradc21822011-04-01 18:03:16 +02002277 exe "keepj e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt})
2278 else
2279 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt - 1 ) % g:netrw_dirhistmax
2280 if g:netrw_dirhist_cnt < 0
2281 let g:netrw_dirhist_cnt= g:netrw_dirhist_cnt + g:netrw_dirhistmax
2282 endif
2283 echo "Sorry, no successor directory exists yet"
Bram Moolenaar9964e462007-05-05 17:54:07 +00002284 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002285 else
2286 let g:netrw_dirhist_cnt= 0
2287 echo "Sorry, no successor directory exists yet (g:netrw_dirhistmax is ".g:netrw_dirhistmax.")"
Bram Moolenaar9964e462007-05-05 17:54:07 +00002288 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002289
2290 elseif a:chg == 6
Bram Moolenaar5c736222010-01-06 20:54:52 +01002291 " delete the v:count'th bookmark
2292" call Decho("delete bookmark#".v:count."<".g:netrw_bookmarklist[v:count-1].">")
2293 let savefile= s:NetrwHome()."/.netrwbook"
2294 if filereadable(savefile)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002295 keepj call s:NetrwBookHistSave() " done here to merge bookmarks first
2296 keepj call delete(savefile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002297 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002298 keepj call remove(g:netrw_bookmarklist,v:count-1)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002299 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002300 call s:NetrwBookmarkMenu()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002301" call Dret("s:NetrwBookHistHandler")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002302endfun
2303
2304" ---------------------------------------------------------------------
2305" s:NetrwBookHistRead: this function reads bookmarks and history {{{2
2306" Sister function: s:NetrwBookHistSave()
2307fun! s:NetrwBookHistRead()
2308" call Dfunc("s:NetrwBookHistRead()")
2309 if !exists("s:netrw_initbookhist")
2310 let home = s:NetrwHome()
2311 let savefile= home."/.netrwbook"
2312 if filereadable(savefile)
2313" call Decho("sourcing .netrwbook")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002314 exe "keepj so ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01002315 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002316 if g:netrw_dirhistmax > 0
2317 let savefile= home."/.netrwhist"
2318 if filereadable(savefile)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002319" call Decho("sourcing .netrwhist")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002320 exe "keepj so ".savefile
2321 endif
2322 let s:netrw_initbookhist= 1
2323 au VimLeave * call s:NetrwBookHistSave()
Bram Moolenaar5c736222010-01-06 20:54:52 +01002324 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002325 endif
2326" call Dret("s:NetrwBookHistRead")
2327endfun
2328
2329" ---------------------------------------------------------------------
2330" s:NetrwBookHistSave: this function saves bookmarks and history {{{2
2331" Sister function: s:NetrwBookHistRead()
2332" I used to do this via viminfo but that appears to
2333" be unreliable for long-term storage
Bram Moolenaar5c736222010-01-06 20:54:52 +01002334fun! s:NetrwBookHistSave()
2335" call Dfunc("s:NetrwBookHistSave() dirhistmax=".g:netrw_dirhistmax)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002336 if g:netrw_dirhistmax <= 0
2337" call Dret("s:NetrwBookHistSave : dirhistmax=".g:netrw_dirhistmax)
2338 return
2339 endif
2340
Bram Moolenaar5c736222010-01-06 20:54:52 +01002341 let savefile= s:NetrwHome()."/.netrwhist"
2342 1split
2343 call s:NetrwEnew()
2344 setlocal cino= com= cpo-=aA fo=nroql2 tw=0 report=10000 noswf
2345 setlocal nocin noai noci magic nospell nohid wig= noaw
2346 setlocal ma noro write
2347 if exists("&acd") | setlocal noacd | endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002348 sil! keepj %d
Bram Moolenaar5c736222010-01-06 20:54:52 +01002349
2350 " save .netrwhist -- no attempt to merge
Bram Moolenaaradc21822011-04-01 18:03:16 +02002351 sil! file .netrwhist
Bram Moolenaar5c736222010-01-06 20:54:52 +01002352 call setline(1,"let g:netrw_dirhistmax =".g:netrw_dirhistmax)
2353 call setline(2,"let g:netrw_dirhist_cnt =".g:netrw_dirhist_cnt)
2354 let lastline = line("$")
2355 let cnt = 1
2356 while cnt <= g:netrw_dirhist_cnt
2357 call setline((cnt+lastline),'let g:netrw_dirhist_'.cnt."='".g:netrw_dirhist_{cnt}."'")
2358 let cnt= cnt + 1
2359 endwhile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002360 exe "sil! w! ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01002361
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002362 sil keepj %d
Bram Moolenaar5c736222010-01-06 20:54:52 +01002363 if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != []
2364 " merge and write .netrwbook
2365 let savefile= s:NetrwHome()."/.netrwbook"
2366
2367 if filereadable(savefile)
2368 let booklist= deepcopy(g:netrw_bookmarklist)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002369 exe "sil keepj so ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01002370 for bdm in booklist
2371 if index(g:netrw_bookmarklist,bdm) == -1
2372 call add(g:netrw_bookmarklist,bdm)
2373 endif
2374 endfor
2375 call sort(g:netrw_bookmarklist)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002376 exe "sil! w! ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01002377 endif
2378
2379 " construct and save .netrwbook
2380 call setline(1,"let g:netrw_bookmarklist= ".string(g:netrw_bookmarklist))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002381 exe "sil! w! ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01002382 endif
2383 let bgone= bufnr("%")
2384 q!
2385 exe bgone."bwipe!"
2386
2387" call Dret("s:NetrwBookHistSave")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002388endfun
2389
2390" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002391" s:NetrwBrowse: This function uses the command in g:netrw_list_cmd to provide a {{{2
2392" list of the contents of a local or remote directory. It is assumed that the
2393" g:netrw_list_cmd has a string, USEPORT HOSTNAME, that needs to be substituted
2394" with the requested remote hostname first.
2395fun! s:NetrwBrowse(islocal,dirname)
2396 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002397" 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 +00002398" call Decho("tab#".tabpagenr()." win#".winnr())
2399" call Dredir("ls!")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002400 if !exists("s:netrw_initbookhist")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002401 keepj call s:NetrwBookHistRead()
Bram Moolenaar5c736222010-01-06 20:54:52 +01002402 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002403
2404 " simplify the dirname (especially for ".."s in dirnames)
2405 if a:dirname !~ '^\a\+://'
2406 let dirname= simplify(a:dirname)
2407 else
2408 let dirname= a:dirname
2409 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002410
2411 if exists("s:netrw_skipbrowse")
2412 unlet s:netrw_skipbrowse
Bram Moolenaarc236c162008-07-13 17:41:49 +00002413" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002414" call Dret("s:NetrwBrowse : s:netrw_skipbrowse=".s:netrw_skipbrowse)
2415 return
2416 endif
2417 if !exists("*shellescape")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002418 keepj call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing shellescape()",69)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002419" call Dret("s:NetrwBrowse : missing shellescape()")
2420 return
2421 endif
2422 if !exists("*fnameescape")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002423 keepj call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing fnameescape()",70)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002424" call Dret("s:NetrwBrowse : missing fnameescape()")
2425 return
2426 endif
2427
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002428 call s:NetrwOptionSave("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002429
2430 " re-instate any marked files
2431 if exists("s:netrwmarkfilelist_{bufnr('%')}")
2432" call Decho("clearing marked files")
2433 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
2434 endif
2435
2436 if a:islocal && exists("w:netrw_acdkeep") && w:netrw_acdkeep
2437" call Decho("handle w:netrw_acdkeep:")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002438" call Decho("keepjumps lcd ".fnameescape(dirname)." (due to w:netrw_acdkeep=".w:netrw_acdkeep." - acd=".&acd.")")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002439 exe 'keepj lcd '.fnameescape(dirname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002440 call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00002441" call Decho("getcwd<".getcwd().">")
2442
Bram Moolenaar5c736222010-01-06 20:54:52 +01002443 elseif !a:islocal && dirname !~ '[\/]$' && dirname !~ '^"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002444 " looks like a regular file, attempt transfer
Bram Moolenaar5c736222010-01-06 20:54:52 +01002445" call Decho("attempt transfer as regular file<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002446
2447 " remove any filetype indicator from end of dirname, except for the {{{3
2448 " "this is a directory" indicator (/).
2449 " There shouldn't be one of those here, anyway.
Bram Moolenaar5c736222010-01-06 20:54:52 +01002450 let path= substitute(dirname,'[*=@|]\r\=$','','e')
Bram Moolenaar446cb832008-06-24 21:56:24 +00002451" call Decho("new path<".path.">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002452 call s:RemotePathAnalysis(dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002453
2454 " remote-read the requested file into current buffer {{{3
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002455 keepj mark '
Bram Moolenaar5c736222010-01-06 20:54:52 +01002456 call s:NetrwEnew(dirname)
2457 call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00002458 setlocal ma noro
2459" call Decho("setlocal ma noro")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002460 let b:netrw_curdir= dirname
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002461" call Decho("exe sil! keepalt file ".fnameescape(s:method."://".s:user.s:machine."/".s:path)." (bt=".&bt.")")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002462 exe "sil! keepj keepalt file ".fnameescape(s:method."://".s:user.s:machine."/".s:path)
2463 exe "sil! keepj keepalt doau BufReadPre ".fnameescape(s:fname)
2464 sil call netrw#NetRead(2,s:method."://".s:user.s:machine."/".s:path)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002465 if s:path !~ '.tar.bz2$' && s:path !~ '.tar.gz' && s:path !~ '.tar.xz' && s:path !~ '.txz'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002466 " netrw.vim and tar.vim have already handled decompression of the tarball; avoiding gzip.vim error
Bram Moolenaaradc21822011-04-01 18:03:16 +02002467 exe "sil keepj keepalt doau BufReadPost ".fnameescape(s:fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002468 endif
2469
2470 " save certain window-oriented variables into buffer-oriented variables {{{3
2471 call s:SetBufWinVars()
2472 call s:NetrwOptionRestore("w:")
2473 setlocal ma nomod
2474
Bram Moolenaarc236c162008-07-13 17:41:49 +00002475" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002476" call Dret("s:NetrwBrowse : file<".s:fname.">")
2477 return
2478 endif
2479
Bram Moolenaaradc21822011-04-01 18:03:16 +02002480 " use buffer-oriented WinVars if buffer variables exist but associated window variables don't {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00002481 call s:UseBufWinVars()
2482
2483 " set up some variables {{{3
2484 let b:netrw_browser_active = 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01002485 let dirname = dirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00002486 let s:last_sort_by = g:netrw_sort_by
2487
2488 " set up menu {{{3
Bram Moolenaaradc21822011-04-01 18:03:16 +02002489 keepj call s:NetrwMenu(1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002490
2491 " set up buffer {{{3
2492 let reusing= s:NetrwGetBuffer(a:islocal,dirname)
2493 " maintain markfile highlighting
2494 if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
2495" call Decho("bufnr(%)=".bufnr('%'))
2496" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
2497 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
2498 else
2499" call Decho("2match none")
2500 2match none
2501 endif
2502 if reusing
2503 call s:NetrwOptionRestore("w:")
2504 setlocal noma nomod nowrap
Bram Moolenaarc236c162008-07-13 17:41:49 +00002505" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002506" call Dret("s:NetrwBrowse : re-using buffer")
2507 return
2508 endif
2509
2510 " set b:netrw_curdir to the new directory name {{{3
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002511" call Decho("set b:netrw_curdir to the new directory name: (buf#".bufnr("%").")")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002512 let b:netrw_curdir= dirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00002513 if b:netrw_curdir =~ '[/\\]$'
2514 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
2515 endif
2516 if b:netrw_curdir == ''
2517 if has("amiga")
2518 " On the Amiga, the empty string connotes the current directory
2519 let b:netrw_curdir= getcwd()
2520 else
2521 " under unix, when the root directory is encountered, the result
2522 " from the preceding substitute is an empty string.
2523 let b:netrw_curdir= '/'
2524 endif
2525 endif
2526 if !a:islocal && b:netrw_curdir !~ '/$'
2527 let b:netrw_curdir= b:netrw_curdir.'/'
2528 endif
2529" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
2530
2531 " ------------
2532 " (local only) {{{3
2533 " ------------
2534 if a:islocal
2535" call Decho("local only:")
2536
2537 " Set up ShellCmdPost handling. Append current buffer to browselist
2538 call s:LocalFastBrowser()
2539
2540 " handle g:netrw_keepdir: set vim's current directory to netrw's notion of the current directory {{{3
2541 if !g:netrw_keepdir
2542" call Decho("handle g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
2543" call Decho("l:acd".(exists("&l:acd")? "=".&l:acd : " doesn't exist"))
2544 if !exists("&l:acd") || !&l:acd
2545" call Decho('exe keepjumps lcd '.fnameescape(b:netrw_curdir))
2546 try
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002547 exe 'keepj lcd '.fnameescape(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002548 catch /^Vim\%((\a\+)\)\=:E472/
2549 call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".b:netrw_curdir."> (permissions?)",61)
2550 if exists("w:netrw_prvdir")
2551 let b:netrw_curdir= w:netrw_prvdir
2552 else
2553 call s:NetrwOptionRestore("w:")
2554 setlocal noma nomod nowrap
2555 let b:netrw_curdir= dirname
Bram Moolenaarc236c162008-07-13 17:41:49 +00002556" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002557" call Dret("s:NetrwBrowse : reusing buffer#".(exists("bufnum")? bufnum : 'N/A')."<".dirname."> getcwd<".getcwd().">")
2558 return
2559 endif
2560 endtry
2561 endif
2562 endif
2563
2564 " --------------------------------
2565 " remote handling: {{{3
2566 " --------------------------------
2567 else
2568" call Decho("remote only:")
2569
Bram Moolenaar5c736222010-01-06 20:54:52 +01002570 " analyze dirname and g:netrw_list_cmd {{{4
2571" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist")."> dirname<".dirname.">")
2572 if dirname =~ "^NetrwTreeListing\>"
Bram Moolenaar446cb832008-06-24 21:56:24 +00002573 let dirname= b:netrw_curdir
Bram Moolenaar5c736222010-01-06 20:54:52 +01002574" call Decho("(dirname was ".dirname.") dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002575 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
2576 let dirname= substitute(b:netrw_curdir,'\\','/','g')
2577 if dirname !~ '/$'
2578 let dirname= dirname.'/'
2579 endif
2580 let b:netrw_curdir = dirname
2581" call Decho("(liststyle is TREELIST) dirname<".dirname.">")
2582 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01002583 let dirname = substitute(dirname,'\\','/','g')
Bram Moolenaar446cb832008-06-24 21:56:24 +00002584" call Decho("(normal) dirname<".dirname.">")
2585 endif
2586
2587 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
2588 if dirname !~ dirpat
2589 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002590 keepj call netrw#ErrorMsg(s:ERROR,"netrw doesn't understand your dirname<".dirname.">",20)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002591 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002592 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002593 setlocal noma nomod nowrap
Bram Moolenaarc236c162008-07-13 17:41:49 +00002594" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002595" call Dret("s:NetrwBrowse : badly formatted dirname<".dirname.">")
2596 return
2597 endif
2598 let b:netrw_curdir= dirname
2599" call Decho("b:netrw_curdir<".b:netrw_curdir."> (remote)")
2600 endif " (additional remote handling)
2601
2602 " -----------------------
2603 " Directory Listing: {{{3
2604 " -----------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02002605 keepj call s:NetrwMaps(a:islocal)
2606 keepj call s:PerformListing(a:islocal)
2607 if v:version >= 700 && has("balloon_eval") && &l:bexpr == ""
2608 let &l:bexpr= "netrw#NetrwBalloonHelp()"
2609 set beval
2610 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002611
2612 " The s:LocalBrowseShellCmdRefresh() function is called by an autocmd
2613 " installed by s:LocalFastBrowser() when g:netrw_fastbrowse <= 1 (ie. slow, medium speed).
2614 " However, s:NetrwBrowse() causes the ShellCmdPost event itself to fire once; setting
2615 " the variable below avoids that second refresh of the screen. The s:LocalBrowseShellCmdRefresh()
2616 " function gets called due to that autocmd; it notices that the following variable is set
2617 " and skips the refresh and sets s:locbrowseshellcmd to zero. Oct 13, 2008
2618 let s:locbrowseshellcmd= 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00002619
Bram Moolenaarc236c162008-07-13 17:41:49 +00002620" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002621" call Dret("s:NetrwBrowse : did PerformListing ft<".&ft.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002622 return
2623endfun
2624
2625" ---------------------------------------------------------------------
2626" s:NetrwFileInfo: supports qf (query for file information) {{{2
2627fun! s:NetrwFileInfo(islocal,fname)
2628" call Dfunc("s:NetrwFileInfo(islocal=".a:islocal." fname<".a:fname.">)")
2629 if a:islocal
2630 if (has("unix") || has("macunix")) && executable("/bin/ls")
2631 if exists("b:netrw_curdir")
2632" call Decho('using ls with b:netrw_curdir<'.b:netrw_curdir.'>')
2633 if b:netrw_curdir =~ '/$'
2634 echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir.a:fname))
2635 else
2636 echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir."/".a:fname))
2637 endif
2638 else
2639" call Decho('using ls '.a:fname." using cwd<".getcwd().">")
2640 echo system("/bin/ls -lsad ".shellescape(a:fname))
2641 endif
2642 else
2643 " use vim functions to return information about file below cursor
2644" call Decho("using vim functions to query for file info")
2645 if !isdirectory(a:fname) && !filereadable(a:fname) && a:fname =~ '[*@/]'
2646 let fname= substitute(a:fname,".$","","")
2647 else
2648 let fname= a:fname
2649 endif
2650 let t = getftime(fname)
2651 let sz = getfsize(fname)
2652 echo a:fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname))
2653" call Decho(fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname)))
2654 endif
2655 else
2656 echo "sorry, \"qf\" not supported yet for remote files"
2657 endif
2658" call Dret("s:NetrwFileInfo")
2659endfun
2660
2661" ---------------------------------------------------------------------
2662" s:NetrwGetBuffer: {{{2
2663" returns 0=cleared buffer
2664" 1=re-used buffer
2665fun! s:NetrwGetBuffer(islocal,dirname)
2666" call Dfunc("s:NetrwGetBuffer(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".g:netrw_liststyle)
2667 let dirname= a:dirname
2668
2669 " re-use buffer if possible {{{3
2670" call Decho("--re-use a buffer if possible--")
2671 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2672 " find NetrwTreeList buffer if there is one
Bram Moolenaar5c736222010-01-06 20:54:52 +01002673" call Decho("find NetrwTreeList buffer if there is one")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002674 if exists("w:netrw_treebufnr") && w:netrw_treebufnr > 0
2675" call Decho(" re-use w:netrw_treebufnr=".w:netrw_treebufnr)
2676 let eikeep= &ei
2677 set ei=all
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002678 exe "sil! b ".w:netrw_treebufnr
Bram Moolenaar446cb832008-06-24 21:56:24 +00002679 let &ei= eikeep
Bram Moolenaar5c736222010-01-06 20:54:52 +01002680" call Dret("s:NetrwGetBuffer : bufnum#".w:netrw_treebufnr."<NetrwTreeListing>")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002681 return
2682 endif
2683 let bufnum= -1
2684" call Decho(" liststyle=TREE but w:netrw_treebufnr doesn't exist")
2685
2686 else
2687 " find buffer number of buffer named precisely the same as dirname {{{3
2688" call Decho("--find buffer numnber of buffer named precisely the same as dirname--")
2689" call Dredir("ls!")
2690
2691 " get dirname and associated buffer number
2692 let bufnum = bufnr(escape(dirname,'\'))
2693" call Decho(" find buffer<".dirname.">'s number ")
2694" call Decho(" bufnr(dirname<".escape(dirname,'\').">)=".bufnum)
2695
2696 if bufnum < 0 && dirname !~ '/$'
Bram Moolenaar5c736222010-01-06 20:54:52 +01002697 " try appending a trailing /
Bram Moolenaar446cb832008-06-24 21:56:24 +00002698" call Decho(" try appending a trailing / to dirname<".dirname.">")
2699 let bufnum= bufnr(escape(dirname.'/','\'))
2700 if bufnum > 0
2701 let dirname= dirname.'/'
2702 endif
2703 endif
2704
2705 if bufnum < 0 && dirname =~ '/$'
Bram Moolenaar5c736222010-01-06 20:54:52 +01002706 " try removing a trailing /
Bram Moolenaar446cb832008-06-24 21:56:24 +00002707" call Decho(" try removing a trailing / from dirname<".dirname.">")
2708 let bufnum= bufnr(escape(substitute(dirname,'/$','',''),'\'))
2709 if bufnum > 0
2710 let dirname= substitute(dirname,'/$','','')
2711 endif
2712 endif
2713
2714" call Decho(" findbuf1: bufnum=bufnr('".dirname."')=".bufnum." bufname(".bufnum.")<".bufname(bufnum)."> (initial)")
2715 " note: !~ was used just below, but that means using ../ to go back would match (ie. abc/def/ and abc/ matches)
2716 if bufnum > 0 && bufname(bufnum) != dirname && bufname(bufnum) != '.'
2717 " handle approximate matches
Bram Moolenaar5c736222010-01-06 20:54:52 +01002718" call Decho(" handling approx match: bufnum#".bufnum."<".bufname(bufnum)."> approx-dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002719 let ibuf = 1
2720 let buflast = bufnr("$")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002721" call Decho(" findbuf2: buflast=bufnr($)=".buflast)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002722 while ibuf <= buflast
2723 let bname= substitute(bufname(ibuf),'\\','/','g')
Bram Moolenaarc236c162008-07-13 17:41:49 +00002724 let bname= substitute(bname,'.\zs/$','','')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002725" call Decho(" findbuf3: while [ibuf=",ibuf."]<=[buflast=".buflast."]: dirname<".dirname."> bname=bufname(".ibuf.")<".bname.">")
2726 if bname != '' && dirname =~ '/'.bname.'/\=$' && dirname !~ '^/'
2727 " bname is not empty
2728 " dirname ends with bname,
2729 " dirname doesn't start with /, so its not a absolute path
2730" call Decho(" findbuf3a: passes test 1 : dirname<".dirname.'> =~ /'.bname.'/\=$ && dirname !~ ^/')
Bram Moolenaar5c736222010-01-06 20:54:52 +01002731 break
2732 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002733 if bname =~ '^'.dirname.'/\=$'
2734 " bname begins with dirname
2735" call Decho(' findbuf3b: passes test 2 : bname<'.bname.'>=~^'.dirname.'/\=$')
Bram Moolenaar5c736222010-01-06 20:54:52 +01002736 break
2737 endif
2738 if dirname =~ '^'.bname.'/$'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002739" call Decho(' findbuf3c: passes test 3 : dirname<'.dirname.'>=~^'.bname.'/$')
2740 break
2741 endif
2742 if bname != '' && dirname =~ '/'.bname.'$' && bname == bufname("%") && line("$") == 1
2743" call Decho(' findbuf3d: passes test 4 : dirname<'.dirname.'>=~ /'.bname.'$')
Bram Moolenaar5c736222010-01-06 20:54:52 +01002744 break
2745 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002746 let ibuf= ibuf + 1
2747 endwhile
2748 if ibuf > buflast
2749 let bufnum= -1
2750 else
2751 let bufnum= ibuf
2752 endif
2753" call Decho(" findbuf4: bufnum=".bufnum." (ibuf=".ibuf." buflast=".buflast.")")
2754 endif
2755 endif
2756
2757 " get enew buffer and name it -or- re-use buffer {{{3
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002758 sil! keepj mark '
Bram Moolenaar446cb832008-06-24 21:56:24 +00002759 if bufnum < 0 || !bufexists(bufnum)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002760" call Decho("--get enew buffer and name it (bufexists([bufnum=".bufnum."])=".bufexists(bufnum).")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002761 call s:NetrwEnew(dirname)
2762" call Decho(" got enew buffer#".bufnr("%")." (altbuf<".expand("#").">)")
2763 " name the buffer
2764 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2765 " Got enew buffer; transform into a NetrwTreeListing
2766" call Decho("--transform enew buffer#".bufnr("%")." into a NetrwTreeListing --")
2767 if !exists("s:netrw_treelistnum")
2768 let s:netrw_treelistnum= 1
2769 else
2770 let s:netrw_treelistnum= s:netrw_treelistnum + 1
2771 endif
2772 let w:netrw_treebufnr= bufnr("%")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002773" call Decho(" exe sil! keepalt file NetrwTreeListing ".fnameescape(s:netrw_treelistnum))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002774 exe 'sil! keepalt file NetrwTreeListing\ '.fnameescape(s:netrw_treelistnum)
2775 set bt=nofile noswf
Bram Moolenaaradc21822011-04-01 18:03:16 +02002776 nnoremap <silent> <buffer> [ :sil call <SID>TreeListMove('[')<cr>
2777 nnoremap <silent> <buffer> ] :sil call <SID>TreeListMove(']')<cr>
2778 nnoremap <silent> <buffer> [[ :sil call <SID>TreeListMove('[')<cr>
2779 nnoremap <silent> <buffer> ]] :sil call <SID>TreeListMove(']')<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002780" call Decho(" tree listing#".s:netrw_treelistnum." bufnr=".w:netrw_treebufnr)
2781 else
2782" let v:errmsg= "" " Decho
2783 let escdirname= fnameescape(dirname)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002784" call Decho(" errmsg<".v:errmsg."> bufnr(escdirname<".escdirname.">)=".bufnr(escdirname)." bufname()<".bufname(bufnr(escdirname)).">")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002785" call Decho(' exe sil! keepalt file '.escdirname)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002786" let v:errmsg= "" " Decho
2787 exe 'sil! keepalt file '.escdirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00002788" call Decho(" errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">")
2789 endif
2790" call Decho(" named enew buffer#".bufnr("%")."<".bufname("%").">")
2791
2792 else " Re-use the buffer
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002793" call Decho("--re-use buffer#".bufnum." (bufexists([bufnum=".bufnum."])=".bufexists(bufnum).")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002794 let eikeep= &ei
2795 set ei=all
2796 if getline(2) =~ '^" Netrw Directory Listing'
2797" call Decho(" re-use buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using: keepalt b ".bufnum)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002798 exe "sil! keepalt b ".bufnum
Bram Moolenaar446cb832008-06-24 21:56:24 +00002799 else
2800" call Decho(" reusing buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using: b ".bufnum)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002801 exe "sil! b ".bufnum
Bram Moolenaar446cb832008-06-24 21:56:24 +00002802 endif
2803 if bufname("%") == '.'
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002804" call Decho("exe sil! keepalt file ".fnameescape(getcwd()))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002805 exe "sil! keepalt file ".fnameescape(getcwd())
Bram Moolenaar446cb832008-06-24 21:56:24 +00002806 endif
2807 let &ei= eikeep
2808 if line("$") <= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02002809 keepj call s:NetrwListSettings(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002810" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but its empty, so refresh it")
2811 return 0
2812 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2813" call Decho("--re-use tree listing--")
2814" call Decho(" clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002815 sil keepj %d
Bram Moolenaaradc21822011-04-01 18:03:16 +02002816 keepj call s:NetrwListSettings(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002817" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but treelist mode always needs a refresh")
2818 return 0
2819 else
2820" call Dret("s:NetrwGetBuffer 1 : buf#".bufnr("%"))
2821 return 1
2822 endif
2823 endif
2824
2825 " do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc {{{3
2826 " fastbrowse Local Remote Hiding a buffer implies it may be re-used (fast)
2827 " slow 0 D D Deleting a buffer implies it will not be re-used (slow)
2828 " med 1 D H
2829 " fast 2 H H
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002830" call Decho("--do netrw settings: make this buffer#".bufnr("%")." not-a-file, modifiable, not line-numbered, etc--")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002831 let fname= expand("%")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002832 keepj call s:NetrwListSettings(a:islocal)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002833" call Decho("exe sil! keepalt file ".fnameescape(fname))
Bram Moolenaaradc21822011-04-01 18:03:16 +02002834 exe "sil! keepj keepalt file ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002835
2836 " delete all lines from buffer {{{3
2837" call Decho("--delete all lines from buffer--")
2838" call Decho(" clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002839 sil! keepalt keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00002840
2841" call Dret("s:NetrwGetBuffer 0 : buf#".bufnr("%"))
2842 return 0
2843endfun
2844
2845" ---------------------------------------------------------------------
2846" s:NetrwGetcwd: get the current directory. {{{2
2847" Change backslashes to forward slashes, if any.
2848" If doesc is true, escape certain troublesome characters
2849fun! s:NetrwGetcwd(doesc)
2850" call Dfunc("NetrwGetcwd(doesc=".a:doesc.")")
2851 let curdir= substitute(getcwd(),'\\','/','ge')
2852 if curdir !~ '[\/]$'
2853 let curdir= curdir.'/'
2854 endif
2855 if a:doesc
2856 let curdir= fnameescape(curdir)
2857 endif
2858" call Dret("NetrwGetcwd <".curdir.">")
2859 return curdir
2860endfun
2861
2862" ---------------------------------------------------------------------
2863" s:NetrwGetWord: it gets the directory/file named under the cursor {{{2
2864fun! s:NetrwGetWord()
2865" call Dfunc("s:NetrwGetWord() line#".line(".")." liststyle=".g:netrw_liststyle." virtcol=".virtcol("."))
2866 call s:UseBufWinVars()
2867
2868 " insure that w:netrw_liststyle is set up
2869 if !exists("w:netrw_liststyle")
2870 if exists("g:netrw_liststyle")
2871 let w:netrw_liststyle= g:netrw_liststyle
2872 else
2873 let w:netrw_liststyle= s:THINLIST
2874 endif
2875" call Decho("w:netrw_liststyle=".w:netrw_liststyle)
2876 endif
2877
2878 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
2879 " Active Banner support
2880" call Decho("active banner handling")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002881 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00002882 let dirname= "./"
2883 let curline= getline('.')
2884
2885 if curline =~ '"\s*Sorted by\s'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002886 keepj norm s
Bram Moolenaar446cb832008-06-24 21:56:24 +00002887 let s:netrw_skipbrowse= 1
2888 echo 'Pressing "s" also works'
2889
2890 elseif curline =~ '"\s*Sort sequence:'
2891 let s:netrw_skipbrowse= 1
2892 echo 'Press "S" to edit sorting sequence'
2893
2894 elseif curline =~ '"\s*Quick Help:'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002895 keepj norm ?
Bram Moolenaar446cb832008-06-24 21:56:24 +00002896 let s:netrw_skipbrowse= 1
2897 echo 'Pressing "?" also works'
2898
2899 elseif curline =~ '"\s*\%(Hiding\|Showing\):'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002900 keepj norm a
Bram Moolenaar446cb832008-06-24 21:56:24 +00002901 let s:netrw_skipbrowse= 1
2902 echo 'Pressing "a" also works'
2903
2904 elseif line("$") > w:netrw_bannercnt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002905 exe 'sil keepj '.w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00002906 endif
2907
2908 elseif w:netrw_liststyle == s:THINLIST
2909" call Decho("thin column handling")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002910 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00002911 let dirname= getline('.')
2912
2913 elseif w:netrw_liststyle == s:LONGLIST
2914" call Decho("long column handling")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002915 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00002916 let dirname= substitute(getline('.'),'^\(\%(\S\+ \)*\S\+\).\{-}$','\1','e')
2917
2918 elseif w:netrw_liststyle == s:TREELIST
2919" call Decho("treelist handling")
2920 let dirname= substitute(getline('.'),'^\(| \)*','','e')
2921
2922 else
2923" call Decho("obtain word from wide listing")
2924 let dirname= getline('.')
2925
2926 if !exists("b:netrw_cpf")
2927 let b:netrw_cpf= 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02002928 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 +01002929 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002930" call Decho("computed cpf=".b:netrw_cpf)
2931 endif
2932
2933" call Decho("buf#".bufnr("%")."<".bufname("%").">")
2934 let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf
2935" call Decho("filestart= ([virtcol=".virtcol(".")."]/[b:netrw_cpf=".b:netrw_cpf."])*b:netrw_cpf=".filestart." bannercnt=".w:netrw_bannercnt)
2936" call Decho("1: dirname<".dirname.">")
2937 if filestart == 0
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002938 keepj norm! 0ma
Bram Moolenaar446cb832008-06-24 21:56:24 +00002939 else
2940 call cursor(line("."),filestart+1)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002941 keepj norm! ma
Bram Moolenaar446cb832008-06-24 21:56:24 +00002942 endif
2943 let rega= @a
Bram Moolenaarc236c162008-07-13 17:41:49 +00002944 let eofname= filestart + b:netrw_cpf + 1
2945 if eofname <= col("$")
2946 call cursor(line("."),filestart+b:netrw_cpf+1)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002947 keepj norm! "ay`a
Bram Moolenaarc236c162008-07-13 17:41:49 +00002948 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002949 keepj norm! "ay$
Bram Moolenaarc236c162008-07-13 17:41:49 +00002950 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002951 let dirname = @a
2952 let @a = rega
2953" call Decho("2: dirname<".dirname.">")
2954 let dirname= substitute(dirname,'\s\+$','','e')
2955" call Decho("3: dirname<".dirname.">")
2956 endif
2957
2958 " symlinks are indicated by a trailing "@". Remove it before further processing.
2959 let dirname= substitute(dirname,"@$","","")
2960
2961 " executables are indicated by a trailing "*". Remove it before further processing.
2962 let dirname= substitute(dirname,"\*$","","")
2963
2964" call Dret("s:NetrwGetWord <".dirname.">")
2965 return dirname
2966endfun
2967
2968" ---------------------------------------------------------------------
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002969" s:NetrwListSettings: make standard settings for a netrw listing {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00002970fun! s:NetrwListSettings(islocal)
2971" call Dfunc("s:NetrwListSettings(islocal=".a:islocal.")")
2972 let fname= bufname("%")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002973" call Decho("setlocal bt=nofile nobl ma nonu nowrap noro")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002974 setlocal bt=nofile nobl ma nonu nowrap noro
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002975" call Decho("exe sil! keepalt file ".fnameescape(fname))
2976 exe "sil! keepalt file ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002977 if g:netrw_use_noswf
2978 setlocal noswf
2979 endif
2980" call Dredir("ls!")
2981" call Decho("exe setlocal ts=".g:netrw_maxfilenamelen)
2982 exe "setlocal ts=".g:netrw_maxfilenamelen
2983 setlocal isk+=.,~,-
2984 if g:netrw_fastbrowse > a:islocal
2985 setlocal bh=hide
2986 else
2987 setlocal bh=delete
2988 endif
2989" call Dret("s:NetrwListSettings")
2990endfun
2991
2992" ---------------------------------------------------------------------
2993" s:NetrwListStyle: {{{2
2994" islocal=0: remote browsing
2995" =1: local browsing
2996fun! s:NetrwListStyle(islocal)
2997" call Dfunc("NetrwListStyle(islocal=".a:islocal.") w:netrw_liststyle=".w:netrw_liststyle)
2998 let fname = s:NetrwGetWord()
2999 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
3000 let w:netrw_liststyle = (w:netrw_liststyle + 1) % s:MAXLIST
3001" call Decho("fname<".fname.">")
3002" call Decho("chgd w:netrw_liststyle to ".w:netrw_liststyle)
3003" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist").">")
3004
3005 if w:netrw_liststyle == s:THINLIST
3006 " use one column listing
3007" call Decho("use one column list")
3008 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
3009
3010 elseif w:netrw_liststyle == s:LONGLIST
3011 " use long list
3012" call Decho("use long list")
3013 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
3014
3015 elseif w:netrw_liststyle == s:WIDELIST
3016 " give wide list
3017" call Decho("use wide list")
3018 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
3019
3020 elseif w:netrw_liststyle == s:TREELIST
3021" call Decho("use tree list")
3022 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
3023
3024 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02003025 keepj call netrw#ErrorMsg(s:WARNING,"bad value for g:netrw_liststyle (=".w:netrw_liststyle.")",46)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003026 let g:netrw_liststyle = s:THINLIST
3027 let w:netrw_liststyle = g:netrw_liststyle
3028 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
3029 endif
3030 setlocal ma noro
3031" call Decho("setlocal ma noro")
3032
3033 " clear buffer - this will cause NetrwBrowse/LocalBrowseCheck to do a refresh
3034" call Decho("clear buffer<".expand("%")."> with :%d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003035 sil! keepj %d
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003036 " following prevents tree listing buffer from being marked "modified"
3037 setlocal nomod
Bram Moolenaar446cb832008-06-24 21:56:24 +00003038
3039 " refresh the listing
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003040" call Decho("refresh the listing")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003041 let svpos= netrw#NetrwSavePosn()
Bram Moolenaaradc21822011-04-01 18:03:16 +02003042 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3043 keepj call netrw#NetrwRestorePosn(svpos)
3044 keepj call s:NetrwCursor()
Bram Moolenaar446cb832008-06-24 21:56:24 +00003045
3046 " keep cursor on the filename
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003047 sil! keepj $
Bram Moolenaar446cb832008-06-24 21:56:24 +00003048 let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
3049" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'))
3050 if result <= 0 && exists("w:netrw_bannercnt")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003051 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00003052 endif
3053
3054" call Dret("NetrwListStyle".(exists("w:netrw_liststyle")? ' : w:netrw_liststyle='.w:netrw_liststyle : ""))
3055endfun
3056
3057" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01003058" s:NetrwBannerCtrl: toggles the display of the banner {{{2
3059fun! s:NetrwBannerCtrl(islocal)
3060" call Dfunc("s:NetrwBannerCtrl(islocal=".a:islocal.") g:netrw_banner=".g:netrw_banner)
3061
3062 " toggle the banner (enable/suppress)
3063 let g:netrw_banner= !g:netrw_banner
3064
3065 " refresh the listing
3066 let svpos= netrw#NetrwSavePosn()
3067 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3068
3069 " keep cursor on the filename
3070 let fname= s:NetrwGetWord()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003071 sil keepj $
Bram Moolenaar5c736222010-01-06 20:54:52 +01003072 let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
3073" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'))
3074 if result <= 0 && exists("w:netrw_bannercnt")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003075 exe "keepj ".w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01003076 endif
3077" call Dret("s:NetrwBannerCtrl : g:netrw_banner=".g:netrw_banner)
3078endfun
3079
3080" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003081" s:NetrwBookmarkMenu: Uses menu priorities {{{2
3082" .2.[cnt] for bookmarks, and
3083" .3.[cnt] for history
3084" (see s:NetrwMenu())
3085fun! s:NetrwBookmarkMenu()
Bram Moolenaar9964e462007-05-05 17:54:07 +00003086 if !exists("s:netrw_menucnt")
3087 return
3088 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003089" call Dfunc("NetrwBookmarkMenu() histcnt=".g:netrw_dirhist_cnt." menucnt=".s:netrw_menucnt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003090
3091 " the following test assures that gvim is running, has menus available, and has menus enabled.
Bram Moolenaaradc21822011-04-01 18:03:16 +02003092 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaar9964e462007-05-05 17:54:07 +00003093 if exists("g:NetrwTopLvlMenu")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003094" call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003095 exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Bookmarks'
3096 exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete'
Bram Moolenaar5c736222010-01-06 20:54:52 +01003097 endif
3098 if !exists("s:netrw_initbookhist")
3099 call s:NetrwBookHistRead()
Bram Moolenaar9964e462007-05-05 17:54:07 +00003100 endif
3101
3102 " show bookmarked places
Bram Moolenaar5c736222010-01-06 20:54:52 +01003103 if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != []
3104 let cnt= 1
3105 for bmd in g:netrw_bookmarklist
Bram Moolenaaradc21822011-04-01 18:03:16 +02003106" call Decho('sil! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmark.'.bmd.' :e '.bmd)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003107 let bmd= escape(bmd,g:netrw_menu_escape)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003108
3109 " show bookmarks for goto menu
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003110 exe 'sil! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks.'.bmd.' :e '.bmd."\<cr>"
Bram Moolenaar5c736222010-01-06 20:54:52 +01003111
3112 " show bookmarks for deletion menu
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003113 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 +01003114 let cnt= cnt + 1
3115 endfor
3116
3117 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003118
3119 " show directory browsing history
Bram Moolenaaradc21822011-04-01 18:03:16 +02003120 if g:netrw_dirhistmax > 0
3121 let cnt = g:netrw_dirhist_cnt
3122 let first = 1
3123 let histcnt = 0
3124 while ( first || cnt != g:netrw_dirhist_cnt )
3125 let histcnt = histcnt + 1
3126 let priority = g:netrw_dirhist_cnt + histcnt
3127 if exists("g:netrw_dirhist_{cnt}")
3128 let histdir= escape(g:netrw_dirhist_{cnt},g:netrw_menu_escape)
3129" call Decho('sil! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir)
3130 exe 'sil! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir."\<cr>"
3131 endif
3132 let first = 0
3133 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
3134 if cnt < 0
3135 let cnt= cnt + g:netrw_dirhistmax
3136 endif
3137 endwhile
3138 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003139
Bram Moolenaar9964e462007-05-05 17:54:07 +00003140 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003141" call Dret("NetrwBookmarkMenu")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003142endfun
3143
3144" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003145" s:NetrwBrowseChgDir: constructs a new directory based on the current {{{2
3146" directory and a new directory name. Also, if the
3147" "new directory name" is actually a file,
3148" NetrwBrowseChgDir() edits the file.
3149fun! s:NetrwBrowseChgDir(islocal,newdir,...)
3150" 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 +00003151
Bram Moolenaar446cb832008-06-24 21:56:24 +00003152 if !exists("b:netrw_curdir")
3153 " Don't try to change-directory: this can happen, for example, when netrw#ErrorMsg has been called
3154 " and the current window is the NetrwMessage window.
3155" call Decho("(NetrwBrowseChgDir) b:netrw_curdir doesn't exist!")
3156" call Decho("getcwd<".getcwd().">")
3157" call Dredir("ls!")
3158" call Dret("s:NetrwBrowseChgDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003159 return
Bram Moolenaar9964e462007-05-05 17:54:07 +00003160 endif
3161
Bram Moolenaaradc21822011-04-01 18:03:16 +02003162 keepj call s:NetrwOptionSave("s:")
3163 keepj call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00003164 let nbcd_curpos = netrw#NetrwSavePosn()
3165 let s:nbcd_curpos_{bufnr('%')} = nbcd_curpos
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003166 if (has("win32") || has("win95") || has("win64") || has("win16"))
3167 let dirname = substitute(b:netrw_curdir,'\\','/','ge')
3168 else
3169 let dirname= b:netrw_curdir
3170 endif
3171 let newdir = a:newdir
3172 let dolockout = 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00003173
Bram Moolenaar446cb832008-06-24 21:56:24 +00003174 " set up o/s-dependent directory recognition pattern
3175 if has("amiga")
3176 let dirpat= '[\/:]$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00003177 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003178 let dirpat= '[\/]$'
3179 endif
3180" call Decho("dirname<".dirname."> dirpat<".dirpat.">")
3181
3182 if dirname !~ dirpat
3183 " apparently vim is "recognizing" that it is in a directory and
Bram Moolenaaradc21822011-04-01 18:03:16 +02003184 " is removing the trailing "/". Bad idea, so let's put it back.
Bram Moolenaar446cb832008-06-24 21:56:24 +00003185 let dirname= dirname.'/'
3186" call Decho("adjusting dirname<".dirname.">")
3187 endif
3188
3189 if newdir !~ dirpat
3190 " ------------
3191 " edit a file:
3192 " ------------
3193" call Decho('case "handling a file": newdir<'.newdir.'> !~ dirpat<'.dirpat.">")
3194 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") && newdir !~ '^\(/\|\a:\)'
3195 let dirname= s:NetrwTreeDir()
3196 if dirname =~ '/$'
3197 let dirname= dirname.newdir
3198 else
3199 let dirname= s:NetrwTreeDir()."/".newdir
3200 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003201" call Decho("dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003202" call Decho("tree listing")
3203 elseif newdir =~ '^\(/\|\a:\)'
3204 let dirname= newdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00003205 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003206 let dirname= s:ComposePath(dirname,newdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003207 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003208" call Decho("handling a file: dirname<".dirname."> (a:0=".a:0.")")
3209 " this lets NetrwBrowseX avoid the edit
3210 if a:0 < 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00003211" 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 +02003212 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003213 if !exists("s:didsplit")
3214 if g:netrw_browse_split == 1
3215 new
Bram Moolenaar5c736222010-01-06 20:54:52 +01003216 if !&ea
3217 wincmd _
3218 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003219 elseif g:netrw_browse_split == 2
3220 rightb vert new
Bram Moolenaar5c736222010-01-06 20:54:52 +01003221 if !&ea
3222 wincmd |
3223 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003224 elseif g:netrw_browse_split == 3
3225 tabnew
3226 elseif g:netrw_browse_split == 4
3227 if s:NetrwPrevWinOpen(2) == 3
3228" call Dret("s:NetrwBrowseChgDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003229 return
3230 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003231 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003232 " handling a file, didn't split, so remove menu
3233" call Decho("handling a file+didn't split, so remove menu")
3234 call s:NetrwMenu(0)
3235 " optional change to window
3236 if g:netrw_chgwin >= 1
3237 exe "keepjumps ".g:netrw_chgwin."wincmd w"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003238 endif
3239 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003240 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003241
Bram Moolenaar446cb832008-06-24 21:56:24 +00003242 " the point where netrw actually edits the (local) file
3243 " if its local only: LocalBrowseCheck() doesn't edit a file, but NetrwBrowse() will
3244 if a:islocal
3245" call Decho("edit local file: exe e! ".fnameescape(dirname))
3246 exe "e! ".fnameescape(dirname)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003247 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003248" call Decho("remote file: NetrwBrowse will edit it")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003249 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003250 let dolockout= 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01003251
3252 " handle g:Netrw_funcref -- call external-to-netrw functions
3253 " This code will handle g:Netrw_funcref as an individual function reference
3254 " or as a list of function references. It will ignore anything that's not
3255 " a function reference. See :help Funcref for information about function references.
3256 if exists("g:Netrw_funcref")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003257" call Decho("handle optional Funcrefs")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003258 if type(g:Netrw_funcref) == 2
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003259" call Decho("handling a g:Netrw_funcref")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003260 keepj call g:Netrw_funcref()
Bram Moolenaar5c736222010-01-06 20:54:52 +01003261 elseif type(g:Netrw_funcref) == 3
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003262" call Decho("handling a list of g:Netrw_funcrefs")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003263 for Fncref in g:Netrw_funcref
3264 if type(FncRef) == 2
Bram Moolenaaradc21822011-04-01 18:03:16 +02003265 keepj call FncRef()
Bram Moolenaar5c736222010-01-06 20:54:52 +01003266 endif
3267 endfor
3268 endif
3269 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003270 endif
3271
3272 elseif newdir =~ '^/'
3273 " ---------------------------------
3274 " just go to the new directory spec
3275 " ---------------------------------
3276" call Decho('case "just go to new directory spec": newdir<'.newdir.'>')
3277 let dirname= newdir
Bram Moolenaaradc21822011-04-01 18:03:16 +02003278 keepj call s:SetRexDir(a:islocal,dirname)
3279 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003280
3281 elseif newdir == './'
3282 " --------------------------
3283 " refresh the directory list
3284 " --------------------------
3285" call Decho('case "refresh directory listing": newdir == "./"')
Bram Moolenaaradc21822011-04-01 18:03:16 +02003286 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003287
3288 elseif newdir == '../'
3289 " -------------------
3290 " go up one directory
3291 " -------------------
3292" call Decho('case "go up one directory": newdir == "../"')
3293
3294 if w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
3295 " force a refresh
3296" call Decho("clear buffer<".expand("%")."> with :%d")
3297 setlocal noro ma
3298" call Decho("setlocal noro ma")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003299 keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00003300 endif
3301
3302 if has("amiga")
3303 " amiga
3304" call Decho('case "go up one directory": newdir == "../" and amiga')
3305 if a:islocal
3306 let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+$\)','\1','')
3307 let dirname= substitute(dirname,'/$','','')
3308 else
3309 let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+/$\)','\1','')
3310 endif
3311" call Decho("amiga: dirname<".dirname."> (go up one dir)")
3312
3313 else
3314 " unix or cygwin
3315" call Decho('case "go up one directory": newdir == "../" and unix or cygwin')
3316 if a:islocal
3317 let dirname= substitute(dirname,'^\(.*\)/\([^/]\+\)/$','\1','')
3318 if dirname == ""
3319 let dirname= '/'
3320 endif
3321 else
3322 let dirname= substitute(dirname,'^\(\a\+://.\{-}/\{1,2}\)\(.\{-}\)\([^/]\+\)/$','\1\2','')
3323 endif
3324" call Decho("unix: dirname<".dirname."> (go up one dir)")
3325 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003326 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003327
3328 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
3329" call Decho('case liststyle is TREELIST and w:netrw_treedict exists')
3330 " force a refresh (for TREELIST, wait for NetrwTreeDir() to force the refresh)
3331 setlocal noro ma
3332" call Decho("setlocal noro ma")
3333 if !(exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir"))
3334" call Decho("clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003335 keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00003336 endif
3337 let treedir = s:NetrwTreeDir()
3338 let s:treecurpos = nbcd_curpos
3339 let haskey= 0
3340" call Decho("w:netrw_treedict<".string(w:netrw_treedict).">")
3341
3342 " search treedict for tree dir as-is
3343 if has_key(w:netrw_treedict,treedir)
3344" call Decho('....searched for treedir<'.treedir.'> : found it!')
3345 let haskey= 1
3346 else
3347" call Decho('....searched for treedir<'.treedir.'> : not found')
3348 endif
3349
3350 " search treedict for treedir with a / appended
3351 if !haskey && treedir !~ '/$'
3352 if has_key(w:netrw_treedict,treedir."/")
3353 let treedir= treedir."/"
3354" call Decho('....searched.for treedir<'.treedir.'> found it!')
3355 let haskey = 1
3356 else
3357" call Decho('....searched for treedir<'.treedir.'/> : not found')
3358 endif
3359 endif
3360
3361 " search treedict for treedir with any trailing / elided
3362 if !haskey && treedir =~ '/$'
3363 let treedir= substitute(treedir,'/$','','')
3364 if has_key(w:netrw_treedict,treedir)
3365" call Decho('....searched.for treedir<'.treedir.'> found it!')
3366 let haskey = 1
3367 else
3368" call Decho('....searched for treedir<'.treedir.'> : not found')
3369 endif
3370 endif
3371
3372 if haskey
3373 " close tree listing for selected subdirectory
3374" call Decho("closing selected subdirectory<".dirname.">")
3375 call remove(w:netrw_treedict,treedir)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003376" call Decho("removed entry<".treedir."> from treedict")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003377" call Decho("yielding treedict<".string(w:netrw_treedict).">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003378 let dirname= w:netrw_treetop
Bram Moolenaar446cb832008-06-24 21:56:24 +00003379 else
3380 " go down one directory
3381 let dirname= substitute(treedir,'/*$','/','')
3382" call Decho("go down one dir: treedir<".treedir.">")
3383 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003384 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003385 let s:treeforceredraw = 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00003386
3387 else
3388 " go down one directory
3389 let dirname= s:ComposePath(dirname,newdir)
3390" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003391 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003392 endif
3393
Bram Moolenaaradc21822011-04-01 18:03:16 +02003394 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003395 if dolockout
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003396" call Decho("filewritable(dirname<".dirname.">)=".filewritable(dirname))
3397 if filewritable(dirname)
3398" call Decho("doing modification lockout settings: ma nomod noro")
3399 setlocal ma nomod noro
3400 else
3401" call Decho("doing modification lockout settings: ma nomod ro")
3402 setlocal ma nomod ro
3403 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003404" call Decho("setlocal ma nomod noro")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003405 endif
3406
Bram Moolenaar446cb832008-06-24 21:56:24 +00003407" call Dret("s:NetrwBrowseChgDir <".dirname."> : curpos<".string(getpos(".")).">")
3408 return dirname
Bram Moolenaar9964e462007-05-05 17:54:07 +00003409endfun
3410
3411" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01003412" s:NetrwBrowseX: (implements "x") executes a special "viewer" script or program for the {{{2
3413" given filename; typically this means given their extension.
3414" 0=local, 1=remote
Bram Moolenaar446cb832008-06-24 21:56:24 +00003415fun! netrw#NetrwBrowseX(fname,remote)
3416" call Dfunc("NetrwBrowseX(fname<".a:fname."> remote=".a:remote.")")
3417
Bram Moolenaar5c736222010-01-06 20:54:52 +01003418 " special core dump handler
3419 if a:fname =~ '/core\(\.\d\+\)\=$'
3420 if exists("g:Netrw_corehandler")
3421 if type(g:Netrw_corehandler) == 2
3422 " g:Netrw_corehandler is a function reference (see :help Funcref)
3423" call Decho("g:Netrw_corehandler is a funcref")
3424 call g:Netrw_corehandler(a:fname)
3425 elseif type(g:netrw_corehandler) == 3)
3426 " g:Netrw_corehandler is a List of function references (see :help Funcref)
3427" call Decho("g:Netrw_corehandler is a List")
3428 for Fncref in g:Netrw_corehandler
3429 if type(FncRef) == 2
3430 call FncRef(a:fname)
3431 endif
3432 endfor
3433 endif
3434" call Dret("NetrwBrowseX : coredump handler invoked")
3435 return
3436 endif
3437 endif
3438
Bram Moolenaar446cb832008-06-24 21:56:24 +00003439 " set up the filename
3440 " (lower case the extension, make a local copy of a remote file)
3441 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
3442 if has("win32") || has("win95") || has("win64") || has("win16")
3443 let exten= substitute(exten,'^.*$','\L&\E','')
Bram Moolenaar9964e462007-05-05 17:54:07 +00003444 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003445" call Decho("exten<".exten.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003446
3447 " seems kde systems often have gnome-open due to dependencies, even though
3448 " gnome-open's subsidiary display tools are largely absent. Kde systems
3449 " usually have "kdeinit" running, though... (tnx Mikolaj Machowski)
3450 if !exists("s:haskdeinit")
3451 if has("unix")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003452 let s:haskdeinit= system("ps -e") =~ 'kdeinit'
Bram Moolenaar446cb832008-06-24 21:56:24 +00003453 if v:shell_error
3454 let s:haskdeinit = 0
3455 endif
3456 else
3457 let s:haskdeinit= 0
3458 endif
3459" call Decho("setting s:haskdeinit=".s:haskdeinit)
3460 endif
3461
3462 if a:remote == 1
3463 " create a local copy
Bram Moolenaar5c736222010-01-06 20:54:52 +01003464" call Decho("a:remote=".a:remote.": create a local copy of <".a:fname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003465 setlocal bh=delete
Bram Moolenaar5c736222010-01-06 20:54:52 +01003466 call netrw#NetRead(3,a:fname)
3467 " attempt to rename tempfile
3468 let basename= substitute(a:fname,'^\(.*\)/\(.*\)\.\([^.]*\)$','\2','')
3469 let newname= substitute(s:netrw_tmpfile,'^\(.*\)/\(.*\)\.\([^.]*\)$','\1/'.basename.'.\3','')
3470" call Decho("basename<".basename.">")
3471" call Decho("newname <".newname.">")
3472 if rename(s:netrw_tmpfile,newname) == 0
3473 " renaming succeeded
3474 let fname= newname
3475 else
3476 " renaming failed
3477 let fname= s:netrw_tmpfile
3478 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00003479 else
3480 let fname= a:fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003481 " special ~ handler for local
3482 if fname =~ '^\~' && expand("$HOME") != ""
3483" call Decho('invoking special ~ handler')
3484 let fname= substitute(fname,'^\~',expand("$HOME"),'')
3485 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003486 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003487" call Decho("fname<".fname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003488" call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten))
3489
3490 " set up redirection
3491 if &srr =~ "%s"
3492 if (has("win32") || has("win95") || has("win64") || has("win16"))
3493 let redir= substitute(&srr,"%s","nul","")
3494 else
3495 let redir= substitute(&srr,"%s","/dev/null","")
3496 endif
3497 elseif (has("win32") || has("win95") || has("win64") || has("win16"))
3498 let redir= &srr . "nul"
3499 else
3500 let redir= &srr . "/dev/null"
3501 endif
3502" call Decho("redir{".redir."} srr{".&srr."}")
3503
3504 " extract any viewing options. Assumes that they're set apart by quotes.
3505 if exists("g:netrw_browsex_viewer")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003506" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003507 if g:netrw_browsex_viewer =~ '\s'
3508 let viewer = substitute(g:netrw_browsex_viewer,'\s.*$','','')
3509 let viewopt = substitute(g:netrw_browsex_viewer,'^\S\+\s*','','')." "
3510 let oviewer = ''
3511 let cnt = 1
3512 while !executable(viewer) && viewer != oviewer
3513 let viewer = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\1','')
3514 let viewopt = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\3','')." "
3515 let cnt = cnt + 1
3516 let oviewer = viewer
3517" call Decho("!exe: viewer<".viewer."> viewopt<".viewopt.">")
3518 endwhile
3519 else
3520 let viewer = g:netrw_browsex_viewer
3521 let viewopt = ""
3522 endif
3523" call Decho("viewer<".viewer."> viewopt<".viewopt.">")
3524 endif
3525
3526 " execute the file handler
3527 if exists("g:netrw_browsex_viewer") && g:netrw_browsex_viewer == '-'
3528" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
3529 let ret= netrwFileHandlers#Invoke(exten,fname)
3530
3531 elseif exists("g:netrw_browsex_viewer") && executable(viewer)
3532" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003533" call Decho("exe sil !".viewer." ".viewopt.shellescape(fname,1).redir)
3534 exe "sil !".viewer." ".viewopt.shellescape(fname,1).redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003535 let ret= v:shell_error
3536
3537 elseif has("win32") || has("win64")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003538 if executable("start")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003539" call Decho('exe sil !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1))
3540 exe 'sil !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003541 elseif executable("rundll32")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003542" call Decho('exe sil !rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1))
3543 exe 'sil !rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003544 else
3545 call netrw#ErrorMsg(s:WARNING,"rundll32 not on path",74)
3546 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003547 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3548 let ret= v:shell_error
3549
3550 elseif has("unix") && executable("gnome-open") && !s:haskdeinit
Bram Moolenaaradc21822011-04-01 18:03:16 +02003551" call Decho("exe sil !gnome-open ".shellescape(fname,1)." ".redir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003552 exe "sil !gnome-open ".shellescape(fname,1).redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003553 let ret= v:shell_error
3554
3555 elseif has("unix") && executable("kfmclient") && s:haskdeinit
Bram Moolenaaradc21822011-04-01 18:03:16 +02003556" call Decho("exe sil !kfmclient exec ".shellescape(fname,1)." ".redir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003557 exe "sil !kfmclient exec ".shellescape(fname,1)." ".redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003558 let ret= v:shell_error
3559
3560 elseif has("macunix") && executable("open")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003561" call Decho("exe sil !open ".shellescape(fname,1)." ".redir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003562 exe "sil !open ".shellescape(fname,1)." ".redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003563 let ret= v:shell_error
3564
3565 else
3566 " netrwFileHandlers#Invoke() always returns 0
3567 let ret= netrwFileHandlers#Invoke(exten,fname)
3568 endif
3569
3570 " if unsuccessful, attempt netrwFileHandlers#Invoke()
3571 if ret
3572 let ret= netrwFileHandlers#Invoke(exten,fname)
3573 endif
3574
Bram Moolenaarc236c162008-07-13 17:41:49 +00003575 " restoring redraw! after external file handlers
3576 redraw!
Bram Moolenaar446cb832008-06-24 21:56:24 +00003577
3578 " cleanup: remove temporary file,
3579 " delete current buffer if success with handler,
3580 " return to prior buffer (directory listing)
3581 " Feb 12, 2008: had to de-activiate removal of
3582 " temporary file because it wasn't getting seen.
3583" if a:remote == 1 && fname != a:fname
3584" call Decho("deleting temporary file<".fname.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003585" call s:NetrwDelete(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003586" endif
3587
3588 if a:remote == 1
3589 setlocal bh=delete bt=nofile
3590 if g:netrw_use_noswf
3591 setlocal noswf
3592 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003593 exe "sil! keepj norm! \<c-o>"
Bram Moolenaar446cb832008-06-24 21:56:24 +00003594" redraw!
3595 endif
3596
3597" call Dret("NetrwBrowseX")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003598endfun
3599
3600" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01003601" s:NetrwChgPerm: (implements "gp") change file permission {{{2
3602fun! s:NetrwChgPerm(islocal,curdir)
3603" call Dfunc("s:NetrwChgPerm(islocal=".a:islocal." curdir<".a:curdir.">)")
3604 call inputsave()
3605 let newperm= input("Enter new permission: ")
3606 call inputrestore()
3607 let chgperm= substitute(g:netrw_chgperm,'\<FILENAME\>',shellescape(expand("<cfile>")),'')
3608 let chgperm= substitute(chgperm,'\<PERM\>',shellescape(newperm),'')
3609" call Decho("chgperm<".chgperm.">")
3610 call system(chgperm)
3611 if v:shell_error != 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02003612 keepj call netrw#ErrorMsg(1,"changing permission on file<".expand("<cfile>")."> seems to have failed",75)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003613 endif
3614 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02003615 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaar5c736222010-01-06 20:54:52 +01003616 endif
3617" call Dret("s:NetrwChgPerm")
3618endfun
3619
3620" ---------------------------------------------------------------------
3621" s:NetrwClearExplore: clear explore variables (if any) {{{2
3622fun! s:NetrwClearExplore()
3623" call Dfunc("s:NetrwClearExplore()")
3624 2match none
3625 if exists("s:explore_match") |unlet s:explore_match |endif
3626 if exists("s:explore_indx") |unlet s:explore_indx |endif
3627 if exists("s:netrw_explore_prvdir") |unlet s:netrw_explore_prvdir |endif
3628 if exists("s:dirstarstar") |unlet s:dirstarstar |endif
3629 if exists("s:explore_prvdir") |unlet s:explore_prvdir |endif
3630 if exists("w:netrw_explore_indx") |unlet w:netrw_explore_indx |endif
3631 if exists("w:netrw_explore_listlen")|unlet w:netrw_explore_listlen|endif
3632 if exists("w:netrw_explore_list") |unlet w:netrw_explore_list |endif
3633 if exists("w:netrw_explore_bufnr") |unlet w:netrw_explore_bufnr |endif
3634" redraw!
3635 echo " "
3636 echo " "
3637" call Dret("s:NetrwClearExplore")
3638endfun
3639
3640" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00003641" netrw#Explore: launch the local browser in the directory of the current file {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +01003642" indx: == -1: Nexplore
3643" == -2: Pexplore
3644" == +: this is overloaded:
3645" * If Nexplore/Pexplore is in use, then this refers to the
3646" indx'th item in the w:netrw_explore_list[] of items which
3647" matched the */pattern **/pattern *//pattern **//pattern
3648" * If Hexplore or Vexplore, then this will override
3649" g:netrw_winsize to specify the qty of rows or columns the
3650" newly split window should have.
3651" dosplit==0: the window will be split iff the current file has been modified
3652" dosplit==1: the window will be split before running the local browser
3653" style == 0: Explore style == 1: Explore!
3654" == 2: Hexplore style == 3: Hexplore!
3655" == 4: Vexplore style == 5: Vexplore!
3656" == 6: Texplore
Bram Moolenaar9964e462007-05-05 17:54:07 +00003657fun! netrw#Explore(indx,dosplit,style,...)
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003658" 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 +00003659 if !exists("b:netrw_curdir")
3660 let b:netrw_curdir= getcwd()
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003661" call Decho("set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003662 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003663 let curdir = simplify(b:netrw_curdir)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003664 let curfiledir = substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
3665" call Decho("curdir<".curdir."> curfiledir<".curfiledir.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003666
3667 " save registers
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003668 sil! let keepregstar = @*
3669 sil! let keepregplus = @+
3670 sil! let keepregslash= @/
Bram Moolenaar9964e462007-05-05 17:54:07 +00003671
3672 " if dosplit or file has been modified
3673 if a:dosplit || &modified || a:style == 6
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003674" 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 +00003675 call s:SaveWinVars()
Bram Moolenaar251e1912011-06-19 05:09:16 +02003676 let winsz= g:netrw_winsize
Bram Moolenaar5c736222010-01-06 20:54:52 +01003677 if a:indx > 0
Bram Moolenaar251e1912011-06-19 05:09:16 +02003678 let winsz= a:indx
Bram Moolenaar5c736222010-01-06 20:54:52 +01003679 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003680
3681 if a:style == 0 " Explore, Sexplore
3682" call Decho("style=0: Explore or Sexplore")
Bram Moolenaar251e1912011-06-19 05:09:16 +02003683 let winsz= (winsz*winheight(0))/100
3684 exe winsz."wincmd s"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003685
3686 elseif a:style == 1 "Explore!, Sexplore!
3687" call Decho("style=1: Explore! or Sexplore!")
Bram Moolenaar251e1912011-06-19 05:09:16 +02003688 let winsz= (winsz*winheight(0))/100
3689 exe winsz."wincmd v"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003690
3691 elseif a:style == 2 " Hexplore
3692" call Decho("style=2: Hexplore")
Bram Moolenaar251e1912011-06-19 05:09:16 +02003693 let winsz= (winsz*winheight(0))/100
3694 exe "bel ".winsz."wincmd s"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003695
3696 elseif a:style == 3 " Hexplore!
3697" call Decho("style=3: Hexplore!")
Bram Moolenaar251e1912011-06-19 05:09:16 +02003698 let winsz= (winsz*winheight(0))/100
3699 exe "abo ".winsz."wincmd s"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003700
3701 elseif a:style == 4 " Vexplore
3702" call Decho("style=4: Vexplore")
Bram Moolenaar251e1912011-06-19 05:09:16 +02003703 let winsz= (winsz*winheight(0))/100
3704 exe "lefta ".winsz."wincmd v"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003705
3706 elseif a:style == 5 " Vexplore!
3707" call Decho("style=5: Vexplore!")
Bram Moolenaar251e1912011-06-19 05:09:16 +02003708 let winsz= (winsz*winheight(0))/100
3709 exe "rightb ".winsz."wincmd v"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003710
3711 elseif a:style == 6 " Texplore
3712 call s:SaveBufVars()
3713" call Decho("style = 6: Texplore")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003714 exe "tabnew ".fnameescape(curdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003715 call s:RestoreBufVars()
3716 endif
3717 call s:RestoreWinVars()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003718" else " Decho
3719" 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 +00003720 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003721 keepj norm! 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00003722
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003723 if a:0 > 0
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003724" call Decho("case [a:0=".a:0."] > 0: a:1<".a:1.">")
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003725 if a:1 =~ '^\~' && (has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003726" call Decho("case a:1: ~ and unix or cygwin")
3727 let dirname= simplify(substitute(a:1,'\~',expand("$HOME"),''))
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003728" call Decho("using dirname<".dirname."> (case: ~ && unix||cygwin)")
3729 elseif a:1 == '.'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003730" call Decho("case a:1: .")
3731 let dirname= simplify(exists("b:netrw_curdir")? b:netrw_curdir : getcwd())
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003732 if dirname !~ '/$'
3733 let dirname= dirname."/"
3734 endif
3735" call Decho("using dirname<".dirname."> (case: ".(exists("b:netrw_curdir")? "b:netrw_curdir" : "getcwd()").")")
3736 elseif a:1 =~ '\$'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003737" call Decho("case a:1: $")
3738 let dirname= simplify(expand(a:1))
Bram Moolenaar5c736222010-01-06 20:54:52 +01003739" call Decho("using user-specified dirname<".dirname."> with $env-var")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003740 elseif a:1 !~ '^\*/'
3741" call Decho("case a:1: other, not pattern or filepattern")
3742 let dirname= simplify(a:1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003743" call Decho("using user-specified dirname<".dirname.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003744 else
3745" call Decho("case a:1: pattern or filepattern")
3746 let dirname= a:1
Bram Moolenaar9964e462007-05-05 17:54:07 +00003747 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003748 else
3749 " clear explore
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003750" call Decho("case a:0=".a:0.": clearing Explore list")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003751 call s:NetrwClearExplore()
Bram Moolenaar446cb832008-06-24 21:56:24 +00003752" call Dret("netrw#Explore : cleared list")
3753 return
Bram Moolenaar9964e462007-05-05 17:54:07 +00003754 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003755
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003756" call Decho("dirname<".dirname.">")
3757 if dirname =~ '\.\./\=$'
3758 let dirname= simplify(fnamemodify(dirname,':p:h'))
3759 elseif dirname =~ '\.\.' || dirname == '.'
3760 let dirname= simplify(fnamemodify(dirname,':p'))
3761 endif
3762" call Decho("dirname<".dirname."> (after simplify)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003763
Bram Moolenaar446cb832008-06-24 21:56:24 +00003764 if dirname =~ '/\*\*/'
3765 " handle .../**/.../filepat
3766" call Decho("case Explore .../**/.../filepat")
3767 let prefixdir= substitute(dirname,'^\(.\{-}\)\*\*.*$','\1','')
3768 if prefixdir =~ '^/' || (prefixdir =~ '^\a:/' && (has("win32") || has("win95") || has("win64") || has("win16")))
3769 let b:netrw_curdir = prefixdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00003770 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003771 let b:netrw_curdir= getcwd().'/'.prefixdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00003772 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003773 let dirname= substitute(dirname,'^.\{-}\(\*\*/.*\)$','\1','')
3774 let starpat= 4;
3775" call Decho("pwd<".getcwd()."> dirname<".dirname.">")
3776" call Decho("case Explore ../**/../filepat (starpat=".starpat.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003777
Bram Moolenaar446cb832008-06-24 21:56:24 +00003778 elseif dirname =~ '^\*//'
3779 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
3780" call Decho("case Explore *//pattern")
3781 let pattern= substitute(dirname,'^\*//\(.*\)$','\1','')
3782 let starpat= 1
3783" call Decho("Explore *//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
3784 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
3785
3786 elseif dirname =~ '^\*\*//'
3787 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
3788" call Decho("case Explore **//pattern")
3789 let pattern= substitute(dirname,'^\*\*//','','')
3790 let starpat= 2
3791" call Decho("Explore **//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
3792
3793 elseif dirname =~ '^\*/'
3794 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
3795 let starpat= 3
3796" call Decho("case Explore */filepat (starpat=".starpat.")")
3797
3798 elseif dirname=~ '^\*\*/'
3799 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
3800 let starpat= 4
3801" call Decho("case Explore **/filepat (starpat=".starpat.")")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003802
Bram Moolenaar446cb832008-06-24 21:56:24 +00003803 else
3804 let starpat= 0
Bram Moolenaar5c736222010-01-06 20:54:52 +01003805" call Decho("default case: starpat=".starpat)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003806 endif
3807
3808 if starpat == 0 && a:indx >= 0
3809 " [Explore Hexplore Vexplore Sexplore] [dirname]
Bram Moolenaar5c736222010-01-06 20:54:52 +01003810" call Decho("case starpat==0 && a:indx=".a:indx.": dirname<".dirname."> Explore Hexplore Vexplore Sexplore")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003811 if dirname == ""
Bram Moolenaar5c736222010-01-06 20:54:52 +01003812 let dirname= curfiledir
3813" call Decho("empty dirname, using current file's directory<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003814 endif
3815 if dirname =~ '^scp:' || dirname =~ '^ftp:'
3816" call Decho("calling NetrwBrowse(0,dirname<".dirname.">)")
3817 call s:NetrwBrowse(0,dirname)
3818 else
3819 if dirname == ""|let dirname= getcwd()|endif
3820" call Decho("calling LocalBrowseCheck(dirname<".dirname.">)")
3821 call netrw#LocalBrowseCheck(dirname)
3822 endif
3823
Bram Moolenaar5c736222010-01-06 20:54:52 +01003824" call Decho("curdir<".curdir.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003825 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003826 keepj call search('\<'.substitute(curdir,'^.*[/\\]','','e').'\>','cW')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003827 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003828 keepj call search('\<'.substitute(curdir,'^.*/','','e').'\>','cW')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003829 endif
3830
3831 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
3832 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
3833 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
3834 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
3835 elseif a:indx <= 0
3836 " Nexplore, Pexplore, Explore: handle starpat
Bram Moolenaar5c736222010-01-06 20:54:52 +01003837" 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 +00003838 if !mapcheck("<s-up>","n") && !mapcheck("<s-down>","n") && exists("b:netrw_curdir")
3839" call Decho("set up <s-up> and <s-down> maps")
3840 let s:didstarstar= 1
3841 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
3842 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
3843 endif
3844
3845 if has("path_extra")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003846" call Decho("starpat=".starpat.": has +path_extra")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003847 if !exists("w:netrw_explore_indx")
3848 let w:netrw_explore_indx= 0
3849 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003850
Bram Moolenaar9964e462007-05-05 17:54:07 +00003851 let indx = a:indx
Bram Moolenaar446cb832008-06-24 21:56:24 +00003852" call Decho("starpat=".starpat.": set indx= [a:indx=".indx."]")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003853
Bram Moolenaar9964e462007-05-05 17:54:07 +00003854 if indx == -1
Bram Moolenaar446cb832008-06-24 21:56:24 +00003855 " Nexplore
3856" call Decho("case Nexplore with starpat=".starpat.": (indx=".indx.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003857 if !exists("w:netrw_explore_list") " sanity check
Bram Moolenaaradc21822011-04-01 18:03:16 +02003858 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 +02003859 sil! let @* = keepregstar
3860 sil! let @+ = keepregstar
3861 sil! let @/ = keepregslash
Bram Moolenaar9964e462007-05-05 17:54:07 +00003862" call Dret("netrw#Explore")
3863 return
3864 endif
3865 let indx= w:netrw_explore_indx
3866 if indx < 0 | let indx= 0 | endif
3867 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
3868 let curfile= w:netrw_explore_list[indx]
3869" call Decho("indx=".indx." curfile<".curfile.">")
3870 while indx < w:netrw_explore_listlen && curfile == w:netrw_explore_list[indx]
3871 let indx= indx + 1
3872" call Decho("indx=".indx." (Nexplore while loop)")
3873 endwhile
3874 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
3875" call Decho("Nexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
3876
3877 elseif indx == -2
Bram Moolenaar446cb832008-06-24 21:56:24 +00003878 " Pexplore
3879" call Decho("case Pexplore with starpat=".starpat.": (indx=".indx.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003880 if !exists("w:netrw_explore_list") " sanity check
Bram Moolenaaradc21822011-04-01 18:03:16 +02003881 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 +02003882 sil! let @* = keepregstar
3883 sil! let @+ = keepregstar
3884 sil! let @/ = keepregslash
Bram Moolenaar9964e462007-05-05 17:54:07 +00003885" call Dret("netrw#Explore")
3886 return
3887 endif
3888 let indx= w:netrw_explore_indx
3889 if indx < 0 | let indx= 0 | endif
3890 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
3891 let curfile= w:netrw_explore_list[indx]
3892" call Decho("indx=".indx." curfile<".curfile.">")
3893 while indx >= 0 && curfile == w:netrw_explore_list[indx]
3894 let indx= indx - 1
3895" call Decho("indx=".indx." (Pexplore while loop)")
3896 endwhile
3897 if indx < 0 | let indx= 0 | endif
3898" call Decho("Pexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
3899
3900 else
3901 " Explore -- initialize
3902 " build list of files to Explore with Nexplore/Pexplore
Bram Moolenaar446cb832008-06-24 21:56:24 +00003903" call Decho("starpat=".starpat.": case Explore: initialize (indx=".indx.")")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003904 keepj call s:NetrwClearExplore()
Bram Moolenaar9964e462007-05-05 17:54:07 +00003905 let w:netrw_explore_indx= 0
3906 if !exists("b:netrw_curdir")
3907 let b:netrw_curdir= getcwd()
3908 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003909" call Decho("starpat=".starpat.": b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003910
Bram Moolenaar446cb832008-06-24 21:56:24 +00003911 " switch on starpat to build the w:netrw_explore_list of files
3912 if starpat == 1
3913 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
3914" call Decho("starpat=".starpat.": build *//pattern list")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003915" call Decho("pattern<".pattern.">")
3916 try
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003917 exe "keepj noautocmd vimgrep /".pattern."/gj ".fnameescape(b:netrw_curdir)."/*"
Bram Moolenaar5c736222010-01-06 20:54:52 +01003918 catch /^Vim\%((\a\+)\)\=:E480/
3919 call netrw#ErrorMsg(s:WARNING,"no match with pattern<".pattern.">",76)
3920" call Dret("netrw#Explore : unable to find pattern<".pattern.">")
3921 return
3922 endtry
3923 let w:netrw_explore_list = s:NetrwExploreListUniq(map(getqflist(),'bufname(v:val.bufnr)'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003924 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
3925
3926 elseif starpat == 2
3927 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
3928" call Decho("starpat=".starpat.": build **//pattern list")
3929 try
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003930 exe "sil keepj noautocmd vimgrep /".pattern."/gj "."**/*"
Bram Moolenaar446cb832008-06-24 21:56:24 +00003931 catch /^Vim\%((\a\+)\)\=:E480/
Bram Moolenaar5c736222010-01-06 20:54:52 +01003932 call netrw#ErrorMsg(s:WARNING,'no files matched pattern<'.pattern.'>',45)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003933 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003934 sil! let @* = keepregstar
3935 sil! let @+ = keepregstar
3936 sil! let @/ = keepregslash
Bram Moolenaar446cb832008-06-24 21:56:24 +00003937" call Dret("netrw#Explore : no files matched pattern")
3938 return
3939 endtry
3940 let s:netrw_curdir = b:netrw_curdir
3941 let w:netrw_explore_list = getqflist()
Bram Moolenaar5c736222010-01-06 20:54:52 +01003942 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 +00003943
3944 elseif starpat == 3
3945 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
3946" call Decho("starpat=".starpat.": build */filepat list")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003947 let filepat= substitute(dirname,'^\*/','','')
3948 let filepat= substitute(filepat,'^[%#<]','\\&','')
3949" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
3950" call Decho("filepat<".filepat.">")
3951 let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".filepat),'\n'))
3952 if &hls | let keepregslash= s:ExplorePatHls(filepat) | endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003953
3954 elseif starpat == 4
3955 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
3956" call Decho("starpat=".starpat.": build **/filepat list")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003957 let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".dirname),'\n'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003958 if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif
3959 endif " switch on starpat to build w:netrw_explore_list
Bram Moolenaar9964e462007-05-05 17:54:07 +00003960
3961 let w:netrw_explore_listlen = len(w:netrw_explore_list)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003962" call Decho("w:netrw_explore_list<".string(w:netrw_explore_list).">")
3963" call Decho("w:netrw_explore_listlen=".w:netrw_explore_listlen)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003964
3965 if w:netrw_explore_listlen == 0 || (w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/')
Bram Moolenaaradc21822011-04-01 18:03:16 +02003966 keepj call netrw#ErrorMsg(s:WARNING,"no files matched",42)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003967 sil! let @* = keepregstar
3968 sil! let @+ = keepregstar
3969 sil! let @/ = keepregslash
Bram Moolenaar9964e462007-05-05 17:54:07 +00003970" call Dret("netrw#Explore : no files matched")
3971 return
3972 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003973 endif " if indx ... endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003974
3975 " NetrwStatusLine support - for exploring support
3976 let w:netrw_explore_indx= indx
Bram Moolenaar5c736222010-01-06 20:54:52 +01003977" call Decho("w:netrw_explore_list<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003978
3979 " wrap the indx around, but issue a note
3980 if indx >= w:netrw_explore_listlen || indx < 0
3981" call Decho("wrap indx (indx=".indx." listlen=".w:netrw_explore_listlen.")")
3982 let indx = (indx < 0)? ( w:netrw_explore_listlen - 1 ) : 0
3983 let w:netrw_explore_indx= indx
Bram Moolenaaradc21822011-04-01 18:03:16 +02003984 keepj call netrw#ErrorMsg(s:NOTE,"no more files match Explore pattern",43)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003985 endif
3986
3987 exe "let dirfile= w:netrw_explore_list[".indx."]"
3988" call Decho("dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">")
3989 let newdir= substitute(dirfile,'/[^/]*$','','e')
3990" call Decho("newdir<".newdir.">")
3991
3992" call Decho("calling LocalBrowseCheck(newdir<".newdir.">)")
3993 call netrw#LocalBrowseCheck(newdir)
3994 if !exists("w:netrw_liststyle")
3995 let w:netrw_liststyle= g:netrw_liststyle
3996 endif
3997 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:LONGLIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003998 keepj call search('^'.substitute(dirfile,"^.*/","","").'\>',"W")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003999 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004000 keepj call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004001 endif
4002 let w:netrw_explore_mtchcnt = indx + 1
4003 let w:netrw_explore_bufnr = bufnr("%")
4004 let w:netrw_explore_line = line(".")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004005 keepj call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}')
Bram Moolenaar9964e462007-05-05 17:54:07 +00004006" call Decho("explore: mtchcnt=".w:netrw_explore_mtchcnt." bufnr=".w:netrw_explore_bufnr." line#".w:netrw_explore_line)
4007
4008 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00004009" call Decho("your vim does not have +path_extra")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004010 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004011 keepj call netrw#ErrorMsg(s:WARNING,"your vim needs the +path_extra feature for Exploring with **!",44)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004012 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004013 sil! let @* = keepregstar
4014 sil! let @+ = keepregstar
4015 sil! let @/ = keepregslash
Bram Moolenaar9964e462007-05-05 17:54:07 +00004016" call Dret("netrw#Explore : missing +path_extra")
4017 return
4018 endif
4019
4020 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01004021" call Decho("default case: Explore newdir<".dirname.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004022 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && dirname =~ '/'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004023 sil! unlet w:netrw_treedict
4024 sil! unlet w:netrw_treetop
Bram Moolenaar9964e462007-05-05 17:54:07 +00004025 endif
4026 let newdir= dirname
4027 if !exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004028 keepj call netrw#LocalBrowseCheck(getcwd())
Bram Moolenaar9964e462007-05-05 17:54:07 +00004029 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02004030 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,newdir))
Bram Moolenaar9964e462007-05-05 17:54:07 +00004031 endif
4032 endif
4033
Bram Moolenaar446cb832008-06-24 21:56:24 +00004034 " visual display of **/ **// */ Exploration files
Bram Moolenaar5c736222010-01-06 20:54:52 +01004035" call Decho("w:netrw_explore_indx=".(exists("w:netrw_explore_indx")? w:netrw_explore_indx : "doesn't exist"))
4036" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "n/a").">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004037 if exists("w:netrw_explore_indx") && exists("b:netrw_curdir")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004038" call Decho("s:explore_prvdir<".(exists("s:explore_prvdir")? s:explore_prvdir : "-doesn't exist-"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004039 if !exists("s:explore_prvdir") || s:explore_prvdir != b:netrw_curdir
4040 " only update match list if current directory isn't the same as before
Bram Moolenaar5c736222010-01-06 20:54:52 +01004041" call Decho("only update match list if current directory not the same as before")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004042 let s:explore_prvdir = b:netrw_curdir
4043 let s:explore_match = ""
Bram Moolenaar5c736222010-01-06 20:54:52 +01004044 let dirlen = s:Strlen(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004045 if b:netrw_curdir !~ '/$'
4046 let dirlen= dirlen + 1
4047 endif
4048 let prvfname= ""
4049 for fname in w:netrw_explore_list
4050" call Decho("fname<".fname.">")
4051 if fname =~ '^'.b:netrw_curdir
4052 if s:explore_match == ""
Bram Moolenaar5c736222010-01-06 20:54:52 +01004053 let s:explore_match= '\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004054 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01004055 let s:explore_match= s:explore_match.'\|\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004056 endif
4057 elseif fname !~ '^/' && fname != prvfname
4058 if s:explore_match == ""
Bram Moolenaar5c736222010-01-06 20:54:52 +01004059 let s:explore_match= '\<'.escape(fname,g:netrw_markfileesc).'\>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004060 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01004061 let s:explore_match= s:explore_match.'\|\<'.escape(fname,g:netrw_markfileesc).'\>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004062 endif
4063 endif
4064 let prvfname= fname
4065 endfor
4066" call Decho("explore_match<".s:explore_match.">")
4067 exe "2match netrwMarkFile /".s:explore_match."/"
4068 endif
4069 echo "<s-up>==Pexplore <s-down>==Nexplore"
4070 else
4071 2match none
4072 if exists("s:explore_match") | unlet s:explore_match | endif
4073 if exists("s:explore_prvdir") | unlet s:explore_prvdir | endif
4074 echo " "
4075" call Decho("cleared explore match list")
4076 endif
4077
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004078 sil! let @* = keepregstar
4079 sil! let @+ = keepregstar
4080 sil! let @/ = keepregslash
Bram Moolenaar9964e462007-05-05 17:54:07 +00004081" call Dret("netrw#Explore : @/<".@/.">")
4082endfun
4083
4084" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01004085" s:NetrwExploreListUniq: {{{2
4086fun! s:NetrwExploreListUniq(explist)
4087" call Dfunc("s:NetrwExploreListUniq(explist)")
4088
4089 " this assumes that the list is already sorted
4090 let newexplist= []
4091 for member in a:explist
4092 if !exists("uniqmember") || member != uniqmember
4093 let uniqmember = member
4094 let newexplist = newexplist + [ member ]
4095 endif
4096 endfor
4097
4098" call Dret("s:NetrwExploreListUniq")
4099 return newexplist
4100endfun
4101
4102" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02004103" s:NetrwForceChgDir: (gd support) Force treatment as a directory {{{2
4104fun! s:NetrwForceChgDir(islocal,newdir)
4105" call Dfunc("s:NetrwForceChgDir(islocal=".a:islocal." newdir<".a:newdir.">)")
4106 if a:newdir !~ '/$'
4107 " ok, looks like force is needed to get directory-style treatment
4108 if a:newdir =~ '@$'
4109 let newdir= substitute(a:newdir,'@$','/','')
4110 elseif a:newdir =~ '[*=|\\]$'
4111 let newdir= substitute(a:newdir,'.$','/','')
4112 else
4113 let newdir= a:newdir.'/'
4114 endif
4115" call Decho("adjusting newdir<".newdir."> due to gd")
4116 else
4117 " should already be getting treatment as a directory
4118 let newdir= a:newdir
4119 endif
4120 call s:NetrwBrowseChgDir(a:islocal,newdir)
4121 call s:NetrwBrowse(a:islocal,newdir)
4122" call Dret("s:NetrwForceChgDir")
4123endfun
4124
4125" ---------------------------------------------------------------------
4126" s:NetrwForceFile: (gf support) Force treatment as a file {{{2
4127fun! s:NetrwForceFile(islocal,newfile)
4128" " call Dfunc("s:NetrwForceFile(islocal=".a:islocal." newdir<".a:newdir.">)")
4129 if a:newfile =~ '[/@*=|\\]$'
4130 let newfile= substitute(a:newfile,'.$','','')
4131 else
4132 let newfile= a:newfile
4133 endif
4134 call s:NetrwBrowseChgDir(a:islocal,newfile)
4135" call Dret("s:NetrwForceFile")
4136endfun
4137
4138" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004139" s:NetrwHide: this function is invoked by the "a" map for browsing {{{2
4140" and switches the hiding mode. The actual hiding is done by
4141" s:NetrwListHide().
4142" g:netrw_hide= 0: show all
4143" 1: show not-hidden files
4144" 2: show hidden files only
4145fun! s:NetrwHide(islocal)
4146" call Dfunc("NetrwHide(islocal=".a:islocal.") g:netrw_hide=".g:netrw_hide)
4147 let svpos= netrw#NetrwSavePosn()
4148
4149 if exists("s:netrwmarkfilelist_{bufnr('%')}")
4150" call Decho(((g:netrw_hide == 1)? "unhide" : "hide")." files in markfilelist<".string(s:netrwmarkfilelist_{bufnr("%")}).">")
4151" call Decho("g:netrw_list_hide<".g:netrw_list_hide.">")
4152
4153 " hide the files in the markfile list
4154 for fname in s:netrwmarkfilelist_{bufnr("%")}
4155" call Decho("match(g:netrw_list_hide<".g:netrw_list_hide.'> fname<\<'.fname.'\>>)='.match(g:netrw_list_hide,'\<'.fname.'\>')." isk=".&isk)
4156 if match(g:netrw_list_hide,'\<'.fname.'\>') != -1
4157 " remove fname from hiding list
4158 let g:netrw_list_hide= substitute(g:netrw_list_hide,'..\<'.escape(fname,g:netrw_fname_escape).'\>..','','')
4159 let g:netrw_list_hide= substitute(g:netrw_list_hide,',,',',','g')
4160 let g:netrw_list_hide= substitute(g:netrw_list_hide,'^,\|,$','','')
4161" call Decho("unhide: g:netrw_list_hide<".g:netrw_list_hide.">")
4162 else
4163 " append fname to hiding list
4164 if exists("g:netrw_list_hide") && g:netrw_list_hide != ""
4165 let g:netrw_list_hide= g:netrw_list_hide.',\<'.escape(fname,g:netrw_fname_escape).'\>'
4166 else
4167 let g:netrw_list_hide= '\<'.escape(fname,g:netrw_fname_escape).'\>'
4168 endif
4169" call Decho("hide: g:netrw_list_hide<".g:netrw_list_hide.">")
4170 endif
4171 endfor
Bram Moolenaaradc21822011-04-01 18:03:16 +02004172 keepj call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004173 let g:netrw_hide= 1
4174
4175 else
4176
4177 " switch between show-all/show-not-hidden/show-hidden
4178 let g:netrw_hide=(g:netrw_hide+1)%3
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004179 exe "keepj norm! 0"
Bram Moolenaar446cb832008-06-24 21:56:24 +00004180 if g:netrw_hide && g:netrw_list_hide == ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02004181 keepj call netrw#ErrorMsg(s:WARNING,"your hiding list is empty!",49)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004182" call Dret("NetrwHide")
4183 return
4184 endif
4185 endif
4186
Bram Moolenaaradc21822011-04-01 18:03:16 +02004187 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4188 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004189" call Dret("NetrwHide")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004190endfun
4191
4192" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004193" s:NetrwHidden: invoked by "gh" {{{2
4194fun! s:NetrwHidden(islocal)
4195" call Dfunc("s:NetrwHidden()")
4196 " save current position
4197 let svpos= netrw#NetrwSavePosn()
4198
4199 if g:netrw_list_hide =~ '\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+'
4200 " remove pattern from hiding list
4201 let g:netrw_list_hide= substitute(g:netrw_list_hide,'\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+','','')
Bram Moolenaar5c736222010-01-06 20:54:52 +01004202 elseif s:Strlen(g:netrw_list_hide) >= 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00004203 let g:netrw_list_hide= g:netrw_list_hide . ',\(^\|\s\s\)\zs\.\S\+'
4204 else
4205 let g:netrw_list_hide= '\(^\|\s\s\)\zs\.\S\+'
4206 endif
4207
4208 " refresh screen and return to saved position
Bram Moolenaaradc21822011-04-01 18:03:16 +02004209 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4210 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004211" call Dret("s:NetrwHidden")
4212endfun
4213
4214" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01004215" s:NetrwHome: this function determines a "home" for saving bookmarks and history {{{2
4216fun! s:NetrwHome()
4217 if exists("g:netrw_home")
4218 let home= g:netrw_home
4219 else
4220 " go to vim plugin home
4221 for home in split(&rtp,',') + ['']
4222 if isdirectory(home) && filewritable(home) | break | endif
4223 let basehome= substitute(home,'[/\\]\.vim$','','')
4224 if isdirectory(basehome) && filewritable(basehome)
4225 let home= basehome."/.vim"
4226 break
4227 endif
4228 endfor
4229 if home == ""
4230 " just pick the first directory
4231 let home= substitute(&rtp,',.*$','','')
4232 endif
4233 if (has("win32") || has("win95") || has("win64") || has("win16"))
4234 let home= substitute(home,'/','\\','g')
4235 endif
4236 endif
4237 " insure that the home directory exists
4238 if !isdirectory(home)
4239 if exists("g:netrw_mkdir")
4240 call system(g:netrw_mkdir." ".shellescape(home))
4241 else
4242 call mkdir(home)
4243 endif
4244 endif
4245 let g:netrw_home= home
4246 return home
4247endfun
4248
4249" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004250" s:NetrwLeftmouse: handles the <leftmouse> when in a netrw browsing window {{{2
4251fun! s:NetrwLeftmouse(islocal)
4252" call Dfunc("s:NetrwLeftmouse(islocal=".a:islocal.")")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004253
4254 " check if the status bar was clicked on instead of a file/directory name
Bram Moolenaaradc21822011-04-01 18:03:16 +02004255 while getchar(0) != 0
4256 "clear the input stream
4257 endwhile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004258 call feedkeys("\<LeftMouse>")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004259 let c = getchar()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004260 let mouse_lnum = v:mouse_lnum
4261 let wlastline = line('w$')
4262 let lastline = line('$')
4263" call Decho("v:mouse_lnum=".mouse_lnum." line(w$)=".wlastline." line($)=".lastline." v:mouse_win=".v:mouse_win." winnr#".winnr())
4264" call Decho("v:mouse_col =".v:mouse_col." col=".col(".")." wincol =".wincol()." winwidth =".winwidth(0))
4265 if mouse_lnum >= wlastline + 1 || v:mouse_win != winnr()
4266 " appears to be a status bar leftmouse click
4267" call Dret("s:NetrwLeftmouse : detected a status bar leftmouse click")
4268 return
4269 endif
4270 if v:mouse_col != col('.')
4271" call Dret("s:NetrwLeftmouse : detected a vertical separator bar leftmouse click")
4272 return
4273 endif
4274
Bram Moolenaar446cb832008-06-24 21:56:24 +00004275 if a:islocal
4276 if exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004277 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004278 endif
4279 else
4280 if exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004281 keepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004282 endif
4283 endif
4284" call Dret("s:NetrwLeftmouse")
4285endfun
4286
4287" ---------------------------------------------------------------------
4288" s:NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
4289" separated patterns given in g:netrw_list_hide
4290fun! s:NetrwListHide()
Bram Moolenaaradc21822011-04-01 18:03:16 +02004291" call Dfunc("NetrwListHide() g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004292
4293 " find a character not in the "hide" string to use as a separator for :g and :v commands
4294 " How-it-works: take the hiding command, convert it into a range. Duplicate
4295 " characters don't matter. Remove all such characters from the '/~...90'
4296 " string. Use the first character left as a separator character.
4297 let listhide= g:netrw_list_hide
4298 let sep = strpart(substitute('/~@#$%^&*{};:,<.>?|1234567890','['.escape(listhide,'-]^\').']','','ge'),1,1)
4299" call Decho("sep=".sep)
4300
4301 while listhide != ""
4302 if listhide =~ ','
4303 let hide = substitute(listhide,',.*$','','e')
4304 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
4305 else
4306 let hide = listhide
4307 let listhide = ""
4308 endif
4309
4310 " Prune the list by hiding any files which match
4311 if g:netrw_hide == 1
4312" call Decho("hiding<".hide."> listhide<".listhide.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004313 exe 'sil keepj '.w:netrw_bannercnt.',$g'.sep.hide.sep.'d'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004314 elseif g:netrw_hide == 2
4315" call Decho("showing<".hide."> listhide<".listhide.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004316 exe 'sil keepj '.w:netrw_bannercnt.',$g'.sep.hide.sep.'s@^@ /-KEEP-/ @'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004317 endif
4318 endwhile
4319 if g:netrw_hide == 2
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004320 exe 'sil keepj '.w:netrw_bannercnt.',$v@^ /-KEEP-/ @d'
4321 exe 'sil keepj '.w:netrw_bannercnt.',$s@^\%( /-KEEP-/ \)\+@@e'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004322 endif
4323
Bram Moolenaaradc21822011-04-01 18:03:16 +02004324 " remove any blank lines that have somehow remained.
4325 " This seems to happen under Windows.
4326 exe 'sil! keepj 1,$g@^\s*$@d'
4327
Bram Moolenaar446cb832008-06-24 21:56:24 +00004328" call Dret("NetrwListHide")
4329endfun
4330
4331" ---------------------------------------------------------------------
4332" NetrwHideEdit: allows user to edit the file/directory hiding list
4333fun! s:NetrwHideEdit(islocal)
4334" call Dfunc("NetrwHideEdit(islocal=".a:islocal.")")
4335
4336 " save current cursor position
4337 let svpos= netrw#NetrwSavePosn()
4338
4339 " get new hiding list from user
4340 call inputsave()
4341 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
4342 call inputrestore()
4343 let g:netrw_list_hide= newhide
4344" call Decho("new g:netrw_list_hide<".g:netrw_list_hide.">")
4345
4346 " refresh the listing
Bram Moolenaaradc21822011-04-01 18:03:16 +02004347 sil keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,"./"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004348
4349 " restore cursor position
4350 call netrw#NetrwRestorePosn(svpos)
4351
4352" call Dret("NetrwHideEdit")
4353endfun
4354
4355" ---------------------------------------------------------------------
4356" NetSortSequence: allows user to edit the sorting sequence
4357fun! s:NetSortSequence(islocal)
4358" call Dfunc("NetSortSequence(islocal=".a:islocal.")")
4359
4360 let svpos= netrw#NetrwSavePosn()
4361 call inputsave()
4362 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
4363 call inputrestore()
4364
4365 " refresh the listing
4366 let g:netrw_sort_sequence= newsortseq
Bram Moolenaaradc21822011-04-01 18:03:16 +02004367 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4368 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004369
4370" call Dret("NetSortSequence")
4371endfun
4372
4373" ---------------------------------------------------------------------
4374" s:NetrwMakeDir: this function makes a directory (both local and remote) {{{2
4375fun! s:NetrwMakeDir(usrhost)
4376" call Dfunc("NetrwMakeDir(usrhost<".a:usrhost.">)")
4377
4378 " get name of new directory from user. A bare <CR> will skip.
4379 " if its currently a directory, also request will be skipped, but with
4380 " a message.
4381 call inputsave()
4382 let newdirname= input("Please give directory name: ")
4383 call inputrestore()
4384" call Decho("newdirname<".newdirname.">")
4385
4386 if newdirname == ""
4387" call Dret("NetrwMakeDir : user aborted with bare <cr>")
4388 return
4389 endif
4390
4391 if a:usrhost == ""
4392" call Decho("local mkdir")
4393
4394 " Local mkdir:
4395 " sanity checks
4396 let fullnewdir= b:netrw_curdir.'/'.newdirname
4397" call Decho("fullnewdir<".fullnewdir.">")
4398 if isdirectory(fullnewdir)
4399 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004400 keepj call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a directory!",24)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004401 endif
4402" call Dret("NetrwMakeDir : directory<".newdirname."> exists previously")
4403 return
4404 endif
4405 if s:FileReadable(fullnewdir)
4406 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004407 keepj call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a file!",25)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004408 endif
4409" call Dret("NetrwMakeDir : file<".newdirname."> exists previously")
4410 return
4411 endif
4412
4413 " requested new local directory is neither a pre-existing file or
4414 " directory, so make it!
4415 if exists("*mkdir")
4416 call mkdir(fullnewdir,"p")
4417 else
4418 let netrw_origdir= s:NetrwGetcwd(1)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004419 exe 'keepj lcd '.fnameescape(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004420" call Decho("netrw_origdir<".netrw_origdir.">: lcd b:netrw_curdir<".fnameescape(b:netrw_curdir).">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004421" call Decho("exe sil! !".g:netrw_local_mkdir.' '.shellescape(newdirname,1))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004422 exe "sil! !".g:netrw_local_mkdir.' '.shellescape(newdirname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004423 if !g:netrw_keepdir
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004424 exe 'keepj lcd '.fnameescape(netrw_origdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004425" call Decho("netrw_keepdir=".g:netrw_keepdir.": keepjumps lcd ".fnameescape(netrw_origdir)." getcwd<".getcwd().">")
4426 endif
4427 endif
4428
4429 if v:shell_error == 0
4430 " refresh listing
4431" call Decho("refresh listing")
4432 let svpos= netrw#NetrwSavePosn()
4433 call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
4434 call netrw#NetrwRestorePosn(svpos)
4435 elseif !exists("g:netrw_quiet")
4436 call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",26)
4437 endif
4438" redraw!
4439
4440 elseif !exists("b:netrw_method") || b:netrw_method == 4
4441 " Remote mkdir:
4442" call Decho("remote mkdir")
4443 let mkdircmd = s:MakeSshCmd(g:netrw_mkdir_cmd)
4444 let newdirname= substitute(b:netrw_curdir,'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname
Bram Moolenaaradc21822011-04-01 18:03:16 +02004445" call Decho("exe sil! !".mkdircmd." ".shellescape(newdirname,1))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004446 exe "sil! !".mkdircmd." ".shellescape(newdirname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004447 if v:shell_error == 0
4448 " refresh listing
4449 let svpos= netrw#NetrwSavePosn()
Bram Moolenaaradc21822011-04-01 18:03:16 +02004450 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
4451 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004452 elseif !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004453 keepj call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",27)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004454 endif
4455" redraw!
4456
4457 elseif b:netrw_method == 2
4458 " COMBAK -- future work
Bram Moolenaaradc21822011-04-01 18:03:16 +02004459 keepj call netrw#ErrorMsg(s:ERROR,"making directories via ftp not currently supported",68)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004460 elseif b:netrw_method == 3
4461 " COMBAK -- future work
Bram Moolenaaradc21822011-04-01 18:03:16 +02004462 keepj call netrw#ErrorMsg(s:ERROR,"making directories via ftp not currently supported",68)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004463 endif
4464
4465" call Dret("NetrwMakeDir")
4466endfun
4467
4468" ---------------------------------------------------------------------
4469" s:NetrwMarkFile: (invoked by mf) This function is used to both {{{2
4470" mark and unmark files. If a markfile list exists,
4471" then the rename and delete functions will use it instead
4472" of whatever may happen to be under the cursor at that
4473" moment. When the mouse and gui are available,
4474" shift-leftmouse may also be used to mark files.
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004475"
4476" Creates two lists
4477" s:netrwmarkfilelist -- holds complete paths to all marked files
4478" s:netrwmarkfilelist_# -- holds list of marked files in current-buffer's directory (#==bufnr())
4479"
4480" Creates a marked file match string
4481" s:netrwmarfilemtch_# -- used with 2match to display marked files
4482"
Bram Moolenaared39e1d2008-08-09 17:55:22 +00004483" Creates a buffer version of islocal
4484" b:netrw_islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00004485fun! s:NetrwMarkFile(islocal,fname)
4486" call Dfunc("s:NetrwMarkFile(islocal=".a:islocal." fname<".a:fname.">)")
4487 let curbufnr= bufnr("%")
4488 let curdir = b:netrw_curdir
Bram Moolenaar5c736222010-01-06 20:54:52 +01004489 let trailer = '[@=|\/\*]\=\>'
Bram Moolenaaradc21822011-04-01 18:03:16 +02004490
Bram Moolenaar446cb832008-06-24 21:56:24 +00004491 if exists("s:netrwmarkfilelist_{curbufnr}")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004492 " markfile list pre-exists
Bram Moolenaar446cb832008-06-24 21:56:24 +00004493" call Decho("starting s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
4494" call Decho("starting s:netrwmarkfilemtch_{curbufnr}<".s:netrwmarkfilemtch_{curbufnr}.">")
Bram Moolenaared39e1d2008-08-09 17:55:22 +00004495 let b:netrw_islocal= a:islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00004496
4497 if index(s:netrwmarkfilelist_{curbufnr},a:fname) == -1
Bram Moolenaared39e1d2008-08-09 17:55:22 +00004498 " append filename to buffer's markfilelist
Bram Moolenaar446cb832008-06-24 21:56:24 +00004499" call Decho("append filename<".a:fname."> to local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
4500 call add(s:netrwmarkfilelist_{curbufnr},a:fname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004501 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(a:fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00004502
4503 else
Bram Moolenaared39e1d2008-08-09 17:55:22 +00004504 " remove filename from buffer's markfilelist
Bram Moolenaar446cb832008-06-24 21:56:24 +00004505" call Decho("remove filename<".a:fname."> from local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
4506 call filter(s:netrwmarkfilelist_{curbufnr},'v:val != a:fname')
4507 if s:netrwmarkfilelist_{curbufnr} == []
4508 " local markfilelist is empty; remove it entirely
Bram Moolenaar5c736222010-01-06 20:54:52 +01004509" call Decho("markfile list now empty")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004510 call s:NetrwUnmarkList(curbufnr,curdir)
4511 else
4512 " rebuild match list to display markings correctly
4513" call Decho("rebuild s:netrwmarkfilemtch_".curbufnr)
4514 let s:netrwmarkfilemtch_{curbufnr}= ""
4515 let first = 1
4516 for fname in s:netrwmarkfilelist_{curbufnr}
4517 if first
Bram Moolenaar5c736222010-01-06 20:54:52 +01004518 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00004519 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01004520 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00004521 endif
4522 let first= 0
4523 endfor
4524" call Decho("ending s:netrwmarkfilelist_"curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
4525" call Decho("ending s:netrwmarkfilemtch_"curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">")
4526 endif
4527 endif
4528
4529 else
4530 " initialize new markfilelist
4531
4532" call Decho("add fname<".a:fname."> to new markfilelist_".curbufnr)
4533 let s:netrwmarkfilelist_{curbufnr}= []
4534 call add(s:netrwmarkfilelist_{curbufnr},a:fname)
4535" call Decho("ending s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
4536
4537 " build initial markfile matching pattern
4538 if a:fname =~ '/$'
4539 let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc)
4540 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01004541 let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc).trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00004542 endif
4543" call Decho("ending s:netrwmarkfilemtch_".curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">")
4544 endif
4545
4546 " handle global markfilelist
4547 if exists("s:netrwmarkfilelist")
4548 let dname= s:ComposePath(b:netrw_curdir,a:fname)
4549 if index(s:netrwmarkfilelist,dname) == -1
4550 " append new filename to global markfilelist
4551 call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
4552" call Decho("append filename<".a:fname."> to global markfilelist<".string(s:netrwmarkfilelist).">")
4553 else
4554 " remove new filename from global markfilelist
4555" call Decho("filter(".string(s:netrwmarkfilelist).",'v:val != '.".dname.")")
4556 call filter(s:netrwmarkfilelist,'v:val != "'.dname.'"')
4557" call Decho("ending s:netrwmarkfilelist <".string(s:netrwmarkfilelist).">")
4558 if s:netrwmarkfilelist == []
4559 unlet s:netrwmarkfilelist
4560 endif
4561 endif
4562 else
4563 " initialize new global-directory markfilelist
4564 let s:netrwmarkfilelist= []
4565 call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
4566" call Decho("init s:netrwmarkfilelist<".string(s:netrwmarkfilelist).">")
4567 endif
4568
4569 " set up 2match'ing to netrwmarkfilemtch list
4570 if exists("s:netrwmarkfilemtch_{curbufnr}") && s:netrwmarkfilemtch_{curbufnr} != ""
4571" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004572 if exists("g:did_drchip_netrwlist_syntax")
4573 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/"
4574 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004575 else
4576" call Decho("2match none")
4577 2match none
4578 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02004579" 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 +00004580endfun
4581
4582" ---------------------------------------------------------------------
4583" s:NetrwMarkFileCompress: (invoked by mz) This function is used to {{{2
4584" compress/decompress files using the programs
4585" in g:netrw_compress and g:netrw_uncompress,
4586" using g:netrw_compress_suffix to know which to
4587" do. By default:
4588" g:netrw_compress = "gzip"
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004589" g:netrw_decompress = { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf", ".xz" : "unxz"}
Bram Moolenaar446cb832008-06-24 21:56:24 +00004590fun! s:NetrwMarkFileCompress(islocal)
4591" call Dfunc("s:NetrwMarkFileCompress(islocal=".a:islocal.")")
4592 let svpos = netrw#NetrwSavePosn()
4593 let curdir = b:netrw_curdir
4594 let curbufnr = bufnr("%")
4595
4596 if exists("s:netrwmarkfilelist_{curbufnr}") && exists("g:netrw_compress") && exists("g:netrw_decompress")
4597 for fname in s:netrwmarkfilelist_{curbufnr}
4598 " for every filename in the marked list
4599 for sfx in sort(keys(g:netrw_decompress))
4600 if fname =~ '\'.sfx.'$'
4601 " fname has a suffix indicating that its compressed; apply associated decompression routine
Bram Moolenaar5c736222010-01-06 20:54:52 +01004602 let exe= netrw#WinPath(g:netrw_decompress[sfx])
Bram Moolenaar446cb832008-06-24 21:56:24 +00004603" call Decho("fname<".fname."> is compressed so decompress with <".exe.">")
4604 if a:islocal
4605 if g:netrw_keepdir
Bram Moolenaarc236c162008-07-13 17:41:49 +00004606 let fname= shellescape(s:ComposePath(curdir,fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004607 endif
4608 else
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004609 let fname= shellescape(b:netrw_curdir.fname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004610 endif
4611 if executable(exe)
4612 if a:islocal
4613 call system(exe." ".fname)
4614 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02004615 keepj call s:RemoteSystem(exe." ".fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004616 endif
4617 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02004618 keepj call netrw#ErrorMsg(s:WARNING,"unable to apply<".exe."> to file<".fname.">",50)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004619 endif
4620 break
4621 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004622 unlet sfx
Bram Moolenaar446cb832008-06-24 21:56:24 +00004623 endfor
4624 if exists("exe")
4625 unlet exe
4626 elseif a:islocal
4627 " fname not a compressed file, so compress it
Bram Moolenaar5c736222010-01-06 20:54:52 +01004628 call system(netrw#WinPath(g:netrw_compress)." ".shellescape(s:ComposePath(b:netrw_curdir,fname)))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004629 else
4630 " fname not a compressed file, so compress it
Bram Moolenaaradc21822011-04-01 18:03:16 +02004631 keepj call s:RemoteSystem(netrw#WinPath(g:netrw_compress)." ".shellescape(fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004632 endif
4633 endfor
4634 call s:NetrwUnmarkList(curbufnr,curdir)
Bram Moolenaaradc21822011-04-01 18:03:16 +02004635 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4636 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004637 endif
4638" call Dret("s:NetrwMarkFileCompress")
4639endfun
4640
4641" ---------------------------------------------------------------------
4642" s:NetrwMarkFileCopy: (invoked by mc) copy marked files to target {{{2
4643" If no marked files, then set up directory as the
4644" target. Currently does not support copying entire
4645" directories. Uses the local-buffer marked file list.
4646" Returns 1=success (used by NetrwMarkFileMove())
4647" 0=failure
4648fun! s:NetrwMarkFileCopy(islocal)
4649" call Dfunc("s:NetrwMarkFileCopy(islocal=".a:islocal.") target<".(exists("s:netrwmftgt")? s:netrwmftgt : '---').">")
4650
4651 " sanity checks
4652 if !exists("s:netrwmarkfilelist_{bufnr('%')}") || empty(s:netrwmarkfilelist_{bufnr('%')})
Bram Moolenaar251e1912011-06-19 05:09:16 +02004653 keepj call netrw#ErrorMsg(s:ERROR,"there are no marked files in this window (:help netrw-mf)",66)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004654" call Dret("s:NetrwMarkFileCopy 0")
4655 return 0
4656 endif
4657" call Decho("sanity chk passed: s:netrwmarkfilelist_".bufnr('%')."<".string(s:netrwmarkfilelist_{bufnr('%')}))
4658 if !exists("s:netrwmftgt")
Bram Moolenaar251e1912011-06-19 05:09:16 +02004659 keepj call netrw#ErrorMsg(s:ERROR,"your marked file target is empty! (:help netrw-mt)",67)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004660" call Dret("s:NetrwMarkFileCopy 0")
4661 return 0
4662 endif
4663" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
4664 let curdir = b:netrw_curdir
4665 let curbufnr = bufnr("%")
4666
4667 if a:islocal && s:netrwmftgt_islocal
4668 " Copy marked files, local directory to local directory
4669" call Decho("copy from local to local")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004670 let args= join(map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),"shellescape(b:netrw_curdir.\"/\".v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004671" call Decho("system(".g:netrw_localcopycmd." ".args." ".shellescape(s:netrwmftgt).")")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004672 call system(netrw#WinPath(g:netrw_localcopycmd)." ".args." ".shellescape(s:netrwmftgt))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004673
4674 elseif a:islocal && !s:netrwmftgt_islocal
4675 " Copy marked files, local directory to remote directory
4676" call Decho("copy from local to remote")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004677 keepj call s:NetrwUpload(s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004678
4679 elseif !a:islocal && s:netrwmftgt_islocal
4680" call Decho("copy from remote to local")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004681 keepj call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004682
4683 elseif !a:islocal && !s:netrwmftgt_islocal
4684" call Decho("copy from remote to remote")
4685 let curdir = getcwd()
4686 let tmpdir = s:GetTempfile("")
4687 if tmpdir !~ '/'
4688 let tmpdir= curdir."/".tmpdir
4689 endif
4690 if exists("*mkdir")
4691 call mkdir(tmpdir)
4692 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004693 exe "sil! !".g:netrw_local_mkdir.' '.shellescape(tmpdir,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004694 endif
4695 if isdirectory(tmpdir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004696 exe "keepj lcd ".fnameescape(tmpdir)
Bram Moolenaaradc21822011-04-01 18:03:16 +02004697 keepj call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},tmpdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004698 let localfiles= map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),'substitute(v:val,"^.*/","","")')
Bram Moolenaaradc21822011-04-01 18:03:16 +02004699 keepj call s:NetrwUpload(localfiles,s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004700 if getcwd() == tmpdir
4701 for fname in s:netrwmarkfilelist_{bufnr('%')}
Bram Moolenaaradc21822011-04-01 18:03:16 +02004702 keepj call s:NetrwDelete(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004703 endfor
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004704 exe "keepj lcd ".fnameescape(curdir)
4705 exe "sil !".g:netrw_local_rmdir." ".shellescape(tmpdir,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004706 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004707 exe "keepj lcd ".fnameescape(curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004708 endif
4709 endif
4710 endif
4711
4712 " -------
4713 " cleanup
4714 " -------
4715" call Decho("cleanup")
4716
4717 " remove markings from local buffer
4718 call s:NetrwUnmarkList(curbufnr,curdir)
4719
4720 " refresh buffers
4721 if !s:netrwmftgt_islocal
4722 call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
4723 endif
4724 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02004725 keepj call s:NetrwRefreshDir(a:islocal,curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004726 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01004727 if g:netrw_fastbrowse <= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02004728 keepj call s:LocalBrowseShellCmdRefresh()
Bram Moolenaar5c736222010-01-06 20:54:52 +01004729 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004730
4731" call Dret("s:NetrwMarkFileCopy 1")
4732 return 1
4733endfun
4734
4735" ---------------------------------------------------------------------
4736" s:NetrwMarkFileDiff: (invoked by md) This function is used to {{{2
4737" invoke vim's diff mode on the marked files.
4738" Either two or three files can be so handled.
4739" Uses the global marked file list.
4740fun! s:NetrwMarkFileDiff(islocal)
4741" call Dfunc("s:NetrwMarkFileDiff(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
4742 let curbufnr= bufnr("%")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004743
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004744 if exists("s:netrwmarkfilelist_{curbufnr}")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004745 let cnt = 0
4746 let curdir = b:netrw_curdir
4747 for fname in s:netrwmarkfilelist
4748 let cnt= cnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00004749 if cnt == 1
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004750" call Decho("diffthis: fname<".fname.">")
4751 exe "e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004752 diffthis
4753 elseif cnt == 2 || cnt == 3
4754 vsplit
4755 wincmd l
4756" call Decho("diffthis: ".fname)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004757 exe "e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004758 diffthis
4759 else
4760 break
4761 endif
4762 endfor
4763 call s:NetrwUnmarkList(curbufnr,curdir)
4764 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004765
Bram Moolenaar446cb832008-06-24 21:56:24 +00004766" call Dret("s:NetrwMarkFileDiff")
4767endfun
4768
4769" ---------------------------------------------------------------------
4770" s:NetrwMarkFileEdit: (invoked by me) put marked files on arg list and start editing them {{{2
4771" Uses global markfilelist
4772fun! s:NetrwMarkFileEdit(islocal)
4773" call Dfunc("s:NetrwMarkFileEdit(islocal=".a:islocal.")")
4774
4775 let curdir = b:netrw_curdir
4776 let curbufnr = bufnr("%")
4777 if exists("s:netrwmarkfilelist_{curbufnr}")
4778 call s:SetRexDir(a:islocal,curdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004779 let flist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004780 " unmark markedfile list
4781" call s:NetrwUnmarkList(curbufnr,curdir)
4782 call s:NetrwUnmarkAll()
Bram Moolenaaradc21822011-04-01 18:03:16 +02004783" call Decho("exe sil args ".flist)
4784 exe "sil args ".flist
Bram Moolenaar446cb832008-06-24 21:56:24 +00004785 endif
4786
4787" call Dret("s:NetrwMarkFileEdit")
4788endfun
4789
4790" ---------------------------------------------------------------------
4791" s:NetrwMarkFileExe: (invoked by mx) execute arbitrary command on marked files, one at a time {{{2
4792" Uses the local marked-file list.
4793fun! s:NetrwMarkFileExe(islocal)
4794" call Dfunc("s:NetrwMarkFileExe(islocal=".a:islocal.")")
4795 let svpos = netrw#NetrwSavePosn()
4796 let curdir = b:netrw_curdir
4797 let curbufnr = bufnr("%")
4798
4799 if exists("s:netrwmarkfilelist_{curbufnr}")
4800 " get the command
4801 call inputsave()
4802 let cmd= input("Enter command: ","","file")
4803 call inputrestore()
4804" call Decho("cmd<".cmd.">")
4805
4806 " apply command to marked files. Substitute: filename -> %
4807 " If no %, then append a space and the filename to the command
4808 for fname in s:netrwmarkfilelist_{curbufnr}
4809 if a:islocal
4810 if g:netrw_keepdir
Bram Moolenaar5c736222010-01-06 20:54:52 +01004811 let fname= shellescape(netrw#WinPath(s:ComposePath(curdir,fname)))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004812 endif
4813 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01004814 let fname= shellescape(netrw#WinPath(b:netrw_curdir.fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004815 endif
4816 if cmd =~ '%'
4817 let xcmd= substitute(cmd,'%',fname,'g')
4818 else
4819 let xcmd= cmd.' '.fname
4820 endif
4821 if a:islocal
4822" call Decho("local: xcmd<".xcmd.">")
4823 let ret= system(xcmd)
4824 else
4825" call Decho("remote: xcmd<".xcmd.">")
4826 let ret= s:RemoteSystem(xcmd)
4827 endif
4828 if v:shell_error < 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02004829 keepj call netrw#ErrorMsg(s:ERROR,"command<".xcmd."> failed, aborting",54)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004830 break
4831 else
4832 echo ret
4833 endif
4834 endfor
4835
4836 " unmark marked file list
4837 call s:NetrwUnmarkList(curbufnr,curdir)
4838
4839 " refresh the listing
Bram Moolenaaradc21822011-04-01 18:03:16 +02004840 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4841 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004842 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02004843 keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004844 endif
4845
4846" call Dret("s:NetrwMarkFileExe")
4847endfun
4848
4849" ---------------------------------------------------------------------
4850" s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix
4851" as the marked file(s) (toggles suffix presence)
4852" Uses the local marked file list.
4853fun! s:NetrwMarkHideSfx(islocal)
4854" call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")")
4855 let svpos = netrw#NetrwSavePosn()
4856 let curbufnr = bufnr("%")
4857
4858 " s:netrwmarkfilelist_{curbufnr}: the List of marked files
4859 if exists("s:netrwmarkfilelist_{curbufnr}")
4860
4861 for fname in s:netrwmarkfilelist_{curbufnr}
4862" call Decho("s:NetrwMarkFileCopy: fname<".fname.">")
4863 " construct suffix pattern
4864 if fname =~ '\.'
4865 let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','')
4866 else
4867 let sfxpat= '^\%(\%(\.\)\@!.\)*$'
4868 endif
4869 " determine if its in the hiding list or not
4870 let inhidelist= 0
4871 if g:netrw_list_hide != ""
4872 let itemnum = 0
4873 let hidelist= split(g:netrw_list_hide,',')
4874 for hidepat in hidelist
4875 if sfxpat == hidepat
4876 let inhidelist= 1
4877 break
4878 endif
4879 let itemnum= itemnum + 1
4880 endfor
4881 endif
4882" call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">")
4883 if inhidelist
4884 " remove sfxpat from list
4885 call remove(hidelist,itemnum)
4886 let g:netrw_list_hide= join(hidelist,",")
4887 elseif g:netrw_list_hide != ""
4888 " append sfxpat to non-empty list
4889 let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat
4890 else
4891 " set hiding list to sfxpat
4892 let g:netrw_list_hide= sfxpat
4893 endif
4894 endfor
4895
4896 " refresh the listing
Bram Moolenaaradc21822011-04-01 18:03:16 +02004897 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4898 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004899 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02004900 keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004901 endif
4902
4903" call Dret("s:NetrwMarkHideSfx")
4904endfun
4905
4906" ---------------------------------------------------------------------
4907" s:NetrwMarkFileGrep: (invoked by mg) This function applies vimgrep to marked files {{{2
4908" Uses the global markfilelist
4909fun! s:NetrwMarkFileGrep(islocal)
4910" call Dfunc("s:NetrwMarkFileGrep(islocal=".a:islocal.")")
4911 let svpos = netrw#NetrwSavePosn()
Bram Moolenaar446cb832008-06-24 21:56:24 +00004912 let curbufnr = bufnr("%")
4913
4914 if exists("s:netrwmarkfilelist")
4915" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004916 let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004917 call s:NetrwUnmarkAll()
4918
4919 " ask user for pattern
4920 call inputsave()
4921 let pat= input("Enter pattern: ","")
4922 call inputrestore()
4923 if pat !~ '^\s'
4924 if pat !~ '^/'
4925 let pat= '/'.pat.'/'
4926 endif
4927 let pat= " ".pat
4928 endif
4929
4930 " use vimgrep for both local and remote
4931" call Decho("exe vimgrep".pat." ".netrwmarkfilelist)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004932 try
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004933 exe "keepj noautocmd vimgrep".pat." ".netrwmarkfilelist
Bram Moolenaar5c736222010-01-06 20:54:52 +01004934 catch /^Vim\%((\a\+)\)\=:E480/
Bram Moolenaaradc21822011-04-01 18:03:16 +02004935 keepj call netrw#ErrorMsg(s:WARNING,"no match with pattern<".pattern.">",76)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004936" call Dret("s:NetrwMarkFileGrep : unable to find pattern<".pattern.">")
4937 return
4938 endtry
Bram Moolenaar446cb832008-06-24 21:56:24 +00004939
4940 2match none
Bram Moolenaaradc21822011-04-01 18:03:16 +02004941 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004942 endif
4943
4944" call Dret("s:NetrwMarkFileGrep")
4945endfun
4946
4947" ---------------------------------------------------------------------
4948" s:NetrwMarkFileMove: (invoked by mm) execute arbitrary command on marked files, one at a time {{{2
4949" uses the global marked file list
4950" s:netrwmfloc= 0: target directory is remote
4951" = 1: target directory is local
4952fun! s:NetrwMarkFileMove(islocal)
4953" call Dfunc("s:NetrwMarkFileMove(islocal=".a:islocal.")")
4954 let curdir = b:netrw_curdir
4955 let curbufnr = bufnr("%")
4956
4957 " sanity check
4958 if !exists("s:netrwmarkfilelist_{bufnr('%')}") || empty(s:netrwmarkfilelist_{bufnr('%')})
Bram Moolenaaradc21822011-04-01 18:03:16 +02004959 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004960" call Dret("s:NetrwMarkFileMove")
4961 return
4962 endif
4963" call Decho("sanity chk passed: s:netrwmarkfilelist_".bufnr('%')."<".string(s:netrwmarkfilelist_{bufnr('%')}))
4964 if !exists("s:netrwmftgt")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004965 keepj call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004966" call Dret("s:NetrwMarkFileCopy 0")
4967 return 0
4968 endif
4969" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
4970
4971 if a:islocal && s:netrwmftgt_islocal
4972 " move: local -> local
4973" call Decho("move from local to local")
4974" call Decho("(s:NetrwMarkFileMove) local to local move")
4975 if executable(g:netrw_localmovecmd)
4976 for fname in s:netrwmarkfilelist_{bufnr("%")}
4977" call Decho("system(".g:netrw_localmovecmd." ".shellescape(fname)." ".shellescape(s:netrwmftgt).")")
4978 let ret= system(g:netrw_localmovecmd." ".shellescape(fname)." ".shellescape(s:netrwmftgt))
4979 if v:shell_error < 0
4980 call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> failed, aborting",54)
4981 break
4982 endif
4983 endfor
4984 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02004985 keepj call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> is not executable!",57)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004986 endif
4987
4988 elseif a:islocal && !s:netrwmftgt_islocal
4989 " move: local -> remote
4990" call Decho("move from local to remote")
4991" call Decho("copy")
4992 let mflist= s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaaradc21822011-04-01 18:03:16 +02004993 keepj call s:NetrwMarkFileCopy(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004994" call Decho("remove")
4995 for fname in mflist
4996 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
4997 let ok = s:NetrwLocalRmFile(b:netrw_curdir,barefname,1)
4998 endfor
4999 unlet mflist
5000
5001 elseif !a:islocal && s:netrwmftgt_islocal
5002 " move: remote -> local
5003" call Decho("move from remote to local")
5004" call Decho("copy")
5005 let mflist= s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaaradc21822011-04-01 18:03:16 +02005006 keepj call s:NetrwMarkFileCopy(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005007" call Decho("remove")
5008 for fname in mflist
5009 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
5010 let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
5011 endfor
5012 unlet mflist
5013
5014 elseif !a:islocal && !s:netrwmftgt_islocal
5015 " move: remote -> remote
5016" call Decho("move from remote to remote")
5017" call Decho("copy")
5018 let mflist= s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaaradc21822011-04-01 18:03:16 +02005019 keepj call s:NetrwMarkFileCopy(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005020" call Decho("remove")
5021 for fname in mflist
5022 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
5023 let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
5024 endfor
5025 unlet mflist
5026 endif
5027
5028 " -------
5029 " cleanup
5030 " -------
5031" call Decho("cleanup")
5032
5033 " remove markings from local buffer
5034 call s:NetrwUnmarkList(curbufnr,curdir) " remove markings from local buffer
5035
5036 " refresh buffers
5037 if !s:netrwmftgt_islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02005038" call Decho("refresh netrwmftgt<".s:netrwmftgt.">")
5039 keepj call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005040 endif
5041 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02005042" call Decho("refresh b:netrw_curdir<".b:netrw_curdir.">")
5043 keepj call s:NetrwRefreshDir(a:islocal,b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005044 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01005045 if g:netrw_fastbrowse <= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02005046" call Decho("since g:netrw_fastbrowse=".g:netrw_fastbrowse.", perform shell cmd refresh")
5047 keepj call s:LocalBrowseShellCmdRefresh()
Bram Moolenaar5c736222010-01-06 20:54:52 +01005048 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005049
5050" call Dret("s:NetrwMarkFileMove")
5051endfun
5052
5053" ---------------------------------------------------------------------
5054" s:NetrwMarkFilePrint: (invoked by mp) This function prints marked files {{{2
5055" using the hardcopy command. Local marked-file list only.
5056fun! s:NetrwMarkFilePrint(islocal)
5057" call Dfunc("s:NetrwMarkFilePrint(islocal=".a:islocal.")")
5058 let curbufnr= bufnr("%")
5059 if exists("s:netrwmarkfilelist_{curbufnr}")
5060 let netrwmarkfilelist = s:netrwmarkfilelist_{curbufnr}
5061 let curdir = b:netrw_curdir
5062 call s:NetrwUnmarkList(curbufnr,curdir)
5063 for fname in netrwmarkfilelist
5064 if a:islocal
5065 if g:netrw_keepdir
5066 let fname= s:ComposePath(curdir,fname)
5067 endif
5068 else
5069 let fname= curdir.fname
5070 endif
5071 1split
5072 " the autocmds will handle both local and remote files
Bram Moolenaaradc21822011-04-01 18:03:16 +02005073" call Decho("exe sil e ".escape(fname,' '))
5074 exe "sil e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005075" call Decho("hardcopy")
5076 hardcopy
5077 q
5078 endfor
5079 2match none
5080 endif
5081" call Dret("s:NetrwMarkFilePrint")
5082endfun
5083
5084" ---------------------------------------------------------------------
5085" s:NetrwMarkFileRegexp: (invoked by mr) This function is used to mark {{{2
5086" files when given a regexp (for which a prompt is
5087" issued).
5088fun! s:NetrwMarkFileRegexp(islocal)
5089" call Dfunc("s:NetrwMarkFileRegexp(islocal=".a:islocal.")")
5090
5091 " get the regular expression
5092 call inputsave()
5093 let regexp= input("Enter regexp: ","","file")
5094 call inputrestore()
5095
5096 if a:islocal
5097 " get the matching list of files using local glob()
5098" call Decho("handle local regexp")
5099 let dirname = escape(b:netrw_curdir,g:netrw_glob_escape)
Bram Moolenaar5c736222010-01-06 20:54:52 +01005100 let files = glob(s:ComposePath(dirname,regexp))
5101" call Decho("files<".files.">")
5102 let filelist= split(files,"\n")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005103
5104 " mark the list of files
Bram Moolenaar5c736222010-01-06 20:54:52 +01005105 for fname in filelist
5106" call Decho("fname<".fname.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005107 keepj call s:NetrwMarkFile(a:islocal,substitute(fname,'^.*/','',''))
Bram Moolenaar5c736222010-01-06 20:54:52 +01005108 endfor
Bram Moolenaar446cb832008-06-24 21:56:24 +00005109
5110 else
5111" call Decho("handle remote regexp")
5112
5113 " convert displayed listing into a filelist
5114 let eikeep = &ei
5115 let areg = @a
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005116 sil keepj %y a
Bram Moolenaar446cb832008-06-24 21:56:24 +00005117 set ei=all ma
5118" call Decho("set ei=all ma")
5119 1split
Bram Moolenaaradc21822011-04-01 18:03:16 +02005120 keepj call s:NetrwEnew()
5121 keepj call s:NetrwSafeOptions()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005122 sil keepj norm! "ap
5123 keepj 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00005124 let bannercnt= search('^" =====','W')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005125 exe "sil keepj 1,".bannercnt."d"
Bram Moolenaar446cb832008-06-24 21:56:24 +00005126 set bt=nofile
5127 if g:netrw_liststyle == s:LONGLIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005128 sil keepj %s/\s\{2,}\S.*$//e
Bram Moolenaar5c736222010-01-06 20:54:52 +01005129 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005130 elseif g:netrw_liststyle == s:WIDELIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005131 sil keepj %s/\s\{2,}/\r/ge
Bram Moolenaar5c736222010-01-06 20:54:52 +01005132 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005133 elseif g:netrw_liststyle == s:TREELIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005134 sil keepj %s/^| //e
5135 sil! keepj g/^ .*$/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01005136 call histdel("/",-1)
5137 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005138 endif
5139 " convert regexp into the more usual glob-style format
5140 let regexp= substitute(regexp,'\*','.*','g')
5141" call Decho("regexp<".regexp.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005142 exe "sil! keepj v/".escape(regexp,'/')."/d"
Bram Moolenaar5c736222010-01-06 20:54:52 +01005143 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005144 let filelist= getline(1,line("$"))
5145 q!
5146 for filename in filelist
Bram Moolenaaradc21822011-04-01 18:03:16 +02005147 keepj call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','',''))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005148 endfor
5149 unlet filelist
5150 let @a = areg
5151 let &ei = eikeep
5152 endif
5153
5154" call Dret("s:NetrwMarkFileRegexp")
5155endfun
5156
5157" ---------------------------------------------------------------------
5158" s:NetrwMarkFileSource: (invoked by ms) This function sources marked files {{{2
5159" Uses the local marked file list.
5160fun! s:NetrwMarkFileSource(islocal)
5161" call Dfunc("s:NetrwMarkFileSource(islocal=".a:islocal.")")
5162 let curbufnr= bufnr("%")
5163 if exists("s:netrwmarkfilelist_{curbufnr}")
5164 let netrwmarkfilelist = s:netrwmarkfilelist_{bufnr("%")}
5165 let curdir = b:netrw_curdir
5166 call s:NetrwUnmarkList(curbufnr,curdir)
5167 for fname in netrwmarkfilelist
5168 if a:islocal
5169 if g:netrw_keepdir
5170 let fname= s:ComposePath(curdir,fname)
5171 endif
5172 else
5173 let fname= curdir.fname
5174 endif
5175 " the autocmds will handle sourcing both local and remote files
Bram Moolenaarc236c162008-07-13 17:41:49 +00005176" call Decho("exe so ".fnameescape(fname))
5177 exe "so ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005178 endfor
5179 2match none
5180 endif
5181" call Dret("s:NetrwMarkFileSource")
5182endfun
5183
5184" ---------------------------------------------------------------------
5185" s:NetrwMarkFileTag: (invoked by mT) This function applies g:netrw_ctags to marked files {{{2
5186" Uses the global markfilelist
5187fun! s:NetrwMarkFileTag(islocal)
5188" call Dfunc("s:NetrwMarkFileTag(islocal=".a:islocal.")")
5189 let svpos = netrw#NetrwSavePosn()
5190 let curdir = b:netrw_curdir
5191 let curbufnr = bufnr("%")
5192
5193 if exists("s:netrwmarkfilelist")
5194" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005195 let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "shellescape(v:val,".!a:islocal.")"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005196 call s:NetrwUnmarkAll()
5197
5198 if a:islocal
5199 if executable(g:netrw_ctags)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005200" call Decho("call system(".g:netrw_ctags." ".netrwmarkfilelist.")")
5201 call system(g:netrw_ctags." ".netrwmarkfilelist)
5202 else
5203 call netrw#ErrorMsg(s:ERROR,"g:netrw_ctags<".g:netrw_ctags."> is not executable!",51)
5204 endif
5205 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00005206 let cmd = s:RemoteSystem(g:netrw_ctags." ".netrwmarkfilelist)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005207 call netrw#NetrwObtain(a:islocal,"tags")
5208 let curdir= b:netrw_curdir
5209 1split
5210 e tags
5211 let path= substitute(curdir,'^\(.*\)/[^/]*$','\1/','')
5212" call Decho("curdir<".curdir."> path<".path.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005213 exe 'keepj %s/\t\(\S\+\)\t/\t'.escape(path,"/\n\r\\").'\1\t/e'
Bram Moolenaar5c736222010-01-06 20:54:52 +01005214 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005215 wq!
5216 endif
5217 2match none
5218 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5219 call netrw#NetrwRestorePosn(svpos)
5220 endif
5221
5222" call Dret("s:NetrwMarkFileTag")
5223endfun
5224
5225" ---------------------------------------------------------------------
5226" s:NetrwMarkFileTgt: (invoked by mt) This function sets up a marked file target {{{2
5227" Sets up two variables,
5228" s:netrwmftgt : holds the target directory
5229" s:netrwmftgt_islocal : 0=target directory is remote
5230" 1=target directory is local
5231fun! s:NetrwMarkFileTgt(islocal)
5232" call Dfunc("s:NetrwMarkFileTgt(islocal=".a:islocal.")")
5233 let svpos = netrw#NetrwSavePosn()
5234 let curdir = b:netrw_curdir
5235 let hadtgt = exists("s:netrwmftgt")
5236 if !exists("w:netrw_bannercnt")
5237 let w:netrw_bannercnt= b:netrw_bannercnt
5238 endif
5239
5240 " set up target
5241 if line(".") < w:netrw_bannercnt
5242 " if cursor in banner region, use b:netrw_curdir for the target
5243 let s:netrwmftgt= b:netrw_curdir
5244" call Decho("inbanner: s:netrwmftgt<".s:netrwmftgt.">")
5245
5246 else
5247 " get word under cursor.
5248 " * If directory, use it for the target.
5249 " * If file, use b:netrw_curdir for the target
5250 let curword= s:NetrwGetWord()
5251 let tgtdir = s:ComposePath(curdir,curword)
5252 if a:islocal && isdirectory(tgtdir)
5253 let s:netrwmftgt = tgtdir
5254" call Decho("local isdir: s:netrwmftgt<".s:netrwmftgt.">")
5255 elseif !a:islocal && tgtdir =~ '/$'
5256 let s:netrwmftgt = tgtdir
5257" call Decho("remote isdir: s:netrwmftgt<".s:netrwmftgt.">")
5258 else
5259 let s:netrwmftgt = curdir
5260" call Decho("isfile: s:netrwmftgt<".s:netrwmftgt.">")
5261 endif
5262 endif
5263 if a:islocal
5264 " simplify the target (eg. /abc/def/../ghi -> /abc/ghi)
5265 let s:netrwmftgt= simplify(s:netrwmftgt)
5266" call Decho("simplify: s:netrwmftgt<".s:netrwmftgt.">")
5267 endif
5268 if g:netrw_cygwin
5269 let s:netrwmftgt= substitute(system("cygpath ".shellescape(s:netrwmftgt)),'\n$','','')
5270 let s:netrwmftgt= substitute(s:netrwmftgt,'\n$','','')
5271 endif
5272 let s:netrwmftgt_islocal= a:islocal
5273
Bram Moolenaar5c736222010-01-06 20:54:52 +01005274 if g:netrw_fastbrowse <= 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00005275 call s:LocalBrowseShellCmdRefresh()
5276 endif
5277 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5278 call netrw#NetrwRestorePosn(svpos)
5279 if !hadtgt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005280 sil! keepj norm! j
Bram Moolenaar446cb832008-06-24 21:56:24 +00005281 endif
5282
5283" call Dret("s:NetrwMarkFileTgt : netrwmftgt<".(exists("s:netrwmftgt")? s:netrwmftgt : "").">")
5284endfun
5285
5286" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00005287" s:NetrwOpenFile: query user for a filename and open it {{{2
5288fun! s:NetrwOpenFile(islocal)
5289" call Dfunc("s:NetrwOpenFile(islocal=".a:islocal.")")
5290 call inputsave()
5291 let fname= input("Enter filename: ")
5292 call inputrestore()
5293 if fname !~ '[/\\]'
5294 if exists("b:netrw_curdir")
5295 if exists("g:netrw_quiet")
5296 let netrw_quiet_keep = g:netrw_quiet
5297 endif
5298 let g:netrw_quiet = 1
5299 if b:netrw_curdir =~ '/$'
5300 exe "e ".fnameescape(b:netrw_curdir.fname)
5301 else
5302 exe "e ".fnameescape(b:netrw_curdir."/".fname)
5303 endif
5304 if exists("netrw_quiet_keep")
5305 let g:netrw_quiet= netrw_quiet_keep
5306 else
5307 unlet g:netrw_quiet
5308 endif
5309 endif
5310 else
5311 exe "e ".fnameescape(fname)
5312 endif
5313" call Dret("s:NetrwOpenFile")
5314endfun
5315
5316" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00005317" s:NetrwUnmarkList: delete local marked file lists and remove their contents from the global marked-file list {{{2
5318fun! s:NetrwUnmarkList(curbufnr,curdir)
5319" call Dfunc("s:NetrwUnmarkList(curbufnr=".a:curbufnr." curdir<".a:curdir.">)")
5320
5321 " remove all files in local marked-file list from global list
5322 if exists("s:netrwmarkfilelist_{a:curbufnr}")
5323 for mfile in s:netrwmarkfilelist_{a:curbufnr}
5324 let dfile = s:ComposePath(a:curdir,mfile) " prepend directory to mfile
5325 let idx = index(s:netrwmarkfilelist,dfile) " get index in list of dfile
5326 call remove(s:netrwmarkfilelist,idx) " remove from global list
5327 endfor
5328 if s:netrwmarkfilelist == []
5329 unlet s:netrwmarkfilelist
5330 endif
5331
5332 " getting rid of the local marked-file lists is easy
5333 unlet s:netrwmarkfilelist_{a:curbufnr}
5334 endif
5335 if exists("s:netrwmarkfilemtch_{a:curbufnr}")
5336 unlet s:netrwmarkfilemtch_{a:curbufnr}
5337 endif
5338 2match none
5339" call Dret("s:NetrwUnmarkList")
5340endfun
5341
5342" ---------------------------------------------------------------------
5343" s:NetrwUnmarkAll: remove the global marked file list and all local ones {{{2
5344fun! s:NetrwUnmarkAll()
5345" call Dfunc("s:NetrwUnmarkAll()")
5346 if exists("s:netrwmarkfilelist")
5347 unlet s:netrwmarkfilelist
5348 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02005349 sil call s:NetrwUnmarkAll2()
Bram Moolenaar446cb832008-06-24 21:56:24 +00005350 2match none
5351" call Dret("s:NetrwUnmarkAll")
5352endfun
5353
5354" ---------------------------------------------------------------------
5355" s:NetrwUnmarkAll2: {{{2
5356fun! s:NetrwUnmarkAll2()
5357" call Dfunc("s:NetrwUnmarkAll2()")
5358 redir => netrwmarkfilelist_let
5359 let
5360 redir END
5361 let netrwmarkfilelist_list= split(netrwmarkfilelist_let,'\n') " convert let string into a let list
5362 call filter(netrwmarkfilelist_list,"v:val =~ '^s:netrwmarkfilelist_'") " retain only those vars that start as s:netrwmarkfilelist_
5363 call map(netrwmarkfilelist_list,"substitute(v:val,'\\s.*$','','')") " remove what the entries are equal to
5364 for flist in netrwmarkfilelist_list
5365 let curbufnr= substitute(flist,'s:netrwmarkfilelist_','','')
5366 unlet s:netrwmarkfilelist_{curbufnr}
5367 unlet s:netrwmarkfilemtch_{curbufnr}
5368 endfor
5369" call Dret("s:NetrwUnmarkAll2")
5370endfun
5371
5372" ---------------------------------------------------------------------
5373" s:NetrwUnMarkFile: {{{2
5374fun! s:NetrwUnMarkFile(islocal)
5375" call Dfunc("s:NetrwUnMarkFile(islocal=".a:islocal.")")
5376 let svpos = netrw#NetrwSavePosn()
5377 let curbufnr = bufnr("%")
5378
5379 " unmark marked file list (although I expect s:NetrwUpload()
5380 " to do it, I'm just making sure)
5381 if exists("s:netrwmarkfilelist_{bufnr('%')}")
5382" call Decho("unlet'ing: s:netrwmarkfile[list|mtch]_".bufnr("%"))
5383 unlet s:netrwmarkfilelist
5384 unlet s:netrwmarkfilelist_{curbufnr}
5385 unlet s:netrwmarkfilemtch_{curbufnr}
5386 2match none
5387 endif
5388
5389" call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5390 call netrw#NetrwRestorePosn(svpos)
5391" call Dret("s:NetrwUnMarkFile")
5392endfun
5393
5394" ---------------------------------------------------------------------
5395" s:NetrwMenu: generates the menu for gvim and netrw {{{2
5396fun! s:NetrwMenu(domenu)
5397
5398 if !exists("g:NetrwMenuPriority")
5399 let g:NetrwMenuPriority= 80
5400 endif
5401
Bram Moolenaaradc21822011-04-01 18:03:16 +02005402 if has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaar446cb832008-06-24 21:56:24 +00005403" call Dfunc("NetrwMenu(domenu=".a:domenu.")")
5404
5405 if !exists("s:netrw_menu_enabled") && a:domenu
5406" call Decho("initialize menu")
5407 let s:netrw_menu_enabled= 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005408 exe 'sil! menu '.g:NetrwMenuPriority.'.1 '.g:NetrwTopLvlMenu.'Help<tab><F1> <F1>'
5409 exe 'sil! menu '.g:NetrwMenuPriority.'.5 '.g:NetrwTopLvlMenu.'-Sep1- :'
5410 exe 'sil! menu '.g:NetrwMenuPriority.'.6 '.g:NetrwTopLvlMenu.'Go\ Up\ Directory<tab>- -'
5411 exe 'sil! menu '.g:NetrwMenuPriority.'.7 '.g:NetrwTopLvlMenu.'Apply\ Special\ Viewer<tab>x x'
5412 exe 'sil! menu '.g:NetrwMenuPriority.'.8.1 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Current\ Directory<tab>mb mb'
5413 exe 'sil! menu '.g:NetrwMenuPriority.'.8.4 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Prev\ Dir\ (History)<tab>u u'
5414 exe 'sil! menu '.g:NetrwMenuPriority.'.8.5 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Next\ Dir\ (History)<tab>U U'
5415 exe 'sil! menu '.g:NetrwMenuPriority.'.8.6 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.List<tab>qb qb'
5416 exe 'sil! menu '.g:NetrwMenuPriority.'.9.1 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ File\ Hiding\ List<tab><ctrl-h>'." \<c-h>'"
5417 exe 'sil! menu '.g:NetrwMenuPriority.'.9.2 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ Sorting\ Sequence<tab>S S'
5418 exe 'sil! menu '.g:NetrwMenuPriority.'.9.3 '.g:NetrwTopLvlMenu.'Browsing\ Control.Quick\ Hide/Unhide\ Dot\ Files<tab>'."gh gh"
5419 exe 'sil! menu '.g:NetrwMenuPriority.'.9.4 '.g:NetrwTopLvlMenu.'Browsing\ Control.Refresh\ Listing<tab>'."<ctrl-l> \<c-l>"
5420 exe 'sil! menu '.g:NetrwMenuPriority.'.9.5 '.g:NetrwTopLvlMenu.'Browsing\ Control.Settings/Options<tab>:NetrwSettings '.":NetrwSettings\<cr>"
5421 exe 'sil! menu '.g:NetrwMenuPriority.'.10 '.g:NetrwTopLvlMenu.'Delete\ File/Directory<tab>D D'
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02005422 exe 'sil! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Create\ New\ File<tab>% %'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005423 exe 'sil! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Current\ Window<tab><cr> '."\<cr>"
5424 exe 'sil! menu '.g:NetrwMenuPriority.'.11.2 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Preview\ File/Directory<tab>p p'
5425 exe 'sil! menu '.g:NetrwMenuPriority.'.11.3 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Previous\ Window<tab>P P'
5426 exe 'sil! menu '.g:NetrwMenuPriority.'.11.4 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Window<tab>o o'
5427 exe 'sil! menu '.g:NetrwMenuPriority.'.11.5 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Vertical\ Window<tab>v v'
5428 exe 'sil! menu '.g:NetrwMenuPriority.'.12.1 '.g:NetrwTopLvlMenu.'Explore.Directory\ Name :Explore '
5429 exe 'sil! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (curdir\ only)<tab>:Explore\ */ :Explore */'
5430 exe 'sil! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (+subdirs)<tab>:Explore\ **/ :Explore **/'
5431 exe 'sil! menu '.g:NetrwMenuPriority.'.12.3 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ String\ Pattern\ (curdir\ only)<tab>:Explore\ *// :Explore *//'
5432 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ String\ Pattern\ (+subdirs)<tab>:Explore\ **// :Explore **//'
5433 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Next\ Match<tab>:Nexplore :Nexplore<cr>'
5434 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Prev\ Match<tab>:Pexplore :Pexplore<cr>'
5435 exe 'sil! menu '.g:NetrwMenuPriority.'.13 '.g:NetrwTopLvlMenu.'Make\ Subdirectory<tab>d d'
5436 exe 'sil! menu '.g:NetrwMenuPriority.'.14.1 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ File<tab>mf mf'
5437 exe 'sil! menu '.g:NetrwMenuPriority.'.14.2 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ Files\ by\ Regexp<tab>mr mr'
5438 exe 'sil! menu '.g:NetrwMenuPriority.'.14.3 '.g:NetrwTopLvlMenu.'Marked\ Files.Hide-Show-List\ Control<tab>a a'
5439 exe 'sil! menu '.g:NetrwMenuPriority.'.14.4 '.g:NetrwTopLvlMenu.'Marked\ Files.Copy\ To\ Target<tab>mc mc'
5440 exe 'sil! menu '.g:NetrwMenuPriority.'.14.5 '.g:NetrwTopLvlMenu.'Marked\ Files.Delete<tab>D D'
5441 exe 'sil! menu '.g:NetrwMenuPriority.'.14.6 '.g:NetrwTopLvlMenu.'Marked\ Files.Diff<tab>md md'
5442 exe 'sil! menu '.g:NetrwMenuPriority.'.14.7 '.g:NetrwTopLvlMenu.'Marked\ Files.Edit<tab>me me'
5443 exe 'sil! menu '.g:NetrwMenuPriority.'.14.8 '.g:NetrwTopLvlMenu.'Marked\ Files.Exe\ Cmd<tab>mx mx'
5444 exe 'sil! menu '.g:NetrwMenuPriority.'.14.9 '.g:NetrwTopLvlMenu.'Marked\ Files.Move\ To\ Target<tab>mm mm'
5445 exe 'sil! menu '.g:NetrwMenuPriority.'.14.10 '.g:NetrwTopLvlMenu.'Marked\ Files.Obtain<tab>O O'
5446 exe 'sil! menu '.g:NetrwMenuPriority.'.14.11 '.g:NetrwTopLvlMenu.'Marked\ Files.Print<tab>mp mp'
5447 exe 'sil! menu '.g:NetrwMenuPriority.'.14.12 '.g:NetrwTopLvlMenu.'Marked\ Files.Replace<tab>R R'
5448 exe 'sil! menu '.g:NetrwMenuPriority.'.14.13 '.g:NetrwTopLvlMenu.'Marked\ Files.Set\ Target<tab>mt mt'
5449 exe 'sil! menu '.g:NetrwMenuPriority.'.14.14 '.g:NetrwTopLvlMenu.'Marked\ Files.Tag<tab>mT mT'
5450 exe 'sil! menu '.g:NetrwMenuPriority.'.14.15 '.g:NetrwTopLvlMenu.'Marked\ Files.Zip/Unzip/Compress/Uncompress<tab>mz mz'
5451 exe 'sil! menu '.g:NetrwMenuPriority.'.15 '.g:NetrwTopLvlMenu.'Obtain\ File<tab>O O'
5452 exe 'sil! menu '.g:NetrwMenuPriority.'.16.1 '.g:NetrwTopLvlMenu.'Style.Listing\ Style\ (thin-long-wide-tree)<tab>i i'
5453 exe 'sil! menu '.g:NetrwMenuPriority.'.16.2 '.g:NetrwTopLvlMenu.'Style.Normal-Hide-Show<tab>a a'
5454 exe 'sil! menu '.g:NetrwMenuPriority.'.16.3 '.g:NetrwTopLvlMenu.'Style.Reverse\ Sorting\ Order<tab>'."r r"
5455 exe 'sil! menu '.g:NetrwMenuPriority.'.16.4 '.g:NetrwTopLvlMenu.'Style.Sorting\ Method\ (name-time-size)<tab>s s'
5456 exe 'sil! menu '.g:NetrwMenuPriority.'.17 '.g:NetrwTopLvlMenu.'Rename\ File/Directory<tab>R R'
5457 exe 'sil! menu '.g:NetrwMenuPriority.'.18 '.g:NetrwTopLvlMenu.'Set\ Current\ Directory<tab>c c'
Bram Moolenaar5c736222010-01-06 20:54:52 +01005458 call s:NetrwBookmarkMenu() " provide some history! uses priorities 2,3, reserves 4, 8.2.x
Bram Moolenaar446cb832008-06-24 21:56:24 +00005459 let s:netrw_menucnt= 28
5460
5461 elseif !a:domenu
5462 let s:netrwcnt = 0
5463 let curwin = winnr()
5464 windo if getline(2) =~ "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif
5465 exe curwin."wincmd w"
5466
5467 if s:netrwcnt <= 1
5468" call Decho("clear menus")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005469 exe 'sil! unmenu '.g:NetrwTopLvlMenu
Bram Moolenaaradc21822011-04-01 18:03:16 +02005470" call Decho('exe sil! unmenu '.g:NetrwTopLvlMenu.'*')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005471 sil! unlet s:netrw_menu_enabled
Bram Moolenaar446cb832008-06-24 21:56:24 +00005472 endif
5473 endif
5474" call Dret("NetrwMenu")
5475 endif
5476
5477endfun
5478
5479" ---------------------------------------------------------------------
5480" s:NetrwObtain: obtain file under cursor or from markfile list {{{2
5481" Used by the O maps (as <SID>NetrwObtain())
5482fun! s:NetrwObtain(islocal)
5483" call Dfunc("NetrwObtain(islocal=".a:islocal.")")
5484
5485 if exists("s:netrwmarkfilelist_{bufnr('%')}")
Bram Moolenaar5c736222010-01-06 20:54:52 +01005486 let islocal= s:netrwmarkfilelist_{bufnr('%')}[1] !~ '^\a\+://'
5487 call netrw#NetrwObtain(islocal,s:netrwmarkfilelist_{bufnr('%')})
Bram Moolenaar446cb832008-06-24 21:56:24 +00005488 call s:NetrwUnmarkList(bufnr('%'),b:netrw_curdir)
5489 else
5490 call netrw#NetrwObtain(a:islocal,expand("<cWORD>"))
5491 endif
5492
5493" call Dret("NetrwObtain")
5494endfun
5495
5496" ---------------------------------------------------------------------
5497" netrw#NetrwObtain: {{{2
5498" netrw#NetrwObtain(islocal,fname[,tgtdirectory])
5499" islocal=0 obtain from remote source
5500" =1 obtain from local source
5501" fname : a filename or a list of filenames
5502" tgtdir : optional place where files are to go (not present, uses getcwd())
5503fun! netrw#NetrwObtain(islocal,fname,...)
5504" call Dfunc("netrw#NetrwObtain(islocal=".a:islocal." fname<".((type(a:fname) == 1)? a:fname : string(a:fname)).">) a:0=".a:0)
5505 " NetrwStatusLine support - for obtaining support
5506
5507 if type(a:fname) == 1
5508 let fnamelist= [ a:fname ]
5509 elseif type(a:fname) == 3
5510 let fnamelist= a:fname
5511 else
5512 call netrw#ErrorMsg(s:ERROR,"attempting to use NetrwObtain on something not a filename or a list",62)
5513" call Dret("netrw#NetrwObtain")
5514 return
5515 endif
5516" call Decho("fnamelist<".string(fnamelist).">")
5517 if a:0 > 0
5518 let tgtdir= a:1
5519 else
5520 let tgtdir= getcwd()
5521 endif
5522" call Decho("tgtdir<".tgtdir.">")
5523
Bram Moolenaar5c736222010-01-06 20:54:52 +01005524 if exists("b:netrw_islocal") && b:netrw_islocal
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005525 " obtain a file from local b:netrw_curdir to (local) tgtdir
5526" call Decho("obtain a file from local ".b:netrw_curdir." to ".tgtdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005527 if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir
5528 let topath= s:ComposePath(tgtdir,"")
5529 if (has("win32") || has("win95") || has("win64") || has("win16"))
5530 " transfer files one at time
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005531" call Decho("transfer files one at a time")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005532 for fname in fnamelist
Bram Moolenaarc236c162008-07-13 17:41:49 +00005533" call Decho("system(".g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath).")")
5534 call system(g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005535 endfor
5536 else
5537 " transfer files with one command
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005538" call Decho("transfer files with one command")
5539 let filelist= join(map(deepcopy(fnamelist),"shellescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005540" call Decho("system(".g:netrw_localcopycmd." ".filelist." ".shellescape(topath).")")
5541 call system(g:netrw_localcopycmd." ".filelist." ".shellescape(topath))
5542 endif
5543 elseif !exists("b:netrw_curdir")
5544 call netrw#ErrorMsg(s:ERROR,"local browsing directory doesn't exist!",36)
5545 else
5546 call netrw#ErrorMsg(s:WARNING,"local browsing directory and current directory are identical",37)
5547 endif
5548
5549 else
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005550 " obtain files from remote b:netrw_curdir to local tgtdir
5551" call Decho("obtain a file from remote ".b:netrw_curdir." to ".tgtdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005552 if type(a:fname) == 1
5553 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.a:fname)
5554 endif
5555 call s:NetrwMethod(b:netrw_curdir)
5556
5557 if b:netrw_method == 4
5558 " obtain file using scp
5559" call Decho("obtain via scp (method#4)")
5560 if exists("g:netrw_port") && g:netrw_port != ""
5561 let useport= " ".g:netrw_scpport." ".g:netrw_port
5562 else
5563 let useport= ""
5564 endif
5565 if b:netrw_fname =~ '/'
5566 let path= substitute(b:netrw_fname,'^\(.*/\).\{-}$','\1','')
5567 else
5568 let path= ""
5569 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005570 let filelist= join(map(deepcopy(fnamelist),'shellescape(g:netrw_machine.":".path.v:val,1)'))
Bram Moolenaarc236c162008-07-13 17:41:49 +00005571" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1))
5572 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005573
5574 elseif b:netrw_method == 2
5575 " obtain file using ftp + .netrc
5576" call Decho("obtain via ftp+.netrc (method #2)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005577 call s:SaveBufVars()|sil keepjumps new|call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00005578 let tmpbufnr= bufnr("%")
5579 setlocal ff=unix
5580 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005581 keepj put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +00005582" call Decho("filter input: ".getline('$'))
5583 endif
5584
5585 if exists("b:netrw_fname") && b:netrw_fname != ""
5586 call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
5587" call Decho("filter input: ".getline('$'))
5588 endif
5589
5590 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005591 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00005592" call Decho("filter input: ".getline('$'))
5593 endif
5594 for fname in fnamelist
5595 call setline(line("$")+1,'get "'.fname.'"')
5596" call Decho("filter input: ".getline('$'))
5597 endfor
5598 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02005599" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
5600 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 +00005601 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02005602" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
5603 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005604 endif
5605 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
5606 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
5607 let debugkeep= &debug
5608 setlocal debug=msg
5609 call netrw#ErrorMsg(s:ERROR,getline(1),4)
5610 let &debug= debugkeep
5611 endif
5612
5613 elseif b:netrw_method == 3
5614 " obtain with ftp + machine, id, passwd, and fname (ie. no .netrc)
5615" call Decho("obtain via ftp+mipf (method #3)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005616 call s:SaveBufVars()|sil keepjumps new|call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00005617 let tmpbufnr= bufnr("%")
5618 setlocal ff=unix
5619
5620 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005621 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00005622" call Decho("filter input: ".getline('$'))
5623 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005624 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00005625" call Decho("filter input: ".getline('$'))
5626 endif
5627
5628 if exists("g:netrw_ftp") && g:netrw_ftp == 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005629 keepj put =g:netrw_uid
Bram Moolenaar446cb832008-06-24 21:56:24 +00005630" call Decho("filter input: ".getline('$'))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005631 keepj put ='\"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00005632" call Decho("filter input: ".getline('$'))
5633 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005634 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00005635" call Decho("filter input: ".getline('$'))
5636 endif
5637
5638 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005639 keepj put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +00005640" call Decho("filter input: ".getline('$'))
5641 endif
5642
5643 if exists("b:netrw_fname") && b:netrw_fname != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005644 keepj call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005645" call Decho("filter input: ".getline('$'))
5646 endif
5647
5648 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005649 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00005650" call Decho("filter input: ".getline('$'))
5651 endif
5652
5653 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005654 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00005655" call Decho("filter input: ".getline('$'))
5656 endif
5657 for fname in fnamelist
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005658 keepj call setline(line("$")+1,'get "'.fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005659 endfor
5660" call Decho("filter input: ".getline('$'))
5661
5662 " perform ftp:
5663 " -i : turns off interactive prompting from ftp
5664 " -n unix : DON'T use <.netrc>, even though it exists
5665 " -n win32: quit being obnoxious about password
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005666 keepj norm! 1Gdd
Bram Moolenaaradc21822011-04-01 18:03:16 +02005667" call Decho("executing: %!".s:netrw_ftp_cmd." -i -n")
5668 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i -n"
Bram Moolenaar446cb832008-06-24 21:56:24 +00005669 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
5670 if getline(1) !~ "^$"
5671" call Decho("error<".getline(1).">")
5672 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005673 keepj call netrw#ErrorMsg(s:ERROR,getline(1),5)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005674 endif
5675 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01005676 elseif !exists("b:netrw_method") || b:netrw_method < 0
5677" call Dfunc("netrw#NetrwObtain : unsupported method")
5678 return
5679 endif
5680
5681 " restore status line
5682 if type(a:fname) == 1 && exists("s:netrw_users_stl")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005683 keepj call s:SetupNetrwStatusLine(s:netrw_users_stl)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005684 endif
5685
5686 endif
5687
5688 " cleanup
5689 if exists("tmpbufnr")
5690 if bufnr("%") != tmpbufnr
5691 exe tmpbufnr."bw!"
5692 else
5693 q!
5694 endif
5695 endif
5696
5697" call Dret("netrw#NetrwObtain")
5698endfun
5699
5700" ---------------------------------------------------------------------
5701" s:NetrwPrevWinOpen: open file/directory in previous window. {{{2
5702" If there's only one window, then the window will first be split.
5703" Returns:
5704" choice = 0 : didn't have to choose
5705" choice = 1 : saved modified file in window first
5706" choice = 2 : didn't save modified file, opened window
5707" choice = 3 : cancel open
5708fun! s:NetrwPrevWinOpen(islocal)
5709" call Dfunc("NetrwPrevWinOpen(islocal=".a:islocal.")")
5710
5711 " grab a copy of the b:netrw_curdir to pass it along to newly split windows
5712 let curdir = b:netrw_curdir
5713
5714 " get last window number and the word currently under the cursor
5715 let lastwinnr = winnr("$")
5716 let curword = s:NetrwGetWord()
5717 let choice = 0
5718" call Decho("lastwinnr=".lastwinnr." curword<".curword.">")
5719
5720 let didsplit = 0
5721 if lastwinnr == 1
5722 " if only one window, open a new one first
5723" call Decho("only one window, so open a new one (g:netrw_alto=".g:netrw_alto.")")
5724 if g:netrw_preview
5725" call Decho("exe ".(g:netrw_alto? "top " : "bot ")."vert ".g:netrw_winsize."wincmd s")
5726 exe (g:netrw_alto? "top " : "bot ")."vert ".g:netrw_winsize."wincmd s"
5727 else
5728" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s")
5729 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
5730 endif
5731 let didsplit = 1
5732
5733 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02005734 keepj call s:SaveBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00005735" call Decho("wincmd p")
5736 wincmd p
Bram Moolenaaradc21822011-04-01 18:03:16 +02005737 keepj call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00005738 " if the previous window's buffer has been changed (is modified),
5739 " and it doesn't appear in any other extant window, then ask the
5740 " user if s/he wants to abandon modifications therein.
5741 let bnr = winbufnr(0)
5742 let bnrcnt = 0
5743 if &mod
5744" call Decho("detected: prev window's buffer has been modified: bnr=".bnr." winnr#".winnr())
5745 let eikeep= &ei
5746 set ei=all
5747 windo if winbufnr(0) == bnr | let bnrcnt=bnrcnt+1 | endif
5748 exe bnr."wincmd p"
5749 let &ei= eikeep
5750" call Decho("bnr=".bnr." bnrcnt=".bnrcnt." buftype=".&bt." winnr#".winnr())
5751 if bnrcnt == 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01005752 let bufname = bufname(winbufnr(winnr()))
5753 let choice = confirm("Save modified file<".bufname.">?","&Yes\n&No\n&Cancel")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005754" call Decho("bufname<".bufname."> choice=".choice." winnr#".winnr())
5755
5756 if choice == 1
5757 " Yes -- write file & then browse
5758 let v:errmsg= ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02005759 sil w
Bram Moolenaar446cb832008-06-24 21:56:24 +00005760 if v:errmsg != ""
5761 call netrw#ErrorMsg(s:ERROR,"unable to write <".bufname.">!",30)
5762 if didsplit
5763 q
5764 else
5765 wincmd p
5766 endif
5767" call Dret("NetrwPrevWinOpen ".choice." : unable to write <".bufname.">")
5768 return choice
5769 endif
5770
5771 elseif choice == 2
5772 " No -- don't worry about changed file, just browse anyway
5773 setlocal nomod
Bram Moolenaaradc21822011-04-01 18:03:16 +02005774 keepj call netrw#ErrorMsg(s:WARNING,bufname." changes to ".bufname." abandoned",31)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005775 wincmd p
5776
5777 else
5778 " Cancel -- don't do this
5779 if didsplit
5780 q
5781 else
5782 wincmd p
5783 endif
5784" call Dret("NetrwPrevWinOpen ".choice." : cancelled")
5785 return choice
5786 endif
5787 endif
5788 endif
5789 endif
5790
5791 " restore b:netrw_curdir (window split/enew may have lost it)
5792 let b:netrw_curdir= curdir
5793 if a:islocal < 2
5794 if a:islocal
5795 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(a:islocal,curword))
5796 else
5797 call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,curword))
5798 endif
5799 endif
5800" call Dret("NetrwPrevWinOpen ".choice)
5801 return choice
5802endfun
5803
5804" ---------------------------------------------------------------------
5805" s:NetrwUpload: load fname to tgt (used by NetrwMarkFileCopy()) {{{2
5806" Always assumed to be local -> remote
5807" call s:NetrwUpload(filename, target)
5808" call s:NetrwUpload(filename, target, fromdirectory)
5809fun! s:NetrwUpload(fname,tgt,...)
5810" call Dfunc("s:NetrwUpload(fname<".((type(a:fname) == 1)? a:fname : string(a:fname))."> tgt<".a:tgt.">) a:0=".a:0)
5811
5812 if a:tgt =~ '^\a\+://'
5813 let tgtdir= substitute(a:tgt,'^\a\+://[^/]\+/\(.\{-}\)$','\1','')
5814 else
5815 let tgtdir= substitute(a:tgt,'^\(.*\)/[^/]*$','\1','')
5816 endif
5817" call Decho("tgtdir<".tgtdir.">")
5818
5819 if a:0 > 0
5820 let fromdir= a:1
5821 else
5822 let fromdir= getcwd()
5823 endif
5824" call Decho("fromdir<".fromdir.">")
5825
5826 if type(a:fname) == 1
5827 " handle uploading a single file using NetWrite
5828" call Decho("handle uploading a single file via NetWrite")
5829 1split
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005830" call Decho("exe e ".fnameescape(a:fname))
5831 exe "e ".fnameescape(a:fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005832" call Decho("now locally editing<".expand("%").">, has ".line("$")." lines")
5833 if a:tgt =~ '/$'
5834 let wfname= substitute(a:fname,'^.*/','','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00005835" call Decho("exe w! ".fnameescape(wfname))
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005836 exe "w! ".fnameescape(a:tgt.wfname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005837 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00005838" call Decho("writing local->remote: exe w ".fnameescape(a:tgt))
5839 exe "w ".fnameescape(a:tgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005840" call Decho("done writing local->remote")
5841 endif
5842 q!
5843
5844 elseif type(a:fname) == 3
5845 " handle uploading a list of files via scp
5846" call Decho("handle uploading a list of files via scp")
5847 let curdir= getcwd()
5848 if a:tgt =~ '^scp:'
Bram Moolenaaradc21822011-04-01 18:03:16 +02005849 exe "keepjumps sil lcd ".fnameescape(fromdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005850 let filelist= deepcopy(s:netrwmarkfilelist_{bufnr('%')})
5851 let args = join(map(filelist,"shellescape(v:val, 1)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005852 if exists("g:netrw_port") && g:netrw_port != ""
5853 let useport= " ".g:netrw_scpport." ".g:netrw_port
5854 else
5855 let useport= ""
5856 endif
5857 let machine = substitute(a:tgt,'^scp://\([^/:]\+\).*$','\1','')
5858 let tgt = substitute(a:tgt,'^scp://[^/]\+/\(.*\)$','\1','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00005859" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1))
5860 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1)
Bram Moolenaaradc21822011-04-01 18:03:16 +02005861 exe "keepjumps sil lcd ".fnameescape(curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005862
5863 elseif a:tgt =~ '^ftp:'
5864 call s:NetrwMethod(a:tgt)
5865
5866 if b:netrw_method == 2
5867 " handle uploading a list of files via ftp+.netrc
5868 let netrw_fname = b:netrw_fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005869 sil keepj new
Bram Moolenaar446cb832008-06-24 21:56:24 +00005870" call Decho("filter input window#".winnr())
5871
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005872 keepj put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +00005873" call Decho("filter input: ".getline('$'))
5874
5875 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005876 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00005877" call Decho("filter input: ".getline('$'))
5878 endif
5879
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005880 keepj call setline(line("$")+1,'lcd "'.fromdir.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005881" call Decho("filter input: ".getline('$'))
5882
Bram Moolenaaradc21822011-04-01 18:03:16 +02005883 if tgtdir == ""
5884 let tgtdir= '/'
5885 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005886 keepj call setline(line("$")+1,'cd "'.tgtdir.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005887" call Decho("filter input: ".getline('$'))
5888
5889 for fname in a:fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005890 keepj call setline(line("$")+1,'put "'.fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005891" call Decho("filter input: ".getline('$'))
5892 endfor
5893
5894 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02005895" call Decho("executing: ".s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
5896 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 +00005897 else
5898" call Decho("filter input window#".winnr())
Bram Moolenaaradc21822011-04-01 18:03:16 +02005899" call Decho("executing: ".s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
5900 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005901 endif
5902 " 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 +02005903 sil keepj g/Local directory now/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01005904 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005905 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
5906 call netrw#ErrorMsg(s:ERROR,getline(1),14)
5907 else
5908 bw!|q
5909 endif
5910
5911 elseif b:netrw_method == 3
5912 " upload with ftp + machine, id, passwd, and fname (ie. no .netrc)
5913 let netrw_fname= b:netrw_fname
Bram Moolenaaradc21822011-04-01 18:03:16 +02005914 keepj call s:SaveBufVars()|sil keepj new|keepj call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00005915 let tmpbufnr= bufnr("%")
5916 setlocal ff=unix
5917
5918 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005919 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00005920" call Decho("filter input: ".getline('$'))
5921 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005922 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00005923" call Decho("filter input: ".getline('$'))
5924 endif
5925
5926 if exists("g:netrw_ftp") && g:netrw_ftp == 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005927 keepj put =g:netrw_uid
Bram Moolenaar446cb832008-06-24 21:56:24 +00005928" call Decho("filter input: ".getline('$'))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005929 keepj call setline(line("$")+1,'"'.s:netrw_passwd.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005930" call Decho("filter input: ".getline('$'))
5931 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005932 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00005933" call Decho("filter input: ".getline('$'))
5934 endif
5935
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005936 keepj call setline(line("$")+1,'lcd "'.fromdir.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005937" call Decho("filter input: ".getline('$'))
5938
5939 if exists("b:netrw_fname") && b:netrw_fname != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005940 keepj call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005941" call Decho("filter input: ".getline('$'))
5942 endif
5943
5944 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005945 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00005946" call Decho("filter input: ".getline('$'))
5947 endif
5948
5949 for fname in a:fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005950 keepj call setline(line("$")+1,'put "'.fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005951" call Decho("filter input: ".getline('$'))
5952 endfor
5953
5954 " perform ftp:
5955 " -i : turns off interactive prompting from ftp
5956 " -n unix : DON'T use <.netrc>, even though it exists
5957 " -n win32: quit being obnoxious about password
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005958 keepj norm! 1Gdd
Bram Moolenaaradc21822011-04-01 18:03:16 +02005959" call Decho("executing: ".s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i -n")
5960 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i -n"
Bram Moolenaar446cb832008-06-24 21:56:24 +00005961 " 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 +02005962 sil keepj g/Local directory now/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01005963 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005964 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
5965 let debugkeep= &debug
5966 setlocal debug=msg
5967 call netrw#ErrorMsg(s:ERROR,getline(1),15)
5968 let &debug = debugkeep
5969 let mod = 1
5970 else
5971 bw!|q
5972 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01005973 elseif !exists("b:netrw_method") || b:netrw_method < 0
5974" call Dfunc("netrw#NetrwUpload : unsupported method")
5975 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00005976 endif
5977 else
5978 call netrw#ErrorMsg(s:ERROR,"can't obtain files with protocol from<".a:tgt.">",63)
5979 endif
5980 endif
5981
5982" call Dret("s:NetrwUpload")
5983endfun
5984
5985" ---------------------------------------------------------------------
5986" s:NetrwPreview: {{{2
5987fun! s:NetrwPreview(path) range
5988" call Dfunc("NetrwPreview(path<".a:path.">)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005989 keepj call s:NetrwOptionSave("s:")
5990 keepj call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00005991 if has("quickfix")
5992 if !isdirectory(a:path)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005993 if g:netrw_preview && !g:netrw_alto
5994 let pvhkeep= &pvh
5995 let &pvh = winwidth(0) - g:netrw_winsize
5996 endif
5997 exe (g:netrw_alto? "top " : "bot ").(g:netrw_preview? "vert " : "")."pedit ".fnameescape(a:path)
5998 if exists("pvhkeep")
5999 let &pvh= pvhkeep
6000 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006001 elseif !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006002 keepj call netrw#ErrorMsg(s:WARNING,"sorry, cannot preview a directory such as <".a:path.">",38)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006003 endif
6004 elseif !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006005 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 +00006006 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02006007 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006008" call Dret("NetrwPreview")
6009endfun
6010
6011" ---------------------------------------------------------------------
6012" s:NetrwRefresh: {{{2
6013fun! s:NetrwRefresh(islocal,dirname)
6014" call Dfunc("NetrwRefresh(islocal<".a:islocal.">,dirname=".a:dirname.") hide=".g:netrw_hide." sortdir=".g:netrw_sort_direction)
6015 " at the current time (Mar 19, 2007) all calls to NetrwRefresh() call NetrwBrowseChgDir() first.
6016 " NetrwBrowseChgDir() may clear the display; hence a NetrwSavePosn() may not work if its placed here.
6017 " Also, NetrwBrowseChgDir() now does a NetrwSavePosn() itself.
6018 setlocal ma noro
6019" call Decho("setlocal ma noro")
6020" call Decho("clear buffer<".expand("%")."> with :%d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006021 sil! keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00006022 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02006023 keepj call netrw#LocalBrowseCheck(a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006024 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02006025 keepj call s:NetrwBrowse(a:islocal,a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006026 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02006027 keepj call netrw#NetrwRestorePosn()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006028
6029 " restore file marks
6030 if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
6031" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
6032 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
6033 else
6034" call Decho("2match none")
6035 2match none
6036 endif
6037
6038" redraw!
6039" call Dret("NetrwRefresh")
6040endfun
6041
6042" ---------------------------------------------------------------------
6043" s:NetrwRefreshDir: refreshes a directory by name {{{2
6044" Called by NetrwMarkFileCopy()
6045" Interfaces to s:NetrwRefresh() and s:LocalBrowseShellCmdRefresh()
6046fun! s:NetrwRefreshDir(islocal,dirname)
6047" call Dfunc("s:NetrwRefreshDir(islocal=".a:islocal." dirname<".a:dirname.">) fastbrowse=".g:netrw_fastbrowse)
6048 if g:netrw_fastbrowse == 0
6049 " slowest mode (keep buffers refreshed, local or remote)
6050" call Decho("slowest mode: keep buffers refreshed, local or remote")
6051 let tgtwin= bufwinnr(a:dirname)
6052" call Decho("tgtwin= bufwinnr(".a:dirname.")=".tgtwin)
6053
6054 if tgtwin > 0
6055 " tgtwin is being displayed, so refresh it
6056 let curwin= winnr()
6057" call Decho("refresh tgtwin#".tgtwin." (curwin#".curwin.")")
6058 exe tgtwin."wincmd w"
Bram Moolenaaradc21822011-04-01 18:03:16 +02006059 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006060 exe curwin."wincmd w"
6061
6062 elseif bufnr(a:dirname) > 0
6063 let bn= bufnr(a:dirname)
6064" call Decho("bd bufnr(".a:dirname.")=".bn)
Bram Moolenaaradc21822011-04-01 18:03:16 +02006065 exe "sil bd ".bn
Bram Moolenaar446cb832008-06-24 21:56:24 +00006066 endif
6067
6068 elseif g:netrw_fastbrowse <= 1
6069" call Decho("medium-speed mode: refresh local buffers only")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006070 keepj call s:LocalBrowseShellCmdRefresh()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006071 endif
6072" call Dret("s:NetrwRefreshDir")
6073endfun
6074
6075" ---------------------------------------------------------------------
6076" s:NetrwSetSort: sets up the sort based on the g:netrw_sort_sequence {{{2
6077" What this function does is to compute a priority for the patterns
6078" in the g:netrw_sort_sequence. It applies a substitute to any
6079" "files" that satisfy each pattern, putting the priority / in
6080" front. An "*" pattern handles the default priority.
6081fun! s:NetrwSetSort()
6082" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
6083 if w:netrw_liststyle == s:LONGLIST
6084 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
6085 else
6086 let seqlist = g:netrw_sort_sequence
6087 endif
6088 " sanity check -- insure that * appears somewhere
6089 if seqlist == ""
6090 let seqlist= '*'
6091 elseif seqlist !~ '\*'
6092 let seqlist= seqlist.',*'
6093 endif
6094 let priority = 1
6095 while seqlist != ""
6096 if seqlist =~ ','
6097 let seq = substitute(seqlist,',.*$','','e')
6098 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
6099 else
6100 let seq = seqlist
6101 let seqlist = ""
6102 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006103 if priority < 10
Bram Moolenaar5c736222010-01-06 20:54:52 +01006104 let spriority= "00".priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00006105 elseif priority < 100
Bram Moolenaar5c736222010-01-06 20:54:52 +01006106 let spriority= "0".priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00006107 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01006108 let spriority= priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00006109 endif
6110" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
6111
6112 " sanity check
6113 if w:netrw_bannercnt > line("$")
6114 " apparently no files were left after a Hiding pattern was used
6115" call Dret("SetSort : no files left after hiding")
6116 return
6117 endif
6118 if seq == '*'
6119 let starpriority= spriority
6120 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006121 exe 'sil keepj '.w:netrw_bannercnt.',$g/'.seq.'/s/^/'.spriority.'/'
Bram Moolenaar5c736222010-01-06 20:54:52 +01006122 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006123 " sometimes multiple sorting patterns will match the same file or directory.
6124 " The following substitute is intended to remove the excess matches.
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006125 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 +02006126 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006127 endif
6128 let priority = priority + 1
6129 endwhile
6130 if exists("starpriority")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006131 exe 'sil keepj '.w:netrw_bannercnt.',$v/^\d\{3}'.g:netrw_sepchr.'/s/^/'.starpriority.'/'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006132 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006133 endif
6134
6135 " Following line associated with priority -- items that satisfy a priority
6136 " pattern get prefixed by ###/ which permits easy sorting by priority.
6137 " Sometimes files can satisfy multiple priority patterns -- only the latest
6138 " priority pattern needs to be retained. So, at this point, these excess
6139 " priority prefixes need to be removed, but not directories that happen to
6140 " be just digits themselves.
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006141 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 +02006142 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006143
6144" call Dret("SetSort")
6145endfun
6146
6147" =====================================================================
6148" s:NetrwSortStyle: change sorting style (name - time - size) and refresh display {{{2
6149fun! s:NetrwSortStyle(islocal)
6150" call Dfunc("s:NetrwSortStyle(islocal=".a:islocal.") netrw_sort_by<".g:netrw_sort_by.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006151 keepj call s:NetrwSaveWordPosn()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006152 let svpos= netrw#NetrwSavePosn()
6153
6154 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 +02006155 keepj norm! 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02006156 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
6157 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006158
6159" call Dret("s:NetrwSortStyle : netrw_sort_by<".g:netrw_sort_by.">")
6160endfun
6161
6162" ---------------------------------------------------------------------
6163" s:NetrwSplit: mode {{{2
6164" =0 : net and o
6165" =1 : net and t
6166" =2 : net and v
6167" =3 : local and o
6168" =4 : local and t
6169" =5 : local and v
6170fun! s:NetrwSplit(mode)
6171" call Dfunc("s:NetrwSplit(mode=".a:mode.") alto=".g:netrw_alto." altv=".g:netrw_altv)
6172
6173 call s:SaveWinVars()
6174
6175 if a:mode == 0
6176 " remote and o
6177" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s")
Bram Moolenaar251e1912011-06-19 05:09:16 +02006178 let winsz= (g:netrw_winsize*winheight(0))/100
6179 exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006180 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006181 keepj call s:RestoreWinVars()
6182 keepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006183 unlet s:didsplit
6184
6185 elseif a:mode == 1
6186 " remote and t
Bram Moolenaar5c736222010-01-06 20:54:52 +01006187 let newdir = s:NetrwBrowseChgDir(0,s:NetrwGetWord())
Bram Moolenaar446cb832008-06-24 21:56:24 +00006188" call Decho("tabnew")
6189 tabnew
6190 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006191 keepj call s:RestoreWinVars()
6192 keepj call s:NetrwBrowse(0,newdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006193 unlet s:didsplit
6194
6195 elseif a:mode == 2
6196 " remote and v
6197" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v")
Bram Moolenaar251e1912011-06-19 05:09:16 +02006198 let winsz= (g:netrw_winsize*winwidth(0))/100
6199 exe (g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006200 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006201 keepj call s:RestoreWinVars()
6202 keepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006203 unlet s:didsplit
6204
6205 elseif a:mode == 3
6206 " local and o
6207" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s")
Bram Moolenaar251e1912011-06-19 05:09:16 +02006208 let winsz= (g:netrw_winsize*winheight(0))/100
6209 exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006210 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006211 keepj call s:RestoreWinVars()
6212 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006213 unlet s:didsplit
6214
6215 elseif a:mode == 4
6216 " local and t
Bram Moolenaar446cb832008-06-24 21:56:24 +00006217 let cursorword = s:NetrwGetWord()
Bram Moolenaar5c736222010-01-06 20:54:52 +01006218 let netrw_curdir= s:NetrwTreeDir()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006219" call Decho("tabnew")
6220 tabnew
6221 let b:netrw_curdir= netrw_curdir
6222 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006223 keepj call s:RestoreWinVars()
6224 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,cursorword))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006225 unlet s:didsplit
6226
6227 elseif a:mode == 5
6228 " local and v
6229" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v")
Bram Moolenaar251e1912011-06-19 05:09:16 +02006230 let winsz= (g:netrw_winsize*winwidth(0))/100
6231 exe (g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006232 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006233 keepj call s:RestoreWinVars()
6234 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006235 unlet s:didsplit
6236
6237 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02006238 keepj call netrw#ErrorMsg(s:ERROR,"(NetrwSplit) unsupported mode=".a:mode,45)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006239 endif
6240
6241" call Dret("s:NetrwSplit")
6242endfun
6243
6244" ---------------------------------------------------------------------
6245" NetrwStatusLine: {{{2
6246fun! NetrwStatusLine()
6247
6248" vvv NetrwStatusLine() debugging vvv
6249" let g:stlmsg=""
6250" if !exists("w:netrw_explore_bufnr")
6251" let g:stlmsg="!X<explore_bufnr>"
6252" elseif w:netrw_explore_bufnr != bufnr("%")
6253" let g:stlmsg="explore_bufnr!=".bufnr("%")
6254" endif
6255" if !exists("w:netrw_explore_line")
6256" let g:stlmsg=" !X<explore_line>"
6257" elseif w:netrw_explore_line != line(".")
6258" let g:stlmsg=" explore_line!={line(.)<".line(".").">"
6259" endif
6260" if !exists("w:netrw_explore_list")
6261" let g:stlmsg=" !X<explore_list>"
6262" endif
6263" ^^^ NetrwStatusLine() debugging ^^^
6264
6265 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")
6266 " restore user's status line
6267 let &stl = s:netrw_users_stl
6268 let &laststatus = s:netrw_users_ls
6269 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
6270 if exists("w:netrw_explore_line") |unlet w:netrw_explore_line |endif
6271 return ""
6272 else
6273 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
6274 endif
6275endfun
6276
6277" ---------------------------------------------------------------------
6278" s:NetrwTreeDir: determine tree directory given current cursor position {{{2
6279" (full path directory with trailing slash returned)
6280fun! s:NetrwTreeDir()
6281" call Dfunc("NetrwTreeDir() curline#".line(".")."<".getline('.')."> b:netrw_curdir<".b:netrw_curdir."> tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%").">")
6282
6283 let treedir= b:netrw_curdir
6284" call Decho("set initial treedir<".treedir.">")
6285 let s:treecurpos= netrw#NetrwSavePosn()
6286
6287 if w:netrw_liststyle == s:TREELIST
6288" call Decho("w:netrrw_liststyle is TREELIST:")
6289" call Decho("line#".line(".")." getline(.)<".getline('.')."> treecurpos<".string(s:treecurpos).">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01006290
6291 " extract tree directory if on a line specifying a subdirectory (ie. ends with "/")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006292 if getline('.') =~ '/$'
6293 let treedir= substitute(getline('.'),'^\%(| \)*\([^|].\{-}\)$','\1','e')
6294 else
6295 let treedir= ""
6296 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006297" call Decho("treedir<".treedir.">")
6298
6299 " detect user attempting to close treeroot
6300 if getline('.') !~ '|' && getline('.') != '..'
6301" call Decho("user attempted to close treeroot")
6302 " now force a refresh
6303" call Decho("clear buffer<".expand("%")."> with :%d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006304 sil! keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00006305" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
6306 return b:netrw_curdir
6307 endif
6308
6309 " elide all non-depth information
6310 let depth = substitute(getline('.'),'^\(\%(| \)*\)[^|].\{-}$','\1','e')
Bram Moolenaar5c736222010-01-06 20:54:52 +01006311" call Decho("depth<".depth."> 1st subst (non-depth info removed)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006312
6313 " elide first depth
6314 let depth = substitute(depth,'^| ','','')
Bram Moolenaar5c736222010-01-06 20:54:52 +01006315" call Decho("depth<".depth."> 2nd subst (first depth removed)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006316
6317 " construct treedir by searching backwards at correct depth
6318" call Decho("constructing treedir<".treedir."> depth<".depth.">")
6319 while depth != "" && search('^'.depth.'[^|].\{-}/$','bW')
6320 let dirname= substitute(getline('.'),'^\(| \)*','','e')
6321 let treedir= dirname.treedir
6322 let depth = substitute(depth,'^| ','','')
6323" call Decho("constructing treedir<".treedir.">: dirname<".dirname."> while depth<".depth.">")
6324 endwhile
6325 if w:netrw_treetop =~ '/$'
6326 let treedir= w:netrw_treetop.treedir
6327 else
6328 let treedir= w:netrw_treetop.'/'.treedir
6329 endif
6330" call Decho("bufnr(.)=".bufnr("%")." line($)=".line("$")." line(.)=".line("."))
6331 endif
6332 let treedir= substitute(treedir,'//$','/','')
6333
Bram Moolenaar446cb832008-06-24 21:56:24 +00006334" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
6335 return treedir
6336endfun
6337
6338" ---------------------------------------------------------------------
6339" s:NetrwTreeDisplay: recursive tree display {{{2
6340fun! s:NetrwTreeDisplay(dir,depth)
6341" call Dfunc("NetrwTreeDisplay(dir<".a:dir."> depth<".a:depth.">)")
6342
6343 " insure that there are no folds
6344 setlocal nofen
6345
6346 " install ../ and shortdir
6347 if a:depth == ""
6348 call setline(line("$")+1,'../')
6349" call Decho("setline#".line("$")." ../ (depth is zero)")
6350 endif
6351 if a:dir =~ '^\a\+://'
6352 if a:dir == w:netrw_treetop
6353 let shortdir= a:dir
6354 else
6355 let shortdir= substitute(a:dir,'^.*/\([^/]\+\)/$','\1/','e')
6356 endif
6357 call setline(line("$")+1,a:depth.shortdir)
6358 else
6359 let shortdir= substitute(a:dir,'^.*/','','e')
6360 call setline(line("$")+1,a:depth.shortdir.'/')
6361 endif
6362" call Decho("setline#".line("$")." shortdir<".a:depth.shortdir.">")
6363
6364 " append a / to dir if its missing one
6365 let dir= a:dir
6366 if dir !~ '/$'
6367 let dir= dir.'/'
6368 endif
6369
6370 " display subtrees (if any)
6371 let depth= "| ".a:depth
6372
6373" call Decho("display subtrees with depth<".depth."> and current leaves")
6374 for entry in w:netrw_treedict[a:dir]
6375 let direntry= substitute(dir.entry,'/$','','e')
6376" call Decho("dir<".dir."> entry<".entry."> direntry<".direntry.">")
6377 if entry =~ '/$' && has_key(w:netrw_treedict,direntry)
6378" call Decho("<".direntry."> is a key in treedict - display subtree for it")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006379 keepj call s:NetrwTreeDisplay(direntry,depth)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006380 elseif entry =~ '/$' && has_key(w:netrw_treedict,direntry.'/')
6381" call Decho("<".direntry."/> is a key in treedict - display subtree for it")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006382 keepj call s:NetrwTreeDisplay(direntry.'/',depth)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006383 else
6384" call Decho("<".entry."> is not a key in treedict (no subtree)")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006385 sil! keepj call setline(line("$")+1,depth.entry)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006386 endif
6387 endfor
6388" call Dret("NetrwTreeDisplay")
6389endfun
6390
6391" ---------------------------------------------------------------------
6392" s:NetrwTreeListing: displays tree listing from treetop on down, using NetrwTreeDisplay() {{{2
6393fun! s:NetrwTreeListing(dirname)
6394 if w:netrw_liststyle == s:TREELIST
6395" call Dfunc("NetrwTreeListing() bufname<".expand("%").">")
6396" call Decho("curdir<".a:dirname.">")
6397" 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"))
6398
6399 " update the treetop
6400" call Decho("update the treetop")
6401 if !exists("w:netrw_treetop")
6402 let w:netrw_treetop= a:dirname
6403" call Decho("w:netrw_treetop<".w:netrw_treetop."> (reusing)")
6404 elseif (w:netrw_treetop =~ ('^'.a:dirname) && s:Strlen(a:dirname) < s:Strlen(w:netrw_treetop)) || a:dirname !~ ('^'.w:netrw_treetop)
6405 let w:netrw_treetop= a:dirname
6406" call Decho("w:netrw_treetop<".w:netrw_treetop."> (went up)")
6407 endif
6408
6409 " insure that we have at least an empty treedict
6410 if !exists("w:netrw_treedict")
6411 let w:netrw_treedict= {}
6412 endif
6413
6414 " update the directory listing for the current directory
6415" call Decho("updating dictionary with ".a:dirname.":[..directory listing..]")
6416" call Decho("bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006417 exe "sil! keepj ".w:netrw_bannercnt.',$g@^\.\.\=/$@d'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006418 let w:netrw_treedict[a:dirname]= getline(w:netrw_bannercnt,line("$"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006419" call Decho("w:treedict[".a:dirname."]= ".string(w:netrw_treedict[a:dirname]))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006420 exe "sil! keepj ".w:netrw_bannercnt.",$d"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006421
6422 " if past banner, record word
6423 if exists("w:netrw_bannercnt") && line(".") > w:netrw_bannercnt
6424 let fname= expand("<cword>")
6425 else
6426 let fname= ""
6427 endif
6428" call Decho("fname<".fname.">")
6429
6430 " display from treetop on down
Bram Moolenaaradc21822011-04-01 18:03:16 +02006431 keepj call s:NetrwTreeDisplay(w:netrw_treetop,"")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006432
6433" call Dret("NetrwTreeListing : bufname<".expand("%").">")
6434 endif
6435endfun
6436
6437" ---------------------------------------------------------------------
6438" s:NetrwWideListing: {{{2
6439fun! s:NetrwWideListing()
6440
6441 if w:netrw_liststyle == s:WIDELIST
6442" call Dfunc("NetrwWideListing() w:netrw_liststyle=".w:netrw_liststyle.' fo='.&fo.' l:fo='.&l:fo)
6443 " look for longest filename (cpf=characters per filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01006444 " cpf: characters per filename
6445 " fpl: filenames per line
6446 " fpc: filenames per column
Bram Moolenaar446cb832008-06-24 21:56:24 +00006447 setlocal ma noro
6448" call Decho("setlocal ma noro")
6449 let b:netrw_cpf= 0
6450 if line("$") >= w:netrw_bannercnt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006451 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 +02006452 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006453 else
6454" call Dret("NetrwWideListing")
6455 return
6456 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006457 let b:netrw_cpf= b:netrw_cpf + 2
6458" call Decho("b:netrw_cpf=max_filename_length+2=".b:netrw_cpf)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006459
6460 " determine qty files per line (fpl)
6461 let w:netrw_fpl= winwidth(0)/b:netrw_cpf
6462 if w:netrw_fpl <= 0
6463 let w:netrw_fpl= 1
6464 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006465" call Decho("fpl= [winwidth=".winwidth(0)."]/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006466
6467 " make wide display
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006468 exe 'sil keepj '.w:netrw_bannercnt.',$s/^.*$/\=escape(printf("%-'.b:netrw_cpf.'s",submatch(0)),"\\")/'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006469 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006470 let fpc = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl
6471 let newcolstart = w:netrw_bannercnt + fpc
6472 let newcolend = newcolstart + fpc - 1
6473" call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006474 sil! let keepregstar = @*
Bram Moolenaar446cb832008-06-24 21:56:24 +00006475 while line("$") >= newcolstart
6476 if newcolend > line("$") | let newcolend= line("$") | endif
6477 let newcolqty= newcolend - newcolstart
6478 exe newcolstart
6479 if newcolqty == 0
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006480 exe "sil! keepj norm! 0\<c-v>$hx".w:netrw_bannercnt."G$p"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006481 else
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006482 exe "sil! keepj norm! 0\<c-v>".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006483 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006484 exe "sil! keepj ".newcolstart.','.newcolend.'d'
6485 exe 'sil! keepj '.w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006486 endwhile
Bram Moolenaaradc21822011-04-01 18:03:16 +02006487 sil! let @*= keepregstar
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006488 exe "sil! keepj ".w:netrw_bannercnt.',$s/\s\+$//e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006489 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006490 setlocal noma nomod ro
6491" call Dret("NetrwWideListing")
6492 endif
6493
6494endfun
6495
6496" ---------------------------------------------------------------------
6497" s:PerformListing: {{{2
6498fun! s:PerformListing(islocal)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006499" call Dfunc("s:PerformListing(islocal=".a:islocal.") bufnr(%)=".bufnr("%")."<".bufname("%").">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006500
Bram Moolenaaradc21822011-04-01 18:03:16 +02006501 keepj call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006502 setlocal noro ma
6503" call Decho("setlocal noro ma")
6504
6505" if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 " Decho
6506" call Decho("(netrw) Processing your browsing request...")
6507" endif " Decho
6508
6509" call Decho('w:netrw_liststyle='.(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a'))
6510 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
6511 " force a refresh for tree listings
6512" call Decho("force refresh for treelisting: clear buffer<".expand("%")."> with :%d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006513 sil! keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00006514 endif
6515
6516 " save current directory on directory history list
Bram Moolenaaradc21822011-04-01 18:03:16 +02006517 keepj call s:NetrwBookHistHandler(3,b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006518
6519 " Set up the banner {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01006520 if g:netrw_banner
6521" call Decho("set up banner")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006522 keepj call setline(1,'" ============================================================================')
6523 keepj call setline(2,'" Netrw Directory Listing (netrw '.g:loaded_netrw.')')
6524 keepj call setline(3,'" '.b:netrw_curdir)
Bram Moolenaar5c736222010-01-06 20:54:52 +01006525 let w:netrw_bannercnt= 3
Bram Moolenaaradc21822011-04-01 18:03:16 +02006526 keepj exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01006527 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006528 keepj 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01006529 let w:netrw_bannercnt= 1
6530 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006531
6532 let sortby= g:netrw_sort_by
6533 if g:netrw_sort_direction =~ "^r"
6534 let sortby= sortby." reversed"
6535 endif
6536
6537 " Sorted by... {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01006538 if g:netrw_banner
6539" call Decho("handle specified sorting: g:netrw_sort_by<".g:netrw_sort_by.">")
6540 if g:netrw_sort_by =~ "^n"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006541" call Decho("directories will be sorted by name")
Bram Moolenaar5c736222010-01-06 20:54:52 +01006542 " sorted by name
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006543 keepj put ='\" Sorted by '.sortby
6544 keepj put ='\" Sort sequence: '.g:netrw_sort_sequence
Bram Moolenaar5c736222010-01-06 20:54:52 +01006545 let w:netrw_bannercnt= w:netrw_bannercnt + 2
6546 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00006547" call Decho("directories will be sorted by size or time")
Bram Moolenaar5c736222010-01-06 20:54:52 +01006548 " sorted by size or date
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006549 keepj put ='\" Sorted by '.sortby
Bram Moolenaar5c736222010-01-06 20:54:52 +01006550 let w:netrw_bannercnt= w:netrw_bannercnt + 1
6551 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006552 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006553 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006554
6555 " show copy/move target, if any
Bram Moolenaar5c736222010-01-06 20:54:52 +01006556 if g:netrw_banner
6557 if exists("s:netrwmftgt") && exists("s:netrwmftgt_islocal")
6558" call Decho("show copy/move target<".s:netrwmftgt.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006559 keepj put =''
Bram Moolenaar5c736222010-01-06 20:54:52 +01006560 if s:netrwmftgt_islocal
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006561 sil! keepj call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (local)')
Bram Moolenaar5c736222010-01-06 20:54:52 +01006562 else
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006563 sil! keepj call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (remote)')
Bram Moolenaar5c736222010-01-06 20:54:52 +01006564 endif
6565 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00006566 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01006567" call Decho("s:netrwmftgt does not exist, don't make Copy/Move Tgt")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006568 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006569 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006570 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006571
6572 " Hiding... -or- Showing... {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01006573 if g:netrw_banner
6574" call Decho("handle hiding/showing (g:netrw_hide=".g:netrw_list_hide." g:netrw_list_hide<".g:netrw_list_hide.">)")
6575 if g:netrw_list_hide != "" && g:netrw_hide
6576 if g:netrw_hide == 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006577 keepj put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaar5c736222010-01-06 20:54:52 +01006578 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006579 keepj put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaar5c736222010-01-06 20:54:52 +01006580 endif
6581 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00006582 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006583 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006584 keepj put ='\" Quick Help: <F1>:help -:go up dir D:delete R:rename s:sort-by x:exec'
6585 keepj put ='\" ============================================================================'
Bram Moolenaar5c736222010-01-06 20:54:52 +01006586 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00006587 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006588
6589 " bannercnt should index the line just after the banner
Bram Moolenaar5c736222010-01-06 20:54:52 +01006590 if g:netrw_banner
6591 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006592 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01006593" call Decho("bannercnt=".w:netrw_bannercnt." (should index line just after banner) line($)=".line("$"))
6594 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006595
6596 " set up syntax highlighting {{{3
6597" call Decho("set up syntax highlighting")
6598 if has("syntax")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006599 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaaradc21822011-04-01 18:03:16 +02006600" call Decho("but g:syntax_on".(exists("g:syntax_on")? "=".g:syntax_on : "<doesn't exist>"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006601 setlocal ft=
Bram Moolenaaradc21822011-04-01 18:03:16 +02006602 elseif &ft != "netrw"
6603 setlocal ft=netrw
Bram Moolenaar446cb832008-06-24 21:56:24 +00006604 endif
6605 endif
6606
6607 " get list of files
6608" call Decho("Get list of files - islocal=".a:islocal)
6609 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02006610 keepj call s:LocalListing()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006611 else " remote
Bram Moolenaaradc21822011-04-01 18:03:16 +02006612 keepj call s:NetrwRemoteListing()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006613 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006614" call Decho("g:netrw_banner=".g:netrw_banner." w:netrw_bannercnt=".w:netrw_bannercnt." (banner complete)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006615
6616 " manipulate the directory listing (hide, sort) {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01006617 if !g:netrw_banner || line("$") >= w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006618" call Decho("manipulate directory listing (hide)")
6619" call Decho("g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">")
6620 if g:netrw_hide && g:netrw_list_hide != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02006621 keepj call s:NetrwListHide()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006622 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006623 if !g:netrw_banner || line("$") >= w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006624" call Decho("manipulate directory listing (sort) : g:netrw_sort_by<".g:netrw_sort_by.">")
6625
6626 if g:netrw_sort_by =~ "^n"
6627 " sort by name
Bram Moolenaaradc21822011-04-01 18:03:16 +02006628 keepj call s:NetrwSetSort()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006629
Bram Moolenaar5c736222010-01-06 20:54:52 +01006630 if !g:netrw_banner || w:netrw_bannercnt < line("$")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006631" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction." (bannercnt=".w:netrw_bannercnt.")")
6632 if g:netrw_sort_direction =~ 'n'
6633 " normal direction sorting
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006634 exe 'sil keepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00006635 else
6636 " reverse direction sorting
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006637 exe 'sil keepj '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00006638 endif
6639 endif
6640 " remove priority pattern prefix
6641" call Decho("remove priority pattern prefix")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006642 exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\d\{3}'.g:netrw_sepchr.'//e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006643 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006644
6645 elseif a:islocal
Bram Moolenaar5c736222010-01-06 20:54:52 +01006646 if !g:netrw_banner || w:netrw_bannercnt < line("$")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006647" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction)
6648 if g:netrw_sort_direction =~ 'n'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006649" call Decho('exe sil keepjumps '.w:netrw_bannercnt.',$sort')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006650 exe 'sil! keepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00006651 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02006652" call Decho('exe sil keepjumps '.w:netrw_bannercnt.',$sort!')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006653 exe 'sil! keepj '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00006654 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006655 exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006656 keepj call histdel("/",-1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01006657 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006658 endif
6659
6660 elseif g:netrw_sort_direction =~ 'r'
6661" call Decho('reverse the sorted listing')
Bram Moolenaar5c736222010-01-06 20:54:52 +01006662 if !g:netrw_banner || w:netrw_bannercnt < line('$')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006663 exe 'sil! keepj '.w:netrw_bannercnt.',$g/^/m '.w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01006664 call histdel("/",-1)
6665 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006666 endif
6667 endif
6668
6669 " convert to wide/tree listing {{{3
6670" call Decho("modify display if wide/tree listing style")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006671 keepj call s:NetrwWideListing()
6672 keepj call s:NetrwTreeListing(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006673
Bram Moolenaar5c736222010-01-06 20:54:52 +01006674 if exists("w:netrw_bannercnt") && (line("$") > w:netrw_bannercnt || !g:netrw_banner)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006675 " place cursor on the top-left corner of the file listing
6676" call Decho("place cursor on top-left corner of file listing")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006677 exe 'sil! keepj '.w:netrw_bannercnt
6678 sil! keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00006679 endif
6680
6681 " record previous current directory
6682 let w:netrw_prvdir= b:netrw_curdir
6683" call Decho("record netrw_prvdir<".w:netrw_prvdir.">")
6684
6685 " save certain window-oriented variables into buffer-oriented variables {{{3
Bram Moolenaaradc21822011-04-01 18:03:16 +02006686 keepj call s:SetBufWinVars()
6687 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006688
6689 " set display to netrw display settings
6690" call Decho("set display to netrw display settings (noma nomod etc)")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006691 exe "setl ".g:netrw_bufsettings
Bram Moolenaar446cb832008-06-24 21:56:24 +00006692 if exists("s:treecurpos")
6693
Bram Moolenaaradc21822011-04-01 18:03:16 +02006694 keepj call netrw#NetrwRestorePosn(s:treecurpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006695 unlet s:treecurpos
6696 endif
6697
6698" call Dret("s:PerformListing : curpos<".string(getpos(".")).">")
6699endfun
6700
6701" ---------------------------------------------------------------------
6702" s:SetupNetrwStatusLine: {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00006703fun! s:SetupNetrwStatusLine(statline)
6704" call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)")
6705
6706 if !exists("s:netrw_setup_statline")
6707 let s:netrw_setup_statline= 1
6708" call Decho("do first-time status line setup")
6709
6710 if !exists("s:netrw_users_stl")
6711 let s:netrw_users_stl= &stl
6712 endif
6713 if !exists("s:netrw_users_ls")
6714 let s:netrw_users_ls= &laststatus
6715 endif
6716
6717 " set up User9 highlighting as needed
6718 let keepa= @a
6719 redir @a
6720 try
6721 hi User9
6722 catch /^Vim\%((\a\+)\)\=:E411/
6723 if &bg == "dark"
6724 hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue
6725 else
6726 hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue
6727 endif
6728 endtry
6729 redir END
6730 let @a= keepa
6731 endif
6732
6733 " set up status line (may use User9 highlighting)
6734 " insure that windows have a statusline
6735 " make sure statusline is displayed
6736 let &stl=a:statline
6737 setlocal laststatus=2
6738" call Decho("stl=".&stl)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006739 redraw
Bram Moolenaar9964e462007-05-05 17:54:07 +00006740
6741" call Dret("SetupNetrwStatusLine : stl=".&stl)
6742endfun
6743
6744" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00006745" Remote Directory Browsing Support: {{{1
6746" ===========================================
Bram Moolenaar9964e462007-05-05 17:54:07 +00006747
6748" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00006749" s:NetrwRemoteListing: {{{2
6750fun! s:NetrwRemoteListing()
6751" call Dfunc("s:NetrwRemoteListing() b:netrw_curdir<".b:netrw_curdir.">)")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00006752
Bram Moolenaar446cb832008-06-24 21:56:24 +00006753 call s:RemotePathAnalysis(b:netrw_curdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00006754
Bram Moolenaar446cb832008-06-24 21:56:24 +00006755 " sanity check:
6756 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
6757" call Decho("b:netrw_method=".b:netrw_method)
6758 if !executable("ftp")
6759 if !exists("g:netrw_quiet")
6760 call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ftp",18)
6761 endif
6762 call s:NetrwOptionRestore("w:")
6763" call Dret("s:NetrwRemoteListing")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00006764 return
6765 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006766
6767 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
6768 if !exists("g:netrw_quiet")
6769 if g:netrw_list_cmd == ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02006770 keepj call netrw#ErrorMsg(s:ERROR,g:netrw_ssh_cmd." is not executable on your system",47)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006771 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02006772 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 +00006773 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00006774 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00006775
Bram Moolenaaradc21822011-04-01 18:03:16 +02006776 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006777" call Dret("s:NetrwRemoteListing")
6778 return
6779 endif " (remote handling sanity check)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00006780
Bram Moolenaar446cb832008-06-24 21:56:24 +00006781 if exists("b:netrw_method")
6782" call Decho("setting w:netrw_method<".b:netrw_method.">")
6783 let w:netrw_method= b:netrw_method
6784 endif
6785
6786 if s:method == "ftp"
Bram Moolenaaradc21822011-04-01 18:03:16 +02006787 " use ftp to get remote file listing {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00006788" call Decho("use ftp to get remote file listing")
6789 let s:method = "ftp"
6790 let listcmd = g:netrw_ftp_list_cmd
6791 if g:netrw_sort_by =~ '^t'
6792 let listcmd= g:netrw_ftp_timelist_cmd
6793 elseif g:netrw_sort_by =~ '^s'
6794 let listcmd= g:netrw_ftp_sizelist_cmd
6795 endif
6796" call Decho("listcmd<".listcmd."> (using g:netrw_ftp_list_cmd)")
6797 call s:NetrwRemoteFtpCmd(s:path,listcmd)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006798" exe "sil! keepalt keepj ".w:netrw_bannercnt.',$g/^./call Decho("raw listing: ".getline("."))'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006799
6800 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
6801 " shorten the listing
6802" call Decho("generate short listing")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006803 exe "sil! keepalt keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006804
6805 " cleanup
6806 if g:netrw_ftp_browse_reject != ""
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006807 exe "sil! keepalt keepj g/".g:netrw_ftp_browse_reject."/keepj d"
Bram Moolenaaradc21822011-04-01 18:03:16 +02006808 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006809 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006810 sil! keepj %s/\r$//e
Bram Moolenaaradc21822011-04-01 18:03:16 +02006811 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006812
6813 " if there's no ../ listed, then put ./ and ../ in
6814 let line1= line(".")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006815 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006816 let line2= search('^\.\.\/\%(\s\|$\)','cnW')
6817 if line2 == 0
6818" call Decho("netrw is putting ./ and ../ into listing")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006819 sil! keepj put='../'
6820 sil! keepj put='./'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006821 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006822 exe "sil! keepj ".line1
6823 sil! keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00006824
6825" call Decho("line1=".line1." line2=".line2." line(.)=".line("."))
6826 if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
6827" call Decho("M$ ftp cleanup")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006828 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 +02006829 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006830 else " normal ftp cleanup
6831" call Decho("normal ftp cleanup")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006832 exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
6833 exe "sil! keepj ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
6834 exe "sil! keepj ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006835 keepj call histdel("/",-1)
6836 keepj call histdel("/",-1)
6837 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006838 endif
6839 endif
6840
6841 else
6842 " use ssh to get remote file listing {{{3
6843" call Decho("use ssh to get remote file listing: s:path<".s:path.">")
6844 let listcmd= s:MakeSshCmd(g:netrw_list_cmd)
6845" call Decho("listcmd<".listcmd."> (using g:netrw_list_cmd)")
6846 if g:netrw_scp_cmd =~ '^pscp'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006847" call Decho("1: exe sil r! ".shellescape(listcmd.s:path, 1))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006848 exe "sil! keepj r! ".listcmd.shellescape(s:path, 1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006849 " remove rubbish and adjust listing format of 'pscp' to 'ssh ls -FLa' like
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006850 sil! keepj g/^Listing directory/keepj d
6851 sil! keepj g/^d[-rwx][-rwx][-rwx]/keepj s+$+/+e
6852 sil! keepj g/^l[-rwx][-rwx][-rwx]/keepj s+$+@+e
Bram Moolenaaradc21822011-04-01 18:03:16 +02006853 keepj call histdel("/",-1)
6854 keepj call histdel("/",-1)
6855 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006856 if g:netrw_liststyle != s:LONGLIST
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006857 sil! keepj g/^[dlsp-][-rwx][-rwx][-rwx]/keepj s/^.*\s\(\S\+\)$/\1/e
Bram Moolenaaradc21822011-04-01 18:03:16 +02006858 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006859 endif
6860 else
6861 if s:path == ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02006862" call Decho("2: exe sil r! ".listcmd)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006863 exe "sil! keepalt r! ".listcmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00006864 else
Bram Moolenaar251e1912011-06-19 05:09:16 +02006865" call Decho("3: exe sil r! ".listcmd.' '.shellescape(fnameescape(s:path),1))
6866 exe "sil! keepalt r! ".listcmd.' '.shellescape(fnameescape(s:path),1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006867" call Decho("listcmd<".listcmd."> path<".s:path.">")
6868 endif
6869 endif
6870
6871 " cleanup
6872 if g:netrw_ftp_browse_reject != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02006873" call Decho("(cleanup) exe sil! g/".g:netrw_ssh_browse_reject."/keepjumps d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006874 exe "sil! g/".g:netrw_ssh_browse_reject."/keepj d"
Bram Moolenaaradc21822011-04-01 18:03:16 +02006875 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006876 endif
6877 endif
6878
6879 if w:netrw_liststyle == s:LONGLIST
6880 " do a long listing; these substitutions need to be done prior to sorting {{{3
6881" call Decho("fix long listing:")
6882
6883 if s:method == "ftp"
6884 " cleanup
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006885 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006886 while getline('.') =~ g:netrw_ftp_browse_reject
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006887 sil! keepj d
Bram Moolenaar446cb832008-06-24 21:56:24 +00006888 endwhile
6889 " if there's no ../ listed, then put ./ and ../ in
6890 let line1= line(".")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006891 sil! keepj 1
6892 sil! keepj call search('^\.\.\/\%(\s\|$\)','W')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006893 let line2= line(".")
6894 if line2 == 0
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006895 exe 'sil! keepj '.w:netrw_bannercnt."put='./'"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006896 if b:netrw_curdir != '/'
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006897 exe 'sil! keepj '.w:netrw_bannercnt."put='../'"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006898 endif
6899 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006900 exe "sil! keepj ".line1
6901 sil! keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00006902 endif
6903
6904 if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
6905" call Decho("M$ ftp site listing cleanup")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006906 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 +00006907 elseif exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$")
6908" call Decho("normal ftp site listing cleanup: bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006909 exe 'sil keepj '.w:netrw_bannercnt.',$s/ -> .*$//e'
6910 exe 'sil keepj '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
6911 exe 'sil keepj '.w:netrw_bannercnt
Bram Moolenaaradc21822011-04-01 18:03:16 +02006912 keepj call histdel("/",-1)
6913 keepj call histdel("/",-1)
6914 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006915 endif
6916 endif
6917
6918" if exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$") " Decho
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006919" exe "keepj ".w:netrw_bannercnt.',$g/^./call Decho("listing: ".getline("."))'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006920" endif " Decho
6921" call Dret("s:NetrwRemoteListing")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00006922endfun
6923
Bram Moolenaar446cb832008-06-24 21:56:24 +00006924" ---------------------------------------------------------------------
6925" s:NetrwRemoteRm: remove/delete a remote file or directory {{{2
6926fun! s:NetrwRemoteRm(usrhost,path) range
6927" call Dfunc("s:NetrwRemoteRm(usrhost<".a:usrhost."> path<".a:path.">) virtcol=".virtcol("."))
6928" call Decho("firstline=".a:firstline." lastline=".a:lastline)
6929 let svpos= netrw#NetrwSavePosn()
6930
6931 let all= 0
6932 if exists("s:netrwmarkfilelist_{bufnr('%')}")
6933 " remove all marked files
Bram Moolenaar5c736222010-01-06 20:54:52 +01006934" call Decho("remove all marked files with bufnr#".bufnr("%"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006935 for fname in s:netrwmarkfilelist_{bufnr("%")}
6936 let ok= s:NetrwRemoteRmFile(a:path,fname,all)
6937 if ok =~ 'q\%[uit]'
6938 break
6939 elseif ok =~ 'a\%[ll]'
6940 let all= 1
6941 endif
6942 endfor
Bram Moolenaar5c736222010-01-06 20:54:52 +01006943 call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006944
6945 else
6946 " remove files specified by range
Bram Moolenaar5c736222010-01-06 20:54:52 +01006947" call Decho("remove files specified by range")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006948
6949 " preparation for removing multiple files/directories
6950 let ctr= a:firstline
6951
6952 " remove multiple files and directories
6953 while ctr <= a:lastline
6954 exe ctr
6955 let ok= s:NetrwRemoteRmFile(a:path,s:NetrwGetWord(),all)
6956 if ok =~ 'q\%[uit]'
6957 break
6958 elseif ok =~ 'a\%[ll]'
6959 let all= 1
6960 endif
6961 let ctr= ctr + 1
6962 endwhile
6963 endif
6964
6965 " refresh the (remote) directory listing
6966" call Decho("refresh remote directory listing")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006967 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
6968 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006969
6970" call Dret("s:NetrwRemoteRm")
6971endfun
6972
6973" ---------------------------------------------------------------------
6974" s:NetrwRemoteRmFile: {{{2
6975fun! s:NetrwRemoteRmFile(path,rmfile,all)
6976" call Dfunc("s:NetrwRemoteRmFile(path<".a:path."> rmfile<".a:rmfile.">) all=".a:all)
6977
6978 let all= a:all
6979 let ok = ""
6980
6981 if a:rmfile !~ '^"' && (a:rmfile =~ '@$' || a:rmfile !~ '[\/]$')
6982 " attempt to remove file
6983" call Decho("attempt to remove file (all=".all.")")
6984 if !all
6985 echohl Statement
6986" call Decho("case all=0:")
6987 call inputsave()
6988 let ok= input("Confirm deletion of file<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
6989 call inputrestore()
6990 echohl NONE
6991 if ok == ""
6992 let ok="no"
6993 endif
6994 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
6995 if ok =~ 'a\%[ll]'
6996 let all= 1
6997 endif
6998 endif
6999
7000 if all || ok =~ 'y\%[es]' || ok == ""
7001" call Decho("case all=".all." or ok<".ok.">".(exists("w:netrw_method")? ': netrw_method='.w:netrw_method : ""))
7002 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
7003" call Decho("case ftp:")
7004 let path= a:path
7005 if path =~ '^\a\+://'
7006 let path= substitute(path,'^\a\+://[^/]\+/','','')
7007 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007008 sil! keepj .,$d
Bram Moolenaar446cb832008-06-24 21:56:24 +00007009 call s:NetrwRemoteFtpCmd(path,"delete ".'"'.a:rmfile.'"')
7010 else
7011" call Decho("case ssh: g:netrw_rm_cmd<".g:netrw_rm_cmd.">")
7012 let netrw_rm_cmd= s:MakeSshCmd(g:netrw_rm_cmd)
7013" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">")
7014 if !exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007015 keepj call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007016 let ok="q"
7017 else
7018 let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
7019" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">")
7020" call Decho("remotedir<".remotedir.">")
7021" call Decho("rmfile<".a:rmfile.">")
7022 if remotedir != ""
7023 let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(remotedir.a:rmfile))
7024 else
7025 let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(a:rmfile))
7026 endif
7027" call Decho("call system(".netrw_rm_cmd.")")
7028 let ret= system(netrw_rm_cmd)
7029 if ret != 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02007030 keepj call netrw#ErrorMsg(s:WARNING,"cmd<".netrw_rm_cmd."> failed",60)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007031 endif
7032" call Decho("returned=".ret." errcode=".v:shell_error)
7033 endif
7034 endif
7035 elseif ok =~ 'q\%[uit]'
7036" call Decho("ok==".ok)
7037 break
7038 endif
7039
7040 else
7041 " attempt to remove directory
7042" call Decho("attempt to remove directory")
7043 if !all
7044 call inputsave()
7045 let ok= input("Confirm deletion of directory<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
7046 call inputrestore()
7047 if ok == ""
7048 let ok="no"
7049 endif
7050 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
7051 if ok =~ 'a\%[ll]'
7052 let all= 1
7053 endif
7054 endif
7055
7056 if all || ok =~ 'y\%[es]' || ok == ""
7057 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaaradc21822011-04-01 18:03:16 +02007058 keepj call s:NetrwRemoteFtpCmd(a:path,"rmdir ".a:rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007059 else
7060 let rmfile = substitute(a:path.a:rmfile,'/$','','')
Bram Moolenaar5c736222010-01-06 20:54:52 +01007061 let netrw_rmdir_cmd = s:MakeSshCmd(netrw#WinPath(g:netrw_rmdir_cmd)).' '.shellescape(netrw#WinPath(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007062" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
Bram Moolenaarc236c162008-07-13 17:41:49 +00007063 let ret= system(netrw_rmdir_cmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007064" call Decho("returned=".ret." errcode=".v:shell_error)
7065
7066 if v:shell_error != 0
Bram Moolenaarc236c162008-07-13 17:41:49 +00007067" call Decho("v:shell_error not 0")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007068 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 +00007069" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
7070 let ret= system(netrw_rmf_cmd)
7071" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007072
7073 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007074 keepj call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",22)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007075 endif
7076 endif
7077 endif
7078
7079 elseif ok =~ 'q\%[uit]'
7080 break
7081 endif
7082 endif
7083
7084" call Dret("s:NetrwRemoteRmFile ".ok)
7085 return ok
7086endfun
7087
7088" ---------------------------------------------------------------------
7089" s:NetrwRemoteFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
7090" This function assumes that a long listing will be received. Size, time,
7091" and reverse sorts will be requested of the server but not otherwise
7092" enforced here.
7093fun! s:NetrwRemoteFtpCmd(path,listcmd)
7094" call Dfunc("NetrwRemoteFtpCmd(path<".a:path."> listcmd<".a:listcmd.">) netrw_method=".w:netrw_method)
7095" call Decho("line($)=".line("$")." bannercnt=".w:netrw_bannercnt)
7096
7097 " because WinXX ftp uses unix style input
7098 let ffkeep= &ff
7099 setlocal ma ff=unix noro
7100" call Decho("setlocal ma ff=unix noro")
7101
7102 " clear off any older non-banner lines
7103 " note that w:netrw_bannercnt indexes the line after the banner
Bram Moolenaaradc21822011-04-01 18:03:16 +02007104" call Decho('exe sil! keepjumps '.w:netrw_bannercnt.",$d (clear off old non-banner lines)")
7105 exe "sil! keepjumps ".w:netrw_bannercnt.",$d"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007106
7107 ".........................................
7108 if w:netrw_method == 2 || w:netrw_method == 5
7109 " ftp + <.netrc>: Method #2
7110 if a:path != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007111 keepj put ='cd \"'.a:path.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007112 endif
7113 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007114 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00007115" call Decho("filter input: ".getline('.'))
7116 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02007117 keepj call setline(line("$")+1,a:listcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007118" exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
7119 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02007120" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
7121 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 +00007122 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02007123" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
7124 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 +00007125 endif
7126
7127 ".........................................
7128 elseif w:netrw_method == 3
7129 " ftp + machine,id,passwd,filename: Method #3
7130 setlocal ff=unix
7131 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007132 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00007133 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007134 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00007135 endif
7136
7137 if exists("g:netrw_ftp") && g:netrw_ftp == 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007138 keepj put =g:netrw_uid
7139 keepj put ='\"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007140 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007141 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007142 endif
7143
7144 if a:path != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007145 keepj put ='cd \"'.a:path.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007146 endif
7147 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007148 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00007149" call Decho("filter input: ".getline('.'))
7150 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007151 keepj call setline(line("$")+1,a:listcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007152
7153 " perform ftp:
7154 " -i : turns off interactive prompting from ftp
7155 " -n unix : DON'T use <.netrc>, even though it exists
7156 " -n win32: quit being obnoxious about password
7157" exe w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007158" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i -n")
7159 exe s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i -n"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007160
7161 ".........................................
7162 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02007163 keepj call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",23)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007164 endif
7165
7166 " cleanup for Windows
7167 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007168 sil! keepj %s/\r$//e
Bram Moolenaaradc21822011-04-01 18:03:16 +02007169 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007170 endif
7171 if a:listcmd == "dir"
7172 " infer directory/link based on the file permission string
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007173 sil! keepj g/d\%([-r][-w][-x]\)\{3}/keepj s@$@/@
7174 sil! keepj g/l\%([-r][-w][-x]\)\{3}/keepj s/$/@/
Bram Moolenaaradc21822011-04-01 18:03:16 +02007175 keepj call histdel("/",-1)
7176 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007177 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007178 exe "sil! keepj ".w:netrw_bannercnt.',$s/^\%(\S\+\s\+\)\{8}//e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007179 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007180 endif
7181 endif
7182
7183 " ftp's listing doesn't seem to include ./ or ../
7184 if !search('^\.\/$\|\s\.\/$','wn')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007185 exe 'keepj '.w:netrw_bannercnt
7186 keepj put ='./'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007187 endif
7188 if !search('^\.\.\/$\|\s\.\.\/$','wn')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007189 exe 'keepj '.w:netrw_bannercnt
7190 keepj put ='../'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007191 endif
7192
7193 " restore settings
7194 let &ff= ffkeep
7195" call Dret("NetrwRemoteFtpCmd")
7196endfun
7197
7198" ---------------------------------------------------------------------
7199" s:NetrwRemoteRename: rename a remote file or directory {{{2
7200fun! s:NetrwRemoteRename(usrhost,path) range
7201" call Dfunc("NetrwRemoteRename(usrhost<".a:usrhost."> path<".a:path.">)")
7202
7203 " preparation for removing multiple files/directories
7204 let svpos = netrw#NetrwSavePosn()
7205 let ctr = a:firstline
7206 let rename_cmd = s:MakeSshCmd(g:netrw_rename_cmd)
7207
7208 " rename files given by the markfilelist
7209 if exists("s:netrwmarkfilelist_{bufnr('%')}")
7210 for oldname in s:netrwmarkfilelist_{bufnr("%")}
7211" call Decho("oldname<".oldname.">")
7212 if exists("subfrom")
7213 let newname= substitute(oldname,subfrom,subto,'')
7214" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
7215 else
7216 call inputsave()
7217 let newname= input("Moving ".oldname." to : ",oldname)
7218 call inputrestore()
7219 if newname =~ '^s/'
7220 let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
7221 let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
7222 let newname = substitute(oldname,subfrom,subto,'')
7223" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
7224 endif
7225 endif
7226
7227 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaaradc21822011-04-01 18:03:16 +02007228 keepj call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007229 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00007230 let oldname= shellescape(a:path.oldname)
7231 let newname= shellescape(a:path.newname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007232" call Decho("system(netrw#WinPath(".rename_cmd.") ".oldname.' '.newname.")")
7233 let ret = system(netrw#WinPath(rename_cmd).' '.oldname.' '.newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007234 endif
7235
7236 endfor
7237 call s:NetrwUnMarkFile(1)
7238
7239 else
7240
7241 " attempt to rename files/directories
7242 while ctr <= a:lastline
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007243 exe "keepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00007244
7245 let oldname= s:NetrwGetWord()
7246" call Decho("oldname<".oldname.">")
7247
7248 call inputsave()
7249 let newname= input("Moving ".oldname." to : ",oldname)
7250 call inputrestore()
7251
7252 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
7253 call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
7254 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00007255 let oldname= shellescape(a:path.oldname)
7256 let newname= shellescape(a:path.newname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007257" call Decho("system(netrw#WinPath(".rename_cmd.") ".oldname.' '.newname.")")
7258 let ret = system(netrw#WinPath(rename_cmd).' '.oldname.' '.newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007259 endif
7260
7261 let ctr= ctr + 1
7262 endwhile
7263 endif
7264
7265 " refresh the directory
Bram Moolenaaradc21822011-04-01 18:03:16 +02007266 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
7267 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007268
7269" call Dret("NetrwRemoteRename")
7270endfun
7271
7272" ---------------------------------------------------------------------
7273" Local Directory Browsing Support: {{{1
7274" ==========================================
7275
7276" ---------------------------------------------------------------------
7277" netrw#LocalBrowseCheck: {{{2
7278fun! netrw#LocalBrowseCheck(dirname)
7279 " unfortunate interaction -- split window debugging can't be
7280 " used here, must use D-echoRemOn or D-echoTabOn -- the BufEnter
7281 " event triggers another call to LocalBrowseCheck() when attempts
7282 " to write to the DBG buffer are made.
7283 " The &ft == "netrw" test was installed because the BufEnter event
7284 " would hit when re-entering netrw windows, creating unexpected
7285 " refreshes (and would do so in the middle of NetrwSaveOptions(), too)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007286" call Decho("netrw#LocalBrowseCheck: isdir<".a:dirname.">=".isdirectory(a:dirname).((exists("s:treeforceredraw")? " treeforceredraw" : "")))
Bram Moolenaaradc21822011-04-01 18:03:16 +02007287" call Dredir("LocalBrowseCheck","ls!")|redraw!|sleep 3
Bram Moolenaar446cb832008-06-24 21:56:24 +00007288 if isdirectory(a:dirname)
7289" call Decho(" ft<".&ft."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : " doesn't exist")."> dirname<".a:dirname.">"." line($)=".line("$"))
7290 if &ft != "netrw" || (exists("b:netrw_curdir") && b:netrw_curdir != a:dirname)
Bram Moolenaaradc21822011-04-01 18:03:16 +02007291 sil! keepj call s:NetrwBrowse(1,a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007292 elseif &ft == "netrw" && line("$") == 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02007293 sil! keepj call s:NetrwBrowse(1,a:dirname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007294 elseif exists("s:treeforceredraw")
7295 unlet s:treeforceredraw
Bram Moolenaaradc21822011-04-01 18:03:16 +02007296 sil! keepj call s:NetrwBrowse(1,a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007297 endif
7298 endif
7299 " not a directory, ignore it
7300endfun
7301
7302" ---------------------------------------------------------------------
7303" s:LocalListing: does the job of "ls" for local directories {{{2
7304fun! s:LocalListing()
7305" call Dfunc("s:LocalListing()")
7306" call Decho("&ma=".&ma)
7307" call Decho("&mod=".&mod)
7308" call Decho("&ro=".&ro)
7309" call Decho("bufname(%)<".bufname("%").">")
7310
7311" if exists("b:netrw_curdir") |call Decho('b:netrw_curdir<'.b:netrw_curdir.">") |else|call Decho("b:netrw_curdir doesn't exist") |endif
7312" 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
7313
7314 " get the list of files contained in the current directory
Bram Moolenaaradc21822011-04-01 18:03:16 +02007315 let dirname = b:netrw_curdir
Bram Moolenaar5c736222010-01-06 20:54:52 +01007316 let dirnamelen = s:Strlen(b:netrw_curdir)
Bram Moolenaar251e1912011-06-19 05:09:16 +02007317 let filelist = glob(s:ComposePath(fnameescape(dirname),"*"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007318" call Decho("glob(dirname<".dirname."/*>)=".filelist)
7319 if filelist != ""
7320 let filelist= filelist."\n"
7321 endif
Bram Moolenaar251e1912011-06-19 05:09:16 +02007322 let filelist= filelist.glob(s:ComposePath(fnameescape(dirname),".*"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007323" call Decho("glob(dirname<".dirname."/.*>)=".filelist)
7324
7325 " Coding choice: either elide ./ if present
7326 " or include ./ if not present
7327 if filelist =~ '[\\/]\.[\\/]\=\(\n\|$\)'
7328 " elide /path/. from glob() entries if present
7329" call Decho("elide /path/. from glob entries if present")
7330 let filelist = substitute(filelist,'\n','\t','g')
7331 let filelist = substitute(filelist,'^[^\t]\+[/\\]\.\t','','')
7332 let filelist = substitute(filelist,'[^\t]\+[/\\]\.$','','')
7333 let filelist = substitute(filelist,'\t\zs[^\t]\+[/\\]\.\t','','')
7334 let filelist = substitute(filelist,'\t','\n','g')
7335 endif
7336" call Decho("filelist<".filelist.">")
7337 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
7338 " include ../ in the glob() entry if its missing
7339" call Decho("forcibly tacking on ..")
7340 let filelist= filelist."\n".s:ComposePath(b:netrw_curdir,"../")
7341" call Decho("filelist<".filelist.">")
7342 endif
7343 if b:netrw_curdir == '/'
7344 " remove .. from filelist when current directory is root directory
7345" call Decho("remove .. from filelist")
7346 let filelist= substitute(filelist,'/\.\.\n','','')
7347 endif
7348 " remove multiple contiguous newlines
7349 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
7350 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
7351 " change all \s to /s
7352" call Decho('change all \s to /s')
7353 let filelist= substitute(filelist,'\','/','g')
7354 else
7355 " escape all \s to \\
7356" call Decho('escape all \s to \\')
7357 let filelist= substitute(filelist,'\','\\','g')
7358 endif
7359
7360" call Decho("(before while) dirname<".dirname.">")
7361" call Decho("(before while) dirnamelen<".dirnamelen.">")
7362" call Decho("(before while) filelist<".filelist.">")
7363
7364 while filelist != ""
7365 if filelist =~ '\n'
7366 let filename = substitute(filelist,'\n.*$','','e')
7367 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
7368 else
7369 let filename = filelist
7370 let filelist = ""
7371 endif
7372" call Decho(" ")
7373" call Decho("(while) filelist<".filelist.">")
7374" call Decho("(while) filename<".filename.">")
7375
7376 if getftype(filename) == "link"
7377 " indicate a symbolic link
7378" call Decho("indicate <".filename."> is a symbolic link with trailing @")
7379 let pfile= filename."@"
7380
7381 elseif getftype(filename) == "socket"
7382 " indicate a socket
7383" call Decho("indicate <".filename."> is a socket with trailing =")
7384 let pfile= filename."="
7385
7386 elseif getftype(filename) == "fifo"
7387 " indicate a fifo
7388" call Decho("indicate <".filename."> is a fifo with trailing |")
7389 let pfile= filename."|"
7390
7391 elseif isdirectory(filename)
7392 " indicate a directory
7393" call Decho("indicate <".filename."> is a directory with trailing /")
7394 let pfile= filename."/"
7395
7396 elseif exists("b:netrw_curdir") && b:netrw_curdir !~ '^.*://' && !isdirectory(filename)
7397 if (has("win32") || has("win95") || has("win64") || has("win16"))
7398 if filename =~ '\.[eE][xX][eE]$' || filename =~ '\.[cC][oO][mM]$' || filename =~ '\.[bB][aA][tT]$'
7399 " indicate an executable
7400" call Decho("indicate <".filename."> is executable with trailing *")
7401 let pfile= filename."*"
7402 else
7403 " normal file
7404 let pfile= filename
7405 endif
7406 elseif executable(filename)
7407 " indicate an executable
7408" call Decho("indicate <".filename."> is executable with trailing *")
7409 let pfile= filename."*"
7410 else
7411 " normal file
7412 let pfile= filename
7413 endif
7414
7415 else
7416 " normal file
7417 let pfile= filename
7418 endif
7419" call Decho("pfile<".pfile."> (after *@/ appending)")
7420
7421 if pfile =~ '//$'
7422 let pfile= substitute(pfile,'//$','/','e')
7423" call Decho("change // to /: pfile<".pfile.">")
7424 endif
7425 let pfile= strpart(pfile,dirnamelen)
7426 let pfile= substitute(pfile,'^[/\\]','','e')
7427" call Decho("filename<".filename.">")
7428" call Decho("pfile <".pfile.">")
7429
7430 if w:netrw_liststyle == s:LONGLIST
7431 let sz = getfsize(filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007432 let fsz = strpart(" ",1,15-strlen(sz)).sz
Bram Moolenaar446cb832008-06-24 21:56:24 +00007433 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
7434" call Decho("sz=".sz." fsz=".fsz)
7435 endif
7436
7437 if g:netrw_sort_by =~ "^t"
7438 " sort by time (handles time up to 1 quintillion seconds, US)
7439" call Decho("getftime(".filename.")=".getftime(filename))
7440 let t = getftime(filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007441 let ft = strpart("000000000000000000",1,18-strlen(t)).t
Bram Moolenaar446cb832008-06-24 21:56:24 +00007442" call Decho("exe keepjumps put ='".ft.'/'.filename."'")
7443 let ftpfile= ft.'/'.pfile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007444 sil! keepj put=ftpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00007445
7446 elseif g:netrw_sort_by =~ "^s"
7447 " sort by size (handles file sizes up to 1 quintillion bytes, US)
7448" call Decho("getfsize(".filename.")=".getfsize(filename))
7449 let sz = getfsize(filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007450 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
Bram Moolenaar446cb832008-06-24 21:56:24 +00007451" call Decho("exe keepjumps put ='".fsz.'/'.filename."'")
7452 let fszpfile= fsz.'/'.pfile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007453 sil! keepj put =fszpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00007454
7455 else
7456 " sort by name
7457" call Decho("exe keepjumps put ='".pfile."'")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007458 sil! keepj put=pfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00007459 endif
7460 endwhile
7461
7462 " cleanup any windows mess at end-of-line
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007463 sil! keepj g/^$/d
7464 sil! keepj %s/\r$//e
Bram Moolenaar5c736222010-01-06 20:54:52 +01007465 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007466 exe "setlocal ts=".g:netrw_maxfilenamelen
7467" call Decho("setlocal ts=".g:netrw_maxfilenamelen)
7468
7469" call Dret("s:LocalListing")
7470endfun
7471
7472" ---------------------------------------------------------------------
7473" s:LocalBrowseShellCmdRefresh: this function is called after a user has {{{2
7474" performed any shell command. The idea is to cause all local-browsing
7475" buffers to be refreshed after a user has executed some shell command,
7476" on the chance that s/he removed/created a file/directory with it.
7477fun! s:LocalBrowseShellCmdRefresh()
7478" call Dfunc("LocalBrowseShellCmdRefresh() browselist=".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "empty")." ".tabpagenr("$")." tabs")
7479 " determine which buffers currently reside in a tab
7480 if !exists("s:netrw_browselist")
7481" call Dret("LocalBrowseShellCmdRefresh : browselist is empty")
7482 return
7483 endif
7484 if !exists("w:netrw_bannercnt")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007485" call Dret("LocalBrowseShellCmdRefresh : don't refresh when focus not on netrw window")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007486 return
7487 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007488 if exists("s:locbrowseshellcmd")
7489 if s:locbrowseshellcmd
7490 let s:locbrowseshellcmd= 0
7491" call Dret("LocalBrowseShellCmdRefresh : NetrwBrowse itself caused the refresh")
7492 return
7493 endif
7494 let s:locbrowseshellcmd= 0
7495 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007496 let itab = 1
7497 let buftablist = []
7498 while itab <= tabpagenr("$")
7499 let buftablist = buftablist + tabpagebuflist()
7500 let itab = itab + 1
7501 tabn
7502 endwhile
7503" call Decho("buftablist".string(buftablist))
7504" call Decho("s:netrw_browselist<".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "").">")
7505 " GO through all buffers on netrw_browselist (ie. just local-netrw buffers):
7506 " | refresh any netrw window
7507 " | wipe out any non-displaying netrw buffer
7508 let curwin = winnr()
7509 let ibl = 0
7510 for ibuf in s:netrw_browselist
7511" call Decho("bufwinnr(".ibuf.") index(buftablist,".ibuf.")=".index(buftablist,ibuf))
7512 if bufwinnr(ibuf) == -1 && index(buftablist,ibuf) == -1
7513 " wipe out any non-displaying netrw buffer
7514" call Decho("wiping buf#".ibuf,"<".bufname(ibuf).">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007515 exe "sil! bd ".fnameescape(ibuf)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007516 call remove(s:netrw_browselist,ibl)
7517" call Decho("browselist=".string(s:netrw_browselist))
7518 continue
7519 elseif index(tabpagebuflist(),ibuf) != -1
7520 " refresh any netrw buffer
7521" call Decho("refresh buf#".ibuf.'-> win#'.bufwinnr(ibuf))
7522 exe bufwinnr(ibuf)."wincmd w"
Bram Moolenaaradc21822011-04-01 18:03:16 +02007523 keepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007524 endif
7525 let ibl= ibl + 1
7526 endfor
7527 exe curwin."wincmd w"
7528
7529" call Dret("LocalBrowseShellCmdRefresh")
7530endfun
7531
7532" ---------------------------------------------------------------------
7533" s:NetrwLocalRm: {{{2
7534fun! s:NetrwLocalRm(path) range
7535" call Dfunc("s:NetrwLocalRm(path<".a:path.">)")
7536" call Decho("firstline=".a:firstline." lastline=".a:lastline)
7537
7538 " preparation for removing multiple files/directories
7539 let ret = 0
7540 let all = 0
7541 let svpos = netrw#NetrwSavePosn()
7542
7543 if exists("s:netrwmarkfilelist_{bufnr('%')}")
7544 " remove all marked files
7545" call Decho("remove all marked files")
7546 for fname in s:netrwmarkfilelist_{bufnr("%")}
7547 let ok= s:NetrwLocalRmFile(a:path,fname,all)
7548 if ok =~ 'q\%[uit]' || ok == "no"
7549 break
7550 elseif ok =~ 'a\%[ll]'
7551 let all= 1
7552 endif
7553 endfor
7554 call s:NetrwUnMarkFile(1)
7555
7556 else
7557 " remove (multiple) files and directories
7558" call Decho("remove files in range [".a:firstline.",".a:lastline."]")
7559
7560 let ctr = a:firstline
7561 while ctr <= a:lastline
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007562 exe "keepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00007563
7564 " sanity checks
7565 if line(".") < w:netrw_bannercnt
7566 let ctr= ctr + 1
7567 continue
7568 endif
7569 let curword= s:NetrwGetWord()
7570 if curword == "./" || curword == "../"
7571 let ctr= ctr + 1
7572 continue
7573 endif
7574 let ok= s:NetrwLocalRmFile(a:path,curword,all)
7575 if ok =~ 'q\%[uit]' || ok == "no"
7576 break
7577 elseif ok =~ 'a\%[ll]'
7578 let all= 1
7579 endif
7580 let ctr= ctr + 1
7581 endwhile
7582 endif
7583
7584 " refresh the directory
7585" call Decho("bufname<".bufname("%").">")
7586 if bufname("%") != "NetrwMessage"
Bram Moolenaaradc21822011-04-01 18:03:16 +02007587 keepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
7588 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007589 endif
7590
7591" call Dret("s:NetrwLocalRm")
7592endfun
7593
7594" ---------------------------------------------------------------------
7595" s:NetrwLocalRmFile: remove file fname given the path {{{2
7596" Give confirmation prompt unless all==1
7597fun! s:NetrwLocalRmFile(path,fname,all)
7598" call Dfunc("s:NetrwLocalRmFile(path<".a:path."> fname<".a:fname."> all=".a:all)
7599
7600 let all= a:all
7601 let ok = ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007602 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00007603 let rmfile= s:ComposePath(a:path,a:fname)
7604" call Decho("rmfile<".rmfile.">")
7605
7606 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
7607 " attempt to remove file
7608" call Decho("attempt to remove file<".rmfile.">")
7609 if !all
7610 echohl Statement
7611 call inputsave()
7612 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
7613 call inputrestore()
7614 echohl NONE
7615 if ok == ""
7616 let ok="no"
7617 endif
7618" call Decho("response: ok<".ok.">")
7619 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
7620" call Decho("response: ok<".ok."> (after sub)")
7621 if ok =~ 'a\%[ll]'
7622 let all= 1
7623 endif
7624 endif
7625
7626 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00007627 let ret= s:NetrwDelete(rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007628" call Decho("errcode=".v:shell_error." ret=".ret)
7629 endif
7630
7631 else
7632 " attempt to remove directory
7633 if !all
7634 echohl Statement
7635 call inputsave()
7636 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
7637 call inputrestore()
7638 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
7639 if ok == ""
7640 let ok="no"
7641 endif
7642 if ok =~ 'a\%[ll]'
7643 let all= 1
7644 endif
7645 endif
7646 let rmfile= substitute(rmfile,'[\/]$','','e')
7647
7648 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar5c736222010-01-06 20:54:52 +01007649" call Decho("1st attempt: system(netrw#WinPath(".g:netrw_local_rmdir.') '.shellescape(rmfile).')')
7650 call system(netrw#WinPath(g:netrw_local_rmdir).' '.shellescape(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007651" call Decho("v:shell_error=".v:shell_error)
7652
7653 if v:shell_error != 0
7654" call Decho("2nd attempt to remove directory<".rmfile.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00007655 let errcode= s:NetrwDelete(rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007656" call Decho("errcode=".errcode)
7657
7658 if errcode != 0
7659 if has("unix")
7660" call Decho("3rd attempt to remove directory<".rmfile.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00007661 call system("rm ".shellescape(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007662 if v:shell_error != 0 && !exists("g:netrw_quiet")
7663 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",34)
7664 let ok="no"
7665 endif
7666 elseif !exists("g:netrw_quiet")
7667 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",35)
7668 let ok="no"
7669 endif
7670 endif
7671 endif
7672 endif
7673 endif
7674
7675" call Dret("s:NetrwLocalRmFile ".ok)
7676 return ok
7677endfun
7678
7679" ---------------------------------------------------------------------
7680" s:NetrwLocalRename: rename a remote file or directory {{{2
7681fun! s:NetrwLocalRename(path) range
7682" call Dfunc("NetrwLocalRename(path<".a:path.">)")
7683
7684 " preparation for removing multiple files/directories
7685 let ctr = a:firstline
7686 let svpos= netrw#NetrwSavePosn()
7687
7688 " rename files given by the markfilelist
7689 if exists("s:netrwmarkfilelist_{bufnr('%')}")
7690 for oldname in s:netrwmarkfilelist_{bufnr("%")}
7691" call Decho("oldname<".oldname.">")
7692 if exists("subfrom")
7693 let newname= substitute(oldname,subfrom,subto,'')
7694" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
7695 else
7696 call inputsave()
7697 let newname= input("Moving ".oldname." to : ",oldname)
7698 call inputrestore()
7699 if newname =~ '^s/'
7700 let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
7701 let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
7702" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
7703 let newname = substitute(oldname,subfrom,subto,'')
7704 endif
7705 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00007706 call rename(oldname,newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007707 endfor
Bram Moolenaar5c736222010-01-06 20:54:52 +01007708 call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007709
7710 else
7711
7712 " attempt to rename files/directories
7713 while ctr <= a:lastline
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007714 exe "keepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00007715
7716 " sanity checks
7717 if line(".") < w:netrw_bannercnt
7718 let ctr= ctr + 1
7719 continue
7720 endif
7721 let curword= s:NetrwGetWord()
7722 if curword == "./" || curword == "../"
7723 let ctr= ctr + 1
7724 continue
7725 endif
7726
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007727 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00007728 let oldname= s:ComposePath(a:path,curword)
7729" call Decho("oldname<".oldname.">")
7730
7731 call inputsave()
7732 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
7733 call inputrestore()
7734
Bram Moolenaare37d50a2008-08-06 17:06:04 +00007735 call rename(oldname,newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007736" call Decho("renaming <".oldname."> to <".newname.">")
7737
7738 let ctr= ctr + 1
7739 endwhile
7740 endif
7741
7742 " refresh the directory
7743" call Decho("refresh the directory listing")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007744 keepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
7745 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007746
7747" call Dret("NetrwLocalRename")
7748endfun
7749
7750" ---------------------------------------------------------------------
7751" s:LocalFastBrowser: handles setting up/taking down fast browsing for the local browser {{{2
7752"
7753" g:netrw_ Directory Is
7754" fastbrowse Local Remote
7755" slow 0 D D D=Deleting a buffer implies it will not be re-used (slow)
7756" med 1 D H H=Hiding a buffer implies it may be re-used (fast)
7757" fast 2 H H
7758"
7759" Deleting a buffer means that it will be re-loaded when examined, hence "slow".
7760" Hiding a buffer means that it will be re-used when examined, hence "fast".
7761" (re-using a buffer may not be as accurate)
7762fun! s:LocalFastBrowser()
7763" call Dfunc("LocalFastBrowser() g:netrw_fastbrowse=".g:netrw_fastbrowse)
7764
7765 " initialize browselist, a list of buffer numbers that the local browser has used
7766 if !exists("s:netrw_browselist")
7767" call Decho("initialize s:netrw_browselist")
7768 let s:netrw_browselist= []
7769 endif
7770
7771 " append current buffer to fastbrowse list
7772 if empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1]
7773" call Decho("appendng current buffer to browselist")
7774 call add(s:netrw_browselist,bufnr("%"))
7775" call Decho("browselist=".string(s:netrw_browselist))
7776 endif
7777
7778 " enable autocmd events to handle refreshing/removing local browser buffers
7779 " If local browse buffer is currently showing: refresh it
7780 " If local browse buffer is currently hidden : wipe it
7781 if !exists("s:netrw_browser_shellcmd") && g:netrw_fastbrowse <= 1
7782" call Decho("setting up local-browser shell command refresh")
7783 let s:netrw_browser_shellcmd= 1
7784 augroup AuNetrwShellCmd
7785 au!
7786 if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01007787" call Decho("autocmd: ShellCmdPost * call s:LocalBrowseShellCmdRefresh()")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007788 au ShellCmdPost * call s:LocalBrowseShellCmdRefresh()
7789 else
7790 au ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()
Bram Moolenaar5c736222010-01-06 20:54:52 +01007791" call Decho("autocmd: ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007792 endif
7793 augroup END
7794 endif
7795
7796 " user must have changed fastbrowse to its fast setting, so remove
7797 " the associated autocmd events
7798 if g:netrw_fastbrowse > 1 && exists("s:netrw_browser_shellcmd")
7799" call Decho("remove AuNetrwShellCmd autcmd group")
7800 unlet s:netrw_browser_shellcmd
7801 augroup AuNetrwShellCmd
7802 au!
7803 augroup END
7804 augroup! AuNetrwShellCmd
7805 endif
7806
7807" call Dret("LocalFastBrowser : browselist<".string(s:netrw_browselist).">")
7808endfun
7809
7810" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02007811" netrw#FileUrlRead: handles reading file:///* files {{{2
7812fun! netrw#FileUrlRead(fname)
7813" call Dfunc("netrw#FileUrlRead()")
7814 let fname2396 = netrw#RFC2396(a:fname)
7815 let fname2396e= fnameescape(fname2396)
7816 let plainfname= substitute(fname2396,'file://\(.*\)','\1',"")
7817" call Decho("fname2396<".fname2396.">")
7818" call Decho("plainfname<".plainfname.">")
7819 exe "sil doau BufReadPre ".fname2396e
7820 exe 'r '.plainfname
7821 exe 'file! '.plainfname
7822 1d
7823 setlocal nomod
7824" call Dret("netrw#FileUrlRead")
7825 exe "sil doau BufReadPost ".fname2396e
7826endfun
7827
7828" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00007829" Support Functions: {{{1
7830
Bram Moolenaar488c6512005-08-11 20:09:58 +00007831" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00007832" netrw#ErrorMsg: {{{2
7833" 0=note = s:NOTE
7834" 1=warning = s:WARNING
7835" 2=error = s:ERROR
Bram Moolenaar251e1912011-06-19 05:09:16 +02007836" Apr 18, 2011 : max errnum currently is 78
Bram Moolenaar9964e462007-05-05 17:54:07 +00007837fun! netrw#ErrorMsg(level,msg,errnum)
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007838" 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 +00007839
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007840 if a:level == 1
7841 let level= "**warning** (netrw) "
7842 elseif a:level == 2
7843 let level= "**error** (netrw) "
7844 else
7845 let level= "**note** (netrw) "
Bram Moolenaar9964e462007-05-05 17:54:07 +00007846 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007847" call Decho("level=".level)
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007848
7849 if g:netrw_use_errorwindow
7850 " (default) netrw creates a one-line window to show error/warning
7851 " messages (reliably displayed)
7852
Bram Moolenaar446cb832008-06-24 21:56:24 +00007853 " record current window number for NetrwRestorePosn()'s benefit
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007854 let s:winBeforeErr= winnr()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007855" call Decho("s:winBeforeErr=".s:winBeforeErr)
7856
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007857 " getting messages out reliably is just plain difficult!
7858 " This attempt splits the current window, creating a one line window.
7859 if bufexists("NetrwMessage") && bufwinnr("NetrwMessage") > 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00007860" call Decho("write to NetrwMessage buffer")
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007861 exe bufwinnr("NetrwMessage")."wincmd w"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007862" call Decho("setlocal ma noro")
7863 setlocal ma noro
Bram Moolenaaradc21822011-04-01 18:03:16 +02007864 keepj call setline(line("$")+1,level.a:msg)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007865 keepj $
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007866 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00007867" call Decho("create a NetrwMessage buffer window")
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007868 bo 1split
Bram Moolenaar5c736222010-01-06 20:54:52 +01007869 call s:NetrwEnew()
Bram Moolenaaradc21822011-04-01 18:03:16 +02007870 keepj call s:NetrwSafeOptions()
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007871 setlocal bt=nofile
Bram Moolenaaradc21822011-04-01 18:03:16 +02007872 keepj file NetrwMessage
Bram Moolenaar446cb832008-06-24 21:56:24 +00007873" call Decho("setlocal ma noro")
7874 setlocal ma noro
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007875 call setline(line("$"),level.a:msg)
7876 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007877" call Decho("wrote msg<".level.a:msg."> to NetrwMessage win#".winnr())
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007878 if &fo !~ '[ta]'
7879 syn clear
7880 syn match netrwMesgNote "^\*\*note\*\*"
7881 syn match netrwMesgWarning "^\*\*warning\*\*"
7882 syn match netrwMesgError "^\*\*error\*\*"
7883 hi link netrwMesgWarning WarningMsg
7884 hi link netrwMesgError Error
7885 endif
7886 setlocal noma ro bh=wipe
7887
7888 else
7889 " (optional) netrw will show messages using echomsg. Even if the
7890 " message doesn't appear, at least it'll be recallable via :messages
Bram Moolenaar446cb832008-06-24 21:56:24 +00007891" redraw!
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007892 if a:level == s:WARNING
7893 echohl WarningMsg
7894 elseif a:level == s:ERROR
7895 echohl Error
7896 endif
7897 echomsg level.a:msg
7898" call Decho("echomsg ***netrw*** ".a:msg)
7899 echohl None
7900 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00007901
7902" call Dret("netrw#ErrorMsg")
7903endfun
7904
7905" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00007906" netrw#NetrwRestorePosn: restores the cursor and file position as saved by NetrwSavePosn() {{{2
7907fun! netrw#NetrwRestorePosn(...)
7908" 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))
7909 let eikeep= &ei
7910 set ei=all
7911 if expand("%") == "NetrwMessage"
7912 exe s:winBeforeErr."wincmd w"
7913 endif
7914
7915 if a:0 > 0
7916 exe a:1
7917 endif
7918
7919 " restore window
7920 if exists("w:netrw_winnr")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007921" call Decho("restore window: exe sil! ".w:netrw_winnr."wincmd w")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007922 exe "sil! ".w:netrw_winnr."wincmd w"
Bram Moolenaarc236c162008-07-13 17:41:49 +00007923 endif
7924 if v:shell_error == 0
7925 " as suggested by Bram M: redraw on no error
7926 " allows protocol error messages to remain visible
7927" redraw!
7928 endif
7929
7930 " restore top-of-screen line
7931 if exists("w:netrw_hline")
7932" call Decho("restore topofscreen: exe norm! ".w:netrw_hline."G0z")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007933 exe "keepj norm! ".w:netrw_hline."G0z\<CR>"
Bram Moolenaarc236c162008-07-13 17:41:49 +00007934 endif
7935
7936 " restore position
7937 if exists("w:netrw_line") && exists("w:netrw_col")
7938" call Decho("restore posn: exe norm! ".w:netrw_line."G0".w:netrw_col."|")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007939 exe "keepj norm! ".w:netrw_line."G0".w:netrw_col."\<bar>"
Bram Moolenaarc236c162008-07-13 17:41:49 +00007940 endif
7941
7942 let &ei= eikeep
7943" call Dret("netrw#NetrwRestorePosn")
7944endfun
7945
7946" ---------------------------------------------------------------------
7947" netrw#NetrwSavePosn: saves position of cursor on screen {{{2
7948fun! netrw#NetrwSavePosn()
7949" call Dfunc("netrw#NetrwSavePosn()")
7950 " Save current line and column
7951 let w:netrw_winnr= winnr()
7952 let w:netrw_line = line(".")
7953 let w:netrw_col = virtcol(".")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007954" call Decho("currently, win#".w:netrw_winnr." line#".w:netrw_line." col#".w:netrw_col)
Bram Moolenaarc236c162008-07-13 17:41:49 +00007955
7956 " Save top-of-screen line
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007957 keepj norm! H0
Bram Moolenaarc236c162008-07-13 17:41:49 +00007958 let w:netrw_hline= line(".")
7959
7960 " set up string holding position parameters
7961 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
7962
Bram Moolenaaradc21822011-04-01 18:03:16 +02007963 keepj call netrw#NetrwRestorePosn()
Bram Moolenaarc236c162008-07-13 17:41:49 +00007964" call Dret("netrw#NetrwSavePosn : winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline)
7965 return ret
7966endfun
7967
7968" ------------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00007969" netrw#RFC2396: converts %xx into characters {{{2
7970fun! netrw#RFC2396(fname)
7971" call Dfunc("netrw#RFC2396(fname<".a:fname.">)")
7972 let fname = escape(substitute(a:fname,'%\(\x\x\)','\=nr2char("0x".submatch(1))','ge')," \t")
7973" call Dret("netrw#RFC2396 ".fname)
7974 return fname
7975endfun
7976
7977" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00007978" s:ComposePath: Appends a new part to a path taking different systems into consideration {{{2
7979fun! s:ComposePath(base,subdir)
7980" call Dfunc("s:ComposePath(base<".a:base."> subdir<".a:subdir.">)")
7981
7982 if(has("amiga"))
7983" call Decho("amiga")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007984 let ec = a:base[s:Strlen(a:base)-1]
Bram Moolenaarc236c162008-07-13 17:41:49 +00007985 if ec != '/' && ec != ':'
7986 let ret = a:base . "/" . a:subdir
7987 else
7988 let ret = a:base . a:subdir
7989 endif
7990
7991 elseif a:subdir =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16"))
7992" call Decho("windows")
7993 let ret= a:subdir
7994
Bram Moolenaar5c736222010-01-06 20:54:52 +01007995 elseif a:base =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16"))
7996" call Decho("windows")
7997 if a:base =~ '[/\\]$'
7998 let ret= a:base.a:subdir
7999 else
8000 let ret= a:base."/".a:subdir
8001 endif
8002
Bram Moolenaarc236c162008-07-13 17:41:49 +00008003 elseif a:base =~ '^\a\+://'
8004" call Decho("remote linux/macos")
8005 let urlbase = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\1','')
8006 let curpath = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\2','')
8007 if a:subdir == '../'
8008 if curpath =~ '[^/]/[^/]\+/$'
8009 let curpath= substitute(curpath,'[^/]\+/$','','')
8010 else
8011 let curpath=""
8012 endif
8013 let ret= urlbase.curpath
8014 else
8015 let ret= urlbase.curpath.a:subdir
8016 endif
8017" call Decho("urlbase<".urlbase.">")
8018" call Decho("curpath<".curpath.">")
8019" call Decho("ret<".ret.">")
8020
8021 else
8022" call Decho("local linux/macos")
8023 let ret = substitute(a:base."/".a:subdir,"//","/","g")
8024 if a:base =~ '^//'
8025 " keeping initial '//' for the benefit of network share listing support
8026 let ret= '/'.ret
8027 endif
8028 let ret= simplify(ret)
8029 endif
8030
8031" call Dret("s:ComposePath ".ret)
8032 return ret
8033endfun
8034
8035" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008036" s:FileReadable: o/s independent filereadable {{{2
8037fun! s:FileReadable(fname)
8038" call Dfunc("s:FileReadable(fname<".a:fname.">)")
8039
8040 if g:netrw_cygwin
8041 let ret= filereadable(substitute(a:fname,'/cygdrive/\(.\)','\1:/',''))
8042 else
8043 let ret= filereadable(a:fname)
8044 endif
8045
8046" call Dret("s:FileReadable ".ret)
8047 return ret
8048endfun
8049
8050" ---------------------------------------------------------------------
8051" s:GetTempfile: gets a tempname that'll work for various o/s's {{{2
8052" Places correct suffix on end of temporary filename,
8053" using the suffix provided with fname
8054fun! s:GetTempfile(fname)
8055" call Dfunc("s:GetTempfile(fname<".a:fname.">)")
8056
8057 if !exists("b:netrw_tmpfile")
8058 " get a brand new temporary filename
8059 let tmpfile= tempname()
8060" call Decho("tmpfile<".tmpfile."> : from tempname()")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008061
Bram Moolenaarc236c162008-07-13 17:41:49 +00008062 let tmpfile= substitute(tmpfile,'\','/','ge')
Bram Moolenaar9964e462007-05-05 17:54:07 +00008063" call Decho("tmpfile<".tmpfile."> : chgd any \\ -> /")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008064
Bram Moolenaar9964e462007-05-05 17:54:07 +00008065 " sanity check -- does the temporary file's directory exist?
8066 if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
Bram Moolenaarc236c162008-07-13 17:41:49 +00008067" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaaradc21822011-04-01 18:03:16 +02008068 keepj call netrw#ErrorMsg(s:ERROR,"your <".substitute(tmpfile,'[^/]\+$','','e')."> directory is missing!",2)
Bram Moolenaar9964e462007-05-05 17:54:07 +00008069" call Dret("s:GetTempfile getcwd<".getcwd().">")
8070 return ""
8071 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008072
Bram Moolenaar9964e462007-05-05 17:54:07 +00008073 " let netrw#NetSource() know about the tmpfile
Bram Moolenaar5c736222010-01-06 20:54:52 +01008074 let s:netrw_tmpfile= tmpfile " used by netrw#NetSource() and netrw#NetrwBrowseX()
Bram Moolenaar9964e462007-05-05 17:54:07 +00008075" call Decho("tmpfile<".tmpfile."> s:netrw_tmpfile<".s:netrw_tmpfile.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008076
Bram Moolenaar9964e462007-05-05 17:54:07 +00008077 " o/s dependencies
Bram Moolenaar446cb832008-06-24 21:56:24 +00008078 if g:netrw_cygwin != 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00008079 let tmpfile = substitute(tmpfile,'^\(\a\):','/cygdrive/\1','e')
8080 elseif has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008081 if !exists("+shellslash") || !&ssl
8082 let tmpfile = substitute(tmpfile,'/','\','g')
8083 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00008084 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00008085 let tmpfile = tmpfile
Bram Moolenaar9964e462007-05-05 17:54:07 +00008086 endif
8087 let b:netrw_tmpfile= tmpfile
8088" call Decho("o/s dependent fixed tempname<".tmpfile.">")
8089 else
8090 " re-use temporary filename
8091 let tmpfile= b:netrw_tmpfile
8092" call Decho("tmpfile<".tmpfile."> re-using")
8093 endif
8094
8095 " use fname's suffix for the temporary file
8096 if a:fname != ""
8097 if a:fname =~ '\.[^./]\+$'
8098" call Decho("using fname<".a:fname.">'s suffix")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008099 if a:fname =~ '\.tar\.gz$' || a:fname =~ '\.tar\.bz2$' || a:fname =~ '\.tar\.xz$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00008100 let suffix = ".tar".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008101 elseif a:fname =~ '.txz$'
8102 let suffix = ".txz".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
Bram Moolenaar9964e462007-05-05 17:54:07 +00008103 else
8104 let suffix = substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
8105 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00008106" call Decho("suffix<".suffix.">")
8107 let tmpfile= substitute(tmpfile,'\.tmp$','','e')
8108" call Decho("chgd tmpfile<".tmpfile."> (removed any .tmp suffix)")
8109 let tmpfile .= suffix
8110" call Decho("chgd tmpfile<".tmpfile."> (added ".suffix." suffix) netrw_fname<".b:netrw_fname.">")
8111 let s:netrw_tmpfile= tmpfile " supports netrw#NetSource()
8112 endif
8113 endif
8114
Bram Moolenaarc236c162008-07-13 17:41:49 +00008115" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar9964e462007-05-05 17:54:07 +00008116" call Dret("s:GetTempfile <".tmpfile.">")
8117 return tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00008118endfun
Bram Moolenaar9964e462007-05-05 17:54:07 +00008119
8120" ---------------------------------------------------------------------
8121" s:MakeSshCmd: transforms input command using USEPORT HOSTNAME into {{{2
Bram Moolenaarc236c162008-07-13 17:41:49 +00008122" a correct command for use with a system() call
Bram Moolenaar9964e462007-05-05 17:54:07 +00008123fun! s:MakeSshCmd(sshcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008124" call Dfunc("s:MakeSshCmd(sshcmd<".a:sshcmd.">) user<".s:user."> machine<".s:machine.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008125 let sshcmd = substitute(a:sshcmd,'\<HOSTNAME\>',s:user.s:machine,'')
8126 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00008127 let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.g:netrw_port,'')
Bram Moolenaar9964e462007-05-05 17:54:07 +00008128 elseif exists("s:port") && s:port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00008129 let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.s:port,'')
Bram Moolenaar9964e462007-05-05 17:54:07 +00008130 else
8131 let sshcmd= substitute(sshcmd,"USEPORT ",'','')
8132 endif
8133" call Dret("s:MakeSshCmd <".sshcmd.">")
8134 return sshcmd
8135endfun
8136
8137" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008138" s:NetrwBMShow: {{{2
8139fun! s:NetrwBMShow()
8140" call Dfunc("s:NetrwBMShow()")
8141 redir => bmshowraw
8142 menu
8143 redir END
8144 let bmshowlist = split(bmshowraw,'\n')
8145 if bmshowlist != []
8146 let bmshowfuncs= filter(bmshowlist,'v:val =~ "<SNR>\\d\\+_BMShow()"')
8147 if bmshowfuncs != []
8148 let bmshowfunc = substitute(bmshowfuncs[0],'^.*:\(call.*BMShow()\).*$','\1','')
8149 if bmshowfunc =~ '^call.*BMShow()'
Bram Moolenaaradc21822011-04-01 18:03:16 +02008150 exe "sil! keepj ".bmshowfunc
Bram Moolenaarc236c162008-07-13 17:41:49 +00008151 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008152 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008153 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00008154" call Dret("s:NetrwBMShow : bmshowfunc<".(exists("bmshowfunc")? bmshowfunc : 'n/a').">")
8155endfun
8156
8157" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02008158" s:NetrwCursor: responsible for setting cursorline/cursorcolumn based upon g:netrw_cursor {{{2
8159fun! s:NetrwCursor()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008160 if !exists("w:netrw_liststyle")
8161 let w:netrw_liststyle= g:netrw_liststyle
8162 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02008163" 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)
8164
8165 if &ft != "netrw"
8166 " if the current window isn't a netrw directory listing window, then use user cursorline/column
8167 " settings. Affects when netrw is used to read/write a file using scp/ftp/etc.
8168 let &l:cursorline = s:netrw_usercul
8169 let &l:cursorcolumn = s:netrw_usercuc
8170
8171 elseif g:netrw_cursor == 4
8172 " all styles: cursorline, cursorcolumn
8173 setlocal cursorline
8174 setlocal cursorcolumn
8175
8176 elseif g:netrw_cursor == 3
8177 " thin-long-tree: cursorline, user's cursorcolumn
8178 " wide : cursorline, cursorcolumn
8179 if w:netrw_liststyle == s:WIDELIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008180 setlocal cursorline
Bram Moolenaaradc21822011-04-01 18:03:16 +02008181 setlocal cursorcolumn
8182 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008183 setlocal cursorline
Bram Moolenaaradc21822011-04-01 18:03:16 +02008184 let &l:cursorcolumn = s:netrw_usercuc
8185 endif
8186
8187 elseif g:netrw_cursor == 2
8188 " thin-long-tree: cursorline, user's cursorcolumn
8189 " wide : cursorline, user's cursorcolumn
8190 let &l:cursorcolumn = s:netrw_usercuc
8191 setlocal cursorline
8192
8193 elseif g:netrw_cursor == 1
8194 " thin-long-tree: user's cursorline, user's cursorcolumn
8195 " wide : cursorline, user's cursorcolumn
8196 let &l:cursorcolumn = s:netrw_usercuc
8197 if w:netrw_liststyle == s:WIDELIST
8198 setlocal cursorline
8199 else
8200 let &l:cursorline = s:netrw_usercul
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008201 endif
8202
8203 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02008204 " all styles: user's cursorline, user's cursorcolumn
8205 let &l:cursorline = s:netrw_usercul
8206 let &l:cursorcolumn = s:netrw_usercuc
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008207 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02008208
8209" call Dret("s:NetrwCursor : l:cursorline=".&l:cursorline." l:cursorcolumn=".&l:cursorcolumn)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008210endfun
8211
8212" ---------------------------------------------------------------------
8213" s:RestoreCursorline: restores cursorline/cursorcolumn to original user settings {{{2
8214fun! s:RestoreCursorline()
8215" call Dfunc("s:RestoreCursorline() currently, cul=".&l:cursorline." cuc=".&l:cursorcolumn." win#".winnr()." buf#".bufnr("%"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02008216 if exists("s:netrw_usercul")
8217 let &l:cursorline = s:netrw_usercul
8218 endif
8219 if exists("s:netrw_usercuc")
8220 let &l:cursorcolumn = s:netrw_usercuc
8221 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008222" call Dret("s:RestoreCursorline : restored cul=".&l:cursorline." cuc=".&l:cursorcolumn)
8223endfun
8224
8225" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008226" s:NetrwDelete: Deletes a file. {{{2
8227" Uses Steve Hall's idea to insure that Windows paths stay
8228" acceptable. No effect on Unix paths.
8229" Examples of use: let result= s:NetrwDelete(path)
8230fun! s:NetrwDelete(path)
8231" call Dfunc("s:NetrwDelete(path<".a:path.">)")
8232
Bram Moolenaar5c736222010-01-06 20:54:52 +01008233 let path = netrw#WinPath(a:path)
Bram Moolenaarc236c162008-07-13 17:41:49 +00008234 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
8235 if exists("+shellslash")
8236 let sskeep= &shellslash
8237 setlocal noshellslash
8238 let result = delete(path)
8239 let &shellslash = sskeep
8240 else
8241" call Decho("exe let result= ".a:cmd."('".path."')")
8242 let result= delete(path)
8243 endif
8244 else
8245" call Decho("let result= delete(".path.")")
8246 let result= delete(path)
8247 endif
8248 if result < 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02008249 keepj call netrw#ErrorMsg(s:WARNING,"delete(".path.") failed!",71)
Bram Moolenaarc236c162008-07-13 17:41:49 +00008250 endif
8251
8252" call Dret("s:NetrwDelete ".result)
8253 return result
Bram Moolenaar446cb832008-06-24 21:56:24 +00008254endfun
8255
8256" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008257" s:NetrwEnew: opens a new buffer, passes netrw buffer variables through {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +01008258fun! s:NetrwEnew(...)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008259" call Dfunc("s:NetrwEnew() a:0=".a:0." bufnr($)=".bufnr("$"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01008260" call Decho("curdir<".((a:0>0)? a:1 : "")."> buf#".bufnr("%")."<".bufname("%").">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008261
Bram Moolenaar446cb832008-06-24 21:56:24 +00008262 " grab a function-local-variable copy of buffer variables
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008263" call Decho("make function-local copy of netrw variables")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008264 if exists("b:netrw_bannercnt") |let netrw_bannercnt = b:netrw_bannercnt |endif
8265 if exists("b:netrw_browser_active") |let netrw_browser_active = b:netrw_browser_active |endif
8266 if exists("b:netrw_cpf") |let netrw_cpf = b:netrw_cpf |endif
8267 if exists("b:netrw_curdir") |let netrw_curdir = b:netrw_curdir |endif
8268 if exists("b:netrw_explore_bufnr") |let netrw_explore_bufnr = b:netrw_explore_bufnr |endif
8269 if exists("b:netrw_explore_indx") |let netrw_explore_indx = b:netrw_explore_indx |endif
8270 if exists("b:netrw_explore_line") |let netrw_explore_line = b:netrw_explore_line |endif
8271 if exists("b:netrw_explore_list") |let netrw_explore_list = b:netrw_explore_list |endif
8272 if exists("b:netrw_explore_listlen")|let netrw_explore_listlen = b:netrw_explore_listlen|endif
8273 if exists("b:netrw_explore_mtchcnt")|let netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
8274 if exists("b:netrw_fname") |let netrw_fname = b:netrw_fname |endif
8275 if exists("b:netrw_lastfile") |let netrw_lastfile = b:netrw_lastfile |endif
8276 if exists("b:netrw_liststyle") |let netrw_liststyle = b:netrw_liststyle |endif
8277 if exists("b:netrw_method") |let netrw_method = b:netrw_method |endif
8278 if exists("b:netrw_option") |let netrw_option = b:netrw_option |endif
8279 if exists("b:netrw_prvdir") |let netrw_prvdir = b:netrw_prvdir |endif
8280
Bram Moolenaaradc21822011-04-01 18:03:16 +02008281 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008282" call Decho("generate a buffer with keepjumps keepalt enew!")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008283 let netrw_keepdiff= &l:diff
Bram Moolenaaradc21822011-04-01 18:03:16 +02008284 " COMBAK: Benzinger: using tree mode, vim -o Foo/ file shows Foo/ Foo/ instead. Place return here, problem goes away (beeps result, but who knows)
8285" call Dredir("Benzinger 1:","ls!")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008286 keepj keepalt enew!
Bram Moolenaaradc21822011-04-01 18:03:16 +02008287" call Dredir("Benzinger 2:","ls!")
8288 " 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 +02008289 let &l:diff= netrw_keepdiff
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008290" call Decho("bufnr($)=".bufnr("$"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02008291 keepj call s:NetrwOptionSave("w:")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008292
Bram Moolenaar446cb832008-06-24 21:56:24 +00008293 " copy function-local-variables to buffer variable equivalents
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008294" call Decho("copy function-local variables back to buffer netrw variables")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008295 if exists("netrw_bannercnt") |let b:netrw_bannercnt = netrw_bannercnt |endif
8296 if exists("netrw_browser_active") |let b:netrw_browser_active = netrw_browser_active |endif
8297 if exists("netrw_cpf") |let b:netrw_cpf = netrw_cpf |endif
8298 if exists("netrw_curdir") |let b:netrw_curdir = netrw_curdir |endif
8299 if exists("netrw_explore_bufnr") |let b:netrw_explore_bufnr = netrw_explore_bufnr |endif
8300 if exists("netrw_explore_indx") |let b:netrw_explore_indx = netrw_explore_indx |endif
8301 if exists("netrw_explore_line") |let b:netrw_explore_line = netrw_explore_line |endif
8302 if exists("netrw_explore_list") |let b:netrw_explore_list = netrw_explore_list |endif
8303 if exists("netrw_explore_listlen")|let b:netrw_explore_listlen = netrw_explore_listlen|endif
8304 if exists("netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = netrw_explore_mtchcnt|endif
8305 if exists("netrw_fname") |let b:netrw_fname = netrw_fname |endif
8306 if exists("netrw_lastfile") |let b:netrw_lastfile = netrw_lastfile |endif
8307 if exists("netrw_liststyle") |let b:netrw_liststyle = netrw_liststyle |endif
8308 if exists("netrw_method") |let b:netrw_method = netrw_method |endif
8309 if exists("netrw_option") |let b:netrw_option = netrw_option |endif
8310 if exists("netrw_prvdir") |let b:netrw_prvdir = netrw_prvdir |endif
8311
Bram Moolenaar5c736222010-01-06 20:54:52 +01008312 if a:0 > 0
8313 let b:netrw_curdir= a:1
8314 if b:netrw_curdir =~ '/$'
8315 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
8316 file NetrwTreeListing
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008317 set bt=nowrite noswf
Bram Moolenaaradc21822011-04-01 18:03:16 +02008318 nno <silent> <buffer> [ :sil call <SID>TreeListMove('[')<cr>
8319 nno <silent> <buffer> ] :sil call <SID>TreeListMove(']')<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01008320 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008321 exe "sil! keepalt file ".fnameescape(b:netrw_curdir)
Bram Moolenaar5c736222010-01-06 20:54:52 +01008322 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00008323 endif
8324 endif
8325
Bram Moolenaar446cb832008-06-24 21:56:24 +00008326" call Dret("s:NetrwEnew : buf#".bufnr("%")."<".bufname("%")."> expand(%)<".expand("%")."> expand(#)<".expand("#").">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008327endfun
8328
8329" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008330" s:NetrwSaveWordPosn: used to keep cursor on same word after refresh, {{{2
8331" changed sorting, etc. Also see s:NetrwRestoreWordPosn().
8332fun! s:NetrwSaveWordPosn()
8333" call Dfunc("NetrwSaveWordPosn()")
8334 let s:netrw_saveword= '^'.fnameescape(getline('.')).'$'
8335" call Dret("NetrwSaveWordPosn : saveword<".s:netrw_saveword.">")
8336endfun
8337
8338" ---------------------------------------------------------------------
8339" s:NetrwRestoreWordPosn: used to keep cursor on same word after refresh, {{{2
8340" changed sorting, etc. Also see s:NetrwSaveWordPosn().
8341fun! s:NetrwRestoreWordPosn()
8342" call Dfunc("NetrwRestoreWordPosn()")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008343 sil! call search(s:netrw_saveword,'w')
Bram Moolenaar446cb832008-06-24 21:56:24 +00008344" call Dret("NetrwRestoreWordPosn")
8345endfun
8346
8347" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008348" s:RestoreBufVars: {{{2
8349fun! s:RestoreBufVars()
8350" call Dfunc("s:RestoreBufVars()")
8351
8352 if exists("s:netrw_curdir") |let b:netrw_curdir = s:netrw_curdir |endif
8353 if exists("s:netrw_lastfile") |let b:netrw_lastfile = s:netrw_lastfile |endif
8354 if exists("s:netrw_method") |let b:netrw_method = s:netrw_method |endif
8355 if exists("s:netrw_fname") |let b:netrw_fname = s:netrw_fname |endif
8356 if exists("s:netrw_machine") |let b:netrw_machine = s:netrw_machine |endif
8357 if exists("s:netrw_browser_active")|let b:netrw_browser_active = s:netrw_browser_active|endif
8358
8359" call Dret("s:RestoreBufVars")
8360endfun
8361
8362" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008363" s:RemotePathAnalysis: {{{2
8364fun! s:RemotePathAnalysis(dirname)
Bram Moolenaar251e1912011-06-19 05:09:16 +02008365" call Dfunc("s:RemotePathAnalysis(a:dirname<".a:dirname.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008366
8367 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/:#]\+\)\%([:#]\(\d\+\)\)\=/\(.*\)$'
8368 let s:method = substitute(a:dirname,dirpat,'\1','')
8369 let s:user = substitute(a:dirname,dirpat,'\2','')
8370 let s:machine = substitute(a:dirname,dirpat,'\3','')
8371 let s:port = substitute(a:dirname,dirpat,'\4','')
8372 let s:path = substitute(a:dirname,dirpat,'\5','')
8373 let s:fname = substitute(a:dirname,'^.*/\ze.','','')
8374
8375" call Decho("set up s:method <".s:method .">")
8376" call Decho("set up s:user <".s:user .">")
8377" call Decho("set up s:machine<".s:machine.">")
8378" call Decho("set up s:port <".s:port.">")
8379" call Decho("set up s:path <".s:path .">")
8380" call Decho("set up s:fname <".s:fname .">")
8381
8382" call Dret("s:RemotePathAnalysis")
8383endfun
8384
8385" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008386" s:RemoteSystem: runs a command on a remote host using ssh {{{2
8387" Returns status
8388" Runs system() on
8389" [cd REMOTEDIRPATH;] a:cmd
8390" Note that it doesn't do shellescape(a:cmd)!
8391fun! s:RemoteSystem(cmd)
8392" call Dfunc("s:RemoteSystem(cmd<".a:cmd.">)")
8393 if !executable(g:netrw_ssh_cmd)
Bram Moolenaaradc21822011-04-01 18:03:16 +02008394 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 +00008395 elseif !exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008396 keepj call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
Bram Moolenaarc236c162008-07-13 17:41:49 +00008397 else
8398 let cmd = s:MakeSshCmd(g:netrw_ssh_cmd." USEPORT HOSTNAME")
8399 let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
8400 if remotedir != ""
8401 let cmd= cmd.' cd '.shellescape(remotedir).";"
8402 else
8403 let cmd= cmd.' '
8404 endif
8405 let cmd= cmd.a:cmd
8406" call Decho("call system(".cmd.")")
8407 let ret= system(cmd)
8408 endif
8409" call Dret("s:RemoteSystem ".ret)
8410 return ret
Bram Moolenaar9964e462007-05-05 17:54:07 +00008411endfun
8412
8413" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008414" s:RestoreWinVars: (used by Explore() and NetrwSplit()) {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00008415fun! s:RestoreWinVars()
8416" call Dfunc("s:RestoreWinVars()")
Bram Moolenaar488c6512005-08-11 20:09:58 +00008417 if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00008418 if exists("s:col") |let w:netrw_col = s:col |unlet s:col |endif
8419 if exists("s:curdir") |let w:netrw_curdir = s:curdir |unlet s:curdir |endif
8420 if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif
8421 if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif
8422 if exists("s:explore_line") |let w:netrw_explore_line = s:explore_line |unlet s:explore_line |endif
8423 if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
8424 if exists("s:explore_list") |let w:netrw_explore_list = s:explore_list |unlet s:explore_list |endif
8425 if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
8426 if exists("s:fpl") |let w:netrw_fpl = s:fpl |unlet s:fpl |endif
8427 if exists("s:hline") |let w:netrw_hline = s:hline |unlet s:hline |endif
8428 if exists("s:line") |let w:netrw_line = s:line |unlet s:line |endif
8429 if exists("s:liststyle") |let w:netrw_liststyle = s:liststyle |unlet s:liststyle |endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00008430 if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif
8431 if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00008432 if exists("s:treedict") |let w:netrw_treedict = s:treedict |unlet s:treedict |endif
8433 if exists("s:treetop") |let w:netrw_treetop = s:treetop |unlet s:treetop |endif
8434 if exists("s:winnr") |let w:netrw_winnr = s:winnr |unlet s:winnr |endif
8435" call Dret("s:RestoreWinVars")
Bram Moolenaar488c6512005-08-11 20:09:58 +00008436endfun
8437
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008438" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008439" s:Rexplore: implements returning from a buffer to a netrw directory {{{2
8440"
8441" s:SetRexDir() sets up <2-leftmouse> maps (if g:netrw_retmap
8442" is true) and a command, :Rexplore, which call this function.
8443"
8444" s:nbcd_curpos_{bufnr('%')} is set up by s:NetrwBrowseChgDir()
8445fun! s:NetrwRexplore(islocal,dirname)
Bram Moolenaaradc21822011-04-01 18:03:16 +02008446" call Dfunc("s:NetrwRexplore() w:netrw_rexlocal=".w:netrw_rexlocal." w:netrw_rexdir<".w:netrw_rexdir.">")
8447 if w:netrw_rexlocal
8448 keepj call netrw#LocalBrowseCheck(w:netrw_rexdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008449 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02008450 keepj call s:NetrwBrowse(0,w:netrw_rexdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008451 endif
8452 if exists("s:nbcd_curpos_{bufnr('%')}")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008453 keepj call netrw#NetrwRestorePosn(s:nbcd_curpos_{bufnr('%')})
Bram Moolenaar446cb832008-06-24 21:56:24 +00008454 unlet s:nbcd_curpos_{bufnr('%')}
8455 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01008456 if exists("s:explore_match")
8457 exe "2match netrwMarkFile /".s:explore_match."/"
8458 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008459" call Dret("s:NetrwRexplore")
8460endfun
8461
8462" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008463" s:SaveBufVars: {{{2
8464fun! s:SaveBufVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +01008465" call Dfunc("s:SaveBufVars() buf#".bufnr("%"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00008466
8467 if exists("b:netrw_curdir") |let s:netrw_curdir = b:netrw_curdir |endif
8468 if exists("b:netrw_lastfile") |let s:netrw_lastfile = b:netrw_lastfile |endif
8469 if exists("b:netrw_method") |let s:netrw_method = b:netrw_method |endif
8470 if exists("b:netrw_fname") |let s:netrw_fname = b:netrw_fname |endif
8471 if exists("b:netrw_machine") |let s:netrw_machine = b:netrw_machine |endif
8472 if exists("b:netrw_browser_active")|let s:netrw_browser_active = b:netrw_browser_active|endif
8473
8474" call Dret("s:SaveBufVars")
8475endfun
8476
8477" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008478" s:SaveWinVars: (used by Explore() and NetrwSplit()) {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00008479fun! s:SaveWinVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +01008480" call Dfunc("s:SaveWinVars() win#".winnr())
Bram Moolenaar9964e462007-05-05 17:54:07 +00008481 if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif
8482 if exists("w:netrw_col") |let s:col = w:netrw_col |endif
8483 if exists("w:netrw_curdir") |let s:curdir = w:netrw_curdir |endif
8484 if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif
8485 if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif
8486 if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif
8487 if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
8488 if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif
8489 if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
8490 if exists("w:netrw_fpl") |let s:fpl = w:netrw_fpl |endif
8491 if exists("w:netrw_hline") |let s:hline = w:netrw_hline |endif
8492 if exists("w:netrw_line") |let s:line = w:netrw_line |endif
8493 if exists("w:netrw_liststyle") |let s:liststyle = w:netrw_liststyle |endif
8494 if exists("w:netrw_method") |let s:method = w:netrw_method |endif
8495 if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif
8496 if exists("w:netrw_treedict") |let s:treedict = w:netrw_treedict |endif
8497 if exists("w:netrw_treetop") |let s:treetop = w:netrw_treetop |endif
8498 if exists("w:netrw_winnr") |let s:winnr = w:netrw_winnr |endif
8499" call Dret("s:SaveWinVars")
8500endfun
8501
8502" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008503" s:SetBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck()) {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008504" To allow separate windows to have their own activities, such as
8505" Explore **/pattern, several variables have been made window-oriented.
8506" However, when the user splits a browser window (ex: ctrl-w s), these
Bram Moolenaar1afcace2005-11-25 19:54:28 +00008507" variables are not inherited by the new window. SetBufWinVars() and
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008508" UseBufWinVars() get around that.
Bram Moolenaar1afcace2005-11-25 19:54:28 +00008509fun! s:SetBufWinVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +01008510" call Dfunc("s:SetBufWinVars() win#".winnr())
Bram Moolenaar9964e462007-05-05 17:54:07 +00008511 if exists("w:netrw_liststyle") |let b:netrw_liststyle = w:netrw_liststyle |endif
8512 if exists("w:netrw_bannercnt") |let b:netrw_bannercnt = w:netrw_bannercnt |endif
8513 if exists("w:netrw_method") |let b:netrw_method = w:netrw_method |endif
8514 if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif
8515 if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif
8516 if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen= w:netrw_explore_listlen|endif
8517 if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt= w:netrw_explore_mtchcnt|endif
8518 if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif
8519 if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif
8520 if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif
8521" call Dret("s:SetBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008522endfun
8523
8524" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008525" s:SetRexDir: set directory for :Rexplore {{{2
8526fun! s:SetRexDir(islocal,dirname)
8527" call Dfunc("s:SetRexDir(islocal=".a:islocal." dirname<".a:dirname.">)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008528 let w:netrw_rexdir = a:dirname
8529 let w:netrw_rexlocal = a:islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00008530" call Dret("s:SetRexDir")
8531endfun
8532
8533" ---------------------------------------------------------------------
8534" s:Strlen: this function returns the length of a string, even if its {{{2
8535" using two-byte etc characters.
Bram Moolenaar5c736222010-01-06 20:54:52 +01008536" Solution from Nicolai Weibull, vim docs (:help strlen()), Tony Mechelynck,
8537" and a bit from me.
8538" if g:netrw_xstrlen is zero (default), then the builtin strlen() function is used.
Bram Moolenaar446cb832008-06-24 21:56:24 +00008539fun! s:Strlen(x)
8540" call Dfunc("s:Strlen(x<".a:x.">")
8541 if g:netrw_xstrlen == 1
8542 " number of codepoints (Latin a + combining circumflex is two codepoints)
8543 " (comment from TM, solution from NW)
8544 let ret= strlen(substitute(a:x,'.','c','g'))
8545
8546 elseif g:netrw_xstrlen == 2
8547 " number of spacing codepoints (Latin a + combining circumflex is one spacing
8548 " codepoint; a hard tab is one; wide and narrow CJK are one each; etc.)
8549 " (comment from TM, solution from TM)
8550 let ret=strlen(substitute(a:x, '.\Z', 'x', 'g'))
8551
8552 elseif g:netrw_xstrlen == 3
8553 " virtual length (counting, for instance, tabs as anything between 1 and
8554 " 'tabstop', wide CJK as 2 rather than 1, Arabic alif as zero when immediately
8555 " preceded by lam, one otherwise, etc.)
8556 " (comment from TM, solution from me)
8557 let modkeep= &mod
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008558 exe "keepj norm! o\<esc>"
Bram Moolenaar446cb832008-06-24 21:56:24 +00008559 call setline(line("."),a:x)
8560 let ret= virtcol("$") - 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008561 keepj d
Bram Moolenaar446cb832008-06-24 21:56:24 +00008562 let &mod= modkeep
8563
8564 else
8565 " at least give a decent default
Bram Moolenaar5c736222010-01-06 20:54:52 +01008566 let ret= strlen(a:x)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008567 endif
8568" call Dret("s:Strlen ".ret)
8569 return ret
8570endfun
8571
8572" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008573" s:TreeListMove: {{{2
8574fun! s:TreeListMove(dir)
8575" call Dfunc("s:TreeListMove(dir<".a:dir.">)")
8576 let curline = getline('.')
8577 let prvline = (line(".") > 1)? getline(line(".")-1) : ''
8578 let nxtline = (line(".") < line("$"))? getline(line(".")+1) : ''
8579 let curindent= substitute(curline,'^\([| ]*\).\{-}$','\1','')
8580 let indentm1 = substitute(curindent,'^| ','','')
8581" call Decho("prvline <".prvline."> #".line(".")-1)
8582" call Decho("curline <".curline."> #".line("."))
8583" call Decho("nxtline <".nxtline."> #".line(".")+1)
8584" call Decho("curindent<".curindent.">")
8585" call Decho("indentm1 <".indentm1.">")
8586
8587 if curline !~ '/$'
8588" call Decho('regfile')
8589 if a:dir == '[' && prvline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008590 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00008591 let nl = search('^'.indentm1.'[^|]','bWe') " search backwards from regular file
8592" call Decho("regfile srch back: ".nl)
8593 elseif a:dir == ']' && nxtline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008594 keepj norm! $
Bram Moolenaar446cb832008-06-24 21:56:24 +00008595 let nl = search('^'.indentm1.'[^|]','We') " search forwards from regular file
8596" call Decho("regfile srch fwd: ".nl)
8597 endif
8598
8599 elseif a:dir == '[' && prvline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008600 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00008601 let curline= line(".")
8602 let nl = search('^'.curindent.'[^|]','bWe') " search backwards From directory, same indentation
8603" call Decho("dir srch back ind: ".nl)
8604 if nl != 0
8605 if line(".") == curline-1
8606 let nl= search('^'.indentm1.'[^|]','bWe') " search backwards from directory, indentation - 1
8607" call Decho("dir srch back ind-1: ".nl)
8608 endif
8609 endif
8610
8611 elseif a:dir == ']' && nxtline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008612 keepj norm! $
Bram Moolenaar446cb832008-06-24 21:56:24 +00008613 let curline = line(".")
8614 let nl = search('^'.curindent.'[^|]','We') " search forwards from directory, same indentation
8615" call Decho("dir srch fwd ind: ".nl)
8616 if nl != 0
8617 if line(".") == curline+1
8618 let nl= search('^'.indentm1.'[^|]','We') " search forwards from directory, indentation - 1
8619" call Decho("dir srch fwd ind-1: ".nl)
8620 endif
8621 endif
8622
8623 endif
8624
8625" call Dret("s:TreeListMove")
8626endfun
8627
8628" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008629" s:UpdateBuffersMenu: does emenu Buffers.Refresh (but due to locale, the menu item may not be called that) {{{2
8630" The Buffers.Refresh menu calls s:BMShow(); unfortunately, that means that that function
8631" can't be called except via emenu. But due to locale, that menu line may not be called
8632" Buffers.Refresh; hence, s:NetrwBMShow() utilizes a "cheat" to call that function anyway.
8633fun! s:UpdateBuffersMenu()
8634" call Dfunc("s:UpdateBuffersMenu()")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008635 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaarc236c162008-07-13 17:41:49 +00008636 try
Bram Moolenaaradc21822011-04-01 18:03:16 +02008637 sil emenu Buffers.Refresh\ menu
Bram Moolenaarc236c162008-07-13 17:41:49 +00008638 catch /^Vim\%((\a\+)\)\=:E/
8639 let v:errmsg= ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02008640 sil keepj call s:NetrwBMShow()
Bram Moolenaarc236c162008-07-13 17:41:49 +00008641 endtry
8642 endif
8643" call Dret("s:UpdateBuffersMenu")
8644endfun
8645
8646" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008647" s:UseBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck() {{{2
Bram Moolenaaradc21822011-04-01 18:03:16 +02008648" Matching function to s:SetBufWinVars()
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008649fun! s:UseBufWinVars()
Bram Moolenaar9964e462007-05-05 17:54:07 +00008650" call Dfunc("s:UseBufWinVars()")
8651 if exists("b:netrw_liststyle") && !exists("w:netrw_liststyle") |let w:netrw_liststyle = b:netrw_liststyle |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008652 if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif
8653 if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif
8654 if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif
8655 if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif
8656 if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
8657 if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
8658 if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif
8659 if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif
8660 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 +00008661" call Dret("s:UseBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008662endfun
8663
Bram Moolenaar1afcace2005-11-25 19:54:28 +00008664" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01008665" netrw#WinPath: tries to insure that the path is windows-acceptable, whether cygwin is used or not {{{2
8666fun! netrw#WinPath(path)
8667" call Dfunc("netrw#WinPath(path<".a:path.">)")
8668 if (!g:netrw_cygwin || &shell !~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$') && (has("win32") || has("win95") || has("win64") || has("win16"))
8669 " remove cygdrive prefix, if present
8670 let path = substitute(a:path,'/cygdrive/\(.\)','\1:','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00008671 " remove trailing slash (Win95)
Bram Moolenaar5c736222010-01-06 20:54:52 +01008672 let path = substitute(path, '\(\\\|/\)$', '', 'g')
Bram Moolenaarc236c162008-07-13 17:41:49 +00008673 " remove escaped spaces
8674 let path = substitute(path, '\ ', ' ', 'g')
8675 " convert slashes to backslashes
8676 let path = substitute(path, '/', '\', 'g')
8677 else
8678 let path= a:path
8679 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01008680" call Dret("netrw#WinPath <".path.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00008681 return path
8682endfun
8683
8684" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00008685" Settings Restoration: {{{2
Bram Moolenaar83bab712005-08-01 21:58:57 +00008686let &cpo= s:keepcpo
8687unlet s:keepcpo
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00008688
Bram Moolenaar071d4272004-06-13 20:20:40 +00008689" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00008690" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +00008691" vim:ts=8 fdm=marker