blob: 2c85bf8d45e0bce2b56e417bd0278d76d194f95f [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 Moolenaar15146672011-10-20 22:22:38 +02003" Date: Sep 26, 2011
4" Version: 143
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 Moolenaar15146672011-10-20 22:22:38 +020025let g:loaded_netrw = "v143"
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 Moolenaar15146672011-10-20 22:22:38 +0200229call s:NetrwInit("g:netrw_remote_mkdir","mkdir")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000230if !exists("g:netrw_localmovecmd")
231 if has("win32") || has("win95") || has("win64") || has("win16")
232 if g:netrw_cygwin
233 let g:netrw_localmovecmd= "mv"
234 else
235 let g:netrw_localmovecmd= "move"
236 endif
237 elseif has("unix") || has("macunix")
238 let g:netrw_localmovecmd= "mv"
239 else
240 let g:netrw_localmovecmd= ""
241 endif
242endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100243call s:NetrwInit("g:netrw_local_rmdir", "rmdir")
244call s:NetrwInit("g:netrw_liststyle" , s:THINLIST)
245" sanity checks
Bram Moolenaar9964e462007-05-05 17:54:07 +0000246if g:netrw_liststyle < 0 || g:netrw_liststyle >= s:MAXLIST
Bram Moolenaar9964e462007-05-05 17:54:07 +0000247 let g:netrw_liststyle= s:THINLIST
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000248endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000249if g:netrw_liststyle == s:LONGLIST && g:netrw_scp_cmd !~ '^pscp'
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000250 let g:netrw_list_cmd= g:netrw_list_cmd." -l"
251endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000252" Default values - m-r ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100253call s:NetrwInit("g:netrw_markfileesc" , '*./[\~')
254call s:NetrwInit("g:netrw_maxfilenamelen", 32)
255call s:NetrwInit("g:netrw_menu" , 1)
256call s:NetrwInit("g:netrw_mkdir_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME mkdir")
257call s:NetrwInit("g:netrw_mousemaps" , (exists("&mouse") && &mouse =~ '[anh]'))
258call s:NetrwInit("g:netrw_retmap" , 0)
259if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)
260 call s:NetrwInit("g:netrw_chgperm" , "chmod PERM FILENAME")
261elseif has("win32") || has("win95") || has("win64") || has("win16")
262 call s:NetrwInit("g:netrw_chgperm" , "cacls FILENAME /e /p PERM")
263else
264 call s:NetrwInit("g:netrw_chgperm" , "chmod PERM FILENAME")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000265endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100266call s:NetrwInit("g:netrw_preview" , 0)
267call s:NetrwInit("g:netrw_scpport" , "-P")
268call s:NetrwInit("g:netrw_sshport" , "-p")
269call s:NetrwInit("g:netrw_rename_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME mv")
270call s:NetrwInit("g:netrw_rm_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rm")
271call s:NetrwInit("g:netrw_rmdir_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rmdir")
272call s:NetrwInit("g:netrw_rmf_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rm -f")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000273" Default values - s ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100274" g:netrw_sepchr: picking a character that doesn't appear in filenames that can be used to separate priority from filename
275call s:NetrwInit("g:netrw_sepchr" , (&enc == "euc-jp")? "\<Char-0x01>" : "\<Char-0xff>")
Bram Moolenaaradc21822011-04-01 18:03:16 +0200276call s:NetrwInit("s:netrw_silentxfer" , (exists("g:netrw_silent") && g:netrw_silent != 0)? "sil keepj " : "keepj ")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100277call s:NetrwInit("g:netrw_sort_by" , "name") " alternatives: date , size
278call s:NetrwInit("g:netrw_sort_options" , "")
279call s:NetrwInit("g:netrw_sort_direction", "normal") " alternative: reverse (z y x ...)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000280if !exists("g:netrw_sort_sequence")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100281 if has("unix")
Bram Moolenaar15146672011-10-20 22:22:38 +0200282 let g:netrw_sort_sequence= '[\/]$,\<core\%(\.\d\+\)\=\>,\.h$,\.c$,\.cpp$,\~\=\*$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
Bram Moolenaar5c736222010-01-06 20:54:52 +0100283 else
284 let g:netrw_sort_sequence= '[\/]$,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000285 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000286endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100287call s:NetrwInit("g:netrw_special_syntax" , 0)
288call s:NetrwInit("g:netrw_ssh_browse_reject", '^total\s\+\d\+$')
289call s:NetrwInit("g:netrw_use_noswf" , 0)
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000290" Default values - t-w ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100291call s:NetrwInit("g:netrw_timefmt","%c")
292call s:NetrwInit("g:netrw_xstrlen",0)
293call s:NetrwInit("g:NetrwTopLvlMenu","Netrw.")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100294call s:NetrwInit("g:netrw_win95ftp",1)
Bram Moolenaar251e1912011-06-19 05:09:16 +0200295call s:NetrwInit("g:netrw_winsize",50)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000296" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000297" Default values for netrw's script variables: {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +0100298call s:NetrwInit("g:netrw_fname_escape",' ?&;%')
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200299if has("win32") || has("win95") || has("win64") || has("win16")
300 call s:NetrwInit("g:netrw_glob_escape",'[]*?`{$')
301else
302 call s:NetrwInit("g:netrw_glob_escape",'[]*?`{~$\')
303endif
304call s:NetrwInit("g:netrw_menu_escape",'./&? \')
Bram Moolenaar5c736222010-01-06 20:54:52 +0100305call s:NetrwInit("g:netrw_tmpfile_escape",' &;')
306call s:NetrwInit("s:netrw_map_escape","<|\n\r\\\<C-V>\"")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000307
308" BufEnter event ignored by decho when following variable is true
309" Has a side effect that doau BufReadPost doesn't work, so
310" files read by network transfer aren't appropriately highlighted.
311"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000312
Bram Moolenaaradc21822011-04-01 18:03:16 +0200313" ======================
314" Netrw Initialization: {{{1
315" ======================
Bram Moolenaar15146672011-10-20 22:22:38 +0200316if v:version >= 700 && has("balloon_eval") && !exists("s:initbeval") && !exists("g:netrw_nobeval") && has("syntax") && exists("g:syntax_on")
317 let s:initbeval = &beval
318 let &l:bexpr = "netrw#NetrwBalloonHelp()"
Bram Moolenaaradc21822011-04-01 18:03:16 +0200319 set beval
Bram Moolenaar15146672011-10-20 22:22:38 +0200320 au BufWinEnter,WinEnter * if &ft == "netrw"|set beval|else|let &beval= s:initbeval|endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200321endif
322
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000323" ==============================
324" Netrw Utility Functions: {{{1
325" ==============================
326
Bram Moolenaaradc21822011-04-01 18:03:16 +0200327" ---------------------------------------------------------------------
328" netrw#NetrwBalloonHelp: {{{2
Bram Moolenaar15146672011-10-20 22:22:38 +0200329if v:version >= 700 && has("balloon_eval") && &beval == 1 && has("syntax") && exists("g:syntax_on")
Bram Moolenaaradc21822011-04-01 18:03:16 +0200330 fun! netrw#NetrwBalloonHelp()
Bram Moolenaar15146672011-10-20 22:22:38 +0200331 if !exists("w:netrw_bannercnt") || v:beval_lnum >= w:netrw_bannercnt || (exists("g:netrw_nobeval") && g:netrw_nobeval)
Bram Moolenaaradc21822011-04-01 18:03:16 +0200332 let mesg= ""
333 elseif v:beval_text == "Netrw" || v:beval_text == "Directory" || v:beval_text == "Listing"
Bram Moolenaar15146672011-10-20 22:22:38 +0200334 let mesg = "i: thin-long-wide-tree gh: quick hide/unhide of dot-files qf: quick file info %:open new file"
Bram Moolenaaradc21822011-04-01 18:03:16 +0200335 elseif getline(v:beval_lnum) =~ '^"\s*/'
336 let mesg = "<cr>: edit/enter o: edit/enter in horiz window t: edit/enter in new tab v:edit/enter in vert window"
337 elseif v:beval_text == "Sorted" || v:beval_text == "by"
338 let mesg = 's: sort by name, time, or file size r: reverse sorting order mt: mark target'
339 elseif v:beval_text == "Sort" || v:beval_text == "sequence"
340 let mesg = "S: edit sorting sequence"
341 elseif v:beval_text == "Hiding" || v:beval_text == "Showing"
342 let mesg = "a: hiding-showing-all ctrl-h: editing hiding list mh: hide/show by suffix"
343 elseif v:beval_text == "Quick" || v:beval_text == "Help"
344 let mesg = "Help: press <F1>"
345 elseif v:beval_text == "Copy/Move" || v:beval_text == "Tgt"
346 let mesg = "mt: mark target mc: copy marked file to target mm: move marked file to target"
347 else
348 let mesg= ""
349 endif
350 return mesg
351 endfun
352endif
353
Bram Moolenaar071d4272004-06-13 20:20:40 +0000354" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000355" s:NetrwOptionSave: save options and set to "standard" form {{{2
356" 06/08/07 : removed call to NetrwSafeOptions(), either placed
357" immediately after NetrwOptionSave() calls in NetRead
358" and NetWrite, or after the s:NetrwEnew() call in
359" NetrwBrowse.
360" vt: normally its "w:" or "s:" (a variable type)
361fun! s:NetrwOptionSave(vt)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100362" call Dfunc("s:NetrwOptionSave(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">"." winnr($)=".winnr("$"))
Bram Moolenaar071d4272004-06-13 20:20:40 +0000363
Bram Moolenaar446cb832008-06-24 21:56:24 +0000364" call Decho(a:vt."netrw_optionsave".(exists("{a:vt}netrw_optionsave")? ("=".{a:vt}netrw_optionsave) : " doesn't exist"))
365 if !exists("{a:vt}netrw_optionsave")
366 let {a:vt}netrw_optionsave= 1
Bram Moolenaar9964e462007-05-05 17:54:07 +0000367 else
Bram Moolenaar446cb832008-06-24 21:56:24 +0000368" call Dret("s:NetrwOptionSave : options already saved")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000369 return
370 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200371" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist")." diff=".&l:diff)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000372
373 " Save current settings and current directory
374 let s:yykeep = @@
Bram Moolenaar15146672011-10-20 22:22:38 +0200375 if exists("&l:acd")|let {a:vt}netrw_acdkeep = &l:acd|endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000376 let {a:vt}netrw_aikeep = &l:ai
377 let {a:vt}netrw_awkeep = &l:aw
Bram Moolenaar15146672011-10-20 22:22:38 +0200378 let {a:vt}netrw_bhkeep = &l:bh
379 let {a:vt}netrw_blkeep = &l:bl
380 let {a:vt}netrw_btkeep = &l:bt
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200381 let {a:vt}netrw_bombkeep = &l:bomb
Bram Moolenaar446cb832008-06-24 21:56:24 +0000382 let {a:vt}netrw_cikeep = &l:ci
383 let {a:vt}netrw_cinkeep = &l:cin
384 let {a:vt}netrw_cinokeep = &l:cino
385 let {a:vt}netrw_comkeep = &l:com
386 let {a:vt}netrw_cpokeep = &l:cpo
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200387 let {a:vt}netrw_diffkeep = &l:diff
Bram Moolenaar15146672011-10-20 22:22:38 +0200388 let {a:vt}netrw_fenkeep = &l:fen
389 let {a:vt}netrw_ffkeep = &l:ff
Bram Moolenaar446cb832008-06-24 21:56:24 +0000390 let {a:vt}netrw_fokeep = &l:fo " formatoptions
391 let {a:vt}netrw_gdkeep = &l:gd " gdefault
392 let {a:vt}netrw_hidkeep = &l:hidden
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200393 let {a:vt}netrw_imkeep = &l:im
Bram Moolenaar15146672011-10-20 22:22:38 +0200394 let {a:vt}netrw_iskkeep = &l:isk
395 let {a:vt}netrw_lskeep = &l:ls
396 let {a:vt}netrw_makeep = &l:ma
Bram Moolenaar446cb832008-06-24 21:56:24 +0000397 let {a:vt}netrw_magickeep = &l:magic
Bram Moolenaar15146672011-10-20 22:22:38 +0200398 let {a:vt}netrw_modkeep = &l:mod
399 let {a:vt}netrw_nukeep = &l:nu
Bram Moolenaar446cb832008-06-24 21:56:24 +0000400 let {a:vt}netrw_repkeep = &l:report
Bram Moolenaar15146672011-10-20 22:22:38 +0200401 let {a:vt}netrw_rokeep = &l:ro
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200402 let {a:vt}netrw_selkeep = &l:sel
Bram Moolenaar446cb832008-06-24 21:56:24 +0000403 let {a:vt}netrw_spellkeep = &l:spell
Bram Moolenaar15146672011-10-20 22:22:38 +0200404 let {a:vt}netrw_tskeep = &l:ts
Bram Moolenaar446cb832008-06-24 21:56:24 +0000405 let {a:vt}netrw_twkeep = &l:tw " textwidth
406 let {a:vt}netrw_wigkeep = &l:wig " wildignore
Bram Moolenaar15146672011-10-20 22:22:38 +0200407 let {a:vt}netrw_wrapkeep = &l:wrap
408 let {a:vt}netrw_writekeep = &l:write
409 if g:netrw_use_noswf && has("win32") && !has("win95")
410 let {a:vt}netrw_swfkeep = &l:swf
411 endif
412
413 " save a few selected netrw-related variables
414 if g:netrw_keepdir
415 let {a:vt}netrw_dirkeep = getcwd()
416 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000417 if has("win32") && !has("win95")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000418 let {a:vt}netrw_swfkeep = &l:swf " swapfile
Bram Moolenaar9964e462007-05-05 17:54:07 +0000419 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200420 if &go =~# 'a' | sil! let {a:vt}netrw_regstar = @* | endif
421 sil! let {a:vt}netrw_regslash= @/
Bram Moolenaar9964e462007-05-05 17:54:07 +0000422
Bram Moolenaar446cb832008-06-24 21:56:24 +0000423" call Dret("s:NetrwOptionSave : win#".winnr()." buf#".bufnr("%"))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000424endfun
425
426" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000427" s:NetrwOptionRestore: restore options {{{2
428fun! s:NetrwOptionRestore(vt)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100429" call Dfunc("s:NetrwOptionRestore(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")." winnr($)=".winnr("$"))
Bram Moolenaar446cb832008-06-24 21:56:24 +0000430 if !exists("{a:vt}netrw_optionsave")
Bram Moolenaar15146672011-10-20 22:22:38 +0200431 if exists("s:nbcd_curpos_{bufnr('%')}")
432" call Decho("restoring previous position")
433 keepj call netrw#NetrwRestorePosn(s:nbcd_curpos_{bufnr('%')})
434" unlet s:nbcd_curpos_{bufnr('%')}
435 else
436" call Decho("no previous position")
437 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +0000438" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000439" call Dret("s:NetrwOptionRestore : ".a:vt."netrw_optionsave doesn't exist")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000440 return
441 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000442 unlet {a:vt}netrw_optionsave
Bram Moolenaar9964e462007-05-05 17:54:07 +0000443
444 if exists("&acd")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000445 if exists("{a:vt}netrw_acdkeep")
446" call Decho("g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
447 let curdir = getcwd()
448 let &l:acd = {a:vt}netrw_acdkeep
449 unlet {a:vt}netrw_acdkeep
450 if &l:acd
Bram Moolenaar15146672011-10-20 22:22:38 +0200451" call Decho("exe keepj lcd ".fnameescape(curdir)) " NOTE: was g:netrw_fname_escape for some reason
Bram Moolenaar446cb832008-06-24 21:56:24 +0000452 try
453 if !exists("&l:acd") && !&l:acd
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200454 exe 'keepj lcd '.fnameescape(curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000455 endif
456 catch /^Vim\%((\a\+)\)\=:E472/
457 call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".curdir."> (permissions?)",61)
458 endtry
459 endif
460 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000461 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000462 if exists("{a:vt}netrw_aikeep") |let &l:ai = {a:vt}netrw_aikeep |unlet {a:vt}netrw_aikeep |endif
463 if exists("{a:vt}netrw_awkeep") |let &l:aw = {a:vt}netrw_awkeep |unlet {a:vt}netrw_awkeep |endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200464 if exists("{a:vt}netrw_bhkeep") |let &l:bh = {a:vt}netrw_bhkeep |unlet {a:vt}netrw_bhkeep |endif
465 if exists("{a:vt}netrw_blkeep") |let &l:bl = {a:vt}netrw_blkeep |unlet {a:vt}netrw_blkeep |endif
466 if exists("{a:vt}netrw_btkeep") |let &l:bt = {a:vt}netrw_btkeep |unlet {a:vt}netrw_btkeep |endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200467 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 +0000468 if exists("{a:vt}netrw_cikeep") |let &l:ci = {a:vt}netrw_cikeep |unlet {a:vt}netrw_cikeep |endif
469 if exists("{a:vt}netrw_cinkeep") |let &l:cin = {a:vt}netrw_cinkeep |unlet {a:vt}netrw_cinkeep |endif
470 if exists("{a:vt}netrw_cinokeep") |let &l:cino = {a:vt}netrw_cinokeep |unlet {a:vt}netrw_cinokeep |endif
471 if exists("{a:vt}netrw_comkeep") |let &l:com = {a:vt}netrw_comkeep |unlet {a:vt}netrw_comkeep |endif
472 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 +0200473 if exists("{a:vt}netrw_diffkeep") |let &l:diff = {a:vt}netrw_diffkeep |unlet {a:vt}netrw_diffkeep |endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200474 if exists("{a:vt}netrw_fenkeep") |let &l:fen = {a:vt}netrw_fenkeep |unlet {a:vt}netrw_fenkeep |endif
475 if exists("{a:vt}netrw_ffkeep") |let &l:ff = {a:vt}netrw_ffkeep |unlet {a:vt}netrw_ffkeep |endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000476 if exists("{a:vt}netrw_fokeep") |let &l:fo = {a:vt}netrw_fokeep |unlet {a:vt}netrw_fokeep |endif
477 if exists("{a:vt}netrw_gdkeep") |let &l:gd = {a:vt}netrw_gdkeep |unlet {a:vt}netrw_gdkeep |endif
478 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 +0200479 if exists("{a:vt}netrw_imkeep") |let &l:im = {a:vt}netrw_imkeep |unlet {a:vt}netrw_imkeep |endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200480 if exists("{a:vt}netrw_iskkeep") |let &l:isk = {a:vt}netrw_iskkeep |unlet {a:vt}netrw_iskkeep |endif
481 if exists("{a:vt}netrw_lskeep") |let &l:ls = {a:vt}netrw_lskeep |unlet {a:vt}netrw_lskeep |endif
482 if exists("{a:vt}netrw_makeep") |let &l:ma = {a:vt}netrw_makeep |unlet {a:vt}netrw_makeep |endif
483 if exists("{a:vt}netrw_magickeep")|let &l:magic = {a:vt}netrw_magickeep |unlet {a:vt}netrw_magickeep|endif
484 if exists("{a:vt}netrw_modkeep") |let &l:mod = {a:vt}netrw_modkeep |unlet {a:vt}netrw_modkeep |endif
485 if exists("{a:vt}netrw_nukeep") |let &l:nu = {a:vt}netrw_nukeep |unlet {a:vt}netrw_nukeep |endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000486 if exists("{a:vt}netrw_repkeep") |let &l:report = {a:vt}netrw_repkeep |unlet {a:vt}netrw_repkeep |endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200487 if exists("{a:vt}netrw_rokeep") |let &l:ro = {a:vt}netrw_rokeep |unlet {a:vt}netrw_rokeep |endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200488 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 +0000489 if exists("{a:vt}netrw_spellkeep")|let &l:spell = {a:vt}netrw_spellkeep |unlet {a:vt}netrw_spellkeep|endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200490 if exists("{a:vt}netrw_tskeep") |let &l:ts = {a:vt}netrw_tskeep |unlet {a:vt}netrw_tskeep |endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000491 if exists("{a:vt}netrw_twkeep") |let &l:tw = {a:vt}netrw_twkeep |unlet {a:vt}netrw_twkeep |endif
492 if exists("{a:vt}netrw_wigkeep") |let &l:wig = {a:vt}netrw_wigkeep |unlet {a:vt}netrw_wigkeep |endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200493 if exists("{a:vt}netrw_wrapkeep") |let &l:wrap = {a:vt}netrw_wrapkeep |unlet {a:vt}netrw_wrapkeep |endif
494 if exists("{a:vt}netrw_writekeep")|let &l:write = {a:vt}netrw_writekeep |unlet {a:vt}netrw_writekeep|endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000495 if exists("s:yykeep") |let @@ = s:yykeep |unlet s:yykeep |endif
496 if exists("{a:vt}netrw_swfkeep")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000497 if &directory == ""
498 " user hasn't specified a swapfile directory;
499 " netrw will temporarily set the swapfile directory
500 " to the current directory as returned by getcwd().
501 let &l:directory = getcwd()
Bram Moolenaaradc21822011-04-01 18:03:16 +0200502 sil! let &l:swf = {a:vt}netrw_swfkeep
Bram Moolenaar9964e462007-05-05 17:54:07 +0000503 setlocal directory=
Bram Moolenaar446cb832008-06-24 21:56:24 +0000504 unlet {a:vt}netrw_swfkeep
505 elseif &l:swf != {a:vt}netrw_swfkeep
506 " following line causes a Press ENTER in windows -- can't seem to work around it!!!
Bram Moolenaaradc21822011-04-01 18:03:16 +0200507 sil! let &l:swf= {a:vt}netrw_swfkeep
Bram Moolenaar446cb832008-06-24 21:56:24 +0000508 unlet {a:vt}netrw_swfkeep
Bram Moolenaar9964e462007-05-05 17:54:07 +0000509 endif
510 endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200511 if exists("{a:vt}netrw_dirkeep") && isdirectory({a:vt}netrw_dirkeep) && g:netrw_keepdir
512 let dirkeep = substitute({a:vt}netrw_dirkeep,'\\','/','g')
513 if exists("{a:vt}netrw_dirkeep") |exe "keepj lcd ".fnameescape(dirkeep)|unlet {a:vt}netrw_dirkeep |endif
514 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200515 if exists("{a:vt}netrw_regstar") |sil! let @*= {a:vt}netrw_regstar |unlet {a:vt}netrw_regstar |endif
516 if exists("{a:vt}netrw_regslash")|sil! let @/= {a:vt}netrw_regslash|unlet {a:vt}netrw_regslash|endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200517 if exists("s:nbcd_curpos_{bufnr('%')}")
518" call Decho("restoring previous position")
519 keepj call netrw#NetrwRestorePosn(s:nbcd_curpos_{bufnr('%')})
520" unlet s:nbcd_curpos_{bufnr('%')}
521 else
522" call Decho("no previous position")
523 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000524
Bram Moolenaar446cb832008-06-24 21:56:24 +0000525" call Decho("g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
526" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist"))
Bram Moolenaarc236c162008-07-13 17:41:49 +0000527" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200528" 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 +0000529" call Dret("s:NetrwOptionRestore : win#".winnr()." buf#".bufnr("%"))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000530endfun
531
532" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000533" s:NetrwSafeOptions: sets options to help netrw do its job {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +0000534fun! s:NetrwSafeOptions()
Bram Moolenaar5c736222010-01-06 20:54:52 +0100535" call Dfunc("s:NetrwSafeOptions() win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%"))."> winnr($)=".winnr("$"))
536" call Decho("win#".winnr()."'s ft=".&ft)
Bram Moolenaar15146672011-10-20 22:22:38 +0200537 if exists("&acd") | setlocal noacd | endif
538 setlocal noai
539 setlocal noaw
540 setlocal nobomb
541 setlocal noci
542 setlocal nocin
Bram Moolenaar9964e462007-05-05 17:54:07 +0000543 setlocal cino=
544 setlocal com=
545 setlocal cpo-=aA
Bram Moolenaar446cb832008-06-24 21:56:24 +0000546 setlocal fo=nroql2
Bram Moolenaar15146672011-10-20 22:22:38 +0200547 setlocal nohid
548 setlocal noim
Bram Moolenaar5c736222010-01-06 20:54:52 +0100549 setlocal isk+=@ isk+=* isk+=/
Bram Moolenaar15146672011-10-20 22:22:38 +0200550 setlocal magic
551 setlocal report=10000
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200552 setlocal sel=inclusive
Bram Moolenaar15146672011-10-20 22:22:38 +0200553 setlocal nospell
554 setlocal tw=0
555 setlocal wig=
Bram Moolenaar9964e462007-05-05 17:54:07 +0000556 if g:netrw_use_noswf && has("win32") && !has("win95")
557 setlocal noswf
558 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +0200559 call s:NetrwCursor()
Bram Moolenaar5c736222010-01-06 20:54:52 +0100560
561 " allow the user to override safe options
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +0200562" call Decho("ft<".&ft."> ei=".&ei)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100563 if &ft == "netrw"
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200564" call Decho("do any netrw FileType autocmds")
Bram Moolenaar15146672011-10-20 22:22:38 +0200565 sil! keepalt keepj doau FileType netrw
Bram Moolenaar5c736222010-01-06 20:54:52 +0100566 endif
567
Bram Moolenaar446cb832008-06-24 21:56:24 +0000568" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist"))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000569" call Dret("s:NetrwSafeOptions")
570endfun
571
Bram Moolenaar446cb832008-06-24 21:56:24 +0000572" ---------------------------------------------------------------------
573" netrw#NetrwClean: remove netrw {{{2
574" supports :NetrwClean -- remove netrw from first directory on runtimepath
575" :NetrwClean! -- remove netrw from all directories on runtimepath
576fun! netrw#NetrwClean(sys)
577" call Dfunc("netrw#NetrwClean(sys=".a:sys.")")
578
579 if a:sys
580 let choice= confirm("Remove personal and system copies of netrw?","&Yes\n&No")
581 else
582 let choice= confirm("Remove personal copy of netrw?","&Yes\n&No")
583 endif
584" call Decho("choice=".choice)
585 let diddel= 0
586 let diddir= ""
587
588 if choice == 1
589 for dir in split(&rtp,',')
590 if filereadable(dir."/plugin/netrwPlugin.vim")
591" call Decho("removing netrw-related files from ".dir)
Bram Moolenaarc236c162008-07-13 17:41:49 +0000592 if s:NetrwDelete(dir."/plugin/netrwPlugin.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/plugin/netrwPlugin.vim",55) |endif
593 if s:NetrwDelete(dir."/autoload/netrwFileHandlers.vim")|call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwFileHandlers.vim",55)|endif
594 if s:NetrwDelete(dir."/autoload/netrwSettings.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwSettings.vim",55) |endif
595 if s:NetrwDelete(dir."/autoload/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrw.vim",55) |endif
596 if s:NetrwDelete(dir."/syntax/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrw.vim",55) |endif
597 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 +0000598 let diddir= dir
599 let diddel= diddel + 1
600 if !a:sys|break|endif
601 endif
602 endfor
603 endif
604
605 echohl WarningMsg
606 if diddel == 0
607 echomsg "netrw is either not installed or not removable"
608 elseif diddel == 1
609 echomsg "removed one copy of netrw from <".diddir.">"
610 else
611 echomsg "removed ".diddel." copies of netrw"
612 endif
613 echohl None
614
615" call Dret("netrw#NetrwClean")
616endfun
617
Bram Moolenaar5c736222010-01-06 20:54:52 +0100618" ---------------------------------------------------------------------
619" netrw#Nread: {{{2
620fun! netrw#Nread(mode,fname)
621" call Dfunc("netrw#Nread(mode=".a:mode." fname<".a:fname.">)")
622 call netrw#NetrwSavePosn()
623 call netrw#NetRead(a:mode,a:fname)
624 call netrw#NetrwRestorePosn()
625" call Dret("netrw#Nread")
626endfun
627
Bram Moolenaar9964e462007-05-05 17:54:07 +0000628" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000629" Netrw Transfer Functions: {{{1
630" ===============================
631
Bram Moolenaar071d4272004-06-13 20:20:40 +0000632" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000633" netrw#NetRead: responsible for reading a file over the net {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +0000634" mode: =0 read remote file and insert before current line
635" =1 read remote file and insert after current line
636" =2 replace with remote file
637" =3 obtain file, but leave in temporary format
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000638fun! netrw#NetRead(mode,...)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000639" call Dfunc("netrw#NetRead(mode=".a:mode.",...) a:0=".a:0." ".g:loaded_netrw)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000640
Bram Moolenaar5c736222010-01-06 20:54:52 +0100641 " NetRead: save options {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +0000642 call s:NetrwOptionSave("w:")
643 call s:NetrwSafeOptions()
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200644 call s:RestoreCursorline()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000645
Bram Moolenaar5c736222010-01-06 20:54:52 +0100646 " NetRead: interpret mode into a readcmd {{{3
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000647 if a:mode == 0 " read remote file before current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000648 let readcmd = "0r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000649 elseif a:mode == 1 " read file after current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000650 let readcmd = "r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000651 elseif a:mode == 2 " replace with remote file
652 let readcmd = "%r"
Bram Moolenaar9964e462007-05-05 17:54:07 +0000653 elseif a:mode == 3 " skip read of file (leave as temporary)
654 let readcmd = "t"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000655 else
656 exe a:mode
657 let readcmd = "r"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000658 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000659 let ichoice = (a:0 == 0)? 0 : 1
660" call Decho("readcmd<".readcmd."> ichoice=".ichoice)
661
Bram Moolenaar5c736222010-01-06 20:54:52 +0100662 " NetRead: get temporary filename {{{3
Bram Moolenaar9964e462007-05-05 17:54:07 +0000663 let tmpfile= s:GetTempfile("")
664 if tmpfile == ""
665" call Dret("netrw#NetRead : unable to get a tempfile!")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000666 return
667 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000668
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000669 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000670
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000671 " attempt to repeat with previous host-file-etc
672 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000673" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000674 let choice = b:netrw_lastfile
675 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000676
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000677 else
678 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000679" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000680
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000681 if match(choice,"?") == 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000682 " give help
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000683 echomsg 'NetRead Usage:'
684 echomsg ':Nread machine:path uses rcp'
685 echomsg ':Nread "machine path" uses ftp with <.netrc>'
686 echomsg ':Nread "machine id password path" uses ftp'
687 echomsg ':Nread dav://machine[:port]/path uses cadaver'
688 echomsg ':Nread fetch://machine/path uses fetch'
689 echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
690 echomsg ':Nread http://[user@]machine/path uses http wget'
691 echomsg ':Nread rcp://[user@]machine/path uses rcp'
692 echomsg ':Nread rsync://machine[:port]/path uses rsync'
693 echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
694 echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000695 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000696 break
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000697
Bram Moolenaar9964e462007-05-05 17:54:07 +0000698 elseif match(choice,'^"') != -1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000699 " Reconstruct Choice if choice starts with '"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000700" call Decho("reconstructing choice")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000701 if match(choice,'"$') != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000702 " case "..."
Bram Moolenaaradc21822011-04-01 18:03:16 +0200703 let choice= strpart(choice,1,strlen(choice)-2)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000704 else
705 " case "... ... ..."
706 let choice = strpart(choice,1,strlen(choice)-1)
707 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000708
Bram Moolenaar9964e462007-05-05 17:54:07 +0000709 while match(choice,'"$') == -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000710 let wholechoice = wholechoice . " " . choice
711 let ichoice = ichoice + 1
712 if ichoice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000713 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000714 call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",3)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000715 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000716" call Dret("netrw#NetRead :2 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000717 return
718 endif
719 let choice= a:{ichoice}
720 endwhile
721 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
722 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000723 endif
724 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000725
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000726" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000727 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000728
Bram Moolenaar5c736222010-01-06 20:54:52 +0100729 " NetRead: Determine method of read (ftp, rcp, etc) {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +0000730 call s:NetrwMethod(choice)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100731 if !exists("b:netrw_method") || b:netrw_method < 0
732" call Dfunc("netrw#NetRead : unsupported method")
733 return
734 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000735 let tmpfile= s:GetTempfile(b:netrw_fname) " apply correct suffix
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000736
Bram Moolenaar446cb832008-06-24 21:56:24 +0000737 " Check if NetrwBrowse() should be handling this request
738" call Decho("checking if NetrwBrowse() should handle choice<".choice."> with netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaar15146672011-10-20 22:22:38 +0200739 if choice =~ "^.*[\/]$" && b:netrw_method != 5 && choice !~ '^https\=://'
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000740" call Decho("yes, choice matches '^.*[\/]$'")
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200741 keepj call s:NetrwBrowse(0,choice)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000742" call Dret("netrw#NetRead :3 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000743 return
Bram Moolenaar071d4272004-06-13 20:20:40 +0000744 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000745
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000746 " ============
Bram Moolenaar5c736222010-01-06 20:54:52 +0100747 " NetRead: Perform Protocol-Based Read {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000748 " ===========================
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000749 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
750 echo "(netrw) Processing your read request..."
751 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000752
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000753 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100754 " NetRead: (rcp) NetRead Method #1 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000755 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000756" call Decho("read via rcp (method #1)")
Bram Moolenaard68071d2006-05-02 22:08:30 +0000757 " ER: nothing done with g:netrw_uid yet?
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000758 " ER: on Win2K" rcp machine[.user]:file tmpfile
759 " ER: if machine contains '.' adding .user is required (use $USERNAME)
760 " ER: the tmpfile is full path: rcp sees C:\... as host C
761 if s:netrw_has_nt_rcp == 1
762 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
763 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
764 else
765 " Any way needed it machine contains a '.'
766 let uid_machine = g:netrw_machine .'.'. $USERNAME
767 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000768 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000769 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
770 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
771 else
772 let uid_machine = g:netrw_machine
773 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000774 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +0000775" 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 +0100776 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 +0000777 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000778 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000779
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000780 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100781 " NetRead: (ftp + <.netrc>) NetRead Method #2 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000782 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000783" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaar8dff8182006-04-06 20:18:50 +0000784 let netrw_fname= b:netrw_fname
Bram Moolenaaradc21822011-04-01 18:03:16 +0200785 keepj call s:SaveBufVars()|new|keepj call s:RestoreBufVars()
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000786 let filtbuf= bufnr("%")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000787 setlocal ff=unix
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200788 keepj put =g:netrw_ftpmode
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000789" call Decho("filter input: ".getline(line("$")))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000790 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200791 keepj put =g:netrw_ftpextracmd
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000792" call Decho("filter input: ".getline(line("$")))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000793 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000794 call setline(line("$")+1,'get "'.netrw_fname.'" '.tmpfile)
795" call Decho("filter input: ".getline(line("$")))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000796 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +0200797" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
798 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 +0000799 else
Bram Moolenaaradc21822011-04-01 18:03:16 +0200800" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
801 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000802 endif
803 " 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 +0000804 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
Bram Moolenaarc236c162008-07-13 17:41:49 +0000805 let debugkeep = &debug
Bram Moolenaar9964e462007-05-05 17:54:07 +0000806 setlocal debug=msg
Bram Moolenaaradc21822011-04-01 18:03:16 +0200807 keepj call netrw#ErrorMsg(s:ERROR,getline(1),4)
Bram Moolenaarc236c162008-07-13 17:41:49 +0000808 let &debug = debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000809 endif
Bram Moolenaared39e1d2008-08-09 17:55:22 +0000810 call s:SaveBufVars()
811 bd!
Bram Moolenaar5c736222010-01-06 20:54:52 +0100812 if bufname("%") == "" && getline("$") == "" && line('$') == 1
813 " needed when one sources a file in a nolbl setting window via ftp
Bram Moolenaared39e1d2008-08-09 17:55:22 +0000814 q!
815 endif
816 call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +0000817 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000818 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000819
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000820 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100821 " NetRead: (ftp + machine,id,passwd,filename) NetRead Method #3 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000822 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
823 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000824" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000825 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaaradc21822011-04-01 18:03:16 +0200826 keepj call s:SaveBufVars()|new|keepj call s:RestoreBufVars()
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000827 let filtbuf= bufnr("%")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000828 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000829 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200830 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +0000831" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000832 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200833 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +0000834" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000835 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000836
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000837 if exists("g:netrw_ftp") && g:netrw_ftp == 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200838 keepj put =g:netrw_uid
Bram Moolenaar446cb832008-06-24 21:56:24 +0000839" call Decho("filter input: ".getline('.'))
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200840 keepj put ='\"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +0000841" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000842 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200843 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +0000844" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000845 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000846
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000847 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200848 keepj put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +0000849" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000850 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000851 if exists("g:netrw_ftpextracmd")
Bram Moolenaaradc21822011-04-01 18:03:16 +0200852 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +0000853" call Decho("filter input: ".getline('.'))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000854 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200855 keepj put ='get \"'.netrw_fname.'\" '.tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +0000856" call Decho("filter input: ".getline('.'))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000857
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000858 " perform ftp:
859 " -i : turns off interactive prompting from ftp
860 " -n unix : DON'T use <.netrc>, even though it exists
861 " -n win32: quit being obnoxious about password
Bram Moolenaaradc21822011-04-01 18:03:16 +0200862 keepj norm! 1Gdd
863" call Decho("executing: %!".s:netrw_ftp_cmd." -i -n")
864 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i -n"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000865 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
866 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000867" call Decho("error<".getline(1).">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000868 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000869 call netrw#ErrorMsg(s:ERROR,getline(1),5)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000870 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000871 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000872 call s:SaveBufVars()|bd!|call s:RestoreBufVars()
873 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000874 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000875
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000876 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100877 " NetRead: (scp) NetRead Method #4 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000878 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000879" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000880 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +0000881 let useport= " ".g:netrw_scpport." ".g:netrw_port
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000882 else
883 let useport= ""
884 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100885" 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 +0000886 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 +0000887 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000888 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000889
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000890 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100891 " NetRead: (http) NetRead Method #5 (wget) {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000892 elseif b:netrw_method == 5
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000893" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000894 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000895 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000896 call netrw#ErrorMsg(s:ERROR,"neither the wget nor the fetch command is available",6)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000897 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000898" call Dret("netrw#NetRead :4 getcwd<".getcwd().">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000899 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000900 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000901
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000902 if match(b:netrw_fname,"#") == -1 || exists("g:netrw_http_xcmd")
903 " using g:netrw_http_cmd (usually elinks, links, curl, wget, or fetch)
Bram Moolenaarc236c162008-07-13 17:41:49 +0000904" call Decho('using '.g:netrw_http_cmd.' (# not in b:netrw_fname<'.b:netrw_fname.">)")
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000905 if exists("g:netrw_http_xcmd")
906" 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))
907 exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)." ".g:netrw_http_xcmd." ".shellescape(tmpfile,1)
908 else
909" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1))
910 exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)
911 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000912 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000913
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000914 else
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000915 " wget/curl/fetch plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
Bram Moolenaaradc21822011-04-01 18:03:16 +0200916" call Decho("wget/curl plus jump (# in b:netrw_fname<".b:netrw_fname.">)")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000917 let netrw_html= substitute(b:netrw_fname,"#.*$","","")
918 let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000919" call Decho("netrw_html<".netrw_html.">")
920" call Decho("netrw_tag <".netrw_tag.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000921" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.netrw_html,1))
922 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 +0000923 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000924" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaaradc21822011-04-01 18:03:16 +0200925 exe 'keepj norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000926 endif
927 let b:netrw_lastfile = choice
Bram Moolenaar9964e462007-05-05 17:54:07 +0000928 setlocal ro
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000929
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000930 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100931 " NetRead: (dav) NetRead Method #6 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000932 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000933" call Decho("read via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000934
Bram Moolenaar5c736222010-01-06 20:54:52 +0100935 if !executable(g:netrw_dav_cmd)
936 call netrw#ErrorMsg(s:ERROR,g:netrw_dav_cmd." is not executable",73)
937" call Dret("netrw#NetRead : ".g:netrw_dav_cmd." not executable")
938 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000939 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100940 if g:netrw_dav_cmd =~ "curl"
941" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_dav_cmd." ".shellescape("dav://".g:netrw_machine.b:netrw_fname,1)." ".shellescape(tmpfile,1))
942 exe s:netrw_silentxfer."!".g:netrw_dav_cmd." ".shellescape("dav://".g:netrw_machine.b:netrw_fname,1)." ".shellescape(tmpfile,1)
943 else
944 " Construct execution string (four lines) which will be passed through filter
945 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
946 new
947 setlocal ff=unix
948 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200949 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar5c736222010-01-06 20:54:52 +0100950 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200951 keepj put ='open '.g:netrw_machine
Bram Moolenaar5c736222010-01-06 20:54:52 +0100952 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200953 keepj put ='user '.g:netrw_uid.' '.s:netrw_passwd
954 keepj put ='get '.netrw_fname.' '.tmpfile
955 keepj put ='quit'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000956
Bram Moolenaar5c736222010-01-06 20:54:52 +0100957 " perform cadaver operation:
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200958 keepj norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000959" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100960 exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
961 bd!
962 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000963 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000964 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000965
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000966 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100967 " NetRead: (rsync) NetRead Method #7 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000968 elseif b:netrw_method == 7
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000969" call Decho("read via rsync (method #7)")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000970" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
971 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 +0000972 let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000973 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000974
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000975 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100976 " NetRead: (fetch) NetRead Method #8 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000977 " fetch://[user@]host[:http]/path
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000978 elseif b:netrw_method == 8
Bram Moolenaar9964e462007-05-05 17:54:07 +0000979" call Decho("read via fetch (method #8)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000980 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000981 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +0200982 keepj call netrw#ErrorMsg(s:ERROR,"fetch command not available",7)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000983 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000984" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000985 endif
Bram Moolenaar15146672011-10-20 22:22:38 +0200986 if exists("g:netrw_option") && g:netrw_option == ":https\="
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000987 let netrw_option= "http"
988 else
989 let netrw_option= "ftp"
990 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000991" call Decho("read via fetch for ".netrw_option)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000992
Bram Moolenaar446cb832008-06-24 21:56:24 +0000993 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("s:netrw_passwd") && s:netrw_passwd != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +0000994" 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))
995 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 +0000996 else
Bram Moolenaarc236c162008-07-13 17:41:49 +0000997" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_machine."/".b:netrw_fname,1))
998 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 +0000999 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001000
Bram Moolenaar446cb832008-06-24 21:56:24 +00001001 let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001002 let b:netrw_lastfile = choice
Bram Moolenaar9964e462007-05-05 17:54:07 +00001003 setlocal ro
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001004
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001005 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001006 " NetRead: (sftp) NetRead Method #9 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001007 elseif b:netrw_method == 9
Bram Moolenaar9964e462007-05-05 17:54:07 +00001008" call Decho("read via sftp (method #9)")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001009" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile)
1010 exe s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00001011 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001012 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001013
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001014 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001015 " NetRead: Complain {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001016 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001017 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",8)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001018 endif
1019 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001020
Bram Moolenaar5c736222010-01-06 20:54:52 +01001021 " NetRead: cleanup {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001022 if exists("b:netrw_method")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001023" call Decho("cleanup b:netrw_method and b:netrw_fname")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001024 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001025 unlet b:netrw_fname
1026 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02001027 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 +00001028" call Decho("cleanup by deleting tmpfile<".tmpfile.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001029 keepj call s:NetrwDelete(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001030 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02001031 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001032
Bram Moolenaar9964e462007-05-05 17:54:07 +00001033" call Dret("netrw#NetRead :5 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001034endfun
1035
1036" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001037" netrw#NetWrite: responsible for writing a file over the net {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001038fun! netrw#NetWrite(...) range
Bram Moolenaar9964e462007-05-05 17:54:07 +00001039" call Dfunc("netrw#NetWrite(a:0=".a:0.") ".g:loaded_netrw)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001040
Bram Moolenaar5c736222010-01-06 20:54:52 +01001041 " NetWrite: option handling {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001042 let mod= 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00001043 call s:NetrwOptionSave("w:")
1044 call s:NetrwSafeOptions()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001045
Bram Moolenaar5c736222010-01-06 20:54:52 +01001046 " NetWrite: Get Temporary Filename {{{3
Bram Moolenaar9964e462007-05-05 17:54:07 +00001047 let tmpfile= s:GetTempfile("")
1048 if tmpfile == ""
1049" call Dret("netrw#NetWrite : unable to get a tempfile!")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001050 return
1051 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001052
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001053 if a:0 == 0
1054 let ichoice = 0
1055 else
1056 let ichoice = 1
1057 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001058
Bram Moolenaar9964e462007-05-05 17:54:07 +00001059 let curbufname= expand("%")
1060" call Decho("curbufname<".curbufname.">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001061 if &binary
Bram Moolenaar9964e462007-05-05 17:54:07 +00001062 " For binary writes, always write entire file.
1063 " (line numbers don't really make sense for that).
1064 " Also supports the writing of tar and zip files.
Bram Moolenaaradc21822011-04-01 18:03:16 +02001065" call Decho("(write entire file) sil exe w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile))
1066 exe "sil keepj w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001067 elseif g:netrw_cygwin
1068 " write (selected portion of) file to temporary
1069 let cygtmpfile= substitute(tmpfile,'/cygdrive/\(.\)','\1:','')
Bram Moolenaaradc21822011-04-01 18:03:16 +02001070" call Decho("(write selected portion) sil exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001071 exe "sil keepj ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile)
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001072 else
1073 " write (selected portion of) file to temporary
Bram Moolenaaradc21822011-04-01 18:03:16 +02001074" call Decho("(write selected portion) sil exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001075 exe "sil keepj ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001076 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001077
Bram Moolenaar9964e462007-05-05 17:54:07 +00001078 if curbufname == ""
1079 " if the file is [No Name], and one attempts to Nwrite it, the buffer takes
1080 " on the temporary file's name. Deletion of the temporary file during
1081 " cleanup then causes an error message.
1082 0file!
1083 endif
1084
Bram Moolenaar5c736222010-01-06 20:54:52 +01001085 " NetWrite: while choice loop: {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001086 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001087
Bram Moolenaar9964e462007-05-05 17:54:07 +00001088 " Process arguments: {{{4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001089 " attempt to repeat with previous host-file-etc
1090 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001091" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001092 let choice = b:netrw_lastfile
1093 let ichoice= ichoice + 1
1094 else
1095 exe "let choice= a:" . ichoice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001096
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001097 " Reconstruct Choice if choice starts with '"'
1098 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001099 echomsg 'NetWrite Usage:"'
1100 echomsg ':Nwrite machine:path uses rcp'
1101 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
1102 echomsg ':Nwrite "machine id password path" uses ftp'
1103 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
1104 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
1105 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
1106 echomsg ':Nwrite rcp://machine/path uses rcp'
1107 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
1108 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
1109 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaar9964e462007-05-05 17:54:07 +00001110 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001111 break
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001112
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001113 elseif match(choice,"^\"") != -1
1114 if match(choice,"\"$") != -1
1115 " case "..."
1116 let choice=strpart(choice,1,strlen(choice)-2)
1117 else
1118 " case "... ... ..."
1119 let choice = strpart(choice,1,strlen(choice)-1)
1120 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001121
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001122 while match(choice,"\"$") == -1
1123 let wholechoice= wholechoice . " " . choice
1124 let ichoice = ichoice + 1
1125 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001126 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001127 call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",13)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001128 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001129" call Dret("netrw#NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001130 return
1131 endif
1132 let choice= a:{ichoice}
1133 endwhile
1134 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
1135 endif
1136 endif
1137 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001138 let ichoice= ichoice + 1
Bram Moolenaar9964e462007-05-05 17:54:07 +00001139" call Decho("choice<" . choice . "> ichoice=".ichoice)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001140
Bram Moolenaar9964e462007-05-05 17:54:07 +00001141 " Determine method of write (ftp, rcp, etc) {{{4
Bram Moolenaaradc21822011-04-01 18:03:16 +02001142 keepj call s:NetrwMethod(choice)
Bram Moolenaar5c736222010-01-06 20:54:52 +01001143 if !exists("b:netrw_method") || b:netrw_method < 0
1144" call Dfunc("netrw#NetWrite : unsupported method")
1145 return
1146 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001147
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001148 " =============
Bram Moolenaar5c736222010-01-06 20:54:52 +01001149 " NetWrite: Perform Protocol-Based Write {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001150 " ============================
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001151 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
1152 echo "(netrw) Processing your write request..."
Bram Moolenaar446cb832008-06-24 21:56:24 +00001153" call Decho("(netrw) Processing your write request...")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001154 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001155
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001156 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001157 " NetWrite: (rcp) NetWrite Method #1 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001158 if b:netrw_method == 1
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001159" call Decho("write via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001160 if s:netrw_has_nt_rcp == 1
1161 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1162 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
1163 else
1164 let uid_machine = g:netrw_machine .'.'. $USERNAME
1165 endif
1166 else
1167 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1168 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1169 else
1170 let uid_machine = g:netrw_machine
1171 endif
1172 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00001173" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(tmpfile,1)." ".shellescape(uid_machine.":".b:netrw_fname,1))
1174 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 +00001175 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001176
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001177 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001178 " NetWrite: (ftp + <.netrc>) NetWrite Method #2 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001179 elseif b:netrw_method == 2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001180" call Decho("write via ftp+.netrc (method #2)")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001181 let netrw_fname = b:netrw_fname
1182
1183 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
1184 let bhkeep = &l:bh
1185 let curbuf = bufnr("%")
1186 setlocal bh=hide
1187 enew
1188
Bram Moolenaar446cb832008-06-24 21:56:24 +00001189" call Decho("filter input window#".winnr())
Bram Moolenaar8299df92004-07-10 09:47:34 +00001190 setlocal ff=unix
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001191 keepj put =g:netrw_ftpmode
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001192" call Decho("filter input: ".getline('$'))
Bram Moolenaar9964e462007-05-05 17:54:07 +00001193 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001194 keepj put =g:netrw_ftpextracmd
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001195" call Decho("filter input: ".getline("$"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00001196 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02001197 keepj call setline(line("$")+1,'put "'.tmpfile.'" "'.netrw_fname.'"')
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001198" call Decho("filter input: ".getline("$"))
Bram Moolenaar071d4272004-06-13 20:20:40 +00001199 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02001200" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
1201 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 +00001202 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00001203" call Decho("filter input window#".winnr())
Bram Moolenaaradc21822011-04-01 18:03:16 +02001204" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
1205 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001206 endif
1207 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1208 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001209 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001210 keepj call netrw#ErrorMsg(s:ERROR,getline(1),14)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001211 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001212 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +00001213 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001214
1215 " remove enew buffer (quietly)
1216 let filtbuf= bufnr("%")
1217 exe curbuf."b!"
1218 let &l:bh = bhkeep
1219 exe filtbuf."bw!"
1220
Bram Moolenaar071d4272004-06-13 20:20:40 +00001221 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001222
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001223 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001224 " NetWrite: (ftp + machine, id, passwd, filename) NetWrite Method #3 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001225 elseif b:netrw_method == 3
Bram Moolenaar5c736222010-01-06 20:54:52 +01001226 " Construct execution string (three or more lines) which will be passed through filter
Bram Moolenaar9964e462007-05-05 17:54:07 +00001227" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001228 let netrw_fname = b:netrw_fname
1229 let bhkeep = &l:bh
1230
1231 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
1232 let curbuf = bufnr("%")
1233 setlocal bh=hide
1234 enew
Bram Moolenaar8299df92004-07-10 09:47:34 +00001235 setlocal ff=unix
Bram Moolenaar5c736222010-01-06 20:54:52 +01001236
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001237 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001238 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00001239" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001240 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001241 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00001242" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001243 endif
1244 if exists("g:netrw_ftp") && g:netrw_ftp == 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001245 keepj put =g:netrw_uid
Bram Moolenaar446cb832008-06-24 21:56:24 +00001246" call Decho("filter input: ".getline('.'))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001247 keepj put ='\"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001248" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001249 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001250 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001251" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001252 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001253 keepj put =g:netrw_ftpmode
Bram Moolenaar5c736222010-01-06 20:54:52 +01001254" call Decho("filter input: ".getline('$'))
1255 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001256 keepj put =g:netrw_ftpextracmd
Bram Moolenaar5c736222010-01-06 20:54:52 +01001257" call Decho("filter input: ".getline("$"))
1258 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001259 keepj put ='put \"'.tmpfile.'\" \"'.netrw_fname.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001260" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001261 " save choice/id/password for future use
1262 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001263
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001264 " perform ftp:
1265 " -i : turns off interactive prompting from ftp
1266 " -n unix : DON'T use <.netrc>, even though it exists
1267 " -n win32: quit being obnoxious about password
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001268 keepj norm! 1Gdd
Bram Moolenaaradc21822011-04-01 18:03:16 +02001269" call Decho("executing: %!".s:netrw_ftp_cmd." -i -n")
1270 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i -n"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001271 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1272 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001273 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001274 call netrw#ErrorMsg(s:ERROR,getline(1),15)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001275 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001276 let mod=1
1277 endif
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!"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001284
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001285 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001286 " NetWrite: (scp) NetWrite Method #4 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001287 elseif b:netrw_method == 4
Bram Moolenaar9964e462007-05-05 17:54:07 +00001288" call Decho("write via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001289 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00001290 let useport= " ".g:netrw_scpport." ".fnameescape(g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001291 else
1292 let useport= ""
1293 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00001294" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1))
1295 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 +00001296 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001297
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001298 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001299 " NetWrite: (http) NetWrite Method #5 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001300 elseif b:netrw_method == 5
Bram Moolenaar9964e462007-05-05 17:54:07 +00001301" call Decho("write via http (method #5)")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001302 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001303 call netrw#ErrorMsg(s:ERROR,"currently <netrw.vim> does not support writing using http:",16)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001304 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001305
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001306 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001307 " NetWrite: (dav) NetWrite Method #6 (cadaver) {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001308 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001309" call Decho("write via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001310
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001311 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaar5c736222010-01-06 20:54:52 +01001312 let netrw_fname = escape(b:netrw_fname,g:netrw_fname_escape)
1313 let bhkeep = &l:bh
1314
1315 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
1316 let curbuf = bufnr("%")
1317 setlocal bh=hide
1318 enew
1319
Bram Moolenaar8299df92004-07-10 09:47:34 +00001320 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001321 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001322 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001323 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001324 keepj put ='open '.g:netrw_machine
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001325 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001326 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001327 keepj put ='user '.g:netrw_uid.' '.s:netrw_passwd
Bram Moolenaar446cb832008-06-24 21:56:24 +00001328 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001329 keepj put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001330
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001331 " perform cadaver operation:
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001332 keepj norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001333" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001334 exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
Bram Moolenaar5c736222010-01-06 20:54:52 +01001335
1336 " remove enew buffer (quietly)
1337 let filtbuf= bufnr("%")
1338 exe curbuf."b!"
1339 let &l:bh = bhkeep
1340 exe filtbuf."bw!"
1341
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001342 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001343
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001344 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001345 " NetWrite: (rsync) NetWrite Method #7 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001346 elseif b:netrw_method == 7
Bram Moolenaar9964e462007-05-05 17:54:07 +00001347" call Decho("write via rsync (method #7)")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001348" call Decho("executing: !".g:netrw_rsync_cmd." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1))
1349 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 +00001350 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001351
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001352 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001353 " NetWrite: (sftp) NetWrite Method #9 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001354 elseif b:netrw_method == 9
Bram Moolenaar9964e462007-05-05 17:54:07 +00001355" call Decho("read via sftp (method #9)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001356 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001357 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1358 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1359 else
1360 let uid_machine = g:netrw_machine
1361 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001362
1363 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
1364 let bhkeep = &l:bh
1365 let curbuf = bufnr("%")
1366 setlocal bh=hide
1367 enew
1368
Bram Moolenaar8299df92004-07-10 09:47:34 +00001369 setlocal ff=unix
Bram Moolenaar5c736222010-01-06 20:54:52 +01001370 call setline(1,'put "'.escape(tmpfile,'\').'" '.netrw_fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001371" call Decho("filter input: ".getline('.'))
Bram Moolenaarc236c162008-07-13 17:41:49 +00001372" call Decho("executing: %!".g:netrw_sftp_cmd.' '.shellescape(uid_machine,1))
1373 exe s:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.shellescape(uid_machine,1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01001374 let filtbuf= bufnr("%")
1375 exe curbuf."b!"
1376 let &l:bh = bhkeep
1377 exe filtbuf."bw!"
1378 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001379
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001380 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001381 " NetWrite: Complain {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001382 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001383 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",17)
Bram Moolenaaradc21822011-04-01 18:03:16 +02001384 let leavemod= 1
Bram Moolenaar071d4272004-06-13 20:20:40 +00001385 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001386 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001387
Bram Moolenaar5c736222010-01-06 20:54:52 +01001388 " NetWrite: Cleanup: {{{3
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001389" call Decho("cleanup")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001390 if s:FileReadable(tmpfile)
1391" call Decho("tmpfile<".tmpfile."> readable, will now delete it")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001392 call s:NetrwDelete(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001393 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001394 call s:NetrwOptionRestore("w:")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001395
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001396 if a:firstline == 1 && a:lastline == line("$")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001397 " restore modifiability; usually equivalent to set nomod
1398 let &mod= mod
Bram Moolenaaradc21822011-04-01 18:03:16 +02001399 elseif !exists("leavemod")
1400 " indicate that the buffer has not been modified since last written
1401 set nomod
Bram Moolenaar071d4272004-06-13 20:20:40 +00001402 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001403
Bram Moolenaar9964e462007-05-05 17:54:07 +00001404" call Dret("netrw#NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001405endfun
1406
1407" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001408" netrw#NetSource: source a remotely hosted vim script {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001409" uses NetRead to get a copy of the file into a temporarily file,
1410" then sources that file,
1411" then removes that file.
1412fun! netrw#NetSource(...)
1413" call Dfunc("netrw#NetSource() a:0=".a:0)
1414 if a:0 > 0 && a:1 == '?'
1415 " give help
1416 echomsg 'NetSource Usage:'
1417 echomsg ':Nsource dav://machine[:port]/path uses cadaver'
1418 echomsg ':Nsource fetch://machine/path uses fetch'
1419 echomsg ':Nsource ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
Bram Moolenaar15146672011-10-20 22:22:38 +02001420 echomsg ':Nsource http[s]://[user@]machine/path uses http wget'
Bram Moolenaar9964e462007-05-05 17:54:07 +00001421 echomsg ':Nsource rcp://[user@]machine/path uses rcp'
1422 echomsg ':Nsource rsync://machine[:port]/path uses rsync'
1423 echomsg ':Nsource scp://[user@]machine[[:#]port]/path uses scp'
1424 echomsg ':Nsource sftp://[user@]machine[[:#]port]/path uses sftp'
1425 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001426 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001427 let i= 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001428 while i <= a:0
Bram Moolenaar9964e462007-05-05 17:54:07 +00001429 call netrw#NetRead(3,a:{i})
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001430" call Decho("(netrw#NetSource) s:netread_tmpfile<".s:netrw_tmpfile.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001431 if s:FileReadable(s:netrw_tmpfile)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001432" call Decho("(netrw#NetSource) exe so ".fnameescape(s:netrw_tmpfile))
1433 exe "so ".fnameescape(s:netrw_tmpfile)
1434" call Decho("(netrw#NetSource) delete(".s:netrw_tmpfile.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001435 call delete(s:netrw_tmpfile)
1436 unlet s:netrw_tmpfile
1437 else
1438 call netrw#ErrorMsg(s:ERROR,"unable to source <".a:{i}.">!",48)
1439 endif
1440 let i= i + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001441 endwhile
Bram Moolenaar9964e462007-05-05 17:54:07 +00001442 endif
1443" call Dret("netrw#NetSource")
1444endfun
1445
1446" ===========================================
Bram Moolenaar446cb832008-06-24 21:56:24 +00001447" s:NetrwGetFile: Function to read temporary file "tfile" with command "readcmd". {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001448" readcmd == %r : replace buffer with newly read file
1449" == 0r : read file at top of buffer
1450" == r : read file after current line
1451" == t : leave file in temporary form (ie. don't read into buffer)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001452fun! s:NetrwGetFile(readcmd, tfile, method)
1453" call Dfunc("NetrwGetFile(readcmd<".a:readcmd.">,tfile<".a:tfile."> method<".a:method.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001454
1455 " readcmd=='t': simply do nothing
1456 if a:readcmd == 't'
Bram Moolenaarc236c162008-07-13 17:41:49 +00001457" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001458" call Dret("NetrwGetFile : skip read of <".a:tfile.">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001459 return
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001460 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001461
Bram Moolenaar9964e462007-05-05 17:54:07 +00001462 " get name of remote filename (ie. url and all)
1463 let rfile= bufname("%")
1464" call Decho("rfile<".rfile.">")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001465
Bram Moolenaar9964e462007-05-05 17:54:07 +00001466 if exists("*NetReadFixup")
1467 " for the use of NetReadFixup (not otherwise used internally)
1468 let line2= line("$")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001469 endif
1470
Bram Moolenaar9964e462007-05-05 17:54:07 +00001471 if a:readcmd[0] == '%'
1472 " get file into buffer
1473" call Decho("get file into buffer")
1474
1475 " rename the current buffer to the temp file (ie. tfile)
1476 if g:netrw_cygwin
1477 let tfile= substitute(a:tfile,'/cygdrive/\(.\)','\1:','')
1478 else
1479 let tfile= a:tfile
1480 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02001481" call Decho("exe sil! keepalt file ".fnameescape(tfile))
1482 exe "sil! keepalt file ".fnameescape(tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001483
1484 " edit temporary file (ie. read the temporary file in)
1485 if rfile =~ '\.zip$'
1486" call Decho("handling remote zip file with zip#Browse(tfile<".tfile.">)")
1487 call zip#Browse(tfile)
1488 elseif rfile =~ '\.tar$'
1489" call Decho("handling remote tar file with tar#Browse(tfile<".tfile.">)")
1490 call tar#Browse(tfile)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02001491 elseif rfile =~ '\.tar\.gz$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00001492" call Decho("handling remote gzip-compressed tar file")
1493 call tar#Browse(tfile)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02001494 elseif rfile =~ '\.tar\.bz2$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00001495" call Decho("handling remote bz2-compressed tar file")
1496 call tar#Browse(tfile)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02001497 elseif rfile =~ '\.tar\.xz$'
1498" call Decho("handling remote xz-compressed tar file")
1499 call tar#Browse(tfile)
1500 elseif rfile =~ '\.txz$'
1501" call Decho("handling remote xz-compressed tar file (.txz)")
1502 call tar#Browse(tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001503 else
1504" call Decho("edit temporary file")
1505 e!
1506 endif
1507
1508 " rename buffer back to remote filename
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02001509" call Decho("exe sil! keepalt file ".fnameescape(rfile))
Bram Moolenaaradc21822011-04-01 18:03:16 +02001510 exe "sil! keepj keepalt file ".fnameescape(rfile)
Bram Moolenaar5c736222010-01-06 20:54:52 +01001511 filetype detect
Bram Moolenaar9964e462007-05-05 17:54:07 +00001512" call Dredir("renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">","ls!")
1513 let line1 = 1
1514 let line2 = line("$")
1515
1516 elseif s:FileReadable(a:tfile)
1517 " read file after current line
1518" call Decho("read file<".a:tfile."> after current line")
1519 let curline = line(".")
1520 let lastline= line("$")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001521" call Decho("exe<".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)."> line#".curline)
Bram Moolenaaradc21822011-04-01 18:03:16 +02001522 exe "keepj ".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001523 let line1= curline + 1
1524 let line2= line("$") - lastline + 1
1525
1526 else
1527 " not readable
Bram Moolenaarc236c162008-07-13 17:41:49 +00001528" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001529" call Decho("tfile<".a:tfile."> not readable")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001530 keepj call netrw#ErrorMsg(s:WARNING,"file <".a:tfile."> not readable",9)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001531" call Dret("NetrwGetFile : tfile<".a:tfile."> not readable")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001532 return
1533 endif
1534
1535 " User-provided (ie. optional) fix-it-up command
1536 if exists("*NetReadFixup")
1537" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001538 keepj call NetReadFixup(a:method, line1, line2)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001539" else " Decho
1540" call Decho("NetReadFixup() not called, doesn't exist (line1=".line1." line2=".line2.")")
1541 endif
1542
Bram Moolenaaradc21822011-04-01 18:03:16 +02001543 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaar446cb832008-06-24 21:56:24 +00001544 " update the Buffers menu
Bram Moolenaaradc21822011-04-01 18:03:16 +02001545 keepj call s:UpdateBuffersMenu()
Bram Moolenaar9964e462007-05-05 17:54:07 +00001546 endif
1547
1548" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> tfile<".a:tfile."> readable=".s:FileReadable(a:tfile))
1549
1550 " make sure file is being displayed
Bram Moolenaar446cb832008-06-24 21:56:24 +00001551" redraw!
1552
Bram Moolenaarc236c162008-07-13 17:41:49 +00001553" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001554" call Dret("NetrwGetFile")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001555endfun
1556
Bram Moolenaar9964e462007-05-05 17:54:07 +00001557" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001558" s:NetrwMethod: determine method of transfer {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +01001559" Input:
1560" choice = url [protocol:]//[userid@]hostname[:port]/[path-to-file]
1561" Output:
1562" b:netrw_method= 1: rcp
1563" 2: ftp + <.netrc>
1564" 3: ftp + machine, id, password, and [path]filename
1565" 4: scp
Bram Moolenaar15146672011-10-20 22:22:38 +02001566" 5: http[s] (wget)
Bram Moolenaar5c736222010-01-06 20:54:52 +01001567" 6: dav
1568" 7: rsync
1569" 8: fetch
1570" 9: sftp
1571" g:netrw_machine= hostname
1572" b:netrw_fname = filename
1573" g:netrw_port = optional port number (for ftp)
1574" g:netrw_choice = copy of input url (choice)
1575fun! s:NetrwMethod(choice)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001576" call Dfunc("NetrwMethod(a:choice<".a:choice.">)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001577
Bram Moolenaar251e1912011-06-19 05:09:16 +02001578 " sanity check: choice should have at least three slashes in it
1579 if strlen(substitute(a:choice,'[^/]','','g')) < 3
1580 call netrw#ErrorMsg(s:ERROR,"not a netrw-style url; netrw uses protocol://[user@]hostname[:port]/[path])",78)
1581 let b:netrw_method = -1
1582" call Dret("NetrwMethod : incorrect url format<".a:choice.">")
1583 return
1584 endif
1585
Bram Moolenaar5c736222010-01-06 20:54:52 +01001586 " record current g:netrw_machine, if any
1587 " curmachine used if protocol == ftp and no .netrc
1588 if exists("g:netrw_machine")
1589 let curmachine= g:netrw_machine
1590" call Decho("curmachine<".curmachine.">")
1591 else
1592 let curmachine= "N O T A HOST"
1593 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02001594 if exists("g:netrw_port")
1595 let netrw_port= g:netrw_port
1596 endif
1597
1598 " insure that netrw_ftp_cmd starts off every method determination
1599 " with the current g:netrw_ftp_cmd
1600 let s:netrw_ftp_cmd= g:netrw_ftp_cmd
Bram Moolenaar5c736222010-01-06 20:54:52 +01001601
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001602 " initialization
1603 let b:netrw_method = 0
1604 let g:netrw_machine = ""
1605 let b:netrw_fname = ""
1606 let g:netrw_port = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001607 let g:netrw_choice = a:choice
1608
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001609 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001610 " mipf : a:machine a:id password filename Use ftp
Bram Moolenaar446cb832008-06-24 21:56:24 +00001611 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
1612 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001613 " rcpurm : rcp://[user@]host/filename Use rcp
1614 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001615 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaar15146672011-10-20 22:22:38 +02001616 " httpurm : http[s]://[user@]host/filename Use wget
Bram Moolenaar5c736222010-01-06 20:54:52 +01001617 " davurm : dav[s]://host[:port]/path Use cadaver/curl
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001618 " rsyncurm : rsync://host[:port]/path Use rsync
1619 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
1620 " sftpurm : sftp://[user@]host/filename Use scp
1621 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
1622 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
Bram Moolenaar15146672011-10-20 22:22:38 +02001623" let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
1624" let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
1625" let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
1626 let ftpurm = '^ftp://\(\([^/]*\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
1627 let rcpurm = '^rcp://\%(\([^/]*\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001628 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001629 let scpurm = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$'
Bram Moolenaar15146672011-10-20 22:22:38 +02001630 let httpurm = '^https\=://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001631 let davurm = '^davs\=://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001632 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
Bram Moolenaar15146672011-10-20 22:22:38 +02001633 let fetchurm = '^fetch://\(\([^/]*\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001634 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001635
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001636" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001637 " Determine Method
Bram Moolenaaradc21822011-04-01 18:03:16 +02001638 " Method#1: rcp://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001639 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001640" call Decho("rcp://...")
Bram Moolenaar83bab712005-08-01 21:58:57 +00001641 let b:netrw_method = 1
1642 let userid = substitute(a:choice,rcpurm,'\1',"")
1643 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
1644 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001645 if userid != ""
1646 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00001647 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001648
Bram Moolenaaradc21822011-04-01 18:03:16 +02001649 " Method#4: scp://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001650 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001651" call Decho("scp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001652 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00001653 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
1654 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
1655 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001656
Bram Moolenaar15146672011-10-20 22:22:38 +02001657 " Method#5: http[s]://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001658 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001659" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001660 let b:netrw_method = 5
1661 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
1662 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001663
Bram Moolenaaradc21822011-04-01 18:03:16 +02001664 " Method#6: dav://hostname[:port]/..path-to-file.. {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001665 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001666" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001667 let b:netrw_method= 6
Bram Moolenaar15146672011-10-20 22:22:38 +02001668 if a:choice =~ 'davs:'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001669 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
1670 else
1671 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
1672 endif
1673 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001674
Bram Moolenaaradc21822011-04-01 18:03:16 +02001675 " Method#7: rsync://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001676 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001677" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001678 let b:netrw_method = 7
1679 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
1680 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001681
Bram Moolenaaradc21822011-04-01 18:03:16 +02001682 " Methods 2,3: ftp://[user@]hostname[[:#]port]/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001683 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001684" call Decho("ftp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001685 let userid = substitute(a:choice,ftpurm,'\2',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001686 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
1687 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
1688 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001689" call Decho("g:netrw_machine<".g:netrw_machine.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001690 if userid != ""
1691 let g:netrw_uid= userid
1692 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02001693 if curmachine != g:netrw_machine
1694 if exists("s:netrw_passwd")
1695 " if there's a change in hostname, require password re-entry
1696 unlet s:netrw_passwd
1697 endif
1698 if exists("netrw_port")
1699 unlet netrw_port
1700 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001701 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001702 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001703 let b:netrw_method = 3
1704 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02001705 if (has("win32") || has("win95") || has("win64") || has("win16")) && s:netrw_ftp_cmd =~ '-[sS]:'
1706" call Decho("has -s: : s:netrw_ftp_cmd<".s:netrw_ftp_cmd.">")
1707" call Decho(" g:netrw_ftp_cmd<".g:netrw_ftp_cmd.">")
1708 if g:netrw_ftp_cmd =~ '-[sS]:\S*MACHINE\>'
1709 let machine = substitute(g:netrw_machine,'\([^.]\+\)\.\S*','\1','')
1710 let s:netrw_ftp_cmd= substitute(g:netrw_ftp_cmd,'\<MACHINE\>',machine.".ftp",'')
1711" call Decho("s:netrw_ftp_cmd<".s:netrw_ftp_cmd.">")
1712 endif
1713 let b:netrw_method= 2
1714 elseif s:FileReadable(expand("$HOME/.netrc")) && !g:netrw_ignorenetrc
1715" call Decho("using <".expand("$HOME/.netrc")."> (readable)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001716 let b:netrw_method= 2
1717 else
1718 if !exists("g:netrw_uid") || g:netrw_uid == ""
1719 call NetUserPass()
Bram Moolenaar446cb832008-06-24 21:56:24 +00001720 elseif !exists("s:netrw_passwd") || s:netrw_passwd == ""
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001721 call NetUserPass(g:netrw_uid)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001722 " else just use current g:netrw_uid and s:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001723 endif
1724 let b:netrw_method= 3
1725 endif
1726 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001727
Bram Moolenaaradc21822011-04-01 18:03:16 +02001728 " Method#8: fetch {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001729 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001730" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001731 let b:netrw_method = 8
1732 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
1733 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
1734 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
1735 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001736
Bram Moolenaaradc21822011-04-01 18:03:16 +02001737 " Method#3: Issue an ftp : "machine id password [path/]filename" {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001738 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001739" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001740 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001741 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
1742 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001743 let s:netrw_passwd = substitute(a:choice,mipf,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001744 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001745
Bram Moolenaaradc21822011-04-01 18:03:16 +02001746 " Method#3: Issue an ftp: "hostname [path/]filename" {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001747 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001748" call Decho("(ftp) host file")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001749 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001750 let b:netrw_method = 3
1751 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
1752 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001753
Bram Moolenaar9964e462007-05-05 17:54:07 +00001754 elseif s:FileReadable(expand("$HOME/.netrc"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001755 let b:netrw_method = 2
1756 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
1757 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
1758 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001759
Bram Moolenaaradc21822011-04-01 18:03:16 +02001760 " Method#9: sftp://user@hostname/...path-to-file {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001761 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001762" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001763 let b:netrw_method = 9
1764 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
1765 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001766
Bram Moolenaaradc21822011-04-01 18:03:16 +02001767 " Method#1: Issue an rcp: hostname:filename" (this one should be last) {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001768 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001769" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001770 let b:netrw_method = 1
1771 let userid = substitute(a:choice,rcphf,'\2',"")
1772 let g:netrw_machine = substitute(a:choice,rcphf,'\3',"")
1773 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001774" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
1775" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
1776" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
1777" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001778 if userid != ""
1779 let g:netrw_uid= userid
1780 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001781
Bram Moolenaaradc21822011-04-01 18:03:16 +02001782 " Cannot Determine Method {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001783 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001784 if !exists("g:netrw_quiet")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001785 call netrw#ErrorMsg(s:WARNING,"cannot determine method (format: protocol://[user@]hostname[:port]/[path])",45)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001786 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001787 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00001788 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02001789 "}}}3
Bram Moolenaar81695252004-12-29 20:58:21 +00001790
Bram Moolenaar81695252004-12-29 20:58:21 +00001791 if g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02001792 " remove any leading [:#] from port number
1793 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
1794 elseif exists("netrw_port")
1795 " retain port number as implicit for subsequent ftp operations
1796 let g:netrw_port= netrw_port
Bram Moolenaar81695252004-12-29 20:58:21 +00001797 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001798
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001799" call Decho("a:choice <".a:choice.">")
1800" call Decho("b:netrw_method <".b:netrw_method.">")
1801" call Decho("g:netrw_machine<".g:netrw_machine.">")
1802" call Decho("g:netrw_port <".g:netrw_port.">")
1803" if exists("g:netrw_uid") "Decho
1804" call Decho("g:netrw_uid <".g:netrw_uid.">")
1805" endif "Decho
Bram Moolenaar446cb832008-06-24 21:56:24 +00001806" if exists("s:netrw_passwd") "Decho
1807" call Decho("s:netrw_passwd <".s:netrw_passwd.">")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001808" endif "Decho
1809" call Decho("b:netrw_fname <".b:netrw_fname.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02001810" call Dret("NetrwMethod : b:netrw_method=".b:netrw_method." g:netrw_port=".g:netrw_port)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001811endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001812
1813" ------------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00001814" NetReadFixup: this sort of function is typically written by the user {{{2
1815" to handle extra junk that their system's ftp dumps
1816" into the transfer. This function is provided as an
1817" example and as a fix for a Windows 95 problem: in my
1818" experience, win95's ftp always dumped four blank lines
1819" at the end of the transfer.
1820if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp
1821 fun! NetReadFixup(method, line1, line2)
1822" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001823
1824 " sanity checks -- attempt to convert inputs to integers
1825 let method = a:method + 0
1826 let line1 = a:line1 + 0
1827 let line2 = a:line2 + 0
1828 if type(method) != 0 || type(line1) != 0 || type(line2) != 0 || method < 0 || line1 <= 0 || line2 <= 0
1829" call Dret("NetReadFixup")
1830 return
1831 endif
1832
Bram Moolenaar9964e462007-05-05 17:54:07 +00001833 if method == 3 " ftp (no <.netrc>)
1834 let fourblanklines= line2 - 3
Bram Moolenaar5c736222010-01-06 20:54:52 +01001835 if fourblanklines >= line1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001836 exe "sil keepj ".fourblanklines.",".line2."g/^\s*$/d"
Bram Moolenaar5c736222010-01-06 20:54:52 +01001837 call histdel("/",-1)
1838 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001839 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001840
Bram Moolenaar9964e462007-05-05 17:54:07 +00001841" call Dret("NetReadFixup")
1842 endfun
1843endif
1844
1845" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001846" NetUserPass: set username and password for subsequent ftp transfer {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +00001847" Usage: :call NetUserPass() -- will prompt for userid and password
1848" :call NetUserPass("uid") -- will prompt for password
1849" :call NetUserPass("uid","password") -- sets global userid and password
1850fun! NetUserPass(...)
1851
1852 " get/set userid
1853 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001854" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001855 if !exists("g:netrw_uid") || g:netrw_uid == ""
1856 " via prompt
1857 let g:netrw_uid= input('Enter username: ')
1858 endif
1859 else " from command line
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001860" call Dfunc("NetUserPass(a:1<".a:1.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001861 let g:netrw_uid= a:1
1862 endif
1863
1864 " get password
1865 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001866" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001867 let s:netrw_passwd= inputsecret("Enter Password: ")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001868 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001869" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001870 let s:netrw_passwd=a:2
Bram Moolenaar071d4272004-06-13 20:20:40 +00001871 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001872
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001873" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001874endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001875
Bram Moolenaar9964e462007-05-05 17:54:07 +00001876" ===========================================
1877" Shared Browsing Support: {{{1
1878" ===========================================
Bram Moolenaar071d4272004-06-13 20:20:40 +00001879
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001880" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02001881" s:NetrwMaps: {{{2
1882fun! s:NetrwMaps(islocal)
1883" call Dfunc("s:NetrwMaps(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar251e1912011-06-19 05:09:16 +02001884
1885 " set up Rexplore and [ 2-leftmouse-click -or- c-leftmouse ]
1886" call Decho("set up Rexplore command")
1887 com! Rexplore call s:NetrwRexplore(w:netrw_rexlocal,exists("w:netrw_rexdir")? w:netrw_rexdir : ".")
1888 if g:netrw_mousemaps && g:netrw_retmap
1889" call Decho("set up Rexplore 2-leftmouse")
1890 if !hasmapto("<Plug>NetrwReturn")
1891 if maparg("<2-leftmouse>","n") == "" || maparg("<2-leftmouse>","n") =~ '^-$'
1892" call Decho("making map for 2-leftmouse")
1893 nmap <unique> <silent> <2-leftmouse> <Plug>NetrwReturn
1894 elseif maparg("<c-leftmouse>","n") == ""
1895" call Decho("making map for c-leftmouse")
1896 nmap <unique> <silent> <c-leftmouse> <Plug>NetrwReturn
1897 endif
1898 endif
1899 nno <silent> <Plug>NetrwReturn :Rexplore<cr>
1900" call Decho("made <Plug>NetrwReturn map")
1901 endif
1902
Bram Moolenaar9964e462007-05-05 17:54:07 +00001903 if a:islocal
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001904" call Decho("make local maps")
Bram Moolenaar15146672011-10-20 22:22:38 +02001905 " local normal-mode maps
1906 nnoremap <buffer> <silent> a :call <SID>NetrwHide(1)<cr>
1907 nnoremap <buffer> <silent> % :call <SID>NetrwOpenFile(1)<cr>
1908 nnoremap <buffer> <silent> c :exe "keepjumps lcd ".fnameescape(b:netrw_curdir)<cr>
1909 nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr>
1910 nnoremap <buffer> <silent> <cr> :call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
1911 nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("")<cr>
1912 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,'../'))<cr>
1913 nnoremap <buffer> <silent> gb :<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
1914 nnoremap <buffer> <silent> gd :<c-u>call <SID>NetrwForceChgDir(1,<SID>NetrwGetWord())<cr>
1915 nnoremap <buffer> <silent> gf :<c-u>call <SID>NetrwForceFile(1,<SID>NetrwGetWord())<cr>
1916 nnoremap <buffer> <silent> gh :<c-u>call <SID>NetrwHidden(1)<cr>
1917 nnoremap <buffer> <silent> gp :<c-u>call <SID>NetrwChgPerm(1,b:netrw_curdir)<cr>
1918 nnoremap <buffer> <silent> I :call <SID>NetrwBannerCtrl(1)<cr>
1919 nnoremap <buffer> <silent> i :call <SID>NetrwListStyle(1)<cr>
1920 nnoremap <buffer> <silent> mb :<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
1921 nnoremap <buffer> <silent> mB :<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
1922 nnoremap <buffer> <silent> mc :<c-u>call <SID>NetrwMarkFileCopy(1)<cr>
1923 nnoremap <buffer> <silent> md :<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
1924 nnoremap <buffer> <silent> me :<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
1925 nnoremap <buffer> <silent> mf :<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
1926 nnoremap <buffer> <silent> mg :<c-u>call <SID>NetrwMarkFileGrep(1)<cr>
1927 nnoremap <buffer> <silent> mh :<c-u>call <SID>NetrwMarkHideSfx(1)<cr>
1928 nnoremap <buffer> <silent> mm :<c-u>call <SID>NetrwMarkFileMove(1)<cr>
1929 nnoremap <buffer> <silent> mp :<c-u>call <SID>NetrwMarkFilePrint(1)<cr>
1930 nnoremap <buffer> <silent> mr :<c-u>call <SID>NetrwMarkFileRegexp(1)<cr>
1931 nnoremap <buffer> <silent> ms :<c-u>call <SID>NetrwMarkFileSource(1)<cr>
1932 nnoremap <buffer> <silent> mt :<c-u>call <SID>NetrwMarkFileTgt(1)<cr>
1933 nnoremap <buffer> <silent> mT :<c-u>call <SID>NetrwMarkFileTag(1)<cr>
1934 nnoremap <buffer> <silent> mu :<c-u>call <SID>NetrwUnMarkFile(1)<cr>
1935 nnoremap <buffer> <silent> mx :<c-u>call <SID>NetrwMarkFileExe(1)<cr>
1936 nnoremap <buffer> <silent> mX :<c-u>call <SID>NetrwMarkFileVimCmd(1)<cr>
1937 nnoremap <buffer> <silent> mz :<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
1938 nnoremap <buffer> <silent> O :call <SID>NetrwObtain(1)<cr>
1939 nnoremap <buffer> <silent> o :call <SID>NetrwSplit(3)<cr>
1940 nnoremap <buffer> <silent> p :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
1941 nnoremap <buffer> <silent> P :call <SID>NetrwPrevWinOpen(1)<cr>
1942 nnoremap <buffer> <silent> qb :<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
1943 nnoremap <buffer> <silent> qf :<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
1944 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>
1945 nnoremap <buffer> <silent> s :call <SID>NetrwSortStyle(1)<cr>
1946 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
1947 nnoremap <buffer> <silent> T :call <SID>NetrwSplit(4)<bar>norm! gT<cr>
1948 nnoremap <buffer> <silent> t :call <SID>NetrwSplit(4)<cr>
1949 nnoremap <buffer> <silent> u :<c-u>call <SID>NetrwBookHistHandler(4,expand("%"))<cr>
1950 nnoremap <buffer> <silent> U :<c-u>call <SID>NetrwBookHistHandler(5,expand("%"))<cr>
1951 nnoremap <buffer> <silent> v :call <SID>NetrwSplit(5)<cr>
1952 nnoremap <buffer> <silent> x :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr>
1953 " local insert-mode maps
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001954 inoremap <buffer> <silent> a <c-o>:call <SID>NetrwHide(1)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02001955 inoremap <buffer> <silent> c <c-o>:exe "keepjumps lcd ".fnameescape(b:netrw_curdir)<cr>
1956 inoremap <buffer> <silent> C <c-o>:let g:netrw_chgwin= winnr()<cr>
1957 inoremap <buffer> <silent> % <c-o>:call <SID>NetrwOpenFile(1)<cr>
1958 inoremap <buffer> <silent> - <c-o>:exe "norm! 0"<bar>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,'../'))<cr>
1959 inoremap <buffer> <silent> <cr> <c-o>:call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
1960 inoremap <buffer> <silent> d <c-o>:call <SID>NetrwMakeDir("")<cr>
1961 inoremap <buffer> <silent> gb <c-o>:<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
1962 inoremap <buffer> <silent> gh <c-o>:<c-u>call <SID>NetrwHidden(1)<cr>
1963 inoremap <buffer> <silent> gp <c-o>:<c-u>call <SID>NetrwChgPerm(1,b:netrw_curdir)<cr>
1964 inoremap <buffer> <silent> I <c-o>:call <SID>NetrwBannerCtrl(1)<cr>
1965 inoremap <buffer> <silent> i <c-o>:call <SID>NetrwListStyle(1)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001966 inoremap <buffer> <silent> mb <c-o>:<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02001967 inoremap <buffer> <silent> mB <c-o>:<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001968 inoremap <buffer> <silent> mc <c-o>:<c-u>call <SID>NetrwMarkFileCopy(1)<cr>
1969 inoremap <buffer> <silent> md <c-o>:<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
1970 inoremap <buffer> <silent> me <c-o>:<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
1971 inoremap <buffer> <silent> mf <c-o>:<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
1972 inoremap <buffer> <silent> mg <c-o>:<c-u>call <SID>NetrwMarkFileGrep(1)<cr>
1973 inoremap <buffer> <silent> mh <c-o>:<c-u>call <SID>NetrwMarkHideSfx(1)<cr>
1974 inoremap <buffer> <silent> mm <c-o>:<c-u>call <SID>NetrwMarkFileMove(1)<cr>
1975 inoremap <buffer> <silent> mp <c-o>:<c-u>call <SID>NetrwMarkFilePrint(1)<cr>
1976 inoremap <buffer> <silent> mr <c-o>:<c-u>call <SID>NetrwMarkFileRegexp(1)<cr>
1977 inoremap <buffer> <silent> ms <c-o>:<c-u>call <SID>NetrwMarkFileSource(1)<cr>
1978 inoremap <buffer> <silent> mT <c-o>:<c-u>call <SID>NetrwMarkFileTag(1)<cr>
1979 inoremap <buffer> <silent> mt <c-o>:<c-u>call <SID>NetrwMarkFileTgt(1)<cr>
1980 inoremap <buffer> <silent> mu <c-o>:<c-u>call <SID>NetrwUnMarkFile(1)<cr>
1981 inoremap <buffer> <silent> mx <c-o>:<c-u>call <SID>NetrwMarkFileExe(1)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02001982 inoremap <buffer> <silent> mX <c-o>:<c-u>call <SID>NetrwMarkFileVimCmd(1)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001983 inoremap <buffer> <silent> mz <c-o>:<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001984 inoremap <buffer> <silent> O <c-o>:call <SID>NetrwObtain(1)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02001985 inoremap <buffer> <silent> o <c-o>:call <SID>NetrwSplit(3)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001986 inoremap <buffer> <silent> p <c-o>:call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
1987 inoremap <buffer> <silent> P <c-o>:call <SID>NetrwPrevWinOpen(1)<cr>
1988 inoremap <buffer> <silent> qb <c-o>:<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001989 inoremap <buffer> <silent> qf <c-o>:<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
1990 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>
1991 inoremap <buffer> <silent> s <c-o>:call <SID>NetrwSortStyle(1)<cr>
1992 inoremap <buffer> <silent> S <c-o>:call <SID>NetSortSequence(1)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001993 inoremap <buffer> <silent> T <c-o>:call <SID>NetrwSplit(4)<bar>norm! gT<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02001994 inoremap <buffer> <silent> t <c-o>:call <SID>NetrwSplit(4)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001995 inoremap <buffer> <silent> u <c-o>:<c-u>call <SID>NetrwBookHistHandler(4,expand("%"))<cr>
1996 inoremap <buffer> <silent> U <c-o>:<c-u>call <SID>NetrwBookHistHandler(5,expand("%"))<cr>
1997 inoremap <buffer> <silent> v <c-o>:call <SID>NetrwSplit(5)<cr>
1998 inoremap <buffer> <silent> x <c-o>:call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001999 if !hasmapto('<Plug>NetrwHideEdit')
2000 nmap <buffer> <unique> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002001 imap <buffer> <unique> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar446cb832008-06-24 21:56:24 +00002002 endif
2003 nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(1)<cr>
2004 if !hasmapto('<Plug>NetrwRefresh')
2005 nmap <buffer> <unique> <c-l> <Plug>NetrwRefresh
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002006 imap <buffer> <unique> <c-l> <Plug>NetrwRefresh
Bram Moolenaar446cb832008-06-24 21:56:24 +00002007 endif
2008 nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,'./'))<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00002009 if s:didstarstar || !mapcheck("<s-down>","n")
2010 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002011 inoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00002012 endif
2013 if s:didstarstar || !mapcheck("<s-up>","n")
2014 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002015 inoremap <buffer> <silent> <s-up> :Pexplore<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00002016 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002017 let mapsafecurdir = escape(b:netrw_curdir, s:netrw_map_escape)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002018 if g:netrw_mousemaps == 1
Bram Moolenaar251e1912011-06-19 05:09:16 +02002019 nmap <buffer> <leftmouse> <Plug>NetrwLeftmouse
2020 nno <buffer> <silent> <Plug>NetrwLeftmouse <leftmouse>:call <SID>NetrwLeftmouse(1)<cr>
2021 nmap <buffer> <middlemouse> <Plug>NetrwMiddlemouse
2022 nno <buffer> <silent> <Plug>NetrwMiddlemouse <leftmouse>:call <SID>NetrwPrevWinOpen(1)<cr>
2023 nmap <buffer> <s-leftmouse> <Plug>NetrwSLeftmouse
2024 nno <buffer> <silent> <Plug>NetrwSLeftmouse <leftmouse>:call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
2025 nmap <buffer> <2-leftmouse> <Plug>Netrw2Leftmouse
2026 nmap <buffer> <silent> <Plug>Netrw2Leftmouse -
2027 imap <buffer> <leftmouse> <Plug>ILeftmouse
2028 ino <buffer> <silent> <Plug>ILeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwLeftmouse(1)<cr>
2029 imap <buffer> <middlemouse> <Plug>IMiddlemouse
2030 ino <buffer> <silent> <Plug>IMiddlemouse <c-o><leftmouse><c-o>:call <SID>NetrwPrevWinOpen(1)<cr>
2031 imap <buffer> <s-leftmouse> <Plug>ISLeftmouse
2032 ino <buffer> <silent> <Plug>ISLeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002033 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
2034 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002035 exe 'inoremap <buffer> <silent> <rightmouse> <c-o><leftmouse><c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002036 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002037 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002038 exe 'nnoremap <buffer> <silent> D :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002039 exe 'nnoremap <buffer> <silent> R :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002040 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetrwMakeDir("")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002041 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
2042 exe 'vnoremap <buffer> <silent> D :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
2043 exe 'vnoremap <buffer> <silent> R :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
2044 exe 'inoremap <buffer> <silent> <del> <c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
2045 exe 'inoremap <buffer> <silent> D <c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
2046 exe 'inoremap <buffer> <silent> R <c-o>:call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
2047 exe 'inoremap <buffer> <silent> <Leader>m <c-o>:call <SID>NetrwMakeDir("")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002048 nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002049
Bram Moolenaar9964e462007-05-05 17:54:07 +00002050 else " remote
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002051" call Decho("make remote maps")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002052 call s:RemotePathAnalysis(b:netrw_curdir)
Bram Moolenaar15146672011-10-20 22:22:38 +02002053 " remote normal-mode maps
Bram Moolenaar446cb832008-06-24 21:56:24 +00002054 nnoremap <buffer> <silent> <cr> :call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr>
2055 nnoremap <buffer> <silent> <c-l> :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
2056 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'../'))<cr>
2057 nnoremap <buffer> <silent> a :call <SID>NetrwHide(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01002058 nnoremap <buffer> <silent> mb :<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002059 nnoremap <buffer> <silent> mc :<c-u>call <SID>NetrwMarkFileCopy(0)<cr>
2060 nnoremap <buffer> <silent> md :<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
2061 nnoremap <buffer> <silent> me :<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
2062 nnoremap <buffer> <silent> mf :<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
2063 nnoremap <buffer> <silent> mg :<c-u>call <SID>NetrwMarkFileGrep(0)<cr>
2064 nnoremap <buffer> <silent> mh :<c-u>call <SID>NetrwMarkHideSfx(0)<cr>
2065 nnoremap <buffer> <silent> mm :<c-u>call <SID>NetrwMarkFileMove(0)<cr>
2066 nnoremap <buffer> <silent> mp :<c-u>call <SID>NetrwMarkFilePrint(0)<cr>
2067 nnoremap <buffer> <silent> mr :<c-u>call <SID>NetrwMarkFileRegexp(0)<cr>
2068 nnoremap <buffer> <silent> ms :<c-u>call <SID>NetrwMarkFileSource(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002069 nnoremap <buffer> <silent> mt :<c-u>call <SID>NetrwMarkFileTgt(0)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02002070 nnoremap <buffer> <silent> mT :<c-u>call <SID>NetrwMarkFileTag(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002071 nnoremap <buffer> <silent> mu :<c-u>call <SID>NetrwUnMarkFile(0)<cr>
2072 nnoremap <buffer> <silent> mx :<c-u>call <SID>NetrwMarkFileExe(0)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02002073 nnoremap <buffer> <silent> mX :<c-u>call <SID>NetrwMarkFileVimCmd(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002074 nnoremap <buffer> <silent> mz :<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01002075 nnoremap <buffer> <silent> gb :<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_cur)<cr>
Bram Moolenaaradc21822011-04-01 18:03:16 +02002076 nnoremap <buffer> <silent> gd :<c-u>call <SID>NetrwForceChgDir(0,<SID>NetrwGetWord())<cr>
2077 nnoremap <buffer> <silent> gf :<c-u>call <SID>NetrwForceFile(0,<SID>NetrwGetWord())<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002078 nnoremap <buffer> <silent> gh :<c-u>call <SID>NetrwHidden(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01002079 nnoremap <buffer> <silent> gp :<c-u>call <SID>NetrwChgPerm(0,b:netrw_curdir)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00002080 nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002081 nnoremap <buffer> <silent> i :call <SID>NetrwListStyle(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01002082 nnoremap <buffer> <silent> I :call <SID>NetrwBannerCtrl(1)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002083 nnoremap <buffer> <silent> o :call <SID>NetrwSplit(0)<cr>
2084 nnoremap <buffer> <silent> O :call <SID>NetrwObtain(0)<cr>
2085 nnoremap <buffer> <silent> p :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
2086 nnoremap <buffer> <silent> P :call <SID>NetrwPrevWinOpen(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01002087 nnoremap <buffer> <silent> qb :<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
2088 nnoremap <buffer> <silent> mB :<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002089 nnoremap <buffer> <silent> qf :<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
2090 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>
2091 nnoremap <buffer> <silent> s :call <SID>NetrwSortStyle(0)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00002092 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002093 nnoremap <buffer> <silent> t :call <SID>NetrwSplit(1)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01002094 nnoremap <buffer> <silent> T :call <SID>NetrwSplit(1)<bar>norm! gT<cr>
2095 nnoremap <buffer> <silent> u :<c-u>call <SID>NetrwBookHistHandler(4,b:netrw_curdir)<cr>
2096 nnoremap <buffer> <silent> U :<c-u>call <SID>NetrwBookHistHandler(5,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002097 nnoremap <buffer> <silent> v :call <SID>NetrwSplit(2)<cr>
2098 nnoremap <buffer> <silent> x :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
Bram Moolenaarc236c162008-07-13 17:41:49 +00002099 nnoremap <buffer> <silent> % :call <SID>NetrwOpenFile(0)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02002100 " remote insert-mode maps
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002101 inoremap <buffer> <silent> <cr> <c-o>:call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr>
2102 inoremap <buffer> <silent> <c-l> <c-o>:call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
2103 inoremap <buffer> <silent> - <c-o>:exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'../'))<cr>
2104 inoremap <buffer> <silent> a <c-o>:call <SID>NetrwHide(0)<cr>
2105 inoremap <buffer> <silent> mb <c-o>:<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
2106 inoremap <buffer> <silent> mc <c-o>:<c-u>call <SID>NetrwMarkFileCopy(0)<cr>
2107 inoremap <buffer> <silent> md <c-o>:<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
2108 inoremap <buffer> <silent> me <c-o>:<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
2109 inoremap <buffer> <silent> mf <c-o>:<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
2110 inoremap <buffer> <silent> mg <c-o>:<c-u>call <SID>NetrwMarkFileGrep(0)<cr>
2111 inoremap <buffer> <silent> mh <c-o>:<c-u>call <SID>NetrwMarkHideSfx(0)<cr>
2112 inoremap <buffer> <silent> mm <c-o>:<c-u>call <SID>NetrwMarkFileMove(0)<cr>
2113 inoremap <buffer> <silent> mp <c-o>:<c-u>call <SID>NetrwMarkFilePrint(0)<cr>
2114 inoremap <buffer> <silent> mr <c-o>:<c-u>call <SID>NetrwMarkFileRegexp(0)<cr>
2115 inoremap <buffer> <silent> ms <c-o>:<c-u>call <SID>NetrwMarkFileSource(0)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002116 inoremap <buffer> <silent> mt <c-o>:<c-u>call <SID>NetrwMarkFileTgt(0)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02002117 inoremap <buffer> <silent> mT <c-o>:<c-u>call <SID>NetrwMarkFileTag(0)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002118 inoremap <buffer> <silent> mu <c-o>:<c-u>call <SID>NetrwUnMarkFile(0)<cr>
2119 inoremap <buffer> <silent> mx <c-o>:<c-u>call <SID>NetrwMarkFileExe(0)<cr>
Bram Moolenaar15146672011-10-20 22:22:38 +02002120 inoremap <buffer> <silent> mX <c-o>:<c-u>call <SID>NetrwMarkFileVimCmd(0)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002121 inoremap <buffer> <silent> mz <c-o>:<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
2122 inoremap <buffer> <silent> gb <c-o>:<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_cur)<cr>
2123 inoremap <buffer> <silent> gh <c-o>:<c-u>call <SID>NetrwHidden(0)<cr>
2124 inoremap <buffer> <silent> gp <c-o>:<c-u>call <SID>NetrwChgPerm(0,b:netrw_curdir)<cr>
2125 inoremap <buffer> <silent> C <c-o>:let g:netrw_chgwin= winnr()<cr>
2126 inoremap <buffer> <silent> i <c-o>:call <SID>NetrwListStyle(0)<cr>
2127 inoremap <buffer> <silent> I <c-o>:call <SID>NetrwBannerCtrl(1)<cr>
2128 inoremap <buffer> <silent> o <c-o>:call <SID>NetrwSplit(0)<cr>
2129 inoremap <buffer> <silent> O <c-o>:call <SID>NetrwObtain(0)<cr>
2130 inoremap <buffer> <silent> p <c-o>:call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
2131 inoremap <buffer> <silent> P <c-o>:call <SID>NetrwPrevWinOpen(0)<cr>
2132 inoremap <buffer> <silent> qb <c-o>:<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
2133 inoremap <buffer> <silent> mB <c-o>:<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
2134 inoremap <buffer> <silent> qf <c-o>:<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
2135 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>
2136 inoremap <buffer> <silent> s <c-o>:call <SID>NetrwSortStyle(0)<cr>
2137 inoremap <buffer> <silent> S <c-o>:call <SID>NetSortSequence(0)<cr>
2138 inoremap <buffer> <silent> t <c-o>:call <SID>NetrwSplit(1)<cr>
2139 inoremap <buffer> <silent> T <c-o>:call <SID>NetrwSplit(1)<bar>norm! gT<cr>
2140 inoremap <buffer> <silent> u <c-o>:<c-u>call <SID>NetrwBookHistHandler(4,b:netrw_curdir)<cr>
2141 inoremap <buffer> <silent> U <c-o>:<c-u>call <SID>NetrwBookHistHandler(5,b:netrw_curdir)<cr>
2142 inoremap <buffer> <silent> v <c-o>:call <SID>NetrwSplit(2)<cr>
2143 inoremap <buffer> <silent> x <c-o>:call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
2144 inoremap <buffer> <silent> % <c-o>:call <SID>NetrwOpenFile(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002145 if !hasmapto('<Plug>NetrwHideEdit')
2146 nmap <buffer> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002147 imap <buffer> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar446cb832008-06-24 21:56:24 +00002148 endif
2149 nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(0)<cr>
2150 if !hasmapto('<Plug>NetrwRefresh')
2151 nmap <buffer> <c-l> <Plug>NetrwRefresh
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002152 imap <buffer> <c-l> <Plug>NetrwRefresh
Bram Moolenaar446cb832008-06-24 21:56:24 +00002153 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002154
2155 let mapsafepath = escape(s:path, s:netrw_map_escape)
2156 let mapsafeusermach = escape(s:user.s:machine, s:netrw_map_escape)
2157
Bram Moolenaar251e1912011-06-19 05:09:16 +02002158 nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002159 if g:netrw_mousemaps == 1
Bram Moolenaar251e1912011-06-19 05:09:16 +02002160 nmap <leftmouse> <Plug>NetrwLeftmouse
2161 nno <buffer> <silent> <Plug>NetrwLeftmouse <leftmouse>:call <SID>NetrwLeftmouse(0)<cr>
2162 nmap <middlemouse> <Plug>NetrwMiddlemouse
2163 nno <buffer> <silent> <middlemouse> <Plug>NetrwMiddlemouse <leftmouse>:call <SID>NetrwPrevWinOpen(0)<cr>
2164 nmap <buffer> <s-leftmouse> <Plug>NetrwSLeftmouse
2165 nno <buffer> <silent> <Plug>NetrwSLeftmouse <leftmouse>:call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
2166 nmap <buffer> <2-leftmouse> <Plug>Netrw2Leftmouse
2167 nmap <buffer> <silent> <Plug>Netrw2Leftmouse -
2168 imap <buffer> <leftmouse> <Plug>ILeftmouse
2169 ino <buffer> <silent> <Plug>ILeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwLeftmouse(0)<cr>
2170 imap <buffer> <middlemouse> <Plug>IMiddlemouse
2171 ino <buffer> <silent> <Plug>IMiddlemouse <c-o><leftmouse><c-o>:call <SID>NetrwPrevWinOpen(0)<cr>
2172 imap <buffer> <s-leftmouse> <Plug>ISLeftmouse
2173 ino <buffer> <silent> <Plug>ISLeftmouse <c-o><leftmouse><c-o>:call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002174 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
2175 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002176 exe 'inoremap <buffer> <silent> <rightmouse> <c-o><leftmouse><c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002177 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002178 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002179 exe 'nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("'.mapsafeusermach.'")<cr>'
2180 exe 'nnoremap <buffer> <silent> D :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
2181 exe 'nnoremap <buffer> <silent> R :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002182 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002183 exe 'vnoremap <buffer> <silent> D :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
2184 exe 'vnoremap <buffer> <silent> R :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
2185 exe 'inoremap <buffer> <silent> <del> <c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
2186 exe 'inoremap <buffer> <silent> d <c-o>:call <SID>NetrwMakeDir("'.mapsafeusermach.'")<cr>'
2187 exe 'inoremap <buffer> <silent> D <c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
2188 exe 'inoremap <buffer> <silent> R <c-o>:call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaarc236c162008-07-13 17:41:49 +00002189 nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002190 inoremap <buffer> <F1> <c-o>:he netrw-quickhelp<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00002191 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002192
Bram Moolenaaradc21822011-04-01 18:03:16 +02002193 keepj call s:SetRexDir(a:islocal,b:netrw_curdir)
Bram Moolenaar251e1912011-06-19 05:09:16 +02002194
Bram Moolenaaradc21822011-04-01 18:03:16 +02002195" call Dret("s:NetrwMaps")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002196endfun
2197
2198" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002199" s:ExplorePatHls: converts an Explore pattern into a regular expression search pattern {{{2
2200fun! s:ExplorePatHls(pattern)
2201" call Dfunc("s:ExplorePatHls(pattern<".a:pattern.">)")
2202 let repat= substitute(a:pattern,'^**/\{1,2}','','')
2203" call Decho("repat<".repat.">")
2204 let repat= escape(repat,'][.\')
2205" call Decho("repat<".repat.">")
2206 let repat= '\<'.substitute(repat,'\*','\\(\\S\\+ \\)*\\S\\+','g').'\>'
2207" call Dret("s:ExplorePatHls repat<".repat.">")
2208 return repat
Bram Moolenaar9964e462007-05-05 17:54:07 +00002209endfun
2210
2211" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01002212" s:NetrwBookHistHandler: {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00002213" 0: (user: <mb>) bookmark current directory
2214" 1: (user: <gb>) change to the bookmarked directory
2215" 2: (user: <qb>) list bookmarks
2216" 3: (browsing) record current directory history
2217" 4: (user: <u>) go up (previous) bookmark
2218" 5: (user: <U>) go down (next) bookmark
2219" 6: (user: <mB>) delete bookmark
Bram Moolenaar5c736222010-01-06 20:54:52 +01002220fun! s:NetrwBookHistHandler(chg,curdir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002221" 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 +00002222
2223 if a:chg == 0
2224 " bookmark the current directory
2225" call Decho("(user: <b>) bookmark the current directory")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002226 if !exists("g:netrw_bookmarklist")
2227 let g:netrw_bookmarklist= []
2228 endif
2229 if index(g:netrw_bookmarklist,a:curdir) == -1
2230 " curdir not currently in g:netrw_bookmarklist, so include it
2231 call add(g:netrw_bookmarklist,a:curdir)
2232 call sort(g:netrw_bookmarklist)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002233 endif
2234 echo "bookmarked the current directory"
2235
2236 elseif a:chg == 1
2237 " change to the bookmarked directory
Bram Moolenaar5c736222010-01-06 20:54:52 +01002238" call Decho("(user: <".v:count."mb>) change to the bookmarked directory")
2239 if exists("g:netrw_bookmarklist[v:count-1]")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002240 exe "keepj e ".fnameescape(g:netrw_bookmarklist[v:count-1])
Bram Moolenaar9964e462007-05-05 17:54:07 +00002241 else
2242 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
2243 endif
2244
2245 elseif a:chg == 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00002246" redraw!
Bram Moolenaar9964e462007-05-05 17:54:07 +00002247 let didwork= 0
2248 " list user's bookmarks
2249" call Decho("(user: <q>) list user's bookmarks")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002250 if exists("g:netrw_bookmarklist")
2251" call Decho('list '.len(g:netrw_bookmarklist).' bookmarks')
2252 let cnt= 1
2253 for bmd in g:netrw_bookmarklist
2254" call Decho("Netrw Bookmark#".cnt.": ".g:netrw_bookmarklist[cnt-1])
2255 echo "Netrw Bookmark#".cnt.": ".g:netrw_bookmarklist[cnt-1]
2256 let didwork = 1
2257 let cnt = cnt + 1
2258 endfor
Bram Moolenaar9964e462007-05-05 17:54:07 +00002259 endif
2260
2261 " list directory history
Bram Moolenaar5c736222010-01-06 20:54:52 +01002262 let cnt = g:netrw_dirhist_cnt
Bram Moolenaar9964e462007-05-05 17:54:07 +00002263 let first = 1
2264 let histcnt = 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02002265 if g:netrw_dirhistmax > 0
2266 while ( first || cnt != g:netrw_dirhist_cnt )
Bram Moolenaar5c736222010-01-06 20:54:52 +01002267" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:netrw_dirhist_cnt)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002268 let histcnt= histcnt + 1
2269 if exists("g:netrw_dirhist_{cnt}")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002270" call Decho("Netrw History#".histcnt.": ".g:netrw_dirhist_{cnt})
Bram Moolenaaradc21822011-04-01 18:03:16 +02002271 echo "Netrw History#".histcnt.": ".g:netrw_dirhist_{cnt}
2272 let didwork= 1
2273 endif
2274 let first = 0
2275 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
2276 if cnt < 0
2277 let cnt= cnt + g:netrw_dirhistmax
2278 endif
2279 endwhile
2280 else
2281 let g:netrw_dirhist_cnt= 0
2282 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002283 if didwork
2284 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2285 endif
2286
2287 elseif a:chg == 3
2288 " saves most recently visited directories (when they differ)
2289" call Decho("(browsing) record curdir history")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002290 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 +02002291 if g:netrw_dirhistmax > 0
2292 let g:netrw_dirhist_cnt = ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
2293 let g:netrw_dirhist_{g:netrw_dirhist_cnt} = a:curdir
2294 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002295" call Decho("save dirhist#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002296 endif
2297
2298 elseif a:chg == 4
2299 " u: change to the previous directory stored on the history list
2300" call Decho("(user: <u>) chg to prev dir from history")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002301 if g:netrw_dirhistmax > 0
2302 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt - 1 ) % g:netrw_dirhistmax
2303 if g:netrw_dirhist_cnt < 0
2304 let g:netrw_dirhist_cnt= g:netrw_dirhist_cnt + g:netrw_dirhistmax
2305 endif
2306 else
2307 let g:netrw_dirhist_cnt= 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00002308 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002309 if exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}")
2310" call Decho("changedir u#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002311 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
2312 setlocal ma noro
Bram Moolenaar446cb832008-06-24 21:56:24 +00002313" call Decho("setlocal ma noro")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002314 sil! keepj %d
Bram Moolenaar9964e462007-05-05 17:54:07 +00002315 setlocal nomod
Bram Moolenaar446cb832008-06-24 21:56:24 +00002316" call Decho("setlocal nomod")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002317 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002318" " call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt}))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002319 exe "keepj e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt})
Bram Moolenaar9964e462007-05-05 17:54:07 +00002320 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02002321 if g:netrw_dirhistmax > 0
2322 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
2323 else
2324 let g:netrw_dirhist_cnt= 0
2325 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002326 echo "Sorry, no predecessor directory exists yet"
2327 endif
2328
2329 elseif a:chg == 5
2330 " U: change to the subsequent directory stored on the history list
2331" call Decho("(user: <U>) chg to next dir from history")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002332 if g:netrw_dirhistmax > 0
2333 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
2334 if exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002335" call Decho("changedir U#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002336 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
2337 setlocal ma noro
Bram Moolenaar446cb832008-06-24 21:56:24 +00002338" call Decho("setlocal ma noro")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002339 sil! keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00002340" call Decho("removed all lines from buffer (%d)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002341 setlocal nomod
Bram Moolenaar446cb832008-06-24 21:56:24 +00002342" call Decho("setlocal nomod")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002343 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002344" call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt}))
Bram Moolenaaradc21822011-04-01 18:03:16 +02002345 exe "keepj e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt})
2346 else
2347 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt - 1 ) % g:netrw_dirhistmax
2348 if g:netrw_dirhist_cnt < 0
2349 let g:netrw_dirhist_cnt= g:netrw_dirhist_cnt + g:netrw_dirhistmax
2350 endif
2351 echo "Sorry, no successor directory exists yet"
Bram Moolenaar9964e462007-05-05 17:54:07 +00002352 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002353 else
2354 let g:netrw_dirhist_cnt= 0
2355 echo "Sorry, no successor directory exists yet (g:netrw_dirhistmax is ".g:netrw_dirhistmax.")"
Bram Moolenaar9964e462007-05-05 17:54:07 +00002356 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002357
2358 elseif a:chg == 6
Bram Moolenaar5c736222010-01-06 20:54:52 +01002359 " delete the v:count'th bookmark
2360" call Decho("delete bookmark#".v:count."<".g:netrw_bookmarklist[v:count-1].">")
2361 let savefile= s:NetrwHome()."/.netrwbook"
2362 if filereadable(savefile)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002363 keepj call s:NetrwBookHistSave() " done here to merge bookmarks first
2364 keepj call delete(savefile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002365 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002366 keepj call remove(g:netrw_bookmarklist,v:count-1)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002367 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002368 call s:NetrwBookmarkMenu()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002369" call Dret("s:NetrwBookHistHandler")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002370endfun
2371
2372" ---------------------------------------------------------------------
2373" s:NetrwBookHistRead: this function reads bookmarks and history {{{2
2374" Sister function: s:NetrwBookHistSave()
2375fun! s:NetrwBookHistRead()
2376" call Dfunc("s:NetrwBookHistRead()")
2377 if !exists("s:netrw_initbookhist")
2378 let home = s:NetrwHome()
2379 let savefile= home."/.netrwbook"
2380 if filereadable(savefile)
2381" call Decho("sourcing .netrwbook")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002382 exe "keepj so ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01002383 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002384 if g:netrw_dirhistmax > 0
2385 let savefile= home."/.netrwhist"
2386 if filereadable(savefile)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002387" call Decho("sourcing .netrwhist")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002388 exe "keepj so ".savefile
2389 endif
2390 let s:netrw_initbookhist= 1
2391 au VimLeave * call s:NetrwBookHistSave()
Bram Moolenaar5c736222010-01-06 20:54:52 +01002392 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002393 endif
2394" call Dret("s:NetrwBookHistRead")
2395endfun
2396
2397" ---------------------------------------------------------------------
2398" s:NetrwBookHistSave: this function saves bookmarks and history {{{2
2399" Sister function: s:NetrwBookHistRead()
2400" I used to do this via viminfo but that appears to
2401" be unreliable for long-term storage
Bram Moolenaar5c736222010-01-06 20:54:52 +01002402fun! s:NetrwBookHistSave()
2403" call Dfunc("s:NetrwBookHistSave() dirhistmax=".g:netrw_dirhistmax)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002404 if g:netrw_dirhistmax <= 0
2405" call Dret("s:NetrwBookHistSave : dirhistmax=".g:netrw_dirhistmax)
2406 return
2407 endif
2408
Bram Moolenaar5c736222010-01-06 20:54:52 +01002409 let savefile= s:NetrwHome()."/.netrwhist"
2410 1split
2411 call s:NetrwEnew()
2412 setlocal cino= com= cpo-=aA fo=nroql2 tw=0 report=10000 noswf
2413 setlocal nocin noai noci magic nospell nohid wig= noaw
2414 setlocal ma noro write
2415 if exists("&acd") | setlocal noacd | endif
Bram Moolenaar15146672011-10-20 22:22:38 +02002416 sil! keepj keepalt %d
Bram Moolenaar5c736222010-01-06 20:54:52 +01002417
2418 " save .netrwhist -- no attempt to merge
Bram Moolenaaradc21822011-04-01 18:03:16 +02002419 sil! file .netrwhist
Bram Moolenaar5c736222010-01-06 20:54:52 +01002420 call setline(1,"let g:netrw_dirhistmax =".g:netrw_dirhistmax)
2421 call setline(2,"let g:netrw_dirhist_cnt =".g:netrw_dirhist_cnt)
2422 let lastline = line("$")
2423 let cnt = 1
2424 while cnt <= g:netrw_dirhist_cnt
2425 call setline((cnt+lastline),'let g:netrw_dirhist_'.cnt."='".g:netrw_dirhist_{cnt}."'")
2426 let cnt= cnt + 1
2427 endwhile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002428 exe "sil! w! ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01002429
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002430 sil keepj %d
Bram Moolenaar5c736222010-01-06 20:54:52 +01002431 if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != []
2432 " merge and write .netrwbook
2433 let savefile= s:NetrwHome()."/.netrwbook"
2434
2435 if filereadable(savefile)
2436 let booklist= deepcopy(g:netrw_bookmarklist)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002437 exe "sil keepj so ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01002438 for bdm in booklist
2439 if index(g:netrw_bookmarklist,bdm) == -1
2440 call add(g:netrw_bookmarklist,bdm)
2441 endif
2442 endfor
2443 call sort(g:netrw_bookmarklist)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002444 exe "sil! w! ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01002445 endif
2446
2447 " construct and save .netrwbook
2448 call setline(1,"let g:netrw_bookmarklist= ".string(g:netrw_bookmarklist))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002449 exe "sil! w! ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01002450 endif
2451 let bgone= bufnr("%")
2452 q!
2453 exe bgone."bwipe!"
2454
2455" call Dret("s:NetrwBookHistSave")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002456endfun
2457
2458" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002459" s:NetrwBrowse: This function uses the command in g:netrw_list_cmd to provide a {{{2
2460" list of the contents of a local or remote directory. It is assumed that the
2461" g:netrw_list_cmd has a string, USEPORT HOSTNAME, that needs to be substituted
2462" with the requested remote hostname first.
2463fun! s:NetrwBrowse(islocal,dirname)
2464 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002465" 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 +00002466" call Decho("tab#".tabpagenr()." win#".winnr())
2467" call Dredir("ls!")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002468 if !exists("s:netrw_initbookhist")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002469 keepj call s:NetrwBookHistRead()
Bram Moolenaar5c736222010-01-06 20:54:52 +01002470 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002471
2472 " simplify the dirname (especially for ".."s in dirnames)
2473 if a:dirname !~ '^\a\+://'
2474 let dirname= simplify(a:dirname)
2475 else
2476 let dirname= a:dirname
2477 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002478
2479 if exists("s:netrw_skipbrowse")
2480 unlet s:netrw_skipbrowse
Bram Moolenaarc236c162008-07-13 17:41:49 +00002481" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002482" call Dret("s:NetrwBrowse : s:netrw_skipbrowse=".s:netrw_skipbrowse)
2483 return
2484 endif
2485 if !exists("*shellescape")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002486 keepj call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing shellescape()",69)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002487" call Dret("s:NetrwBrowse : missing shellescape()")
2488 return
2489 endif
2490 if !exists("*fnameescape")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002491 keepj call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing fnameescape()",70)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002492" call Dret("s:NetrwBrowse : missing fnameescape()")
2493 return
2494 endif
2495
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002496 call s:NetrwOptionSave("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002497
2498 " re-instate any marked files
2499 if exists("s:netrwmarkfilelist_{bufnr('%')}")
2500" call Decho("clearing marked files")
2501 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
2502 endif
2503
2504 if a:islocal && exists("w:netrw_acdkeep") && w:netrw_acdkeep
2505" call Decho("handle w:netrw_acdkeep:")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002506" call Decho("keepjumps lcd ".fnameescape(dirname)." (due to w:netrw_acdkeep=".w:netrw_acdkeep." - acd=".&acd.")")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002507 exe 'keepj lcd '.fnameescape(dirname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002508 call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00002509" call Decho("getcwd<".getcwd().">")
2510
Bram Moolenaar5c736222010-01-06 20:54:52 +01002511 elseif !a:islocal && dirname !~ '[\/]$' && dirname !~ '^"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002512 " looks like a regular file, attempt transfer
Bram Moolenaar5c736222010-01-06 20:54:52 +01002513" call Decho("attempt transfer as regular file<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002514
2515 " remove any filetype indicator from end of dirname, except for the {{{3
2516 " "this is a directory" indicator (/).
2517 " There shouldn't be one of those here, anyway.
Bram Moolenaar5c736222010-01-06 20:54:52 +01002518 let path= substitute(dirname,'[*=@|]\r\=$','','e')
Bram Moolenaar446cb832008-06-24 21:56:24 +00002519" call Decho("new path<".path.">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002520 call s:RemotePathAnalysis(dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002521
2522 " remote-read the requested file into current buffer {{{3
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002523 keepj mark '
Bram Moolenaar5c736222010-01-06 20:54:52 +01002524 call s:NetrwEnew(dirname)
2525 call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00002526 setlocal ma noro
2527" call Decho("setlocal ma noro")
Bram Moolenaar15146672011-10-20 22:22:38 +02002528 let b:netrw_curdir = dirname
2529 let url = s:method."://".s:user.s:machine.(s:port ? ":".s:port : "")."/".s:path
2530" call Decho("exe sil! keepalt file ".fnameescape(url)." (bt=".&bt.")")
2531 exe "sil! keepj keepalt file ".fnameescape(url)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002532 exe "sil! keepj keepalt doau BufReadPre ".fnameescape(s:fname)
Bram Moolenaar15146672011-10-20 22:22:38 +02002533 sil call netrw#NetRead(2,url)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002534 if s:path !~ '.tar.bz2$' && s:path !~ '.tar.gz' && s:path !~ '.tar.xz' && s:path !~ '.txz'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002535 " netrw.vim and tar.vim have already handled decompression of the tarball; avoiding gzip.vim error
Bram Moolenaaradc21822011-04-01 18:03:16 +02002536 exe "sil keepj keepalt doau BufReadPost ".fnameescape(s:fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002537 endif
2538
2539 " save certain window-oriented variables into buffer-oriented variables {{{3
2540 call s:SetBufWinVars()
2541 call s:NetrwOptionRestore("w:")
2542 setlocal ma nomod
2543
Bram Moolenaarc236c162008-07-13 17:41:49 +00002544" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002545" call Dret("s:NetrwBrowse : file<".s:fname.">")
2546 return
2547 endif
2548
Bram Moolenaaradc21822011-04-01 18:03:16 +02002549 " use buffer-oriented WinVars if buffer variables exist but associated window variables don't {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00002550 call s:UseBufWinVars()
2551
2552 " set up some variables {{{3
2553 let b:netrw_browser_active = 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01002554 let dirname = dirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00002555 let s:last_sort_by = g:netrw_sort_by
2556
2557 " set up menu {{{3
Bram Moolenaaradc21822011-04-01 18:03:16 +02002558 keepj call s:NetrwMenu(1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002559
2560 " set up buffer {{{3
2561 let reusing= s:NetrwGetBuffer(a:islocal,dirname)
2562 " maintain markfile highlighting
2563 if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
2564" call Decho("bufnr(%)=".bufnr('%'))
2565" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
2566 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
2567 else
2568" call Decho("2match none")
2569 2match none
2570 endif
2571 if reusing
2572 call s:NetrwOptionRestore("w:")
2573 setlocal noma nomod nowrap
Bram Moolenaarc236c162008-07-13 17:41:49 +00002574" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002575" call Dret("s:NetrwBrowse : re-using buffer")
2576 return
2577 endif
2578
2579 " set b:netrw_curdir to the new directory name {{{3
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002580" call Decho("set b:netrw_curdir to the new directory name: (buf#".bufnr("%").")")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002581 let b:netrw_curdir= dirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00002582 if b:netrw_curdir =~ '[/\\]$'
2583 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
2584 endif
2585 if b:netrw_curdir == ''
2586 if has("amiga")
2587 " On the Amiga, the empty string connotes the current directory
2588 let b:netrw_curdir= getcwd()
2589 else
2590 " under unix, when the root directory is encountered, the result
2591 " from the preceding substitute is an empty string.
2592 let b:netrw_curdir= '/'
2593 endif
2594 endif
2595 if !a:islocal && b:netrw_curdir !~ '/$'
2596 let b:netrw_curdir= b:netrw_curdir.'/'
2597 endif
2598" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
2599
2600 " ------------
2601 " (local only) {{{3
2602 " ------------
2603 if a:islocal
2604" call Decho("local only:")
2605
2606 " Set up ShellCmdPost handling. Append current buffer to browselist
2607 call s:LocalFastBrowser()
2608
2609 " handle g:netrw_keepdir: set vim's current directory to netrw's notion of the current directory {{{3
2610 if !g:netrw_keepdir
2611" call Decho("handle g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
2612" call Decho("l:acd".(exists("&l:acd")? "=".&l:acd : " doesn't exist"))
2613 if !exists("&l:acd") || !&l:acd
2614" call Decho('exe keepjumps lcd '.fnameescape(b:netrw_curdir))
2615 try
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002616 exe 'keepj lcd '.fnameescape(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002617 catch /^Vim\%((\a\+)\)\=:E472/
2618 call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".b:netrw_curdir."> (permissions?)",61)
2619 if exists("w:netrw_prvdir")
2620 let b:netrw_curdir= w:netrw_prvdir
2621 else
2622 call s:NetrwOptionRestore("w:")
2623 setlocal noma nomod nowrap
2624 let b:netrw_curdir= dirname
Bram Moolenaarc236c162008-07-13 17:41:49 +00002625" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002626" call Dret("s:NetrwBrowse : reusing buffer#".(exists("bufnum")? bufnum : 'N/A')."<".dirname."> getcwd<".getcwd().">")
2627 return
2628 endif
2629 endtry
2630 endif
2631 endif
2632
2633 " --------------------------------
2634 " remote handling: {{{3
2635 " --------------------------------
2636 else
2637" call Decho("remote only:")
2638
Bram Moolenaar5c736222010-01-06 20:54:52 +01002639 " analyze dirname and g:netrw_list_cmd {{{4
2640" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist")."> dirname<".dirname.">")
2641 if dirname =~ "^NetrwTreeListing\>"
Bram Moolenaar446cb832008-06-24 21:56:24 +00002642 let dirname= b:netrw_curdir
Bram Moolenaar5c736222010-01-06 20:54:52 +01002643" call Decho("(dirname was ".dirname.") dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002644 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
2645 let dirname= substitute(b:netrw_curdir,'\\','/','g')
2646 if dirname !~ '/$'
2647 let dirname= dirname.'/'
2648 endif
2649 let b:netrw_curdir = dirname
2650" call Decho("(liststyle is TREELIST) dirname<".dirname.">")
2651 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01002652 let dirname = substitute(dirname,'\\','/','g')
Bram Moolenaar446cb832008-06-24 21:56:24 +00002653" call Decho("(normal) dirname<".dirname.">")
2654 endif
2655
2656 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
2657 if dirname !~ dirpat
2658 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002659 keepj call netrw#ErrorMsg(s:ERROR,"netrw doesn't understand your dirname<".dirname.">",20)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002660 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02002661 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002662 setlocal noma nomod nowrap
Bram Moolenaarc236c162008-07-13 17:41:49 +00002663" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002664" call Dret("s:NetrwBrowse : badly formatted dirname<".dirname.">")
2665 return
2666 endif
2667 let b:netrw_curdir= dirname
2668" call Decho("b:netrw_curdir<".b:netrw_curdir."> (remote)")
2669 endif " (additional remote handling)
2670
2671 " -----------------------
2672 " Directory Listing: {{{3
2673 " -----------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02002674 keepj call s:NetrwMaps(a:islocal)
2675 keepj call s:PerformListing(a:islocal)
Bram Moolenaar15146672011-10-20 22:22:38 +02002676 if v:version >= 700 && has("balloon_eval") && &beval == 0 && &l:bexpr == "" && !exists("g:netrw_nobeval")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002677 let &l:bexpr= "netrw#NetrwBalloonHelp()"
Bram Moolenaar15146672011-10-20 22:22:38 +02002678" call Decho("set up balloon help: l:bexpr=".&l:bexpr)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002679 set beval
2680 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02002681 call s:NetrwOptionRestore("w:")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002682
2683 " The s:LocalBrowseShellCmdRefresh() function is called by an autocmd
2684 " installed by s:LocalFastBrowser() when g:netrw_fastbrowse <= 1 (ie. slow, medium speed).
2685 " However, s:NetrwBrowse() causes the ShellCmdPost event itself to fire once; setting
2686 " the variable below avoids that second refresh of the screen. The s:LocalBrowseShellCmdRefresh()
2687 " function gets called due to that autocmd; it notices that the following variable is set
2688 " and skips the refresh and sets s:locbrowseshellcmd to zero. Oct 13, 2008
2689 let s:locbrowseshellcmd= 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00002690
Bram Moolenaarc236c162008-07-13 17:41:49 +00002691" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaaradc21822011-04-01 18:03:16 +02002692" call Dret("s:NetrwBrowse : did PerformListing ft<".&ft.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002693 return
2694endfun
2695
2696" ---------------------------------------------------------------------
2697" s:NetrwFileInfo: supports qf (query for file information) {{{2
2698fun! s:NetrwFileInfo(islocal,fname)
2699" call Dfunc("s:NetrwFileInfo(islocal=".a:islocal." fname<".a:fname.">)")
2700 if a:islocal
2701 if (has("unix") || has("macunix")) && executable("/bin/ls")
2702 if exists("b:netrw_curdir")
2703" call Decho('using ls with b:netrw_curdir<'.b:netrw_curdir.'>')
2704 if b:netrw_curdir =~ '/$'
2705 echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir.a:fname))
2706 else
2707 echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir."/".a:fname))
2708 endif
2709 else
2710" call Decho('using ls '.a:fname." using cwd<".getcwd().">")
2711 echo system("/bin/ls -lsad ".shellescape(a:fname))
2712 endif
2713 else
2714 " use vim functions to return information about file below cursor
2715" call Decho("using vim functions to query for file info")
2716 if !isdirectory(a:fname) && !filereadable(a:fname) && a:fname =~ '[*@/]'
2717 let fname= substitute(a:fname,".$","","")
2718 else
2719 let fname= a:fname
2720 endif
2721 let t = getftime(fname)
2722 let sz = getfsize(fname)
2723 echo a:fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname))
2724" call Decho(fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname)))
2725 endif
2726 else
2727 echo "sorry, \"qf\" not supported yet for remote files"
2728 endif
2729" call Dret("s:NetrwFileInfo")
2730endfun
2731
2732" ---------------------------------------------------------------------
2733" s:NetrwGetBuffer: {{{2
2734" returns 0=cleared buffer
2735" 1=re-used buffer
2736fun! s:NetrwGetBuffer(islocal,dirname)
2737" call Dfunc("s:NetrwGetBuffer(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".g:netrw_liststyle)
2738 let dirname= a:dirname
2739
2740 " re-use buffer if possible {{{3
2741" call Decho("--re-use a buffer if possible--")
2742 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2743 " find NetrwTreeList buffer if there is one
Bram Moolenaar5c736222010-01-06 20:54:52 +01002744" call Decho("find NetrwTreeList buffer if there is one")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002745 if exists("w:netrw_treebufnr") && w:netrw_treebufnr > 0
2746" call Decho(" re-use w:netrw_treebufnr=".w:netrw_treebufnr)
2747 let eikeep= &ei
2748 set ei=all
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002749 exe "sil! b ".w:netrw_treebufnr
Bram Moolenaar446cb832008-06-24 21:56:24 +00002750 let &ei= eikeep
Bram Moolenaar5c736222010-01-06 20:54:52 +01002751" call Dret("s:NetrwGetBuffer : bufnum#".w:netrw_treebufnr."<NetrwTreeListing>")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002752 return
2753 endif
2754 let bufnum= -1
2755" call Decho(" liststyle=TREE but w:netrw_treebufnr doesn't exist")
2756
2757 else
2758 " find buffer number of buffer named precisely the same as dirname {{{3
2759" call Decho("--find buffer numnber of buffer named precisely the same as dirname--")
2760" call Dredir("ls!")
2761
2762 " get dirname and associated buffer number
2763 let bufnum = bufnr(escape(dirname,'\'))
2764" call Decho(" find buffer<".dirname.">'s number ")
2765" call Decho(" bufnr(dirname<".escape(dirname,'\').">)=".bufnum)
2766
2767 if bufnum < 0 && dirname !~ '/$'
Bram Moolenaar5c736222010-01-06 20:54:52 +01002768 " try appending a trailing /
Bram Moolenaar446cb832008-06-24 21:56:24 +00002769" call Decho(" try appending a trailing / to dirname<".dirname.">")
2770 let bufnum= bufnr(escape(dirname.'/','\'))
2771 if bufnum > 0
2772 let dirname= dirname.'/'
2773 endif
2774 endif
2775
2776 if bufnum < 0 && dirname =~ '/$'
Bram Moolenaar5c736222010-01-06 20:54:52 +01002777 " try removing a trailing /
Bram Moolenaar446cb832008-06-24 21:56:24 +00002778" call Decho(" try removing a trailing / from dirname<".dirname.">")
2779 let bufnum= bufnr(escape(substitute(dirname,'/$','',''),'\'))
2780 if bufnum > 0
2781 let dirname= substitute(dirname,'/$','','')
2782 endif
2783 endif
2784
2785" call Decho(" findbuf1: bufnum=bufnr('".dirname."')=".bufnum." bufname(".bufnum.")<".bufname(bufnum)."> (initial)")
2786 " note: !~ was used just below, but that means using ../ to go back would match (ie. abc/def/ and abc/ matches)
2787 if bufnum > 0 && bufname(bufnum) != dirname && bufname(bufnum) != '.'
2788 " handle approximate matches
Bram Moolenaar5c736222010-01-06 20:54:52 +01002789" call Decho(" handling approx match: bufnum#".bufnum."<".bufname(bufnum)."> approx-dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002790 let ibuf = 1
2791 let buflast = bufnr("$")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002792" call Decho(" findbuf2: buflast=bufnr($)=".buflast)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002793 while ibuf <= buflast
2794 let bname= substitute(bufname(ibuf),'\\','/','g')
Bram Moolenaarc236c162008-07-13 17:41:49 +00002795 let bname= substitute(bname,'.\zs/$','','')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002796" call Decho(" findbuf3: while [ibuf=",ibuf."]<=[buflast=".buflast."]: dirname<".dirname."> bname=bufname(".ibuf.")<".bname.">")
2797 if bname != '' && dirname =~ '/'.bname.'/\=$' && dirname !~ '^/'
2798 " bname is not empty
2799 " dirname ends with bname,
2800 " dirname doesn't start with /, so its not a absolute path
2801" call Decho(" findbuf3a: passes test 1 : dirname<".dirname.'> =~ /'.bname.'/\=$ && dirname !~ ^/')
Bram Moolenaar5c736222010-01-06 20:54:52 +01002802 break
2803 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002804 if bname =~ '^'.dirname.'/\=$'
2805 " bname begins with dirname
2806" call Decho(' findbuf3b: passes test 2 : bname<'.bname.'>=~^'.dirname.'/\=$')
Bram Moolenaar5c736222010-01-06 20:54:52 +01002807 break
2808 endif
2809 if dirname =~ '^'.bname.'/$'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002810" call Decho(' findbuf3c: passes test 3 : dirname<'.dirname.'>=~^'.bname.'/$')
2811 break
2812 endif
2813 if bname != '' && dirname =~ '/'.bname.'$' && bname == bufname("%") && line("$") == 1
2814" call Decho(' findbuf3d: passes test 4 : dirname<'.dirname.'>=~ /'.bname.'$')
Bram Moolenaar5c736222010-01-06 20:54:52 +01002815 break
2816 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002817 let ibuf= ibuf + 1
2818 endwhile
2819 if ibuf > buflast
2820 let bufnum= -1
2821 else
2822 let bufnum= ibuf
2823 endif
2824" call Decho(" findbuf4: bufnum=".bufnum." (ibuf=".ibuf." buflast=".buflast.")")
2825 endif
2826 endif
2827
2828 " get enew buffer and name it -or- re-use buffer {{{3
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002829 sil! keepj mark '
Bram Moolenaar446cb832008-06-24 21:56:24 +00002830 if bufnum < 0 || !bufexists(bufnum)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002831" call Decho("--get enew buffer and name it (bufexists([bufnum=".bufnum."])=".bufexists(bufnum).")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002832 call s:NetrwEnew(dirname)
2833" call Decho(" got enew buffer#".bufnr("%")." (altbuf<".expand("#").">)")
2834 " name the buffer
2835 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2836 " Got enew buffer; transform into a NetrwTreeListing
2837" call Decho("--transform enew buffer#".bufnr("%")." into a NetrwTreeListing --")
2838 if !exists("s:netrw_treelistnum")
2839 let s:netrw_treelistnum= 1
2840 else
2841 let s:netrw_treelistnum= s:netrw_treelistnum + 1
2842 endif
2843 let w:netrw_treebufnr= bufnr("%")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002844" call Decho(" exe sil! keepalt file NetrwTreeListing ".fnameescape(s:netrw_treelistnum))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002845 exe 'sil! keepalt file NetrwTreeListing\ '.fnameescape(s:netrw_treelistnum)
2846 set bt=nofile noswf
Bram Moolenaaradc21822011-04-01 18:03:16 +02002847 nnoremap <silent> <buffer> [ :sil call <SID>TreeListMove('[')<cr>
2848 nnoremap <silent> <buffer> ] :sil call <SID>TreeListMove(']')<cr>
2849 nnoremap <silent> <buffer> [[ :sil call <SID>TreeListMove('[')<cr>
2850 nnoremap <silent> <buffer> ]] :sil call <SID>TreeListMove(']')<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00002851" call Decho(" tree listing#".s:netrw_treelistnum." bufnr=".w:netrw_treebufnr)
2852 else
2853" let v:errmsg= "" " Decho
2854 let escdirname= fnameescape(dirname)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002855" call Decho(" errmsg<".v:errmsg."> bufnr(escdirname<".escdirname.">)=".bufnr(escdirname)." bufname()<".bufname(bufnr(escdirname)).">")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002856" call Decho(' exe sil! keepalt file '.escdirname)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002857" let v:errmsg= "" " Decho
2858 exe 'sil! keepalt file '.escdirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00002859" call Decho(" errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">")
2860 endif
2861" call Decho(" named enew buffer#".bufnr("%")."<".bufname("%").">")
2862
2863 else " Re-use the buffer
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002864" call Decho("--re-use buffer#".bufnum." (bufexists([bufnum=".bufnum."])=".bufexists(bufnum).")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002865 let eikeep= &ei
2866 set ei=all
2867 if getline(2) =~ '^" Netrw Directory Listing'
2868" call Decho(" re-use buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using: keepalt b ".bufnum)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002869 exe "sil! keepalt b ".bufnum
Bram Moolenaar446cb832008-06-24 21:56:24 +00002870 else
2871" call Decho(" reusing buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using: b ".bufnum)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002872 exe "sil! b ".bufnum
Bram Moolenaar446cb832008-06-24 21:56:24 +00002873 endif
2874 if bufname("%") == '.'
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002875" call Decho("exe sil! keepalt file ".fnameescape(getcwd()))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002876 exe "sil! keepalt file ".fnameescape(getcwd())
Bram Moolenaar446cb832008-06-24 21:56:24 +00002877 endif
2878 let &ei= eikeep
2879 if line("$") <= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02002880 keepj call s:NetrwListSettings(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002881" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but its empty, so refresh it")
2882 return 0
2883 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2884" call Decho("--re-use tree listing--")
2885" call Decho(" clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002886 sil keepj %d
Bram Moolenaaradc21822011-04-01 18:03:16 +02002887 keepj call s:NetrwListSettings(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002888" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but treelist mode always needs a refresh")
2889 return 0
2890 else
2891" call Dret("s:NetrwGetBuffer 1 : buf#".bufnr("%"))
2892 return 1
2893 endif
2894 endif
2895
2896 " do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc {{{3
2897 " fastbrowse Local Remote Hiding a buffer implies it may be re-used (fast)
2898 " slow 0 D D Deleting a buffer implies it will not be re-used (slow)
2899 " med 1 D H
2900 " fast 2 H H
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002901" call Decho("--do netrw settings: make this buffer#".bufnr("%")." not-a-file, modifiable, not line-numbered, etc--")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002902 let fname= expand("%")
Bram Moolenaaradc21822011-04-01 18:03:16 +02002903 keepj call s:NetrwListSettings(a:islocal)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02002904" call Decho("exe sil! keepalt file ".fnameescape(fname))
Bram Moolenaaradc21822011-04-01 18:03:16 +02002905 exe "sil! keepj keepalt file ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002906
2907 " delete all lines from buffer {{{3
2908" call Decho("--delete all lines from buffer--")
2909" call Decho(" clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002910 sil! keepalt keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00002911
2912" call Dret("s:NetrwGetBuffer 0 : buf#".bufnr("%"))
2913 return 0
2914endfun
2915
2916" ---------------------------------------------------------------------
2917" s:NetrwGetcwd: get the current directory. {{{2
2918" Change backslashes to forward slashes, if any.
2919" If doesc is true, escape certain troublesome characters
2920fun! s:NetrwGetcwd(doesc)
2921" call Dfunc("NetrwGetcwd(doesc=".a:doesc.")")
2922 let curdir= substitute(getcwd(),'\\','/','ge')
2923 if curdir !~ '[\/]$'
2924 let curdir= curdir.'/'
2925 endif
2926 if a:doesc
2927 let curdir= fnameescape(curdir)
2928 endif
2929" call Dret("NetrwGetcwd <".curdir.">")
2930 return curdir
2931endfun
2932
2933" ---------------------------------------------------------------------
2934" s:NetrwGetWord: it gets the directory/file named under the cursor {{{2
2935fun! s:NetrwGetWord()
2936" call Dfunc("s:NetrwGetWord() line#".line(".")." liststyle=".g:netrw_liststyle." virtcol=".virtcol("."))
2937 call s:UseBufWinVars()
2938
2939 " insure that w:netrw_liststyle is set up
2940 if !exists("w:netrw_liststyle")
2941 if exists("g:netrw_liststyle")
2942 let w:netrw_liststyle= g:netrw_liststyle
2943 else
2944 let w:netrw_liststyle= s:THINLIST
2945 endif
2946" call Decho("w:netrw_liststyle=".w:netrw_liststyle)
2947 endif
2948
2949 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
2950 " Active Banner support
2951" call Decho("active banner handling")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002952 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00002953 let dirname= "./"
2954 let curline= getline('.')
2955
2956 if curline =~ '"\s*Sorted by\s'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002957 keepj norm s
Bram Moolenaar446cb832008-06-24 21:56:24 +00002958 let s:netrw_skipbrowse= 1
2959 echo 'Pressing "s" also works'
2960
2961 elseif curline =~ '"\s*Sort sequence:'
2962 let s:netrw_skipbrowse= 1
2963 echo 'Press "S" to edit sorting sequence'
2964
2965 elseif curline =~ '"\s*Quick Help:'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002966 keepj norm ?
Bram Moolenaar446cb832008-06-24 21:56:24 +00002967 let s:netrw_skipbrowse= 1
2968 echo 'Pressing "?" also works'
2969
2970 elseif curline =~ '"\s*\%(Hiding\|Showing\):'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002971 keepj norm a
Bram Moolenaar446cb832008-06-24 21:56:24 +00002972 let s:netrw_skipbrowse= 1
2973 echo 'Pressing "a" also works'
2974
2975 elseif line("$") > w:netrw_bannercnt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002976 exe 'sil keepj '.w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00002977 endif
2978
2979 elseif w:netrw_liststyle == s:THINLIST
2980" call Decho("thin column handling")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002981 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00002982 let dirname= getline('.')
2983
2984 elseif w:netrw_liststyle == s:LONGLIST
2985" call Decho("long column handling")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002986 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00002987 let dirname= substitute(getline('.'),'^\(\%(\S\+ \)*\S\+\).\{-}$','\1','e')
2988
2989 elseif w:netrw_liststyle == s:TREELIST
2990" call Decho("treelist handling")
2991 let dirname= substitute(getline('.'),'^\(| \)*','','e')
2992
2993 else
2994" call Decho("obtain word from wide listing")
2995 let dirname= getline('.')
2996
2997 if !exists("b:netrw_cpf")
2998 let b:netrw_cpf= 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02002999 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 +01003000 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003001" call Decho("computed cpf=".b:netrw_cpf)
3002 endif
3003
3004" call Decho("buf#".bufnr("%")."<".bufname("%").">")
3005 let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf
3006" call Decho("filestart= ([virtcol=".virtcol(".")."]/[b:netrw_cpf=".b:netrw_cpf."])*b:netrw_cpf=".filestart." bannercnt=".w:netrw_bannercnt)
3007" call Decho("1: dirname<".dirname.">")
3008 if filestart == 0
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003009 keepj norm! 0ma
Bram Moolenaar446cb832008-06-24 21:56:24 +00003010 else
3011 call cursor(line("."),filestart+1)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003012 keepj norm! ma
Bram Moolenaar446cb832008-06-24 21:56:24 +00003013 endif
3014 let rega= @a
Bram Moolenaarc236c162008-07-13 17:41:49 +00003015 let eofname= filestart + b:netrw_cpf + 1
3016 if eofname <= col("$")
3017 call cursor(line("."),filestart+b:netrw_cpf+1)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003018 keepj norm! "ay`a
Bram Moolenaarc236c162008-07-13 17:41:49 +00003019 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003020 keepj norm! "ay$
Bram Moolenaarc236c162008-07-13 17:41:49 +00003021 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003022 let dirname = @a
3023 let @a = rega
3024" call Decho("2: dirname<".dirname.">")
3025 let dirname= substitute(dirname,'\s\+$','','e')
3026" call Decho("3: dirname<".dirname.">")
3027 endif
3028
3029 " symlinks are indicated by a trailing "@". Remove it before further processing.
3030 let dirname= substitute(dirname,"@$","","")
3031
3032 " executables are indicated by a trailing "*". Remove it before further processing.
3033 let dirname= substitute(dirname,"\*$","","")
3034
3035" call Dret("s:NetrwGetWord <".dirname.">")
3036 return dirname
3037endfun
3038
3039" ---------------------------------------------------------------------
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003040" s:NetrwListSettings: make standard settings for a netrw listing {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00003041fun! s:NetrwListSettings(islocal)
3042" call Dfunc("s:NetrwListSettings(islocal=".a:islocal.")")
3043 let fname= bufname("%")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003044" call Decho("setlocal bt=nofile nobl ma nonu nowrap noro")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003045 setlocal bt=nofile nobl ma nonu nowrap noro
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003046" call Decho("exe sil! keepalt file ".fnameescape(fname))
3047 exe "sil! keepalt file ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003048 if g:netrw_use_noswf
3049 setlocal noswf
3050 endif
3051" call Dredir("ls!")
3052" call Decho("exe setlocal ts=".g:netrw_maxfilenamelen)
3053 exe "setlocal ts=".g:netrw_maxfilenamelen
3054 setlocal isk+=.,~,-
3055 if g:netrw_fastbrowse > a:islocal
3056 setlocal bh=hide
3057 else
3058 setlocal bh=delete
3059 endif
3060" call Dret("s:NetrwListSettings")
3061endfun
3062
3063" ---------------------------------------------------------------------
3064" s:NetrwListStyle: {{{2
3065" islocal=0: remote browsing
3066" =1: local browsing
3067fun! s:NetrwListStyle(islocal)
3068" call Dfunc("NetrwListStyle(islocal=".a:islocal.") w:netrw_liststyle=".w:netrw_liststyle)
3069 let fname = s:NetrwGetWord()
3070 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
3071 let w:netrw_liststyle = (w:netrw_liststyle + 1) % s:MAXLIST
3072" call Decho("fname<".fname.">")
3073" call Decho("chgd w:netrw_liststyle to ".w:netrw_liststyle)
3074" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist").">")
3075
3076 if w:netrw_liststyle == s:THINLIST
3077 " use one column listing
3078" call Decho("use one column list")
3079 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
3080
3081 elseif w:netrw_liststyle == s:LONGLIST
3082 " use long list
3083" call Decho("use long list")
3084 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
3085
3086 elseif w:netrw_liststyle == s:WIDELIST
3087 " give wide list
3088" call Decho("use wide list")
3089 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
3090
3091 elseif w:netrw_liststyle == s:TREELIST
3092" call Decho("use tree list")
3093 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
3094
3095 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02003096 keepj call netrw#ErrorMsg(s:WARNING,"bad value for g:netrw_liststyle (=".w:netrw_liststyle.")",46)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003097 let g:netrw_liststyle = s:THINLIST
3098 let w:netrw_liststyle = g:netrw_liststyle
3099 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
3100 endif
3101 setlocal ma noro
3102" call Decho("setlocal ma noro")
3103
3104 " clear buffer - this will cause NetrwBrowse/LocalBrowseCheck to do a refresh
3105" call Decho("clear buffer<".expand("%")."> with :%d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003106 sil! keepj %d
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003107 " following prevents tree listing buffer from being marked "modified"
3108 setlocal nomod
Bram Moolenaar446cb832008-06-24 21:56:24 +00003109
3110 " refresh the listing
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003111" call Decho("refresh the listing")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003112 let svpos= netrw#NetrwSavePosn()
Bram Moolenaaradc21822011-04-01 18:03:16 +02003113 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3114 keepj call netrw#NetrwRestorePosn(svpos)
3115 keepj call s:NetrwCursor()
Bram Moolenaar446cb832008-06-24 21:56:24 +00003116
3117 " keep cursor on the filename
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003118 sil! keepj $
Bram Moolenaar446cb832008-06-24 21:56:24 +00003119 let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
3120" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'))
3121 if result <= 0 && exists("w:netrw_bannercnt")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003122 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00003123 endif
3124
3125" call Dret("NetrwListStyle".(exists("w:netrw_liststyle")? ' : w:netrw_liststyle='.w:netrw_liststyle : ""))
3126endfun
3127
3128" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01003129" s:NetrwBannerCtrl: toggles the display of the banner {{{2
3130fun! s:NetrwBannerCtrl(islocal)
3131" call Dfunc("s:NetrwBannerCtrl(islocal=".a:islocal.") g:netrw_banner=".g:netrw_banner)
3132
3133 " toggle the banner (enable/suppress)
3134 let g:netrw_banner= !g:netrw_banner
3135
3136 " refresh the listing
3137 let svpos= netrw#NetrwSavePosn()
3138 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3139
3140 " keep cursor on the filename
3141 let fname= s:NetrwGetWord()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003142 sil keepj $
Bram Moolenaar5c736222010-01-06 20:54:52 +01003143 let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
3144" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'))
3145 if result <= 0 && exists("w:netrw_bannercnt")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003146 exe "keepj ".w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01003147 endif
3148" call Dret("s:NetrwBannerCtrl : g:netrw_banner=".g:netrw_banner)
3149endfun
3150
3151" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003152" s:NetrwBookmarkMenu: Uses menu priorities {{{2
3153" .2.[cnt] for bookmarks, and
3154" .3.[cnt] for history
3155" (see s:NetrwMenu())
3156fun! s:NetrwBookmarkMenu()
Bram Moolenaar9964e462007-05-05 17:54:07 +00003157 if !exists("s:netrw_menucnt")
3158 return
3159 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003160" call Dfunc("NetrwBookmarkMenu() histcnt=".g:netrw_dirhist_cnt." menucnt=".s:netrw_menucnt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003161
3162 " the following test assures that gvim is running, has menus available, and has menus enabled.
Bram Moolenaaradc21822011-04-01 18:03:16 +02003163 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaar9964e462007-05-05 17:54:07 +00003164 if exists("g:NetrwTopLvlMenu")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003165" call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003166 exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Bookmarks'
3167 exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete'
Bram Moolenaar5c736222010-01-06 20:54:52 +01003168 endif
3169 if !exists("s:netrw_initbookhist")
3170 call s:NetrwBookHistRead()
Bram Moolenaar9964e462007-05-05 17:54:07 +00003171 endif
3172
3173 " show bookmarked places
Bram Moolenaar5c736222010-01-06 20:54:52 +01003174 if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != []
3175 let cnt= 1
3176 for bmd in g:netrw_bookmarklist
Bram Moolenaaradc21822011-04-01 18:03:16 +02003177" call Decho('sil! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmark.'.bmd.' :e '.bmd)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003178 let bmd= escape(bmd,g:netrw_menu_escape)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003179
3180 " show bookmarks for goto menu
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003181 exe 'sil! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks.'.bmd.' :e '.bmd."\<cr>"
Bram Moolenaar5c736222010-01-06 20:54:52 +01003182
3183 " show bookmarks for deletion menu
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003184 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 +01003185 let cnt= cnt + 1
3186 endfor
3187
3188 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003189
3190 " show directory browsing history
Bram Moolenaaradc21822011-04-01 18:03:16 +02003191 if g:netrw_dirhistmax > 0
3192 let cnt = g:netrw_dirhist_cnt
3193 let first = 1
3194 let histcnt = 0
3195 while ( first || cnt != g:netrw_dirhist_cnt )
3196 let histcnt = histcnt + 1
3197 let priority = g:netrw_dirhist_cnt + histcnt
3198 if exists("g:netrw_dirhist_{cnt}")
3199 let histdir= escape(g:netrw_dirhist_{cnt},g:netrw_menu_escape)
3200" call Decho('sil! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir)
3201 exe 'sil! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir."\<cr>"
3202 endif
3203 let first = 0
3204 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
3205 if cnt < 0
3206 let cnt= cnt + g:netrw_dirhistmax
3207 endif
3208 endwhile
3209 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003210
Bram Moolenaar9964e462007-05-05 17:54:07 +00003211 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003212" call Dret("NetrwBookmarkMenu")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003213endfun
3214
3215" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003216" s:NetrwBrowseChgDir: constructs a new directory based on the current {{{2
3217" directory and a new directory name. Also, if the
3218" "new directory name" is actually a file,
3219" NetrwBrowseChgDir() edits the file.
3220fun! s:NetrwBrowseChgDir(islocal,newdir,...)
3221" 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 +00003222
Bram Moolenaar446cb832008-06-24 21:56:24 +00003223 if !exists("b:netrw_curdir")
3224 " Don't try to change-directory: this can happen, for example, when netrw#ErrorMsg has been called
3225 " and the current window is the NetrwMessage window.
3226" call Decho("(NetrwBrowseChgDir) b:netrw_curdir doesn't exist!")
3227" call Decho("getcwd<".getcwd().">")
3228" call Dredir("ls!")
3229" call Dret("s:NetrwBrowseChgDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003230 return
Bram Moolenaar9964e462007-05-05 17:54:07 +00003231 endif
3232
Bram Moolenaaradc21822011-04-01 18:03:16 +02003233 keepj call s:NetrwOptionSave("s:")
3234 keepj call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00003235 let nbcd_curpos = netrw#NetrwSavePosn()
3236 let s:nbcd_curpos_{bufnr('%')} = nbcd_curpos
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003237 if (has("win32") || has("win95") || has("win64") || has("win16"))
3238 let dirname = substitute(b:netrw_curdir,'\\','/','ge')
3239 else
3240 let dirname= b:netrw_curdir
3241 endif
3242 let newdir = a:newdir
3243 let dolockout = 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00003244
Bram Moolenaar446cb832008-06-24 21:56:24 +00003245 " set up o/s-dependent directory recognition pattern
3246 if has("amiga")
3247 let dirpat= '[\/:]$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00003248 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003249 let dirpat= '[\/]$'
3250 endif
3251" call Decho("dirname<".dirname."> dirpat<".dirpat.">")
3252
3253 if dirname !~ dirpat
3254 " apparently vim is "recognizing" that it is in a directory and
Bram Moolenaaradc21822011-04-01 18:03:16 +02003255 " is removing the trailing "/". Bad idea, so let's put it back.
Bram Moolenaar446cb832008-06-24 21:56:24 +00003256 let dirname= dirname.'/'
3257" call Decho("adjusting dirname<".dirname.">")
3258 endif
3259
3260 if newdir !~ dirpat
3261 " ------------
3262 " edit a file:
3263 " ------------
3264" call Decho('case "handling a file": newdir<'.newdir.'> !~ dirpat<'.dirpat.">")
3265 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") && newdir !~ '^\(/\|\a:\)'
3266 let dirname= s:NetrwTreeDir()
3267 if dirname =~ '/$'
3268 let dirname= dirname.newdir
3269 else
3270 let dirname= s:NetrwTreeDir()."/".newdir
3271 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003272" call Decho("dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003273" call Decho("tree listing")
3274 elseif newdir =~ '^\(/\|\a:\)'
3275 let dirname= newdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00003276 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003277 let dirname= s:ComposePath(dirname,newdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003278 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003279" call Decho("handling a file: dirname<".dirname."> (a:0=".a:0.")")
3280 " this lets NetrwBrowseX avoid the edit
3281 if a:0 < 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00003282" 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 +02003283 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003284 if !exists("s:didsplit")
3285 if g:netrw_browse_split == 1
3286 new
Bram Moolenaar5c736222010-01-06 20:54:52 +01003287 if !&ea
3288 wincmd _
3289 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003290 elseif g:netrw_browse_split == 2
3291 rightb vert new
Bram Moolenaar5c736222010-01-06 20:54:52 +01003292 if !&ea
3293 wincmd |
3294 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003295 elseif g:netrw_browse_split == 3
3296 tabnew
3297 elseif g:netrw_browse_split == 4
3298 if s:NetrwPrevWinOpen(2) == 3
3299" call Dret("s:NetrwBrowseChgDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003300 return
3301 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003302 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003303 " handling a file, didn't split, so remove menu
3304" call Decho("handling a file+didn't split, so remove menu")
3305 call s:NetrwMenu(0)
3306 " optional change to window
3307 if g:netrw_chgwin >= 1
3308 exe "keepjumps ".g:netrw_chgwin."wincmd w"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003309 endif
3310 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003311 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003312
Bram Moolenaar446cb832008-06-24 21:56:24 +00003313 " the point where netrw actually edits the (local) file
3314 " if its local only: LocalBrowseCheck() doesn't edit a file, but NetrwBrowse() will
3315 if a:islocal
3316" call Decho("edit local file: exe e! ".fnameescape(dirname))
3317 exe "e! ".fnameescape(dirname)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003318 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003319" call Decho("remote file: NetrwBrowse will edit it")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003320 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003321 let dolockout= 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01003322
3323 " handle g:Netrw_funcref -- call external-to-netrw functions
3324 " This code will handle g:Netrw_funcref as an individual function reference
3325 " or as a list of function references. It will ignore anything that's not
3326 " a function reference. See :help Funcref for information about function references.
3327 if exists("g:Netrw_funcref")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003328" call Decho("handle optional Funcrefs")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003329 if type(g:Netrw_funcref) == 2
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003330" call Decho("handling a g:Netrw_funcref")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003331 keepj call g:Netrw_funcref()
Bram Moolenaar5c736222010-01-06 20:54:52 +01003332 elseif type(g:Netrw_funcref) == 3
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003333" call Decho("handling a list of g:Netrw_funcrefs")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003334 for Fncref in g:Netrw_funcref
3335 if type(FncRef) == 2
Bram Moolenaaradc21822011-04-01 18:03:16 +02003336 keepj call FncRef()
Bram Moolenaar5c736222010-01-06 20:54:52 +01003337 endif
3338 endfor
3339 endif
3340 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003341 endif
3342
3343 elseif newdir =~ '^/'
3344 " ---------------------------------
3345 " just go to the new directory spec
3346 " ---------------------------------
3347" call Decho('case "just go to new directory spec": newdir<'.newdir.'>')
3348 let dirname= newdir
Bram Moolenaaradc21822011-04-01 18:03:16 +02003349 keepj call s:SetRexDir(a:islocal,dirname)
3350 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003351
3352 elseif newdir == './'
3353 " --------------------------
3354 " refresh the directory list
3355 " --------------------------
3356" call Decho('case "refresh directory listing": newdir == "./"')
Bram Moolenaaradc21822011-04-01 18:03:16 +02003357 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003358
3359 elseif newdir == '../'
3360 " -------------------
3361 " go up one directory
3362 " -------------------
3363" call Decho('case "go up one directory": newdir == "../"')
3364
3365 if w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
3366 " force a refresh
3367" call Decho("clear buffer<".expand("%")."> with :%d")
3368 setlocal noro ma
3369" call Decho("setlocal noro ma")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003370 keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00003371 endif
3372
3373 if has("amiga")
3374 " amiga
3375" call Decho('case "go up one directory": newdir == "../" and amiga')
3376 if a:islocal
3377 let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+$\)','\1','')
3378 let dirname= substitute(dirname,'/$','','')
3379 else
3380 let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+/$\)','\1','')
3381 endif
3382" call Decho("amiga: dirname<".dirname."> (go up one dir)")
3383
3384 else
3385 " unix or cygwin
3386" call Decho('case "go up one directory": newdir == "../" and unix or cygwin')
3387 if a:islocal
3388 let dirname= substitute(dirname,'^\(.*\)/\([^/]\+\)/$','\1','')
3389 if dirname == ""
3390 let dirname= '/'
3391 endif
3392 else
3393 let dirname= substitute(dirname,'^\(\a\+://.\{-}/\{1,2}\)\(.\{-}\)\([^/]\+\)/$','\1\2','')
3394 endif
3395" call Decho("unix: dirname<".dirname."> (go up one dir)")
3396 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003397 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003398
3399 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
3400" call Decho('case liststyle is TREELIST and w:netrw_treedict exists')
3401 " force a refresh (for TREELIST, wait for NetrwTreeDir() to force the refresh)
3402 setlocal noro ma
3403" call Decho("setlocal noro ma")
3404 if !(exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir"))
3405" call Decho("clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003406 keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00003407 endif
3408 let treedir = s:NetrwTreeDir()
3409 let s:treecurpos = nbcd_curpos
3410 let haskey= 0
3411" call Decho("w:netrw_treedict<".string(w:netrw_treedict).">")
3412
3413 " search treedict for tree dir as-is
3414 if has_key(w:netrw_treedict,treedir)
3415" call Decho('....searched for treedir<'.treedir.'> : found it!')
3416 let haskey= 1
3417 else
3418" call Decho('....searched for treedir<'.treedir.'> : not found')
3419 endif
3420
3421 " search treedict for treedir with a / appended
3422 if !haskey && treedir !~ '/$'
3423 if has_key(w:netrw_treedict,treedir."/")
3424 let treedir= treedir."/"
3425" call Decho('....searched.for treedir<'.treedir.'> found it!')
3426 let haskey = 1
3427 else
3428" call Decho('....searched for treedir<'.treedir.'/> : not found')
3429 endif
3430 endif
3431
3432 " search treedict for treedir with any trailing / elided
3433 if !haskey && treedir =~ '/$'
3434 let treedir= substitute(treedir,'/$','','')
3435 if has_key(w:netrw_treedict,treedir)
3436" call Decho('....searched.for treedir<'.treedir.'> found it!')
3437 let haskey = 1
3438 else
3439" call Decho('....searched for treedir<'.treedir.'> : not found')
3440 endif
3441 endif
3442
3443 if haskey
3444 " close tree listing for selected subdirectory
3445" call Decho("closing selected subdirectory<".dirname.">")
3446 call remove(w:netrw_treedict,treedir)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003447" call Decho("removed entry<".treedir."> from treedict")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003448" call Decho("yielding treedict<".string(w:netrw_treedict).">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003449 let dirname= w:netrw_treetop
Bram Moolenaar446cb832008-06-24 21:56:24 +00003450 else
3451 " go down one directory
3452 let dirname= substitute(treedir,'/*$','/','')
3453" call Decho("go down one dir: treedir<".treedir.">")
3454 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003455 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003456 let s:treeforceredraw = 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00003457
3458 else
3459 " go down one directory
3460 let dirname= s:ComposePath(dirname,newdir)
3461" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003462 keepj call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003463 endif
3464
Bram Moolenaaradc21822011-04-01 18:03:16 +02003465 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003466 if dolockout
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02003467" call Decho("filewritable(dirname<".dirname.">)=".filewritable(dirname))
3468 if filewritable(dirname)
3469" call Decho("doing modification lockout settings: ma nomod noro")
3470 setlocal ma nomod noro
3471 else
3472" call Decho("doing modification lockout settings: ma nomod ro")
3473 setlocal ma nomod ro
3474 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003475" call Decho("setlocal ma nomod noro")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003476 endif
3477
Bram Moolenaar446cb832008-06-24 21:56:24 +00003478" call Dret("s:NetrwBrowseChgDir <".dirname."> : curpos<".string(getpos(".")).">")
3479 return dirname
Bram Moolenaar9964e462007-05-05 17:54:07 +00003480endfun
3481
3482" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01003483" s:NetrwBrowseX: (implements "x") executes a special "viewer" script or program for the {{{2
3484" given filename; typically this means given their extension.
3485" 0=local, 1=remote
Bram Moolenaar446cb832008-06-24 21:56:24 +00003486fun! netrw#NetrwBrowseX(fname,remote)
3487" call Dfunc("NetrwBrowseX(fname<".a:fname."> remote=".a:remote.")")
3488
Bram Moolenaar5c736222010-01-06 20:54:52 +01003489 " special core dump handler
3490 if a:fname =~ '/core\(\.\d\+\)\=$'
3491 if exists("g:Netrw_corehandler")
3492 if type(g:Netrw_corehandler) == 2
3493 " g:Netrw_corehandler is a function reference (see :help Funcref)
3494" call Decho("g:Netrw_corehandler is a funcref")
3495 call g:Netrw_corehandler(a:fname)
Bram Moolenaar15146672011-10-20 22:22:38 +02003496 elseif type(g:Netrw_corehandler) == 3)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003497 " g:Netrw_corehandler is a List of function references (see :help Funcref)
3498" call Decho("g:Netrw_corehandler is a List")
3499 for Fncref in g:Netrw_corehandler
3500 if type(FncRef) == 2
3501 call FncRef(a:fname)
3502 endif
3503 endfor
3504 endif
3505" call Dret("NetrwBrowseX : coredump handler invoked")
3506 return
3507 endif
3508 endif
3509
Bram Moolenaar446cb832008-06-24 21:56:24 +00003510 " set up the filename
3511 " (lower case the extension, make a local copy of a remote file)
3512 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
3513 if has("win32") || has("win95") || has("win64") || has("win16")
3514 let exten= substitute(exten,'^.*$','\L&\E','')
Bram Moolenaar9964e462007-05-05 17:54:07 +00003515 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003516" call Decho("exten<".exten.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003517
3518 " seems kde systems often have gnome-open due to dependencies, even though
3519 " gnome-open's subsidiary display tools are largely absent. Kde systems
3520 " usually have "kdeinit" running, though... (tnx Mikolaj Machowski)
3521 if !exists("s:haskdeinit")
3522 if has("unix")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003523 let s:haskdeinit= system("ps -e") =~ 'kdeinit'
Bram Moolenaar446cb832008-06-24 21:56:24 +00003524 if v:shell_error
3525 let s:haskdeinit = 0
3526 endif
3527 else
3528 let s:haskdeinit= 0
3529 endif
3530" call Decho("setting s:haskdeinit=".s:haskdeinit)
3531 endif
3532
3533 if a:remote == 1
3534 " create a local copy
Bram Moolenaar5c736222010-01-06 20:54:52 +01003535" call Decho("a:remote=".a:remote.": create a local copy of <".a:fname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003536 setlocal bh=delete
Bram Moolenaar5c736222010-01-06 20:54:52 +01003537 call netrw#NetRead(3,a:fname)
3538 " attempt to rename tempfile
3539 let basename= substitute(a:fname,'^\(.*\)/\(.*\)\.\([^.]*\)$','\2','')
3540 let newname= substitute(s:netrw_tmpfile,'^\(.*\)/\(.*\)\.\([^.]*\)$','\1/'.basename.'.\3','')
3541" call Decho("basename<".basename.">")
3542" call Decho("newname <".newname.">")
3543 if rename(s:netrw_tmpfile,newname) == 0
3544 " renaming succeeded
3545 let fname= newname
3546 else
3547 " renaming failed
3548 let fname= s:netrw_tmpfile
3549 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00003550 else
3551 let fname= a:fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003552 " special ~ handler for local
3553 if fname =~ '^\~' && expand("$HOME") != ""
3554" call Decho('invoking special ~ handler')
3555 let fname= substitute(fname,'^\~',expand("$HOME"),'')
3556 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003557 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003558" call Decho("fname<".fname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003559" call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten))
3560
3561 " set up redirection
3562 if &srr =~ "%s"
3563 if (has("win32") || has("win95") || has("win64") || has("win16"))
3564 let redir= substitute(&srr,"%s","nul","")
3565 else
3566 let redir= substitute(&srr,"%s","/dev/null","")
3567 endif
3568 elseif (has("win32") || has("win95") || has("win64") || has("win16"))
3569 let redir= &srr . "nul"
3570 else
3571 let redir= &srr . "/dev/null"
3572 endif
3573" call Decho("redir{".redir."} srr{".&srr."}")
3574
3575 " extract any viewing options. Assumes that they're set apart by quotes.
3576 if exists("g:netrw_browsex_viewer")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003577" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003578 if g:netrw_browsex_viewer =~ '\s'
3579 let viewer = substitute(g:netrw_browsex_viewer,'\s.*$','','')
3580 let viewopt = substitute(g:netrw_browsex_viewer,'^\S\+\s*','','')." "
3581 let oviewer = ''
3582 let cnt = 1
3583 while !executable(viewer) && viewer != oviewer
3584 let viewer = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\1','')
3585 let viewopt = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\3','')." "
3586 let cnt = cnt + 1
3587 let oviewer = viewer
3588" call Decho("!exe: viewer<".viewer."> viewopt<".viewopt.">")
3589 endwhile
3590 else
3591 let viewer = g:netrw_browsex_viewer
3592 let viewopt = ""
3593 endif
3594" call Decho("viewer<".viewer."> viewopt<".viewopt.">")
3595 endif
3596
3597 " execute the file handler
3598 if exists("g:netrw_browsex_viewer") && g:netrw_browsex_viewer == '-'
3599" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
3600 let ret= netrwFileHandlers#Invoke(exten,fname)
3601
3602 elseif exists("g:netrw_browsex_viewer") && executable(viewer)
3603" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003604" call Decho("exe sil !".viewer." ".viewopt.shellescape(fname,1).redir)
3605 exe "sil !".viewer." ".viewopt.shellescape(fname,1).redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003606 let ret= v:shell_error
3607
3608 elseif has("win32") || has("win64")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003609 if executable("start")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003610" call Decho('exe sil !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1))
3611 exe 'sil !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003612 elseif executable("rundll32")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003613" call Decho('exe sil !rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1))
3614 exe 'sil !rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003615 else
3616 call netrw#ErrorMsg(s:WARNING,"rundll32 not on path",74)
3617 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003618 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3619 let ret= v:shell_error
3620
3621 elseif has("unix") && executable("gnome-open") && !s:haskdeinit
Bram Moolenaaradc21822011-04-01 18:03:16 +02003622" call Decho("exe sil !gnome-open ".shellescape(fname,1)." ".redir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003623 exe "sil !gnome-open ".shellescape(fname,1).redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003624 let ret= v:shell_error
3625
3626 elseif has("unix") && executable("kfmclient") && s:haskdeinit
Bram Moolenaaradc21822011-04-01 18:03:16 +02003627" call Decho("exe sil !kfmclient exec ".shellescape(fname,1)." ".redir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003628 exe "sil !kfmclient exec ".shellescape(fname,1)." ".redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003629 let ret= v:shell_error
3630
3631 elseif has("macunix") && executable("open")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003632" call Decho("exe sil !open ".shellescape(fname,1)." ".redir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003633 exe "sil !open ".shellescape(fname,1)." ".redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003634 let ret= v:shell_error
3635
3636 else
3637 " netrwFileHandlers#Invoke() always returns 0
3638 let ret= netrwFileHandlers#Invoke(exten,fname)
3639 endif
3640
3641 " if unsuccessful, attempt netrwFileHandlers#Invoke()
3642 if ret
3643 let ret= netrwFileHandlers#Invoke(exten,fname)
3644 endif
3645
Bram Moolenaarc236c162008-07-13 17:41:49 +00003646 " restoring redraw! after external file handlers
3647 redraw!
Bram Moolenaar446cb832008-06-24 21:56:24 +00003648
3649 " cleanup: remove temporary file,
3650 " delete current buffer if success with handler,
3651 " return to prior buffer (directory listing)
3652 " Feb 12, 2008: had to de-activiate removal of
3653 " temporary file because it wasn't getting seen.
3654" if a:remote == 1 && fname != a:fname
3655" call Decho("deleting temporary file<".fname.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003656" call s:NetrwDelete(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003657" endif
3658
3659 if a:remote == 1
3660 setlocal bh=delete bt=nofile
3661 if g:netrw_use_noswf
3662 setlocal noswf
3663 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02003664 exe "sil! keepj norm! \<c-o>"
Bram Moolenaar446cb832008-06-24 21:56:24 +00003665" redraw!
3666 endif
3667
3668" call Dret("NetrwBrowseX")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003669endfun
3670
3671" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01003672" s:NetrwChgPerm: (implements "gp") change file permission {{{2
3673fun! s:NetrwChgPerm(islocal,curdir)
3674" call Dfunc("s:NetrwChgPerm(islocal=".a:islocal." curdir<".a:curdir.">)")
3675 call inputsave()
3676 let newperm= input("Enter new permission: ")
3677 call inputrestore()
3678 let chgperm= substitute(g:netrw_chgperm,'\<FILENAME\>',shellescape(expand("<cfile>")),'')
3679 let chgperm= substitute(chgperm,'\<PERM\>',shellescape(newperm),'')
3680" call Decho("chgperm<".chgperm.">")
3681 call system(chgperm)
3682 if v:shell_error != 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02003683 keepj call netrw#ErrorMsg(1,"changing permission on file<".expand("<cfile>")."> seems to have failed",75)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003684 endif
3685 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02003686 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaar5c736222010-01-06 20:54:52 +01003687 endif
3688" call Dret("s:NetrwChgPerm")
3689endfun
3690
3691" ---------------------------------------------------------------------
3692" s:NetrwClearExplore: clear explore variables (if any) {{{2
3693fun! s:NetrwClearExplore()
3694" call Dfunc("s:NetrwClearExplore()")
3695 2match none
3696 if exists("s:explore_match") |unlet s:explore_match |endif
3697 if exists("s:explore_indx") |unlet s:explore_indx |endif
3698 if exists("s:netrw_explore_prvdir") |unlet s:netrw_explore_prvdir |endif
3699 if exists("s:dirstarstar") |unlet s:dirstarstar |endif
3700 if exists("s:explore_prvdir") |unlet s:explore_prvdir |endif
3701 if exists("w:netrw_explore_indx") |unlet w:netrw_explore_indx |endif
3702 if exists("w:netrw_explore_listlen")|unlet w:netrw_explore_listlen|endif
3703 if exists("w:netrw_explore_list") |unlet w:netrw_explore_list |endif
3704 if exists("w:netrw_explore_bufnr") |unlet w:netrw_explore_bufnr |endif
3705" redraw!
3706 echo " "
3707 echo " "
3708" call Dret("s:NetrwClearExplore")
3709endfun
3710
3711" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00003712" netrw#Explore: launch the local browser in the directory of the current file {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +01003713" indx: == -1: Nexplore
3714" == -2: Pexplore
3715" == +: this is overloaded:
3716" * If Nexplore/Pexplore is in use, then this refers to the
3717" indx'th item in the w:netrw_explore_list[] of items which
3718" matched the */pattern **/pattern *//pattern **//pattern
3719" * If Hexplore or Vexplore, then this will override
3720" g:netrw_winsize to specify the qty of rows or columns the
3721" newly split window should have.
3722" dosplit==0: the window will be split iff the current file has been modified
3723" dosplit==1: the window will be split before running the local browser
3724" style == 0: Explore style == 1: Explore!
3725" == 2: Hexplore style == 3: Hexplore!
3726" == 4: Vexplore style == 5: Vexplore!
3727" == 6: Texplore
Bram Moolenaar9964e462007-05-05 17:54:07 +00003728fun! netrw#Explore(indx,dosplit,style,...)
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003729" 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 +00003730 if !exists("b:netrw_curdir")
3731 let b:netrw_curdir= getcwd()
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003732" call Decho("set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003733 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003734 let curdir = simplify(b:netrw_curdir)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003735 let curfiledir = substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
3736" call Decho("curdir<".curdir."> curfiledir<".curfiledir.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003737
3738 " save registers
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003739 sil! let keepregstar = @*
3740 sil! let keepregplus = @+
3741 sil! let keepregslash= @/
Bram Moolenaar9964e462007-05-05 17:54:07 +00003742
3743 " if dosplit or file has been modified
3744 if a:dosplit || &modified || a:style == 6
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003745" 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 +00003746 call s:SaveWinVars()
Bram Moolenaar251e1912011-06-19 05:09:16 +02003747 let winsz= g:netrw_winsize
Bram Moolenaar5c736222010-01-06 20:54:52 +01003748 if a:indx > 0
Bram Moolenaar251e1912011-06-19 05:09:16 +02003749 let winsz= a:indx
Bram Moolenaar5c736222010-01-06 20:54:52 +01003750 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003751
3752 if a:style == 0 " Explore, Sexplore
3753" call Decho("style=0: Explore or Sexplore")
Bram Moolenaar15146672011-10-20 22:22:38 +02003754 let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz
Bram Moolenaar251e1912011-06-19 05:09:16 +02003755 exe winsz."wincmd s"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003756
3757 elseif a:style == 1 "Explore!, Sexplore!
3758" call Decho("style=1: Explore! or Sexplore!")
Bram Moolenaar15146672011-10-20 22:22:38 +02003759 let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz
Bram Moolenaar251e1912011-06-19 05:09:16 +02003760 exe winsz."wincmd v"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003761
3762 elseif a:style == 2 " Hexplore
3763" call Decho("style=2: Hexplore")
Bram Moolenaar15146672011-10-20 22:22:38 +02003764 let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz
Bram Moolenaar251e1912011-06-19 05:09:16 +02003765 exe "bel ".winsz."wincmd s"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003766
3767 elseif a:style == 3 " Hexplore!
3768" call Decho("style=3: Hexplore!")
Bram Moolenaar15146672011-10-20 22:22:38 +02003769 let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz
Bram Moolenaar251e1912011-06-19 05:09:16 +02003770 exe "abo ".winsz."wincmd s"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003771
3772 elseif a:style == 4 " Vexplore
3773" call Decho("style=4: Vexplore")
Bram Moolenaar15146672011-10-20 22:22:38 +02003774 let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz
Bram Moolenaar251e1912011-06-19 05:09:16 +02003775 exe "lefta ".winsz."wincmd v"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003776
3777 elseif a:style == 5 " Vexplore!
3778" call Decho("style=5: Vexplore!")
Bram Moolenaar15146672011-10-20 22:22:38 +02003779 let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz
Bram Moolenaar251e1912011-06-19 05:09:16 +02003780 exe "rightb ".winsz."wincmd v"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003781
3782 elseif a:style == 6 " Texplore
3783 call s:SaveBufVars()
3784" call Decho("style = 6: Texplore")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003785 exe "tabnew ".fnameescape(curdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003786 call s:RestoreBufVars()
3787 endif
3788 call s:RestoreWinVars()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003789" else " Decho
3790" 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 +00003791 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003792 keepj norm! 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00003793
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003794 if a:0 > 0
Bram Moolenaar15146672011-10-20 22:22:38 +02003795" call Decho("case [a:0=".a:0."] > 0")
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003796 if a:1 =~ '^\~' && (has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin))
Bram Moolenaar15146672011-10-20 22:22:38 +02003797" call Decho("..case a:1<".a:1.">: starts with ~ and unix or cygwin")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003798 let dirname= simplify(substitute(a:1,'\~',expand("$HOME"),''))
Bram Moolenaar15146672011-10-20 22:22:38 +02003799" call Decho("..using dirname<".dirname."> (case: ~ && unix||cygwin)")
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003800 elseif a:1 == '.'
Bram Moolenaar15146672011-10-20 22:22:38 +02003801" call Decho("..case a:1<".a:1.">: matches .")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003802 let dirname= simplify(exists("b:netrw_curdir")? b:netrw_curdir : getcwd())
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003803 if dirname !~ '/$'
3804 let dirname= dirname."/"
3805 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02003806" call Decho("..using dirname<".dirname."> (case: ".(exists("b:netrw_curdir")? "b:netrw_curdir" : "getcwd()").")")
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003807 elseif a:1 =~ '\$'
Bram Moolenaar15146672011-10-20 22:22:38 +02003808" call Decho("..case a:1<".a:1.">: matches ending $")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003809 let dirname= simplify(expand(a:1))
Bram Moolenaar15146672011-10-20 22:22:38 +02003810" call Decho("..using user-specified dirname<".dirname."> with $env-var")
3811 elseif a:1 !~ '^\*\{1,2}/'
3812" call Decho("..case a:1<".a:1.">: other, not pattern or filepattern")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003813 let dirname= simplify(a:1)
Bram Moolenaar15146672011-10-20 22:22:38 +02003814" call Decho("..using user-specified dirname<".dirname.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003815 else
Bram Moolenaar15146672011-10-20 22:22:38 +02003816" call Decho("..case a:1: pattern or filepattern")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003817 let dirname= a:1
Bram Moolenaar9964e462007-05-05 17:54:07 +00003818 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003819 else
3820 " clear explore
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003821" call Decho("case a:0=".a:0.": clearing Explore list")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003822 call s:NetrwClearExplore()
Bram Moolenaar446cb832008-06-24 21:56:24 +00003823" call Dret("netrw#Explore : cleared list")
3824 return
Bram Moolenaar9964e462007-05-05 17:54:07 +00003825 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003826
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003827" call Decho("dirname<".dirname.">")
3828 if dirname =~ '\.\./\=$'
3829 let dirname= simplify(fnamemodify(dirname,':p:h'))
3830 elseif dirname =~ '\.\.' || dirname == '.'
3831 let dirname= simplify(fnamemodify(dirname,':p'))
3832 endif
3833" call Decho("dirname<".dirname."> (after simplify)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003834
Bram Moolenaar15146672011-10-20 22:22:38 +02003835 if dirname =~ '^\*//'
3836 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
3837" call Decho("case Explore *//pattern")
3838 let pattern= substitute(dirname,'^\*//\(.*\)$','\1','')
3839 let starpat= 1
3840" call Decho("..Explore *//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
3841 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
3842
3843 elseif dirname =~ '^\*\*//'
3844 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
3845" call Decho("case Explore **//pattern")
3846 let pattern= substitute(dirname,'^\*\*//','','')
3847 let starpat= 2
3848" call Decho("..Explore **//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
3849
3850 elseif dirname =~ '/\*\*/'
Bram Moolenaar446cb832008-06-24 21:56:24 +00003851 " handle .../**/.../filepat
3852" call Decho("case Explore .../**/.../filepat")
3853 let prefixdir= substitute(dirname,'^\(.\{-}\)\*\*.*$','\1','')
3854 if prefixdir =~ '^/' || (prefixdir =~ '^\a:/' && (has("win32") || has("win95") || has("win64") || has("win16")))
3855 let b:netrw_curdir = prefixdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00003856 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003857 let b:netrw_curdir= getcwd().'/'.prefixdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00003858 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003859 let dirname= substitute(dirname,'^.\{-}\(\*\*/.*\)$','\1','')
3860 let starpat= 4;
Bram Moolenaar15146672011-10-20 22:22:38 +02003861" call Decho("..pwd<".getcwd()."> dirname<".dirname.">")
3862" call Decho("..case Explore ../**/../filepat (starpat=".starpat.")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003863
3864 elseif dirname =~ '^\*/'
3865 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
3866 let starpat= 3
3867" call Decho("case Explore */filepat (starpat=".starpat.")")
3868
3869 elseif dirname=~ '^\*\*/'
3870 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
3871 let starpat= 4
3872" call Decho("case Explore **/filepat (starpat=".starpat.")")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003873
Bram Moolenaar446cb832008-06-24 21:56:24 +00003874 else
3875 let starpat= 0
Bram Moolenaar5c736222010-01-06 20:54:52 +01003876" call Decho("default case: starpat=".starpat)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003877 endif
3878
3879 if starpat == 0 && a:indx >= 0
3880 " [Explore Hexplore Vexplore Sexplore] [dirname]
Bram Moolenaar5c736222010-01-06 20:54:52 +01003881" call Decho("case starpat==0 && a:indx=".a:indx.": dirname<".dirname."> Explore Hexplore Vexplore Sexplore")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003882 if dirname == ""
Bram Moolenaar5c736222010-01-06 20:54:52 +01003883 let dirname= curfiledir
Bram Moolenaar15146672011-10-20 22:22:38 +02003884" call Decho("..empty dirname, using current file's directory<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003885 endif
3886 if dirname =~ '^scp:' || dirname =~ '^ftp:'
Bram Moolenaar15146672011-10-20 22:22:38 +02003887" call Decho("..calling NetrwBrowse(0,dirname<".dirname.">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003888 call s:NetrwBrowse(0,dirname)
3889 else
3890 if dirname == ""|let dirname= getcwd()|endif
Bram Moolenaar15146672011-10-20 22:22:38 +02003891" call Decho("..calling LocalBrowseCheck(dirname<".dirname.">)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003892 call netrw#LocalBrowseCheck(dirname)
3893 endif
3894
Bram Moolenaar5c736222010-01-06 20:54:52 +01003895" call Decho("curdir<".curdir.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003896 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003897 keepj call search('\<'.substitute(curdir,'^.*[/\\]','','e').'\>','cW')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003898 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003899 keepj call search('\<'.substitute(curdir,'^.*/','','e').'\>','cW')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003900 endif
3901
3902 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
3903 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
3904 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
3905 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
3906 elseif a:indx <= 0
3907 " Nexplore, Pexplore, Explore: handle starpat
Bram Moolenaar5c736222010-01-06 20:54:52 +01003908" 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 +00003909 if !mapcheck("<s-up>","n") && !mapcheck("<s-down>","n") && exists("b:netrw_curdir")
Bram Moolenaar15146672011-10-20 22:22:38 +02003910" call Decho("..set up <s-up> and <s-down> maps")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003911 let s:didstarstar= 1
3912 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
3913 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
3914 endif
3915
3916 if has("path_extra")
Bram Moolenaar15146672011-10-20 22:22:38 +02003917" call Decho("..starpat=".starpat.": has +path_extra")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003918 if !exists("w:netrw_explore_indx")
3919 let w:netrw_explore_indx= 0
3920 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003921
Bram Moolenaar9964e462007-05-05 17:54:07 +00003922 let indx = a:indx
Bram Moolenaar15146672011-10-20 22:22:38 +02003923" call Decho("..starpat=".starpat.": set indx= [a:indx=".indx."]")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003924
Bram Moolenaar9964e462007-05-05 17:54:07 +00003925 if indx == -1
Bram Moolenaar446cb832008-06-24 21:56:24 +00003926 " Nexplore
Bram Moolenaar15146672011-10-20 22:22:38 +02003927" call Decho("..case Nexplore with starpat=".starpat.": (indx=".indx.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003928 if !exists("w:netrw_explore_list") " sanity check
Bram Moolenaaradc21822011-04-01 18:03:16 +02003929 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 +02003930 sil! let @* = keepregstar
3931 sil! let @+ = keepregstar
3932 sil! let @/ = keepregslash
Bram Moolenaar9964e462007-05-05 17:54:07 +00003933" call Dret("netrw#Explore")
3934 return
3935 endif
3936 let indx= w:netrw_explore_indx
3937 if indx < 0 | let indx= 0 | endif
3938 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
3939 let curfile= w:netrw_explore_list[indx]
Bram Moolenaar15146672011-10-20 22:22:38 +02003940" call Decho("....indx=".indx." curfile<".curfile.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003941 while indx < w:netrw_explore_listlen && curfile == w:netrw_explore_list[indx]
3942 let indx= indx + 1
Bram Moolenaar15146672011-10-20 22:22:38 +02003943" call Decho("....indx=".indx." (Nexplore while loop)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003944 endwhile
3945 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
Bram Moolenaar15146672011-10-20 22:22:38 +02003946" call Decho("....Nexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003947
3948 elseif indx == -2
Bram Moolenaar446cb832008-06-24 21:56:24 +00003949 " Pexplore
3950" call Decho("case Pexplore with starpat=".starpat.": (indx=".indx.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003951 if !exists("w:netrw_explore_list") " sanity check
Bram Moolenaaradc21822011-04-01 18:03:16 +02003952 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 +02003953 sil! let @* = keepregstar
3954 sil! let @+ = keepregstar
3955 sil! let @/ = keepregslash
Bram Moolenaar9964e462007-05-05 17:54:07 +00003956" call Dret("netrw#Explore")
3957 return
3958 endif
3959 let indx= w:netrw_explore_indx
3960 if indx < 0 | let indx= 0 | endif
3961 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
3962 let curfile= w:netrw_explore_list[indx]
Bram Moolenaar15146672011-10-20 22:22:38 +02003963" call Decho("....indx=".indx." curfile<".curfile.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003964 while indx >= 0 && curfile == w:netrw_explore_list[indx]
3965 let indx= indx - 1
Bram Moolenaar15146672011-10-20 22:22:38 +02003966" call Decho("....indx=".indx." (Pexplore while loop)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003967 endwhile
3968 if indx < 0 | let indx= 0 | endif
Bram Moolenaar15146672011-10-20 22:22:38 +02003969" call Decho("....Pexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003970
3971 else
3972 " Explore -- initialize
3973 " build list of files to Explore with Nexplore/Pexplore
Bram Moolenaar15146672011-10-20 22:22:38 +02003974" call Decho("..starpat=".starpat.": case Explore: initialize (indx=".indx.")")
Bram Moolenaaradc21822011-04-01 18:03:16 +02003975 keepj call s:NetrwClearExplore()
Bram Moolenaar9964e462007-05-05 17:54:07 +00003976 let w:netrw_explore_indx= 0
3977 if !exists("b:netrw_curdir")
3978 let b:netrw_curdir= getcwd()
3979 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02003980" call Decho("....starpat=".starpat.": b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003981
Bram Moolenaar446cb832008-06-24 21:56:24 +00003982 " switch on starpat to build the w:netrw_explore_list of files
3983 if starpat == 1
3984 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
Bram Moolenaar15146672011-10-20 22:22:38 +02003985" call Decho("..case starpat=".starpat.": build *//pattern list (curdir-only srch for files containing pattern) &hls=".&hls)
3986" call Decho("....pattern<".pattern.">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003987 try
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003988 exe "keepj noautocmd vimgrep /".pattern."/gj ".fnameescape(b:netrw_curdir)."/*"
Bram Moolenaar5c736222010-01-06 20:54:52 +01003989 catch /^Vim\%((\a\+)\)\=:E480/
3990 call netrw#ErrorMsg(s:WARNING,"no match with pattern<".pattern.">",76)
3991" call Dret("netrw#Explore : unable to find pattern<".pattern.">")
3992 return
3993 endtry
3994 let w:netrw_explore_list = s:NetrwExploreListUniq(map(getqflist(),'bufname(v:val.bufnr)'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003995 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
3996
3997 elseif starpat == 2
3998 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
Bram Moolenaar15146672011-10-20 22:22:38 +02003999" call Decho("..case starpat=".starpat.": build **//pattern list (recursive descent files containing pattern)")
4000" call Decho("....pattern<".pattern.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004001 try
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004002 exe "sil keepj noautocmd vimgrep /".pattern."/gj "."**/*"
Bram Moolenaar446cb832008-06-24 21:56:24 +00004003 catch /^Vim\%((\a\+)\)\=:E480/
Bram Moolenaar5c736222010-01-06 20:54:52 +01004004 call netrw#ErrorMsg(s:WARNING,'no files matched pattern<'.pattern.'>',45)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004005 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02004006 sil! let @* = keepregstar
4007 sil! let @+ = keepregstar
4008 sil! let @/ = keepregslash
Bram Moolenaar446cb832008-06-24 21:56:24 +00004009" call Dret("netrw#Explore : no files matched pattern")
4010 return
4011 endtry
4012 let s:netrw_curdir = b:netrw_curdir
4013 let w:netrw_explore_list = getqflist()
Bram Moolenaar5c736222010-01-06 20:54:52 +01004014 let w:netrw_explore_list = s:NetrwExploreListUniq(map(w:netrw_explore_list,'s:netrw_curdir."/".bufname(v:val.bufnr)'))
Bram Moolenaar15146672011-10-20 22:22:38 +02004015 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004016
4017 elseif starpat == 3
4018 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
Bram Moolenaar15146672011-10-20 22:22:38 +02004019" call Decho("..case starpat=".starpat.": build */filepat list (curdir-only srch filenames matching filepat) &hls=".&hls)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004020 let filepat= substitute(dirname,'^\*/','','')
4021 let filepat= substitute(filepat,'^[%#<]','\\&','')
Bram Moolenaar15146672011-10-20 22:22:38 +02004022" call Decho("....b:netrw_curdir<".b:netrw_curdir.">")
4023" call Decho("....filepat<".filepat.">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004024 let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".filepat),'\n'))
4025 if &hls | let keepregslash= s:ExplorePatHls(filepat) | endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004026
4027 elseif starpat == 4
4028 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
Bram Moolenaar15146672011-10-20 22:22:38 +02004029" call Decho("..case starpat=".starpat.": build **/filepat list (recursive descent srch filenames matching filepat) &hls=".&hls)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004030 let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".dirname),'\n'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004031 if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif
4032 endif " switch on starpat to build w:netrw_explore_list
Bram Moolenaar9964e462007-05-05 17:54:07 +00004033
4034 let w:netrw_explore_listlen = len(w:netrw_explore_list)
Bram Moolenaar15146672011-10-20 22:22:38 +02004035" call Decho("....w:netrw_explore_list<".string(w:netrw_explore_list).">")
4036" call Decho("....w:netrw_explore_listlen=".w:netrw_explore_listlen)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004037
4038 if w:netrw_explore_listlen == 0 || (w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/')
Bram Moolenaaradc21822011-04-01 18:03:16 +02004039 keepj call netrw#ErrorMsg(s:WARNING,"no files matched",42)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004040 sil! let @* = keepregstar
4041 sil! let @+ = keepregstar
4042 sil! let @/ = keepregslash
Bram Moolenaar9964e462007-05-05 17:54:07 +00004043" call Dret("netrw#Explore : no files matched")
4044 return
4045 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004046 endif " if indx ... endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00004047
4048 " NetrwStatusLine support - for exploring support
4049 let w:netrw_explore_indx= indx
Bram Moolenaar15146672011-10-20 22:22:38 +02004050" call Decho("....w:netrw_explore_list<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004051
4052 " wrap the indx around, but issue a note
4053 if indx >= w:netrw_explore_listlen || indx < 0
Bram Moolenaar15146672011-10-20 22:22:38 +02004054" call Decho("....wrap indx (indx=".indx." listlen=".w:netrw_explore_listlen.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004055 let indx = (indx < 0)? ( w:netrw_explore_listlen - 1 ) : 0
4056 let w:netrw_explore_indx= indx
Bram Moolenaaradc21822011-04-01 18:03:16 +02004057 keepj call netrw#ErrorMsg(s:NOTE,"no more files match Explore pattern",43)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004058 endif
4059
4060 exe "let dirfile= w:netrw_explore_list[".indx."]"
Bram Moolenaar15146672011-10-20 22:22:38 +02004061" call Decho("....dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004062 let newdir= substitute(dirfile,'/[^/]*$','','e')
Bram Moolenaar15146672011-10-20 22:22:38 +02004063" call Decho("....newdir<".newdir.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004064
Bram Moolenaar15146672011-10-20 22:22:38 +02004065" call Decho("....calling LocalBrowseCheck(newdir<".newdir.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004066 call netrw#LocalBrowseCheck(newdir)
4067 if !exists("w:netrw_liststyle")
4068 let w:netrw_liststyle= g:netrw_liststyle
4069 endif
4070 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:LONGLIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004071 keepj call search('^'.substitute(dirfile,"^.*/","","").'\>',"W")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004072 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004073 keepj call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004074 endif
4075 let w:netrw_explore_mtchcnt = indx + 1
4076 let w:netrw_explore_bufnr = bufnr("%")
4077 let w:netrw_explore_line = line(".")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004078 keepj call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}')
Bram Moolenaar15146672011-10-20 22:22:38 +02004079" call Decho("....explore: mtchcnt=".w:netrw_explore_mtchcnt." bufnr=".w:netrw_explore_bufnr." line#".w:netrw_explore_line)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004080
4081 else
Bram Moolenaar15146672011-10-20 22:22:38 +02004082" call Decho("..your vim does not have +path_extra")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004083 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004084 keepj call netrw#ErrorMsg(s:WARNING,"your vim needs the +path_extra feature for Exploring with **!",44)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004085 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004086 sil! let @* = keepregstar
4087 sil! let @+ = keepregstar
4088 sil! let @/ = keepregslash
Bram Moolenaar9964e462007-05-05 17:54:07 +00004089" call Dret("netrw#Explore : missing +path_extra")
4090 return
4091 endif
4092
4093 else
Bram Moolenaar15146672011-10-20 22:22:38 +02004094" call Decho("..default case: Explore newdir<".dirname.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004095 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && dirname =~ '/'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004096 sil! unlet w:netrw_treedict
4097 sil! unlet w:netrw_treetop
Bram Moolenaar9964e462007-05-05 17:54:07 +00004098 endif
4099 let newdir= dirname
4100 if !exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004101 keepj call netrw#LocalBrowseCheck(getcwd())
Bram Moolenaar9964e462007-05-05 17:54:07 +00004102 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02004103 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,newdir))
Bram Moolenaar9964e462007-05-05 17:54:07 +00004104 endif
4105 endif
4106
Bram Moolenaar446cb832008-06-24 21:56:24 +00004107 " visual display of **/ **// */ Exploration files
Bram Moolenaar5c736222010-01-06 20:54:52 +01004108" call Decho("w:netrw_explore_indx=".(exists("w:netrw_explore_indx")? w:netrw_explore_indx : "doesn't exist"))
4109" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "n/a").">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004110 if exists("w:netrw_explore_indx") && exists("b:netrw_curdir")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004111" call Decho("s:explore_prvdir<".(exists("s:explore_prvdir")? s:explore_prvdir : "-doesn't exist-"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004112 if !exists("s:explore_prvdir") || s:explore_prvdir != b:netrw_curdir
4113 " only update match list if current directory isn't the same as before
Bram Moolenaar5c736222010-01-06 20:54:52 +01004114" call Decho("only update match list if current directory not the same as before")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004115 let s:explore_prvdir = b:netrw_curdir
4116 let s:explore_match = ""
Bram Moolenaar5c736222010-01-06 20:54:52 +01004117 let dirlen = s:Strlen(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004118 if b:netrw_curdir !~ '/$'
4119 let dirlen= dirlen + 1
4120 endif
4121 let prvfname= ""
4122 for fname in w:netrw_explore_list
4123" call Decho("fname<".fname.">")
4124 if fname =~ '^'.b:netrw_curdir
4125 if s:explore_match == ""
Bram Moolenaar5c736222010-01-06 20:54:52 +01004126 let s:explore_match= '\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004127 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01004128 let s:explore_match= s:explore_match.'\|\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004129 endif
4130 elseif fname !~ '^/' && fname != prvfname
4131 if s:explore_match == ""
Bram Moolenaar5c736222010-01-06 20:54:52 +01004132 let s:explore_match= '\<'.escape(fname,g:netrw_markfileesc).'\>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004133 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01004134 let s:explore_match= s:explore_match.'\|\<'.escape(fname,g:netrw_markfileesc).'\>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004135 endif
4136 endif
4137 let prvfname= fname
4138 endfor
4139" call Decho("explore_match<".s:explore_match.">")
4140 exe "2match netrwMarkFile /".s:explore_match."/"
4141 endif
4142 echo "<s-up>==Pexplore <s-down>==Nexplore"
4143 else
4144 2match none
4145 if exists("s:explore_match") | unlet s:explore_match | endif
4146 if exists("s:explore_prvdir") | unlet s:explore_prvdir | endif
4147 echo " "
4148" call Decho("cleared explore match list")
4149 endif
4150
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004151 sil! let @* = keepregstar
4152 sil! let @+ = keepregstar
4153 sil! let @/ = keepregslash
Bram Moolenaar9964e462007-05-05 17:54:07 +00004154" call Dret("netrw#Explore : @/<".@/.">")
4155endfun
4156
4157" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01004158" s:NetrwExploreListUniq: {{{2
4159fun! s:NetrwExploreListUniq(explist)
Bram Moolenaar15146672011-10-20 22:22:38 +02004160" call Dfunc("s:NetrwExploreListUniq(explist<".string(a:explist).">)")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004161
4162 " this assumes that the list is already sorted
4163 let newexplist= []
4164 for member in a:explist
4165 if !exists("uniqmember") || member != uniqmember
4166 let uniqmember = member
4167 let newexplist = newexplist + [ member ]
4168 endif
4169 endfor
4170
Bram Moolenaar15146672011-10-20 22:22:38 +02004171" call Dret("s:NetrwExploreListUniq newexplist<".string(newexplist).">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004172 return newexplist
4173endfun
4174
4175" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02004176" s:NetrwForceChgDir: (gd support) Force treatment as a directory {{{2
4177fun! s:NetrwForceChgDir(islocal,newdir)
4178" call Dfunc("s:NetrwForceChgDir(islocal=".a:islocal." newdir<".a:newdir.">)")
4179 if a:newdir !~ '/$'
4180 " ok, looks like force is needed to get directory-style treatment
4181 if a:newdir =~ '@$'
4182 let newdir= substitute(a:newdir,'@$','/','')
4183 elseif a:newdir =~ '[*=|\\]$'
4184 let newdir= substitute(a:newdir,'.$','/','')
4185 else
4186 let newdir= a:newdir.'/'
4187 endif
4188" call Decho("adjusting newdir<".newdir."> due to gd")
4189 else
4190 " should already be getting treatment as a directory
4191 let newdir= a:newdir
4192 endif
4193 call s:NetrwBrowseChgDir(a:islocal,newdir)
4194 call s:NetrwBrowse(a:islocal,newdir)
4195" call Dret("s:NetrwForceChgDir")
4196endfun
4197
4198" ---------------------------------------------------------------------
4199" s:NetrwForceFile: (gf support) Force treatment as a file {{{2
4200fun! s:NetrwForceFile(islocal,newfile)
4201" " call Dfunc("s:NetrwForceFile(islocal=".a:islocal." newdir<".a:newdir.">)")
4202 if a:newfile =~ '[/@*=|\\]$'
4203 let newfile= substitute(a:newfile,'.$','','')
4204 else
4205 let newfile= a:newfile
4206 endif
4207 call s:NetrwBrowseChgDir(a:islocal,newfile)
4208" call Dret("s:NetrwForceFile")
4209endfun
4210
4211" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004212" s:NetrwHide: this function is invoked by the "a" map for browsing {{{2
4213" and switches the hiding mode. The actual hiding is done by
4214" s:NetrwListHide().
4215" g:netrw_hide= 0: show all
4216" 1: show not-hidden files
4217" 2: show hidden files only
4218fun! s:NetrwHide(islocal)
4219" call Dfunc("NetrwHide(islocal=".a:islocal.") g:netrw_hide=".g:netrw_hide)
4220 let svpos= netrw#NetrwSavePosn()
4221
4222 if exists("s:netrwmarkfilelist_{bufnr('%')}")
4223" call Decho(((g:netrw_hide == 1)? "unhide" : "hide")." files in markfilelist<".string(s:netrwmarkfilelist_{bufnr("%")}).">")
4224" call Decho("g:netrw_list_hide<".g:netrw_list_hide.">")
4225
4226 " hide the files in the markfile list
4227 for fname in s:netrwmarkfilelist_{bufnr("%")}
4228" call Decho("match(g:netrw_list_hide<".g:netrw_list_hide.'> fname<\<'.fname.'\>>)='.match(g:netrw_list_hide,'\<'.fname.'\>')." isk=".&isk)
4229 if match(g:netrw_list_hide,'\<'.fname.'\>') != -1
4230 " remove fname from hiding list
4231 let g:netrw_list_hide= substitute(g:netrw_list_hide,'..\<'.escape(fname,g:netrw_fname_escape).'\>..','','')
4232 let g:netrw_list_hide= substitute(g:netrw_list_hide,',,',',','g')
4233 let g:netrw_list_hide= substitute(g:netrw_list_hide,'^,\|,$','','')
4234" call Decho("unhide: g:netrw_list_hide<".g:netrw_list_hide.">")
4235 else
4236 " append fname to hiding list
4237 if exists("g:netrw_list_hide") && g:netrw_list_hide != ""
4238 let g:netrw_list_hide= g:netrw_list_hide.',\<'.escape(fname,g:netrw_fname_escape).'\>'
4239 else
4240 let g:netrw_list_hide= '\<'.escape(fname,g:netrw_fname_escape).'\>'
4241 endif
4242" call Decho("hide: g:netrw_list_hide<".g:netrw_list_hide.">")
4243 endif
4244 endfor
Bram Moolenaaradc21822011-04-01 18:03:16 +02004245 keepj call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004246 let g:netrw_hide= 1
4247
4248 else
4249
4250 " switch between show-all/show-not-hidden/show-hidden
4251 let g:netrw_hide=(g:netrw_hide+1)%3
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004252 exe "keepj norm! 0"
Bram Moolenaar446cb832008-06-24 21:56:24 +00004253 if g:netrw_hide && g:netrw_list_hide == ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02004254 keepj call netrw#ErrorMsg(s:WARNING,"your hiding list is empty!",49)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004255" call Dret("NetrwHide")
4256 return
4257 endif
4258 endif
4259
Bram Moolenaaradc21822011-04-01 18:03:16 +02004260 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4261 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004262" call Dret("NetrwHide")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004263endfun
4264
4265" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004266" s:NetrwHidden: invoked by "gh" {{{2
4267fun! s:NetrwHidden(islocal)
4268" call Dfunc("s:NetrwHidden()")
4269 " save current position
4270 let svpos= netrw#NetrwSavePosn()
4271
4272 if g:netrw_list_hide =~ '\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+'
4273 " remove pattern from hiding list
4274 let g:netrw_list_hide= substitute(g:netrw_list_hide,'\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+','','')
Bram Moolenaar5c736222010-01-06 20:54:52 +01004275 elseif s:Strlen(g:netrw_list_hide) >= 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00004276 let g:netrw_list_hide= g:netrw_list_hide . ',\(^\|\s\s\)\zs\.\S\+'
4277 else
4278 let g:netrw_list_hide= '\(^\|\s\s\)\zs\.\S\+'
4279 endif
4280
4281 " refresh screen and return to saved position
Bram Moolenaaradc21822011-04-01 18:03:16 +02004282 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4283 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004284" call Dret("s:NetrwHidden")
4285endfun
4286
4287" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01004288" s:NetrwHome: this function determines a "home" for saving bookmarks and history {{{2
4289fun! s:NetrwHome()
4290 if exists("g:netrw_home")
4291 let home= g:netrw_home
4292 else
4293 " go to vim plugin home
4294 for home in split(&rtp,',') + ['']
4295 if isdirectory(home) && filewritable(home) | break | endif
4296 let basehome= substitute(home,'[/\\]\.vim$','','')
4297 if isdirectory(basehome) && filewritable(basehome)
4298 let home= basehome."/.vim"
4299 break
4300 endif
4301 endfor
4302 if home == ""
4303 " just pick the first directory
4304 let home= substitute(&rtp,',.*$','','')
4305 endif
4306 if (has("win32") || has("win95") || has("win64") || has("win16"))
4307 let home= substitute(home,'/','\\','g')
4308 endif
4309 endif
4310 " insure that the home directory exists
4311 if !isdirectory(home)
4312 if exists("g:netrw_mkdir")
4313 call system(g:netrw_mkdir." ".shellescape(home))
4314 else
4315 call mkdir(home)
4316 endif
4317 endif
4318 let g:netrw_home= home
4319 return home
4320endfun
4321
4322" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004323" s:NetrwLeftmouse: handles the <leftmouse> when in a netrw browsing window {{{2
4324fun! s:NetrwLeftmouse(islocal)
4325" call Dfunc("s:NetrwLeftmouse(islocal=".a:islocal.")")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004326
4327 " check if the status bar was clicked on instead of a file/directory name
Bram Moolenaaradc21822011-04-01 18:03:16 +02004328 while getchar(0) != 0
4329 "clear the input stream
4330 endwhile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004331 call feedkeys("\<LeftMouse>")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004332 let c = getchar()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004333 let mouse_lnum = v:mouse_lnum
4334 let wlastline = line('w$')
4335 let lastline = line('$')
4336" call Decho("v:mouse_lnum=".mouse_lnum." line(w$)=".wlastline." line($)=".lastline." v:mouse_win=".v:mouse_win." winnr#".winnr())
4337" call Decho("v:mouse_col =".v:mouse_col." col=".col(".")." wincol =".wincol()." winwidth =".winwidth(0))
4338 if mouse_lnum >= wlastline + 1 || v:mouse_win != winnr()
4339 " appears to be a status bar leftmouse click
4340" call Dret("s:NetrwLeftmouse : detected a status bar leftmouse click")
4341 return
4342 endif
4343 if v:mouse_col != col('.')
4344" call Dret("s:NetrwLeftmouse : detected a vertical separator bar leftmouse click")
4345 return
4346 endif
4347
Bram Moolenaar446cb832008-06-24 21:56:24 +00004348 if a:islocal
4349 if exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004350 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004351 endif
4352 else
4353 if exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004354 keepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004355 endif
4356 endif
4357" call Dret("s:NetrwLeftmouse")
4358endfun
4359
4360" ---------------------------------------------------------------------
4361" s:NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
4362" separated patterns given in g:netrw_list_hide
4363fun! s:NetrwListHide()
Bram Moolenaaradc21822011-04-01 18:03:16 +02004364" call Dfunc("NetrwListHide() g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004365
4366 " find a character not in the "hide" string to use as a separator for :g and :v commands
4367 " How-it-works: take the hiding command, convert it into a range. Duplicate
4368 " characters don't matter. Remove all such characters from the '/~...90'
4369 " string. Use the first character left as a separator character.
4370 let listhide= g:netrw_list_hide
4371 let sep = strpart(substitute('/~@#$%^&*{};:,<.>?|1234567890','['.escape(listhide,'-]^\').']','','ge'),1,1)
4372" call Decho("sep=".sep)
4373
4374 while listhide != ""
4375 if listhide =~ ','
4376 let hide = substitute(listhide,',.*$','','e')
4377 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
4378 else
4379 let hide = listhide
4380 let listhide = ""
4381 endif
4382
4383 " Prune the list by hiding any files which match
4384 if g:netrw_hide == 1
4385" call Decho("hiding<".hide."> listhide<".listhide.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004386 exe 'sil keepj '.w:netrw_bannercnt.',$g'.sep.hide.sep.'d'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004387 elseif g:netrw_hide == 2
4388" call Decho("showing<".hide."> listhide<".listhide.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004389 exe 'sil keepj '.w:netrw_bannercnt.',$g'.sep.hide.sep.'s@^@ /-KEEP-/ @'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004390 endif
4391 endwhile
4392 if g:netrw_hide == 2
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004393 exe 'sil keepj '.w:netrw_bannercnt.',$v@^ /-KEEP-/ @d'
4394 exe 'sil keepj '.w:netrw_bannercnt.',$s@^\%( /-KEEP-/ \)\+@@e'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004395 endif
4396
Bram Moolenaaradc21822011-04-01 18:03:16 +02004397 " remove any blank lines that have somehow remained.
4398 " This seems to happen under Windows.
4399 exe 'sil! keepj 1,$g@^\s*$@d'
4400
Bram Moolenaar446cb832008-06-24 21:56:24 +00004401" call Dret("NetrwListHide")
4402endfun
4403
4404" ---------------------------------------------------------------------
4405" NetrwHideEdit: allows user to edit the file/directory hiding list
4406fun! s:NetrwHideEdit(islocal)
4407" call Dfunc("NetrwHideEdit(islocal=".a:islocal.")")
4408
4409 " save current cursor position
4410 let svpos= netrw#NetrwSavePosn()
4411
4412 " get new hiding list from user
4413 call inputsave()
4414 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
4415 call inputrestore()
4416 let g:netrw_list_hide= newhide
4417" call Decho("new g:netrw_list_hide<".g:netrw_list_hide.">")
4418
4419 " refresh the listing
Bram Moolenaaradc21822011-04-01 18:03:16 +02004420 sil keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,"./"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004421
4422 " restore cursor position
4423 call netrw#NetrwRestorePosn(svpos)
4424
4425" call Dret("NetrwHideEdit")
4426endfun
4427
4428" ---------------------------------------------------------------------
4429" NetSortSequence: allows user to edit the sorting sequence
4430fun! s:NetSortSequence(islocal)
4431" call Dfunc("NetSortSequence(islocal=".a:islocal.")")
4432
4433 let svpos= netrw#NetrwSavePosn()
4434 call inputsave()
4435 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
4436 call inputrestore()
4437
4438 " refresh the listing
4439 let g:netrw_sort_sequence= newsortseq
Bram Moolenaaradc21822011-04-01 18:03:16 +02004440 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4441 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004442
4443" call Dret("NetSortSequence")
4444endfun
4445
4446" ---------------------------------------------------------------------
4447" s:NetrwMakeDir: this function makes a directory (both local and remote) {{{2
4448fun! s:NetrwMakeDir(usrhost)
4449" call Dfunc("NetrwMakeDir(usrhost<".a:usrhost.">)")
4450
4451 " get name of new directory from user. A bare <CR> will skip.
4452 " if its currently a directory, also request will be skipped, but with
4453 " a message.
4454 call inputsave()
4455 let newdirname= input("Please give directory name: ")
4456 call inputrestore()
4457" call Decho("newdirname<".newdirname.">")
4458
4459 if newdirname == ""
4460" call Dret("NetrwMakeDir : user aborted with bare <cr>")
4461 return
4462 endif
4463
4464 if a:usrhost == ""
4465" call Decho("local mkdir")
4466
4467 " Local mkdir:
4468 " sanity checks
4469 let fullnewdir= b:netrw_curdir.'/'.newdirname
4470" call Decho("fullnewdir<".fullnewdir.">")
4471 if isdirectory(fullnewdir)
4472 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004473 keepj call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a directory!",24)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004474 endif
4475" call Dret("NetrwMakeDir : directory<".newdirname."> exists previously")
4476 return
4477 endif
4478 if s:FileReadable(fullnewdir)
4479 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004480 keepj call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a file!",25)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004481 endif
4482" call Dret("NetrwMakeDir : file<".newdirname."> exists previously")
4483 return
4484 endif
4485
4486 " requested new local directory is neither a pre-existing file or
4487 " directory, so make it!
4488 if exists("*mkdir")
4489 call mkdir(fullnewdir,"p")
4490 else
4491 let netrw_origdir= s:NetrwGetcwd(1)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004492 exe 'keepj lcd '.fnameescape(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004493" call Decho("netrw_origdir<".netrw_origdir.">: lcd b:netrw_curdir<".fnameescape(b:netrw_curdir).">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004494" call Decho("exe sil! !".g:netrw_local_mkdir.' '.shellescape(newdirname,1))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004495 exe "sil! !".g:netrw_local_mkdir.' '.shellescape(newdirname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004496 if !g:netrw_keepdir
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004497 exe 'keepj lcd '.fnameescape(netrw_origdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004498" call Decho("netrw_keepdir=".g:netrw_keepdir.": keepjumps lcd ".fnameescape(netrw_origdir)." getcwd<".getcwd().">")
4499 endif
4500 endif
4501
4502 if v:shell_error == 0
4503 " refresh listing
4504" call Decho("refresh listing")
4505 let svpos= netrw#NetrwSavePosn()
4506 call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
4507 call netrw#NetrwRestorePosn(svpos)
4508 elseif !exists("g:netrw_quiet")
4509 call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",26)
4510 endif
4511" redraw!
4512
4513 elseif !exists("b:netrw_method") || b:netrw_method == 4
4514 " Remote mkdir:
4515" call Decho("remote mkdir")
4516 let mkdircmd = s:MakeSshCmd(g:netrw_mkdir_cmd)
4517 let newdirname= substitute(b:netrw_curdir,'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname
Bram Moolenaaradc21822011-04-01 18:03:16 +02004518" call Decho("exe sil! !".mkdircmd." ".shellescape(newdirname,1))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004519 exe "sil! !".mkdircmd." ".shellescape(newdirname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004520 if v:shell_error == 0
4521 " refresh listing
4522 let svpos= netrw#NetrwSavePosn()
Bram Moolenaaradc21822011-04-01 18:03:16 +02004523 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
4524 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004525 elseif !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004526 keepj call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",27)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004527 endif
4528" redraw!
4529
4530 elseif b:netrw_method == 2
Bram Moolenaar15146672011-10-20 22:22:38 +02004531 let svpos= netrw#NetrwSavePosn()
4532 call s:NetrwRemoteFtpCmd("",g:netrw_remote_mkdir.' "'.newdirname.'"')
4533 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
4534 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004535 elseif b:netrw_method == 3
Bram Moolenaar15146672011-10-20 22:22:38 +02004536 let svpos= netrw#NetrwSavePosn()
4537 call s:NetrwRemoteFtpCmd("",g:netrw_remote_mkdir.' "'.newdirname.'"')
4538 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
4539 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004540 endif
4541
4542" call Dret("NetrwMakeDir")
4543endfun
4544
4545" ---------------------------------------------------------------------
4546" s:NetrwMarkFile: (invoked by mf) This function is used to both {{{2
4547" mark and unmark files. If a markfile list exists,
4548" then the rename and delete functions will use it instead
4549" of whatever may happen to be under the cursor at that
4550" moment. When the mouse and gui are available,
4551" shift-leftmouse may also be used to mark files.
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004552"
4553" Creates two lists
4554" s:netrwmarkfilelist -- holds complete paths to all marked files
4555" s:netrwmarkfilelist_# -- holds list of marked files in current-buffer's directory (#==bufnr())
4556"
4557" Creates a marked file match string
4558" s:netrwmarfilemtch_# -- used with 2match to display marked files
4559"
Bram Moolenaared39e1d2008-08-09 17:55:22 +00004560" Creates a buffer version of islocal
4561" b:netrw_islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00004562fun! s:NetrwMarkFile(islocal,fname)
4563" call Dfunc("s:NetrwMarkFile(islocal=".a:islocal." fname<".a:fname.">)")
4564 let curbufnr= bufnr("%")
4565 let curdir = b:netrw_curdir
Bram Moolenaar5c736222010-01-06 20:54:52 +01004566 let trailer = '[@=|\/\*]\=\>'
Bram Moolenaaradc21822011-04-01 18:03:16 +02004567
Bram Moolenaar446cb832008-06-24 21:56:24 +00004568 if exists("s:netrwmarkfilelist_{curbufnr}")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004569 " markfile list pre-exists
Bram Moolenaar446cb832008-06-24 21:56:24 +00004570" call Decho("starting s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
4571" call Decho("starting s:netrwmarkfilemtch_{curbufnr}<".s:netrwmarkfilemtch_{curbufnr}.">")
Bram Moolenaared39e1d2008-08-09 17:55:22 +00004572 let b:netrw_islocal= a:islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00004573
4574 if index(s:netrwmarkfilelist_{curbufnr},a:fname) == -1
Bram Moolenaared39e1d2008-08-09 17:55:22 +00004575 " append filename to buffer's markfilelist
Bram Moolenaar446cb832008-06-24 21:56:24 +00004576" call Decho("append filename<".a:fname."> to local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
4577 call add(s:netrwmarkfilelist_{curbufnr},a:fname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004578 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(a:fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00004579
4580 else
Bram Moolenaared39e1d2008-08-09 17:55:22 +00004581 " remove filename from buffer's markfilelist
Bram Moolenaar446cb832008-06-24 21:56:24 +00004582" call Decho("remove filename<".a:fname."> from local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
4583 call filter(s:netrwmarkfilelist_{curbufnr},'v:val != a:fname')
4584 if s:netrwmarkfilelist_{curbufnr} == []
4585 " local markfilelist is empty; remove it entirely
Bram Moolenaar5c736222010-01-06 20:54:52 +01004586" call Decho("markfile list now empty")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004587 call s:NetrwUnmarkList(curbufnr,curdir)
4588 else
4589 " rebuild match list to display markings correctly
4590" call Decho("rebuild s:netrwmarkfilemtch_".curbufnr)
4591 let s:netrwmarkfilemtch_{curbufnr}= ""
4592 let first = 1
4593 for fname in s:netrwmarkfilelist_{curbufnr}
4594 if first
Bram Moolenaar5c736222010-01-06 20:54:52 +01004595 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00004596 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01004597 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00004598 endif
4599 let first= 0
4600 endfor
Bram Moolenaar15146672011-10-20 22:22:38 +02004601" call Decho("ending s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004602 endif
4603 endif
4604
4605 else
4606 " initialize new markfilelist
4607
4608" call Decho("add fname<".a:fname."> to new markfilelist_".curbufnr)
4609 let s:netrwmarkfilelist_{curbufnr}= []
4610 call add(s:netrwmarkfilelist_{curbufnr},a:fname)
4611" call Decho("ending s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
4612
4613 " build initial markfile matching pattern
4614 if a:fname =~ '/$'
4615 let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc)
4616 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01004617 let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc).trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00004618 endif
4619" call Decho("ending s:netrwmarkfilemtch_".curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">")
4620 endif
4621
4622 " handle global markfilelist
4623 if exists("s:netrwmarkfilelist")
4624 let dname= s:ComposePath(b:netrw_curdir,a:fname)
4625 if index(s:netrwmarkfilelist,dname) == -1
4626 " append new filename to global markfilelist
4627 call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
4628" call Decho("append filename<".a:fname."> to global markfilelist<".string(s:netrwmarkfilelist).">")
4629 else
4630 " remove new filename from global markfilelist
4631" call Decho("filter(".string(s:netrwmarkfilelist).",'v:val != '.".dname.")")
4632 call filter(s:netrwmarkfilelist,'v:val != "'.dname.'"')
4633" call Decho("ending s:netrwmarkfilelist <".string(s:netrwmarkfilelist).">")
4634 if s:netrwmarkfilelist == []
4635 unlet s:netrwmarkfilelist
4636 endif
4637 endif
4638 else
4639 " initialize new global-directory markfilelist
4640 let s:netrwmarkfilelist= []
4641 call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
4642" call Decho("init s:netrwmarkfilelist<".string(s:netrwmarkfilelist).">")
4643 endif
4644
4645 " set up 2match'ing to netrwmarkfilemtch list
4646 if exists("s:netrwmarkfilemtch_{curbufnr}") && s:netrwmarkfilemtch_{curbufnr} != ""
4647" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004648 if exists("g:did_drchip_netrwlist_syntax")
4649 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/"
4650 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004651 else
4652" call Decho("2match none")
4653 2match none
4654 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02004655" 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 +00004656endfun
4657
4658" ---------------------------------------------------------------------
4659" s:NetrwMarkFileCompress: (invoked by mz) This function is used to {{{2
4660" compress/decompress files using the programs
4661" in g:netrw_compress and g:netrw_uncompress,
4662" using g:netrw_compress_suffix to know which to
4663" do. By default:
4664" g:netrw_compress = "gzip"
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004665" g:netrw_decompress = { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf", ".xz" : "unxz"}
Bram Moolenaar446cb832008-06-24 21:56:24 +00004666fun! s:NetrwMarkFileCompress(islocal)
4667" call Dfunc("s:NetrwMarkFileCompress(islocal=".a:islocal.")")
4668 let svpos = netrw#NetrwSavePosn()
4669 let curdir = b:netrw_curdir
4670 let curbufnr = bufnr("%")
4671
4672 if exists("s:netrwmarkfilelist_{curbufnr}") && exists("g:netrw_compress") && exists("g:netrw_decompress")
4673 for fname in s:netrwmarkfilelist_{curbufnr}
4674 " for every filename in the marked list
4675 for sfx in sort(keys(g:netrw_decompress))
4676 if fname =~ '\'.sfx.'$'
4677 " fname has a suffix indicating that its compressed; apply associated decompression routine
Bram Moolenaar5c736222010-01-06 20:54:52 +01004678 let exe= netrw#WinPath(g:netrw_decompress[sfx])
Bram Moolenaar446cb832008-06-24 21:56:24 +00004679" call Decho("fname<".fname."> is compressed so decompress with <".exe.">")
4680 if a:islocal
4681 if g:netrw_keepdir
Bram Moolenaarc236c162008-07-13 17:41:49 +00004682 let fname= shellescape(s:ComposePath(curdir,fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004683 endif
4684 else
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004685 let fname= shellescape(b:netrw_curdir.fname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004686 endif
4687 if executable(exe)
4688 if a:islocal
4689 call system(exe." ".fname)
4690 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02004691 keepj call s:RemoteSystem(exe." ".fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004692 endif
4693 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02004694 keepj call netrw#ErrorMsg(s:WARNING,"unable to apply<".exe."> to file<".fname.">",50)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004695 endif
4696 break
4697 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02004698 unlet sfx
Bram Moolenaar446cb832008-06-24 21:56:24 +00004699 endfor
4700 if exists("exe")
4701 unlet exe
4702 elseif a:islocal
4703 " fname not a compressed file, so compress it
Bram Moolenaar5c736222010-01-06 20:54:52 +01004704 call system(netrw#WinPath(g:netrw_compress)." ".shellescape(s:ComposePath(b:netrw_curdir,fname)))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004705 else
4706 " fname not a compressed file, so compress it
Bram Moolenaaradc21822011-04-01 18:03:16 +02004707 keepj call s:RemoteSystem(netrw#WinPath(g:netrw_compress)." ".shellescape(fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004708 endif
4709 endfor
4710 call s:NetrwUnmarkList(curbufnr,curdir)
Bram Moolenaaradc21822011-04-01 18:03:16 +02004711 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4712 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004713 endif
4714" call Dret("s:NetrwMarkFileCompress")
4715endfun
4716
4717" ---------------------------------------------------------------------
4718" s:NetrwMarkFileCopy: (invoked by mc) copy marked files to target {{{2
4719" If no marked files, then set up directory as the
4720" target. Currently does not support copying entire
4721" directories. Uses the local-buffer marked file list.
4722" Returns 1=success (used by NetrwMarkFileMove())
4723" 0=failure
4724fun! s:NetrwMarkFileCopy(islocal)
4725" call Dfunc("s:NetrwMarkFileCopy(islocal=".a:islocal.") target<".(exists("s:netrwmftgt")? s:netrwmftgt : '---').">")
4726
4727 " sanity checks
4728 if !exists("s:netrwmarkfilelist_{bufnr('%')}") || empty(s:netrwmarkfilelist_{bufnr('%')})
Bram Moolenaar251e1912011-06-19 05:09:16 +02004729 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 +00004730" call Dret("s:NetrwMarkFileCopy 0")
4731 return 0
4732 endif
4733" call Decho("sanity chk passed: s:netrwmarkfilelist_".bufnr('%')."<".string(s:netrwmarkfilelist_{bufnr('%')}))
4734 if !exists("s:netrwmftgt")
Bram Moolenaar251e1912011-06-19 05:09:16 +02004735 keepj call netrw#ErrorMsg(s:ERROR,"your marked file target is empty! (:help netrw-mt)",67)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004736" call Dret("s:NetrwMarkFileCopy 0")
4737 return 0
4738 endif
4739" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
4740 let curdir = b:netrw_curdir
4741 let curbufnr = bufnr("%")
4742
4743 if a:islocal && s:netrwmftgt_islocal
4744 " Copy marked files, local directory to local directory
4745" call Decho("copy from local to local")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004746 let args= join(map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),"shellescape(b:netrw_curdir.\"/\".v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004747" call Decho("system(".g:netrw_localcopycmd." ".args." ".shellescape(s:netrwmftgt).")")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004748 call system(netrw#WinPath(g:netrw_localcopycmd)." ".args." ".shellescape(s:netrwmftgt))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004749
4750 elseif a:islocal && !s:netrwmftgt_islocal
4751 " Copy marked files, local directory to remote directory
4752" call Decho("copy from local to remote")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004753 keepj call s:NetrwUpload(s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004754
4755 elseif !a:islocal && s:netrwmftgt_islocal
4756" call Decho("copy from remote to local")
Bram Moolenaaradc21822011-04-01 18:03:16 +02004757 keepj call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004758
4759 elseif !a:islocal && !s:netrwmftgt_islocal
4760" call Decho("copy from remote to remote")
4761 let curdir = getcwd()
4762 let tmpdir = s:GetTempfile("")
4763 if tmpdir !~ '/'
4764 let tmpdir= curdir."/".tmpdir
4765 endif
4766 if exists("*mkdir")
4767 call mkdir(tmpdir)
4768 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004769 exe "sil! !".g:netrw_local_mkdir.' '.shellescape(tmpdir,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004770 endif
4771 if isdirectory(tmpdir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004772 exe "keepj lcd ".fnameescape(tmpdir)
Bram Moolenaaradc21822011-04-01 18:03:16 +02004773 keepj call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},tmpdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004774 let localfiles= map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),'substitute(v:val,"^.*/","","")')
Bram Moolenaaradc21822011-04-01 18:03:16 +02004775 keepj call s:NetrwUpload(localfiles,s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004776 if getcwd() == tmpdir
4777 for fname in s:netrwmarkfilelist_{bufnr('%')}
Bram Moolenaaradc21822011-04-01 18:03:16 +02004778 keepj call s:NetrwDelete(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004779 endfor
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004780 exe "keepj lcd ".fnameescape(curdir)
4781 exe "sil !".g:netrw_local_rmdir." ".shellescape(tmpdir,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004782 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004783 exe "keepj lcd ".fnameescape(curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004784 endif
4785 endif
4786 endif
4787
4788 " -------
4789 " cleanup
4790 " -------
4791" call Decho("cleanup")
4792
4793 " remove markings from local buffer
4794 call s:NetrwUnmarkList(curbufnr,curdir)
4795
4796 " refresh buffers
4797 if !s:netrwmftgt_islocal
4798 call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
4799 endif
4800 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02004801 keepj call s:NetrwRefreshDir(a:islocal,curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004802 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01004803 if g:netrw_fastbrowse <= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02004804 keepj call s:LocalBrowseShellCmdRefresh()
Bram Moolenaar5c736222010-01-06 20:54:52 +01004805 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004806
4807" call Dret("s:NetrwMarkFileCopy 1")
4808 return 1
4809endfun
4810
4811" ---------------------------------------------------------------------
4812" s:NetrwMarkFileDiff: (invoked by md) This function is used to {{{2
4813" invoke vim's diff mode on the marked files.
4814" Either two or three files can be so handled.
4815" Uses the global marked file list.
4816fun! s:NetrwMarkFileDiff(islocal)
4817" call Dfunc("s:NetrwMarkFileDiff(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
4818 let curbufnr= bufnr("%")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004819
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004820 if exists("s:netrwmarkfilelist_{curbufnr}")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004821 let cnt = 0
4822 let curdir = b:netrw_curdir
4823 for fname in s:netrwmarkfilelist
4824 let cnt= cnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00004825 if cnt == 1
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004826" call Decho("diffthis: fname<".fname.">")
4827 exe "e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004828 diffthis
4829 elseif cnt == 2 || cnt == 3
4830 vsplit
4831 wincmd l
4832" call Decho("diffthis: ".fname)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004833 exe "e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004834 diffthis
4835 else
4836 break
4837 endif
4838 endfor
4839 call s:NetrwUnmarkList(curbufnr,curdir)
4840 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004841
Bram Moolenaar446cb832008-06-24 21:56:24 +00004842" call Dret("s:NetrwMarkFileDiff")
4843endfun
4844
4845" ---------------------------------------------------------------------
4846" s:NetrwMarkFileEdit: (invoked by me) put marked files on arg list and start editing them {{{2
4847" Uses global markfilelist
4848fun! s:NetrwMarkFileEdit(islocal)
4849" call Dfunc("s:NetrwMarkFileEdit(islocal=".a:islocal.")")
4850
4851 let curdir = b:netrw_curdir
4852 let curbufnr = bufnr("%")
4853 if exists("s:netrwmarkfilelist_{curbufnr}")
4854 call s:SetRexDir(a:islocal,curdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004855 let flist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004856 " unmark markedfile list
4857" call s:NetrwUnmarkList(curbufnr,curdir)
4858 call s:NetrwUnmarkAll()
Bram Moolenaaradc21822011-04-01 18:03:16 +02004859" call Decho("exe sil args ".flist)
4860 exe "sil args ".flist
Bram Moolenaar446cb832008-06-24 21:56:24 +00004861 endif
4862
4863" call Dret("s:NetrwMarkFileEdit")
4864endfun
4865
4866" ---------------------------------------------------------------------
Bram Moolenaar15146672011-10-20 22:22:38 +02004867" s:NetrwMarkFileExe: (invoked by mx) execute arbitrary system command on marked files, one at a time {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00004868" Uses the local marked-file list.
4869fun! s:NetrwMarkFileExe(islocal)
4870" call Dfunc("s:NetrwMarkFileExe(islocal=".a:islocal.")")
4871 let svpos = netrw#NetrwSavePosn()
4872 let curdir = b:netrw_curdir
4873 let curbufnr = bufnr("%")
4874
4875 if exists("s:netrwmarkfilelist_{curbufnr}")
4876 " get the command
4877 call inputsave()
4878 let cmd= input("Enter command: ","","file")
4879 call inputrestore()
4880" call Decho("cmd<".cmd.">")
Bram Moolenaar15146672011-10-20 22:22:38 +02004881 if cmd == ""
4882" " call Dret("s:NetrwMarkFileExe : early exit, empty command")
4883 return
4884 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004885
4886 " apply command to marked files. Substitute: filename -> %
4887 " If no %, then append a space and the filename to the command
4888 for fname in s:netrwmarkfilelist_{curbufnr}
4889 if a:islocal
4890 if g:netrw_keepdir
Bram Moolenaar5c736222010-01-06 20:54:52 +01004891 let fname= shellescape(netrw#WinPath(s:ComposePath(curdir,fname)))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004892 endif
4893 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01004894 let fname= shellescape(netrw#WinPath(b:netrw_curdir.fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004895 endif
4896 if cmd =~ '%'
4897 let xcmd= substitute(cmd,'%',fname,'g')
4898 else
4899 let xcmd= cmd.' '.fname
4900 endif
4901 if a:islocal
4902" call Decho("local: xcmd<".xcmd.">")
4903 let ret= system(xcmd)
4904 else
4905" call Decho("remote: xcmd<".xcmd.">")
4906 let ret= s:RemoteSystem(xcmd)
4907 endif
4908 if v:shell_error < 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02004909 keepj call netrw#ErrorMsg(s:ERROR,"command<".xcmd."> failed, aborting",54)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004910 break
4911 else
4912 echo ret
4913 endif
4914 endfor
4915
4916 " unmark marked file list
4917 call s:NetrwUnmarkList(curbufnr,curdir)
4918
4919 " refresh the listing
Bram Moolenaaradc21822011-04-01 18:03:16 +02004920 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4921 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004922 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02004923 keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004924 endif
4925
4926" call Dret("s:NetrwMarkFileExe")
4927endfun
4928
4929" ---------------------------------------------------------------------
4930" s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix
4931" as the marked file(s) (toggles suffix presence)
4932" Uses the local marked file list.
4933fun! s:NetrwMarkHideSfx(islocal)
4934" call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")")
4935 let svpos = netrw#NetrwSavePosn()
4936 let curbufnr = bufnr("%")
4937
4938 " s:netrwmarkfilelist_{curbufnr}: the List of marked files
4939 if exists("s:netrwmarkfilelist_{curbufnr}")
4940
4941 for fname in s:netrwmarkfilelist_{curbufnr}
4942" call Decho("s:NetrwMarkFileCopy: fname<".fname.">")
4943 " construct suffix pattern
4944 if fname =~ '\.'
4945 let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','')
4946 else
4947 let sfxpat= '^\%(\%(\.\)\@!.\)*$'
4948 endif
4949 " determine if its in the hiding list or not
4950 let inhidelist= 0
4951 if g:netrw_list_hide != ""
4952 let itemnum = 0
4953 let hidelist= split(g:netrw_list_hide,',')
4954 for hidepat in hidelist
4955 if sfxpat == hidepat
4956 let inhidelist= 1
4957 break
4958 endif
4959 let itemnum= itemnum + 1
4960 endfor
4961 endif
4962" call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">")
4963 if inhidelist
4964 " remove sfxpat from list
4965 call remove(hidelist,itemnum)
4966 let g:netrw_list_hide= join(hidelist,",")
4967 elseif g:netrw_list_hide != ""
4968 " append sfxpat to non-empty list
4969 let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat
4970 else
4971 " set hiding list to sfxpat
4972 let g:netrw_list_hide= sfxpat
4973 endif
4974 endfor
4975
4976 " refresh the listing
Bram Moolenaaradc21822011-04-01 18:03:16 +02004977 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4978 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004979 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02004980 keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004981 endif
4982
4983" call Dret("s:NetrwMarkHideSfx")
4984endfun
4985
4986" ---------------------------------------------------------------------
Bram Moolenaar15146672011-10-20 22:22:38 +02004987" s:NetrwMarkFileVimCmd: (invoked by mX) execute arbitrary vim command on marked files, one at a time {{{2
4988" Uses the local marked-file list.
4989fun! s:NetrwMarkFileVimCmd(islocal)
4990" call Dfunc("s:NetrwMarkFileVimCmd(islocal=".a:islocal.")")
4991 let svpos = netrw#NetrwSavePosn()
4992 let curdir = b:netrw_curdir
4993 let curbufnr = bufnr("%")
4994
4995 if exists("s:netrwmarkfilelist_{curbufnr}")
4996 " get the command
4997 call inputsave()
4998 let cmd= input("Enter vim command: ","","file")
4999 call inputrestore()
5000" call Decho("cmd<".cmd.">")
5001 if cmd == ""
5002" " call Dret("s:NetrwMarkFileVimCmd : early exit, empty command")
5003 return
5004 endif
5005
5006 " apply command to marked files. Substitute: filename -> %
5007 " If no %, then append a space and the filename to the command
5008 for fname in s:netrwmarkfilelist_{curbufnr}
5009" call Decho("fname<".fname.">")
5010 if a:islocal
5011 1split
5012 exe "sil! keepalt e ".fnameescape(fname)
5013" call Decho("local<".fname.">: exe ".cmd)
5014 exe cmd
5015 exe "sil! keepalt wq!"
5016 else
5017 " COMBAK -- not supported yet
5018" call Decho("remote<".fname.">: exe ".cmd." : NOT SUPPORTED YET")
5019 echo "sorry, \"mX\" not supported yet for remote files"
5020 endif
5021 endfor
5022
5023 " unmark marked file list
5024 call s:NetrwUnmarkList(curbufnr,curdir)
5025
5026 " refresh the listing
5027 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5028 keepj call netrw#NetrwRestorePosn(svpos)
5029 else
5030 keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
5031 endif
5032
5033" call Dret("s:NetrwMarkFileVimCmd")
5034endfun
5035
5036" ---------------------------------------------------------------------
5037" s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix
5038" as the marked file(s) (toggles suffix presence)
5039" Uses the local marked file list.
5040fun! s:NetrwMarkHideSfx(islocal)
5041" call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")")
5042 let svpos = netrw#NetrwSavePosn()
5043 let curbufnr = bufnr("%")
5044
5045 " s:netrwmarkfilelist_{curbufnr}: the List of marked files
5046 if exists("s:netrwmarkfilelist_{curbufnr}")
5047
5048 for fname in s:netrwmarkfilelist_{curbufnr}
5049" call Decho("s:NetrwMarkFileCopy: fname<".fname.">")
5050 " construct suffix pattern
5051 if fname =~ '\.'
5052 let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','')
5053 else
5054 let sfxpat= '^\%(\%(\.\)\@!.\)*$'
5055 endif
5056 " determine if its in the hiding list or not
5057 let inhidelist= 0
5058 if g:netrw_list_hide != ""
5059 let itemnum = 0
5060 let hidelist= split(g:netrw_list_hide,',')
5061 for hidepat in hidelist
5062 if sfxpat == hidepat
5063 let inhidelist= 1
5064 break
5065 endif
5066 let itemnum= itemnum + 1
5067 endfor
5068 endif
5069" call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">")
5070 if inhidelist
5071 " remove sfxpat from list
5072 call remove(hidelist,itemnum)
5073 let g:netrw_list_hide= join(hidelist,",")
5074 elseif g:netrw_list_hide != ""
5075 " append sfxpat to non-empty list
5076 let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat
5077 else
5078 " set hiding list to sfxpat
5079 let g:netrw_list_hide= sfxpat
5080 endif
5081 endfor
5082
5083 " refresh the listing
5084 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5085 keepj call netrw#NetrwRestorePosn(svpos)
5086 else
5087 keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
5088 endif
5089
5090" call Dret("s:NetrwMarkHideSfx")
5091endfun
5092
5093" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00005094" s:NetrwMarkFileGrep: (invoked by mg) This function applies vimgrep to marked files {{{2
5095" Uses the global markfilelist
5096fun! s:NetrwMarkFileGrep(islocal)
5097" call Dfunc("s:NetrwMarkFileGrep(islocal=".a:islocal.")")
5098 let svpos = netrw#NetrwSavePosn()
Bram Moolenaar446cb832008-06-24 21:56:24 +00005099 let curbufnr = bufnr("%")
5100
5101 if exists("s:netrwmarkfilelist")
5102" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005103 let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005104 call s:NetrwUnmarkAll()
5105
5106 " ask user for pattern
5107 call inputsave()
5108 let pat= input("Enter pattern: ","")
5109 call inputrestore()
5110 if pat !~ '^\s'
5111 if pat !~ '^/'
5112 let pat= '/'.pat.'/'
5113 endif
5114 let pat= " ".pat
5115 endif
5116
5117 " use vimgrep for both local and remote
5118" call Decho("exe vimgrep".pat." ".netrwmarkfilelist)
Bram Moolenaar5c736222010-01-06 20:54:52 +01005119 try
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005120 exe "keepj noautocmd vimgrep".pat." ".netrwmarkfilelist
Bram Moolenaar5c736222010-01-06 20:54:52 +01005121 catch /^Vim\%((\a\+)\)\=:E480/
Bram Moolenaaradc21822011-04-01 18:03:16 +02005122 keepj call netrw#ErrorMsg(s:WARNING,"no match with pattern<".pattern.">",76)
Bram Moolenaar5c736222010-01-06 20:54:52 +01005123" call Dret("s:NetrwMarkFileGrep : unable to find pattern<".pattern.">")
5124 return
5125 endtry
Bram Moolenaar446cb832008-06-24 21:56:24 +00005126
5127 2match none
Bram Moolenaaradc21822011-04-01 18:03:16 +02005128 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005129 endif
5130
5131" call Dret("s:NetrwMarkFileGrep")
5132endfun
5133
5134" ---------------------------------------------------------------------
5135" s:NetrwMarkFileMove: (invoked by mm) execute arbitrary command on marked files, one at a time {{{2
5136" uses the global marked file list
5137" s:netrwmfloc= 0: target directory is remote
5138" = 1: target directory is local
5139fun! s:NetrwMarkFileMove(islocal)
5140" call Dfunc("s:NetrwMarkFileMove(islocal=".a:islocal.")")
5141 let curdir = b:netrw_curdir
5142 let curbufnr = bufnr("%")
5143
5144 " sanity check
5145 if !exists("s:netrwmarkfilelist_{bufnr('%')}") || empty(s:netrwmarkfilelist_{bufnr('%')})
Bram Moolenaaradc21822011-04-01 18:03:16 +02005146 keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005147" call Dret("s:NetrwMarkFileMove")
5148 return
5149 endif
5150" call Decho("sanity chk passed: s:netrwmarkfilelist_".bufnr('%')."<".string(s:netrwmarkfilelist_{bufnr('%')}))
5151 if !exists("s:netrwmftgt")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005152 keepj call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005153" call Dret("s:NetrwMarkFileCopy 0")
5154 return 0
5155 endif
5156" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
5157
5158 if a:islocal && s:netrwmftgt_islocal
5159 " move: local -> local
5160" call Decho("move from local to local")
5161" call Decho("(s:NetrwMarkFileMove) local to local move")
5162 if executable(g:netrw_localmovecmd)
5163 for fname in s:netrwmarkfilelist_{bufnr("%")}
5164" call Decho("system(".g:netrw_localmovecmd." ".shellescape(fname)." ".shellescape(s:netrwmftgt).")")
5165 let ret= system(g:netrw_localmovecmd." ".shellescape(fname)." ".shellescape(s:netrwmftgt))
5166 if v:shell_error < 0
5167 call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> failed, aborting",54)
5168 break
5169 endif
5170 endfor
5171 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02005172 keepj call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> is not executable!",57)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005173 endif
5174
5175 elseif a:islocal && !s:netrwmftgt_islocal
5176 " move: local -> remote
5177" call Decho("move from local to remote")
5178" call Decho("copy")
5179 let mflist= s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaaradc21822011-04-01 18:03:16 +02005180 keepj call s:NetrwMarkFileCopy(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005181" call Decho("remove")
5182 for fname in mflist
5183 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
5184 let ok = s:NetrwLocalRmFile(b:netrw_curdir,barefname,1)
5185 endfor
5186 unlet mflist
5187
5188 elseif !a:islocal && s:netrwmftgt_islocal
5189 " move: remote -> local
5190" call Decho("move from remote to local")
5191" call Decho("copy")
5192 let mflist= s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaaradc21822011-04-01 18:03:16 +02005193 keepj call s:NetrwMarkFileCopy(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005194" call Decho("remove")
5195 for fname in mflist
5196 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
5197 let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
5198 endfor
5199 unlet mflist
5200
5201 elseif !a:islocal && !s:netrwmftgt_islocal
5202 " move: remote -> remote
5203" call Decho("move from remote to remote")
5204" call Decho("copy")
5205 let mflist= s:netrwmarkfilelist_{bufnr("%")}
Bram Moolenaaradc21822011-04-01 18:03:16 +02005206 keepj call s:NetrwMarkFileCopy(a:islocal)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005207" call Decho("remove")
5208 for fname in mflist
5209 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
5210 let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
5211 endfor
5212 unlet mflist
5213 endif
5214
5215 " -------
5216 " cleanup
5217 " -------
5218" call Decho("cleanup")
5219
5220 " remove markings from local buffer
5221 call s:NetrwUnmarkList(curbufnr,curdir) " remove markings from local buffer
5222
5223 " refresh buffers
5224 if !s:netrwmftgt_islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02005225" call Decho("refresh netrwmftgt<".s:netrwmftgt.">")
5226 keepj call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005227 endif
5228 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02005229" call Decho("refresh b:netrw_curdir<".b:netrw_curdir.">")
5230 keepj call s:NetrwRefreshDir(a:islocal,b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005231 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01005232 if g:netrw_fastbrowse <= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02005233" call Decho("since g:netrw_fastbrowse=".g:netrw_fastbrowse.", perform shell cmd refresh")
5234 keepj call s:LocalBrowseShellCmdRefresh()
Bram Moolenaar5c736222010-01-06 20:54:52 +01005235 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005236
5237" call Dret("s:NetrwMarkFileMove")
5238endfun
5239
5240" ---------------------------------------------------------------------
5241" s:NetrwMarkFilePrint: (invoked by mp) This function prints marked files {{{2
5242" using the hardcopy command. Local marked-file list only.
5243fun! s:NetrwMarkFilePrint(islocal)
5244" call Dfunc("s:NetrwMarkFilePrint(islocal=".a:islocal.")")
5245 let curbufnr= bufnr("%")
5246 if exists("s:netrwmarkfilelist_{curbufnr}")
5247 let netrwmarkfilelist = s:netrwmarkfilelist_{curbufnr}
5248 let curdir = b:netrw_curdir
5249 call s:NetrwUnmarkList(curbufnr,curdir)
5250 for fname in netrwmarkfilelist
5251 if a:islocal
5252 if g:netrw_keepdir
5253 let fname= s:ComposePath(curdir,fname)
5254 endif
5255 else
5256 let fname= curdir.fname
5257 endif
5258 1split
5259 " the autocmds will handle both local and remote files
Bram Moolenaaradc21822011-04-01 18:03:16 +02005260" call Decho("exe sil e ".escape(fname,' '))
5261 exe "sil e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005262" call Decho("hardcopy")
5263 hardcopy
5264 q
5265 endfor
5266 2match none
5267 endif
5268" call Dret("s:NetrwMarkFilePrint")
5269endfun
5270
5271" ---------------------------------------------------------------------
5272" s:NetrwMarkFileRegexp: (invoked by mr) This function is used to mark {{{2
5273" files when given a regexp (for which a prompt is
5274" issued).
5275fun! s:NetrwMarkFileRegexp(islocal)
5276" call Dfunc("s:NetrwMarkFileRegexp(islocal=".a:islocal.")")
5277
5278 " get the regular expression
5279 call inputsave()
5280 let regexp= input("Enter regexp: ","","file")
5281 call inputrestore()
5282
5283 if a:islocal
5284 " get the matching list of files using local glob()
5285" call Decho("handle local regexp")
5286 let dirname = escape(b:netrw_curdir,g:netrw_glob_escape)
Bram Moolenaar5c736222010-01-06 20:54:52 +01005287 let files = glob(s:ComposePath(dirname,regexp))
5288" call Decho("files<".files.">")
5289 let filelist= split(files,"\n")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005290
5291 " mark the list of files
Bram Moolenaar5c736222010-01-06 20:54:52 +01005292 for fname in filelist
5293" call Decho("fname<".fname.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005294 keepj call s:NetrwMarkFile(a:islocal,substitute(fname,'^.*/','',''))
Bram Moolenaar5c736222010-01-06 20:54:52 +01005295 endfor
Bram Moolenaar446cb832008-06-24 21:56:24 +00005296
5297 else
5298" call Decho("handle remote regexp")
5299
5300 " convert displayed listing into a filelist
5301 let eikeep = &ei
5302 let areg = @a
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005303 sil keepj %y a
Bram Moolenaar446cb832008-06-24 21:56:24 +00005304 set ei=all ma
5305" call Decho("set ei=all ma")
5306 1split
Bram Moolenaaradc21822011-04-01 18:03:16 +02005307 keepj call s:NetrwEnew()
5308 keepj call s:NetrwSafeOptions()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005309 sil keepj norm! "ap
5310 keepj 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00005311 let bannercnt= search('^" =====','W')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005312 exe "sil keepj 1,".bannercnt."d"
Bram Moolenaar446cb832008-06-24 21:56:24 +00005313 set bt=nofile
5314 if g:netrw_liststyle == s:LONGLIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005315 sil keepj %s/\s\{2,}\S.*$//e
Bram Moolenaar5c736222010-01-06 20:54:52 +01005316 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005317 elseif g:netrw_liststyle == s:WIDELIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005318 sil keepj %s/\s\{2,}/\r/ge
Bram Moolenaar5c736222010-01-06 20:54:52 +01005319 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005320 elseif g:netrw_liststyle == s:TREELIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005321 sil keepj %s/^| //e
5322 sil! keepj g/^ .*$/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01005323 call histdel("/",-1)
5324 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005325 endif
5326 " convert regexp into the more usual glob-style format
5327 let regexp= substitute(regexp,'\*','.*','g')
5328" call Decho("regexp<".regexp.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005329 exe "sil! keepj v/".escape(regexp,'/')."/d"
Bram Moolenaar5c736222010-01-06 20:54:52 +01005330 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005331 let filelist= getline(1,line("$"))
5332 q!
5333 for filename in filelist
Bram Moolenaaradc21822011-04-01 18:03:16 +02005334 keepj call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','',''))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005335 endfor
5336 unlet filelist
5337 let @a = areg
5338 let &ei = eikeep
5339 endif
5340
5341" call Dret("s:NetrwMarkFileRegexp")
5342endfun
5343
5344" ---------------------------------------------------------------------
5345" s:NetrwMarkFileSource: (invoked by ms) This function sources marked files {{{2
5346" Uses the local marked file list.
5347fun! s:NetrwMarkFileSource(islocal)
5348" call Dfunc("s:NetrwMarkFileSource(islocal=".a:islocal.")")
5349 let curbufnr= bufnr("%")
5350 if exists("s:netrwmarkfilelist_{curbufnr}")
5351 let netrwmarkfilelist = s:netrwmarkfilelist_{bufnr("%")}
5352 let curdir = b:netrw_curdir
5353 call s:NetrwUnmarkList(curbufnr,curdir)
5354 for fname in netrwmarkfilelist
5355 if a:islocal
5356 if g:netrw_keepdir
5357 let fname= s:ComposePath(curdir,fname)
5358 endif
5359 else
5360 let fname= curdir.fname
5361 endif
5362 " the autocmds will handle sourcing both local and remote files
Bram Moolenaarc236c162008-07-13 17:41:49 +00005363" call Decho("exe so ".fnameescape(fname))
5364 exe "so ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005365 endfor
5366 2match none
5367 endif
5368" call Dret("s:NetrwMarkFileSource")
5369endfun
5370
5371" ---------------------------------------------------------------------
5372" s:NetrwMarkFileTag: (invoked by mT) This function applies g:netrw_ctags to marked files {{{2
5373" Uses the global markfilelist
5374fun! s:NetrwMarkFileTag(islocal)
5375" call Dfunc("s:NetrwMarkFileTag(islocal=".a:islocal.")")
5376 let svpos = netrw#NetrwSavePosn()
5377 let curdir = b:netrw_curdir
5378 let curbufnr = bufnr("%")
5379
5380 if exists("s:netrwmarkfilelist")
5381" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005382 let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "shellescape(v:val,".!a:islocal.")"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005383 call s:NetrwUnmarkAll()
5384
5385 if a:islocal
5386 if executable(g:netrw_ctags)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005387" call Decho("call system(".g:netrw_ctags." ".netrwmarkfilelist.")")
5388 call system(g:netrw_ctags." ".netrwmarkfilelist)
5389 else
5390 call netrw#ErrorMsg(s:ERROR,"g:netrw_ctags<".g:netrw_ctags."> is not executable!",51)
5391 endif
5392 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00005393 let cmd = s:RemoteSystem(g:netrw_ctags." ".netrwmarkfilelist)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005394 call netrw#NetrwObtain(a:islocal,"tags")
5395 let curdir= b:netrw_curdir
5396 1split
5397 e tags
5398 let path= substitute(curdir,'^\(.*\)/[^/]*$','\1/','')
5399" call Decho("curdir<".curdir."> path<".path.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005400 exe 'keepj %s/\t\(\S\+\)\t/\t'.escape(path,"/\n\r\\").'\1\t/e'
Bram Moolenaar5c736222010-01-06 20:54:52 +01005401 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005402 wq!
5403 endif
5404 2match none
5405 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5406 call netrw#NetrwRestorePosn(svpos)
5407 endif
5408
5409" call Dret("s:NetrwMarkFileTag")
5410endfun
5411
5412" ---------------------------------------------------------------------
5413" s:NetrwMarkFileTgt: (invoked by mt) This function sets up a marked file target {{{2
5414" Sets up two variables,
5415" s:netrwmftgt : holds the target directory
5416" s:netrwmftgt_islocal : 0=target directory is remote
5417" 1=target directory is local
5418fun! s:NetrwMarkFileTgt(islocal)
5419" call Dfunc("s:NetrwMarkFileTgt(islocal=".a:islocal.")")
5420 let svpos = netrw#NetrwSavePosn()
5421 let curdir = b:netrw_curdir
5422 let hadtgt = exists("s:netrwmftgt")
5423 if !exists("w:netrw_bannercnt")
5424 let w:netrw_bannercnt= b:netrw_bannercnt
5425 endif
5426
5427 " set up target
5428 if line(".") < w:netrw_bannercnt
5429 " if cursor in banner region, use b:netrw_curdir for the target
5430 let s:netrwmftgt= b:netrw_curdir
5431" call Decho("inbanner: s:netrwmftgt<".s:netrwmftgt.">")
5432
5433 else
5434 " get word under cursor.
5435 " * If directory, use it for the target.
5436 " * If file, use b:netrw_curdir for the target
5437 let curword= s:NetrwGetWord()
5438 let tgtdir = s:ComposePath(curdir,curword)
5439 if a:islocal && isdirectory(tgtdir)
5440 let s:netrwmftgt = tgtdir
5441" call Decho("local isdir: s:netrwmftgt<".s:netrwmftgt.">")
5442 elseif !a:islocal && tgtdir =~ '/$'
5443 let s:netrwmftgt = tgtdir
5444" call Decho("remote isdir: s:netrwmftgt<".s:netrwmftgt.">")
5445 else
5446 let s:netrwmftgt = curdir
5447" call Decho("isfile: s:netrwmftgt<".s:netrwmftgt.">")
5448 endif
5449 endif
5450 if a:islocal
5451 " simplify the target (eg. /abc/def/../ghi -> /abc/ghi)
5452 let s:netrwmftgt= simplify(s:netrwmftgt)
5453" call Decho("simplify: s:netrwmftgt<".s:netrwmftgt.">")
5454 endif
5455 if g:netrw_cygwin
5456 let s:netrwmftgt= substitute(system("cygpath ".shellescape(s:netrwmftgt)),'\n$','','')
5457 let s:netrwmftgt= substitute(s:netrwmftgt,'\n$','','')
5458 endif
5459 let s:netrwmftgt_islocal= a:islocal
5460
Bram Moolenaar5c736222010-01-06 20:54:52 +01005461 if g:netrw_fastbrowse <= 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00005462 call s:LocalBrowseShellCmdRefresh()
5463 endif
5464 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5465 call netrw#NetrwRestorePosn(svpos)
5466 if !hadtgt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005467 sil! keepj norm! j
Bram Moolenaar446cb832008-06-24 21:56:24 +00005468 endif
5469
5470" call Dret("s:NetrwMarkFileTgt : netrwmftgt<".(exists("s:netrwmftgt")? s:netrwmftgt : "").">")
5471endfun
5472
5473" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00005474" s:NetrwOpenFile: query user for a filename and open it {{{2
5475fun! s:NetrwOpenFile(islocal)
5476" call Dfunc("s:NetrwOpenFile(islocal=".a:islocal.")")
5477 call inputsave()
5478 let fname= input("Enter filename: ")
5479 call inputrestore()
5480 if fname !~ '[/\\]'
5481 if exists("b:netrw_curdir")
5482 if exists("g:netrw_quiet")
5483 let netrw_quiet_keep = g:netrw_quiet
5484 endif
5485 let g:netrw_quiet = 1
5486 if b:netrw_curdir =~ '/$'
5487 exe "e ".fnameescape(b:netrw_curdir.fname)
5488 else
5489 exe "e ".fnameescape(b:netrw_curdir."/".fname)
5490 endif
5491 if exists("netrw_quiet_keep")
5492 let g:netrw_quiet= netrw_quiet_keep
5493 else
5494 unlet g:netrw_quiet
5495 endif
5496 endif
5497 else
5498 exe "e ".fnameescape(fname)
5499 endif
5500" call Dret("s:NetrwOpenFile")
5501endfun
5502
5503" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00005504" s:NetrwUnmarkList: delete local marked file lists and remove their contents from the global marked-file list {{{2
5505fun! s:NetrwUnmarkList(curbufnr,curdir)
5506" call Dfunc("s:NetrwUnmarkList(curbufnr=".a:curbufnr." curdir<".a:curdir.">)")
5507
5508 " remove all files in local marked-file list from global list
5509 if exists("s:netrwmarkfilelist_{a:curbufnr}")
5510 for mfile in s:netrwmarkfilelist_{a:curbufnr}
5511 let dfile = s:ComposePath(a:curdir,mfile) " prepend directory to mfile
5512 let idx = index(s:netrwmarkfilelist,dfile) " get index in list of dfile
5513 call remove(s:netrwmarkfilelist,idx) " remove from global list
5514 endfor
5515 if s:netrwmarkfilelist == []
5516 unlet s:netrwmarkfilelist
5517 endif
5518
5519 " getting rid of the local marked-file lists is easy
5520 unlet s:netrwmarkfilelist_{a:curbufnr}
5521 endif
5522 if exists("s:netrwmarkfilemtch_{a:curbufnr}")
5523 unlet s:netrwmarkfilemtch_{a:curbufnr}
5524 endif
5525 2match none
5526" call Dret("s:NetrwUnmarkList")
5527endfun
5528
5529" ---------------------------------------------------------------------
5530" s:NetrwUnmarkAll: remove the global marked file list and all local ones {{{2
5531fun! s:NetrwUnmarkAll()
5532" call Dfunc("s:NetrwUnmarkAll()")
5533 if exists("s:netrwmarkfilelist")
5534 unlet s:netrwmarkfilelist
5535 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02005536 sil call s:NetrwUnmarkAll2()
Bram Moolenaar446cb832008-06-24 21:56:24 +00005537 2match none
5538" call Dret("s:NetrwUnmarkAll")
5539endfun
5540
5541" ---------------------------------------------------------------------
5542" s:NetrwUnmarkAll2: {{{2
5543fun! s:NetrwUnmarkAll2()
5544" call Dfunc("s:NetrwUnmarkAll2()")
5545 redir => netrwmarkfilelist_let
5546 let
5547 redir END
5548 let netrwmarkfilelist_list= split(netrwmarkfilelist_let,'\n') " convert let string into a let list
5549 call filter(netrwmarkfilelist_list,"v:val =~ '^s:netrwmarkfilelist_'") " retain only those vars that start as s:netrwmarkfilelist_
5550 call map(netrwmarkfilelist_list,"substitute(v:val,'\\s.*$','','')") " remove what the entries are equal to
5551 for flist in netrwmarkfilelist_list
5552 let curbufnr= substitute(flist,'s:netrwmarkfilelist_','','')
5553 unlet s:netrwmarkfilelist_{curbufnr}
5554 unlet s:netrwmarkfilemtch_{curbufnr}
5555 endfor
5556" call Dret("s:NetrwUnmarkAll2")
5557endfun
5558
5559" ---------------------------------------------------------------------
5560" s:NetrwUnMarkFile: {{{2
5561fun! s:NetrwUnMarkFile(islocal)
5562" call Dfunc("s:NetrwUnMarkFile(islocal=".a:islocal.")")
5563 let svpos = netrw#NetrwSavePosn()
5564 let curbufnr = bufnr("%")
5565
5566 " unmark marked file list (although I expect s:NetrwUpload()
5567 " to do it, I'm just making sure)
5568 if exists("s:netrwmarkfilelist_{bufnr('%')}")
5569" call Decho("unlet'ing: s:netrwmarkfile[list|mtch]_".bufnr("%"))
5570 unlet s:netrwmarkfilelist
5571 unlet s:netrwmarkfilelist_{curbufnr}
5572 unlet s:netrwmarkfilemtch_{curbufnr}
5573 2match none
5574 endif
5575
5576" call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5577 call netrw#NetrwRestorePosn(svpos)
5578" call Dret("s:NetrwUnMarkFile")
5579endfun
5580
5581" ---------------------------------------------------------------------
5582" s:NetrwMenu: generates the menu for gvim and netrw {{{2
5583fun! s:NetrwMenu(domenu)
5584
5585 if !exists("g:NetrwMenuPriority")
5586 let g:NetrwMenuPriority= 80
5587 endif
5588
Bram Moolenaaradc21822011-04-01 18:03:16 +02005589 if has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaar446cb832008-06-24 21:56:24 +00005590" call Dfunc("NetrwMenu(domenu=".a:domenu.")")
5591
5592 if !exists("s:netrw_menu_enabled") && a:domenu
5593" call Decho("initialize menu")
5594 let s:netrw_menu_enabled= 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005595 exe 'sil! menu '.g:NetrwMenuPriority.'.1 '.g:NetrwTopLvlMenu.'Help<tab><F1> <F1>'
5596 exe 'sil! menu '.g:NetrwMenuPriority.'.5 '.g:NetrwTopLvlMenu.'-Sep1- :'
5597 exe 'sil! menu '.g:NetrwMenuPriority.'.6 '.g:NetrwTopLvlMenu.'Go\ Up\ Directory<tab>- -'
5598 exe 'sil! menu '.g:NetrwMenuPriority.'.7 '.g:NetrwTopLvlMenu.'Apply\ Special\ Viewer<tab>x x'
5599 exe 'sil! menu '.g:NetrwMenuPriority.'.8.1 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Current\ Directory<tab>mb mb'
5600 exe 'sil! menu '.g:NetrwMenuPriority.'.8.4 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Prev\ Dir\ (History)<tab>u u'
5601 exe 'sil! menu '.g:NetrwMenuPriority.'.8.5 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Next\ Dir\ (History)<tab>U U'
5602 exe 'sil! menu '.g:NetrwMenuPriority.'.8.6 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.List<tab>qb qb'
5603 exe 'sil! menu '.g:NetrwMenuPriority.'.9.1 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ File\ Hiding\ List<tab><ctrl-h>'." \<c-h>'"
5604 exe 'sil! menu '.g:NetrwMenuPriority.'.9.2 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ Sorting\ Sequence<tab>S S'
5605 exe 'sil! menu '.g:NetrwMenuPriority.'.9.3 '.g:NetrwTopLvlMenu.'Browsing\ Control.Quick\ Hide/Unhide\ Dot\ Files<tab>'."gh gh"
5606 exe 'sil! menu '.g:NetrwMenuPriority.'.9.4 '.g:NetrwTopLvlMenu.'Browsing\ Control.Refresh\ Listing<tab>'."<ctrl-l> \<c-l>"
5607 exe 'sil! menu '.g:NetrwMenuPriority.'.9.5 '.g:NetrwTopLvlMenu.'Browsing\ Control.Settings/Options<tab>:NetrwSettings '.":NetrwSettings\<cr>"
5608 exe 'sil! menu '.g:NetrwMenuPriority.'.10 '.g:NetrwTopLvlMenu.'Delete\ File/Directory<tab>D D'
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02005609 exe 'sil! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Create\ New\ File<tab>% %'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005610 exe 'sil! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Current\ Window<tab><cr> '."\<cr>"
5611 exe 'sil! menu '.g:NetrwMenuPriority.'.11.2 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Preview\ File/Directory<tab>p p'
5612 exe 'sil! menu '.g:NetrwMenuPriority.'.11.3 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Previous\ Window<tab>P P'
5613 exe 'sil! menu '.g:NetrwMenuPriority.'.11.4 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Window<tab>o o'
5614 exe 'sil! menu '.g:NetrwMenuPriority.'.11.5 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Vertical\ Window<tab>v v'
5615 exe 'sil! menu '.g:NetrwMenuPriority.'.12.1 '.g:NetrwTopLvlMenu.'Explore.Directory\ Name :Explore '
5616 exe 'sil! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (curdir\ only)<tab>:Explore\ */ :Explore */'
5617 exe 'sil! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (+subdirs)<tab>:Explore\ **/ :Explore **/'
5618 exe 'sil! menu '.g:NetrwMenuPriority.'.12.3 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ String\ Pattern\ (curdir\ only)<tab>:Explore\ *// :Explore *//'
5619 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ String\ Pattern\ (+subdirs)<tab>:Explore\ **// :Explore **//'
5620 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Next\ Match<tab>:Nexplore :Nexplore<cr>'
5621 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Prev\ Match<tab>:Pexplore :Pexplore<cr>'
5622 exe 'sil! menu '.g:NetrwMenuPriority.'.13 '.g:NetrwTopLvlMenu.'Make\ Subdirectory<tab>d d'
5623 exe 'sil! menu '.g:NetrwMenuPriority.'.14.1 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ File<tab>mf mf'
5624 exe 'sil! menu '.g:NetrwMenuPriority.'.14.2 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ Files\ by\ Regexp<tab>mr mr'
5625 exe 'sil! menu '.g:NetrwMenuPriority.'.14.3 '.g:NetrwTopLvlMenu.'Marked\ Files.Hide-Show-List\ Control<tab>a a'
5626 exe 'sil! menu '.g:NetrwMenuPriority.'.14.4 '.g:NetrwTopLvlMenu.'Marked\ Files.Copy\ To\ Target<tab>mc mc'
5627 exe 'sil! menu '.g:NetrwMenuPriority.'.14.5 '.g:NetrwTopLvlMenu.'Marked\ Files.Delete<tab>D D'
5628 exe 'sil! menu '.g:NetrwMenuPriority.'.14.6 '.g:NetrwTopLvlMenu.'Marked\ Files.Diff<tab>md md'
5629 exe 'sil! menu '.g:NetrwMenuPriority.'.14.7 '.g:NetrwTopLvlMenu.'Marked\ Files.Edit<tab>me me'
5630 exe 'sil! menu '.g:NetrwMenuPriority.'.14.8 '.g:NetrwTopLvlMenu.'Marked\ Files.Exe\ Cmd<tab>mx mx'
5631 exe 'sil! menu '.g:NetrwMenuPriority.'.14.9 '.g:NetrwTopLvlMenu.'Marked\ Files.Move\ To\ Target<tab>mm mm'
5632 exe 'sil! menu '.g:NetrwMenuPriority.'.14.10 '.g:NetrwTopLvlMenu.'Marked\ Files.Obtain<tab>O O'
5633 exe 'sil! menu '.g:NetrwMenuPriority.'.14.11 '.g:NetrwTopLvlMenu.'Marked\ Files.Print<tab>mp mp'
5634 exe 'sil! menu '.g:NetrwMenuPriority.'.14.12 '.g:NetrwTopLvlMenu.'Marked\ Files.Replace<tab>R R'
5635 exe 'sil! menu '.g:NetrwMenuPriority.'.14.13 '.g:NetrwTopLvlMenu.'Marked\ Files.Set\ Target<tab>mt mt'
5636 exe 'sil! menu '.g:NetrwMenuPriority.'.14.14 '.g:NetrwTopLvlMenu.'Marked\ Files.Tag<tab>mT mT'
5637 exe 'sil! menu '.g:NetrwMenuPriority.'.14.15 '.g:NetrwTopLvlMenu.'Marked\ Files.Zip/Unzip/Compress/Uncompress<tab>mz mz'
5638 exe 'sil! menu '.g:NetrwMenuPriority.'.15 '.g:NetrwTopLvlMenu.'Obtain\ File<tab>O O'
5639 exe 'sil! menu '.g:NetrwMenuPriority.'.16.1 '.g:NetrwTopLvlMenu.'Style.Listing\ Style\ (thin-long-wide-tree)<tab>i i'
5640 exe 'sil! menu '.g:NetrwMenuPriority.'.16.2 '.g:NetrwTopLvlMenu.'Style.Normal-Hide-Show<tab>a a'
5641 exe 'sil! menu '.g:NetrwMenuPriority.'.16.3 '.g:NetrwTopLvlMenu.'Style.Reverse\ Sorting\ Order<tab>'."r r"
5642 exe 'sil! menu '.g:NetrwMenuPriority.'.16.4 '.g:NetrwTopLvlMenu.'Style.Sorting\ Method\ (name-time-size)<tab>s s'
5643 exe 'sil! menu '.g:NetrwMenuPriority.'.17 '.g:NetrwTopLvlMenu.'Rename\ File/Directory<tab>R R'
5644 exe 'sil! menu '.g:NetrwMenuPriority.'.18 '.g:NetrwTopLvlMenu.'Set\ Current\ Directory<tab>c c'
Bram Moolenaar5c736222010-01-06 20:54:52 +01005645 call s:NetrwBookmarkMenu() " provide some history! uses priorities 2,3, reserves 4, 8.2.x
Bram Moolenaar446cb832008-06-24 21:56:24 +00005646 let s:netrw_menucnt= 28
5647
5648 elseif !a:domenu
5649 let s:netrwcnt = 0
5650 let curwin = winnr()
5651 windo if getline(2) =~ "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif
5652 exe curwin."wincmd w"
5653
5654 if s:netrwcnt <= 1
5655" call Decho("clear menus")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005656 exe 'sil! unmenu '.g:NetrwTopLvlMenu
Bram Moolenaaradc21822011-04-01 18:03:16 +02005657" call Decho('exe sil! unmenu '.g:NetrwTopLvlMenu.'*')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005658 sil! unlet s:netrw_menu_enabled
Bram Moolenaar446cb832008-06-24 21:56:24 +00005659 endif
5660 endif
5661" call Dret("NetrwMenu")
5662 endif
5663
5664endfun
5665
5666" ---------------------------------------------------------------------
5667" s:NetrwObtain: obtain file under cursor or from markfile list {{{2
5668" Used by the O maps (as <SID>NetrwObtain())
5669fun! s:NetrwObtain(islocal)
5670" call Dfunc("NetrwObtain(islocal=".a:islocal.")")
5671
5672 if exists("s:netrwmarkfilelist_{bufnr('%')}")
Bram Moolenaar5c736222010-01-06 20:54:52 +01005673 let islocal= s:netrwmarkfilelist_{bufnr('%')}[1] !~ '^\a\+://'
5674 call netrw#NetrwObtain(islocal,s:netrwmarkfilelist_{bufnr('%')})
Bram Moolenaar446cb832008-06-24 21:56:24 +00005675 call s:NetrwUnmarkList(bufnr('%'),b:netrw_curdir)
5676 else
5677 call netrw#NetrwObtain(a:islocal,expand("<cWORD>"))
5678 endif
5679
5680" call Dret("NetrwObtain")
5681endfun
5682
5683" ---------------------------------------------------------------------
5684" netrw#NetrwObtain: {{{2
5685" netrw#NetrwObtain(islocal,fname[,tgtdirectory])
5686" islocal=0 obtain from remote source
5687" =1 obtain from local source
5688" fname : a filename or a list of filenames
5689" tgtdir : optional place where files are to go (not present, uses getcwd())
5690fun! netrw#NetrwObtain(islocal,fname,...)
5691" call Dfunc("netrw#NetrwObtain(islocal=".a:islocal." fname<".((type(a:fname) == 1)? a:fname : string(a:fname)).">) a:0=".a:0)
5692 " NetrwStatusLine support - for obtaining support
5693
5694 if type(a:fname) == 1
5695 let fnamelist= [ a:fname ]
5696 elseif type(a:fname) == 3
5697 let fnamelist= a:fname
5698 else
5699 call netrw#ErrorMsg(s:ERROR,"attempting to use NetrwObtain on something not a filename or a list",62)
5700" call Dret("netrw#NetrwObtain")
5701 return
5702 endif
5703" call Decho("fnamelist<".string(fnamelist).">")
5704 if a:0 > 0
5705 let tgtdir= a:1
5706 else
5707 let tgtdir= getcwd()
5708 endif
5709" call Decho("tgtdir<".tgtdir.">")
5710
Bram Moolenaar5c736222010-01-06 20:54:52 +01005711 if exists("b:netrw_islocal") && b:netrw_islocal
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005712 " obtain a file from local b:netrw_curdir to (local) tgtdir
5713" call Decho("obtain a file from local ".b:netrw_curdir." to ".tgtdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005714 if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir
5715 let topath= s:ComposePath(tgtdir,"")
5716 if (has("win32") || has("win95") || has("win64") || has("win16"))
5717 " transfer files one at time
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005718" call Decho("transfer files one at a time")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005719 for fname in fnamelist
Bram Moolenaarc236c162008-07-13 17:41:49 +00005720" call Decho("system(".g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath).")")
5721 call system(g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005722 endfor
5723 else
5724 " transfer files with one command
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005725" call Decho("transfer files with one command")
5726 let filelist= join(map(deepcopy(fnamelist),"shellescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005727" call Decho("system(".g:netrw_localcopycmd." ".filelist." ".shellescape(topath).")")
5728 call system(g:netrw_localcopycmd." ".filelist." ".shellescape(topath))
5729 endif
5730 elseif !exists("b:netrw_curdir")
5731 call netrw#ErrorMsg(s:ERROR,"local browsing directory doesn't exist!",36)
5732 else
5733 call netrw#ErrorMsg(s:WARNING,"local browsing directory and current directory are identical",37)
5734 endif
5735
5736 else
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005737 " obtain files from remote b:netrw_curdir to local tgtdir
5738" call Decho("obtain a file from remote ".b:netrw_curdir." to ".tgtdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005739 if type(a:fname) == 1
5740 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.a:fname)
5741 endif
5742 call s:NetrwMethod(b:netrw_curdir)
5743
5744 if b:netrw_method == 4
5745 " obtain file using scp
5746" call Decho("obtain via scp (method#4)")
5747 if exists("g:netrw_port") && g:netrw_port != ""
5748 let useport= " ".g:netrw_scpport." ".g:netrw_port
5749 else
5750 let useport= ""
5751 endif
5752 if b:netrw_fname =~ '/'
5753 let path= substitute(b:netrw_fname,'^\(.*/\).\{-}$','\1','')
5754 else
5755 let path= ""
5756 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005757 let filelist= join(map(deepcopy(fnamelist),'shellescape(g:netrw_machine.":".path.v:val,1)'))
Bram Moolenaarc236c162008-07-13 17:41:49 +00005758" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1))
5759 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005760
5761 elseif b:netrw_method == 2
5762 " obtain file using ftp + .netrc
5763" call Decho("obtain via ftp+.netrc (method #2)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005764 call s:SaveBufVars()|sil keepjumps new|call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00005765 let tmpbufnr= bufnr("%")
5766 setlocal ff=unix
5767 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005768 keepj put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +00005769" call Decho("filter input: ".getline('$'))
5770 endif
5771
5772 if exists("b:netrw_fname") && b:netrw_fname != ""
5773 call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
5774" call Decho("filter input: ".getline('$'))
5775 endif
5776
5777 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005778 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00005779" call Decho("filter input: ".getline('$'))
5780 endif
5781 for fname in fnamelist
5782 call setline(line("$")+1,'get "'.fname.'"')
5783" call Decho("filter input: ".getline('$'))
5784 endfor
5785 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02005786" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
5787 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 +00005788 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02005789" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
5790 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005791 endif
5792 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
5793 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
5794 let debugkeep= &debug
5795 setlocal debug=msg
5796 call netrw#ErrorMsg(s:ERROR,getline(1),4)
5797 let &debug= debugkeep
5798 endif
5799
5800 elseif b:netrw_method == 3
5801 " obtain with ftp + machine, id, passwd, and fname (ie. no .netrc)
5802" call Decho("obtain via ftp+mipf (method #3)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005803 call s:SaveBufVars()|sil keepjumps new|call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00005804 let tmpbufnr= bufnr("%")
5805 setlocal ff=unix
5806
5807 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005808 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00005809" call Decho("filter input: ".getline('$'))
5810 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005811 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00005812" call Decho("filter input: ".getline('$'))
5813 endif
5814
5815 if exists("g:netrw_ftp") && g:netrw_ftp == 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005816 keepj put =g:netrw_uid
Bram Moolenaar446cb832008-06-24 21:56:24 +00005817" call Decho("filter input: ".getline('$'))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005818 keepj put ='\"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00005819" call Decho("filter input: ".getline('$'))
5820 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005821 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00005822" call Decho("filter input: ".getline('$'))
5823 endif
5824
5825 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005826 keepj put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +00005827" call Decho("filter input: ".getline('$'))
5828 endif
5829
5830 if exists("b:netrw_fname") && b:netrw_fname != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005831 keepj call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005832" call Decho("filter input: ".getline('$'))
5833 endif
5834
5835 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005836 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00005837" call Decho("filter input: ".getline('$'))
5838 endif
5839
5840 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005841 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00005842" call Decho("filter input: ".getline('$'))
5843 endif
5844 for fname in fnamelist
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005845 keepj call setline(line("$")+1,'get "'.fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005846 endfor
5847" call Decho("filter input: ".getline('$'))
5848
5849 " perform ftp:
5850 " -i : turns off interactive prompting from ftp
5851 " -n unix : DON'T use <.netrc>, even though it exists
5852 " -n win32: quit being obnoxious about password
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005853 keepj norm! 1Gdd
Bram Moolenaaradc21822011-04-01 18:03:16 +02005854" call Decho("executing: %!".s:netrw_ftp_cmd." -i -n")
5855 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i -n"
Bram Moolenaar446cb832008-06-24 21:56:24 +00005856 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
5857 if getline(1) !~ "^$"
5858" call Decho("error<".getline(1).">")
5859 if !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005860 keepj call netrw#ErrorMsg(s:ERROR,getline(1),5)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005861 endif
5862 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01005863 elseif !exists("b:netrw_method") || b:netrw_method < 0
5864" call Dfunc("netrw#NetrwObtain : unsupported method")
5865 return
5866 endif
5867
5868 " restore status line
5869 if type(a:fname) == 1 && exists("s:netrw_users_stl")
Bram Moolenaaradc21822011-04-01 18:03:16 +02005870 keepj call s:SetupNetrwStatusLine(s:netrw_users_stl)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005871 endif
5872
5873 endif
5874
5875 " cleanup
5876 if exists("tmpbufnr")
5877 if bufnr("%") != tmpbufnr
5878 exe tmpbufnr."bw!"
5879 else
5880 q!
5881 endif
5882 endif
5883
5884" call Dret("netrw#NetrwObtain")
5885endfun
5886
5887" ---------------------------------------------------------------------
5888" s:NetrwPrevWinOpen: open file/directory in previous window. {{{2
5889" If there's only one window, then the window will first be split.
5890" Returns:
5891" choice = 0 : didn't have to choose
5892" choice = 1 : saved modified file in window first
5893" choice = 2 : didn't save modified file, opened window
5894" choice = 3 : cancel open
5895fun! s:NetrwPrevWinOpen(islocal)
5896" call Dfunc("NetrwPrevWinOpen(islocal=".a:islocal.")")
5897
5898 " grab a copy of the b:netrw_curdir to pass it along to newly split windows
5899 let curdir = b:netrw_curdir
5900
5901 " get last window number and the word currently under the cursor
5902 let lastwinnr = winnr("$")
5903 let curword = s:NetrwGetWord()
5904 let choice = 0
5905" call Decho("lastwinnr=".lastwinnr." curword<".curword.">")
5906
5907 let didsplit = 0
5908 if lastwinnr == 1
5909 " if only one window, open a new one first
5910" call Decho("only one window, so open a new one (g:netrw_alto=".g:netrw_alto.")")
5911 if g:netrw_preview
Bram Moolenaar15146672011-10-20 22:22:38 +02005912 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
5913" call Decho("exe ".(g:netrw_alto? "top " : "bot ")."vert ".winsz."wincmd s")
5914 exe (g:netrw_alto? "top " : "bot ")."vert ".winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00005915 else
Bram Moolenaar15146672011-10-20 22:22:38 +02005916 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
5917" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s")
5918 exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00005919 endif
5920 let didsplit = 1
5921
5922 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02005923 keepj call s:SaveBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00005924" call Decho("wincmd p")
5925 wincmd p
Bram Moolenaaradc21822011-04-01 18:03:16 +02005926 keepj call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00005927 " if the previous window's buffer has been changed (is modified),
5928 " and it doesn't appear in any other extant window, then ask the
5929 " user if s/he wants to abandon modifications therein.
5930 let bnr = winbufnr(0)
5931 let bnrcnt = 0
5932 if &mod
5933" call Decho("detected: prev window's buffer has been modified: bnr=".bnr." winnr#".winnr())
5934 let eikeep= &ei
5935 set ei=all
5936 windo if winbufnr(0) == bnr | let bnrcnt=bnrcnt+1 | endif
5937 exe bnr."wincmd p"
5938 let &ei= eikeep
5939" call Decho("bnr=".bnr." bnrcnt=".bnrcnt." buftype=".&bt." winnr#".winnr())
5940 if bnrcnt == 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01005941 let bufname = bufname(winbufnr(winnr()))
5942 let choice = confirm("Save modified file<".bufname.">?","&Yes\n&No\n&Cancel")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005943" call Decho("bufname<".bufname."> choice=".choice." winnr#".winnr())
5944
5945 if choice == 1
5946 " Yes -- write file & then browse
5947 let v:errmsg= ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02005948 sil w
Bram Moolenaar446cb832008-06-24 21:56:24 +00005949 if v:errmsg != ""
5950 call netrw#ErrorMsg(s:ERROR,"unable to write <".bufname.">!",30)
5951 if didsplit
5952 q
5953 else
5954 wincmd p
5955 endif
5956" call Dret("NetrwPrevWinOpen ".choice." : unable to write <".bufname.">")
5957 return choice
5958 endif
5959
5960 elseif choice == 2
5961 " No -- don't worry about changed file, just browse anyway
5962 setlocal nomod
Bram Moolenaaradc21822011-04-01 18:03:16 +02005963 keepj call netrw#ErrorMsg(s:WARNING,bufname." changes to ".bufname." abandoned",31)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005964 wincmd p
5965
5966 else
5967 " Cancel -- don't do this
5968 if didsplit
5969 q
5970 else
5971 wincmd p
5972 endif
5973" call Dret("NetrwPrevWinOpen ".choice." : cancelled")
5974 return choice
5975 endif
5976 endif
5977 endif
5978 endif
5979
5980 " restore b:netrw_curdir (window split/enew may have lost it)
5981 let b:netrw_curdir= curdir
5982 if a:islocal < 2
5983 if a:islocal
5984 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(a:islocal,curword))
5985 else
5986 call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,curword))
5987 endif
5988 endif
5989" call Dret("NetrwPrevWinOpen ".choice)
5990 return choice
5991endfun
5992
5993" ---------------------------------------------------------------------
5994" s:NetrwUpload: load fname to tgt (used by NetrwMarkFileCopy()) {{{2
5995" Always assumed to be local -> remote
5996" call s:NetrwUpload(filename, target)
5997" call s:NetrwUpload(filename, target, fromdirectory)
5998fun! s:NetrwUpload(fname,tgt,...)
5999" call Dfunc("s:NetrwUpload(fname<".((type(a:fname) == 1)? a:fname : string(a:fname))."> tgt<".a:tgt.">) a:0=".a:0)
6000
6001 if a:tgt =~ '^\a\+://'
6002 let tgtdir= substitute(a:tgt,'^\a\+://[^/]\+/\(.\{-}\)$','\1','')
6003 else
6004 let tgtdir= substitute(a:tgt,'^\(.*\)/[^/]*$','\1','')
6005 endif
6006" call Decho("tgtdir<".tgtdir.">")
6007
6008 if a:0 > 0
6009 let fromdir= a:1
6010 else
6011 let fromdir= getcwd()
6012 endif
6013" call Decho("fromdir<".fromdir.">")
6014
6015 if type(a:fname) == 1
6016 " handle uploading a single file using NetWrite
6017" call Decho("handle uploading a single file via NetWrite")
6018 1split
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006019" call Decho("exe e ".fnameescape(a:fname))
6020 exe "e ".fnameescape(a:fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006021" call Decho("now locally editing<".expand("%").">, has ".line("$")." lines")
6022 if a:tgt =~ '/$'
6023 let wfname= substitute(a:fname,'^.*/','','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00006024" call Decho("exe w! ".fnameescape(wfname))
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006025 exe "w! ".fnameescape(a:tgt.wfname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006026 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00006027" call Decho("writing local->remote: exe w ".fnameescape(a:tgt))
6028 exe "w ".fnameescape(a:tgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006029" call Decho("done writing local->remote")
6030 endif
6031 q!
6032
6033 elseif type(a:fname) == 3
6034 " handle uploading a list of files via scp
6035" call Decho("handle uploading a list of files via scp")
6036 let curdir= getcwd()
6037 if a:tgt =~ '^scp:'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006038 exe "keepjumps sil lcd ".fnameescape(fromdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006039 let filelist= deepcopy(s:netrwmarkfilelist_{bufnr('%')})
6040 let args = join(map(filelist,"shellescape(v:val, 1)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006041 if exists("g:netrw_port") && g:netrw_port != ""
6042 let useport= " ".g:netrw_scpport." ".g:netrw_port
6043 else
6044 let useport= ""
6045 endif
6046 let machine = substitute(a:tgt,'^scp://\([^/:]\+\).*$','\1','')
6047 let tgt = substitute(a:tgt,'^scp://[^/]\+/\(.*\)$','\1','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00006048" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1))
6049 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1)
Bram Moolenaaradc21822011-04-01 18:03:16 +02006050 exe "keepjumps sil lcd ".fnameescape(curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006051
6052 elseif a:tgt =~ '^ftp:'
6053 call s:NetrwMethod(a:tgt)
6054
6055 if b:netrw_method == 2
6056 " handle uploading a list of files via ftp+.netrc
6057 let netrw_fname = b:netrw_fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006058 sil keepj new
Bram Moolenaar446cb832008-06-24 21:56:24 +00006059" call Decho("filter input window#".winnr())
6060
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006061 keepj put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +00006062" call Decho("filter input: ".getline('$'))
6063
6064 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006065 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00006066" call Decho("filter input: ".getline('$'))
6067 endif
6068
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006069 keepj call setline(line("$")+1,'lcd "'.fromdir.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006070" call Decho("filter input: ".getline('$'))
6071
Bram Moolenaaradc21822011-04-01 18:03:16 +02006072 if tgtdir == ""
6073 let tgtdir= '/'
6074 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006075 keepj call setline(line("$")+1,'cd "'.tgtdir.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006076" call Decho("filter input: ".getline('$'))
6077
6078 for fname in a:fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006079 keepj call setline(line("$")+1,'put "'.fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006080" call Decho("filter input: ".getline('$'))
6081 endfor
6082
6083 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02006084" call Decho("executing: ".s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
6085 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 +00006086 else
6087" call Decho("filter input window#".winnr())
Bram Moolenaaradc21822011-04-01 18:03:16 +02006088" call Decho("executing: ".s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
6089 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006090 endif
6091 " 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 +02006092 sil keepj g/Local directory now/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01006093 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006094 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
6095 call netrw#ErrorMsg(s:ERROR,getline(1),14)
6096 else
6097 bw!|q
6098 endif
6099
6100 elseif b:netrw_method == 3
6101 " upload with ftp + machine, id, passwd, and fname (ie. no .netrc)
6102 let netrw_fname= b:netrw_fname
Bram Moolenaaradc21822011-04-01 18:03:16 +02006103 keepj call s:SaveBufVars()|sil keepj new|keepj call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006104 let tmpbufnr= bufnr("%")
6105 setlocal ff=unix
6106
6107 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006108 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00006109" call Decho("filter input: ".getline('$'))
6110 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006111 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00006112" call Decho("filter input: ".getline('$'))
6113 endif
6114
6115 if exists("g:netrw_ftp") && g:netrw_ftp == 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006116 keepj put =g:netrw_uid
Bram Moolenaar446cb832008-06-24 21:56:24 +00006117" call Decho("filter input: ".getline('$'))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006118 keepj call setline(line("$")+1,'"'.s:netrw_passwd.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006119" call Decho("filter input: ".getline('$'))
6120 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006121 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006122" call Decho("filter input: ".getline('$'))
6123 endif
6124
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006125 keepj call setline(line("$")+1,'lcd "'.fromdir.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006126" call Decho("filter input: ".getline('$'))
6127
6128 if exists("b:netrw_fname") && b:netrw_fname != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006129 keepj call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006130" call Decho("filter input: ".getline('$'))
6131 endif
6132
6133 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006134 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00006135" call Decho("filter input: ".getline('$'))
6136 endif
6137
6138 for fname in a:fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006139 keepj call setline(line("$")+1,'put "'.fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006140" call Decho("filter input: ".getline('$'))
6141 endfor
6142
6143 " perform ftp:
6144 " -i : turns off interactive prompting from ftp
6145 " -n unix : DON'T use <.netrc>, even though it exists
6146 " -n win32: quit being obnoxious about password
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006147 keepj norm! 1Gdd
Bram Moolenaaradc21822011-04-01 18:03:16 +02006148" call Decho("executing: ".s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i -n")
6149 exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i -n"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006150 " 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 +02006151 sil keepj g/Local directory now/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01006152 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006153 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
6154 let debugkeep= &debug
6155 setlocal debug=msg
6156 call netrw#ErrorMsg(s:ERROR,getline(1),15)
6157 let &debug = debugkeep
6158 let mod = 1
6159 else
6160 bw!|q
6161 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006162 elseif !exists("b:netrw_method") || b:netrw_method < 0
6163" call Dfunc("netrw#NetrwUpload : unsupported method")
6164 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00006165 endif
6166 else
6167 call netrw#ErrorMsg(s:ERROR,"can't obtain files with protocol from<".a:tgt.">",63)
6168 endif
6169 endif
6170
6171" call Dret("s:NetrwUpload")
6172endfun
6173
6174" ---------------------------------------------------------------------
6175" s:NetrwPreview: {{{2
6176fun! s:NetrwPreview(path) range
6177" call Dfunc("NetrwPreview(path<".a:path.">)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006178 keepj call s:NetrwOptionSave("s:")
6179 keepj call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006180 if has("quickfix")
6181 if !isdirectory(a:path)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006182 if g:netrw_preview && !g:netrw_alto
Bram Moolenaar15146672011-10-20 22:22:38 +02006183 let pvhkeep = &pvh
6184 let winsz = (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
6185 let &pvh = winwidth(0) - winsz
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006186 endif
6187 exe (g:netrw_alto? "top " : "bot ").(g:netrw_preview? "vert " : "")."pedit ".fnameescape(a:path)
6188 if exists("pvhkeep")
6189 let &pvh= pvhkeep
6190 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006191 elseif !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006192 keepj call netrw#ErrorMsg(s:WARNING,"sorry, cannot preview a directory such as <".a:path.">",38)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006193 endif
6194 elseif !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006195 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 +00006196 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02006197 keepj call s:NetrwOptionRestore("s:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006198" call Dret("NetrwPreview")
6199endfun
6200
6201" ---------------------------------------------------------------------
6202" s:NetrwRefresh: {{{2
6203fun! s:NetrwRefresh(islocal,dirname)
6204" call Dfunc("NetrwRefresh(islocal<".a:islocal.">,dirname=".a:dirname.") hide=".g:netrw_hide." sortdir=".g:netrw_sort_direction)
6205 " at the current time (Mar 19, 2007) all calls to NetrwRefresh() call NetrwBrowseChgDir() first.
6206 " NetrwBrowseChgDir() may clear the display; hence a NetrwSavePosn() may not work if its placed here.
6207 " Also, NetrwBrowseChgDir() now does a NetrwSavePosn() itself.
6208 setlocal ma noro
6209" call Decho("setlocal ma noro")
6210" call Decho("clear buffer<".expand("%")."> with :%d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006211 sil! keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00006212 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02006213 keepj call netrw#LocalBrowseCheck(a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006214 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02006215 keepj call s:NetrwBrowse(a:islocal,a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006216 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02006217 keepj call netrw#NetrwRestorePosn()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006218
6219 " restore file marks
6220 if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
6221" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
6222 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
6223 else
6224" call Decho("2match none")
6225 2match none
6226 endif
6227
6228" redraw!
6229" call Dret("NetrwRefresh")
6230endfun
6231
6232" ---------------------------------------------------------------------
6233" s:NetrwRefreshDir: refreshes a directory by name {{{2
6234" Called by NetrwMarkFileCopy()
6235" Interfaces to s:NetrwRefresh() and s:LocalBrowseShellCmdRefresh()
6236fun! s:NetrwRefreshDir(islocal,dirname)
6237" call Dfunc("s:NetrwRefreshDir(islocal=".a:islocal." dirname<".a:dirname.">) fastbrowse=".g:netrw_fastbrowse)
6238 if g:netrw_fastbrowse == 0
6239 " slowest mode (keep buffers refreshed, local or remote)
6240" call Decho("slowest mode: keep buffers refreshed, local or remote")
6241 let tgtwin= bufwinnr(a:dirname)
6242" call Decho("tgtwin= bufwinnr(".a:dirname.")=".tgtwin)
6243
6244 if tgtwin > 0
6245 " tgtwin is being displayed, so refresh it
6246 let curwin= winnr()
6247" call Decho("refresh tgtwin#".tgtwin." (curwin#".curwin.")")
6248 exe tgtwin."wincmd w"
Bram Moolenaaradc21822011-04-01 18:03:16 +02006249 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006250 exe curwin."wincmd w"
6251
6252 elseif bufnr(a:dirname) > 0
6253 let bn= bufnr(a:dirname)
6254" call Decho("bd bufnr(".a:dirname.")=".bn)
Bram Moolenaaradc21822011-04-01 18:03:16 +02006255 exe "sil bd ".bn
Bram Moolenaar446cb832008-06-24 21:56:24 +00006256 endif
6257
6258 elseif g:netrw_fastbrowse <= 1
6259" call Decho("medium-speed mode: refresh local buffers only")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006260 keepj call s:LocalBrowseShellCmdRefresh()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006261 endif
6262" call Dret("s:NetrwRefreshDir")
6263endfun
6264
6265" ---------------------------------------------------------------------
6266" s:NetrwSetSort: sets up the sort based on the g:netrw_sort_sequence {{{2
6267" What this function does is to compute a priority for the patterns
6268" in the g:netrw_sort_sequence. It applies a substitute to any
6269" "files" that satisfy each pattern, putting the priority / in
6270" front. An "*" pattern handles the default priority.
6271fun! s:NetrwSetSort()
6272" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
6273 if w:netrw_liststyle == s:LONGLIST
6274 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
6275 else
6276 let seqlist = g:netrw_sort_sequence
6277 endif
6278 " sanity check -- insure that * appears somewhere
6279 if seqlist == ""
6280 let seqlist= '*'
6281 elseif seqlist !~ '\*'
6282 let seqlist= seqlist.',*'
6283 endif
6284 let priority = 1
6285 while seqlist != ""
6286 if seqlist =~ ','
6287 let seq = substitute(seqlist,',.*$','','e')
6288 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
6289 else
6290 let seq = seqlist
6291 let seqlist = ""
6292 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006293 if priority < 10
Bram Moolenaar5c736222010-01-06 20:54:52 +01006294 let spriority= "00".priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00006295 elseif priority < 100
Bram Moolenaar5c736222010-01-06 20:54:52 +01006296 let spriority= "0".priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00006297 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01006298 let spriority= priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00006299 endif
6300" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
6301
6302 " sanity check
6303 if w:netrw_bannercnt > line("$")
6304 " apparently no files were left after a Hiding pattern was used
6305" call Dret("SetSort : no files left after hiding")
6306 return
6307 endif
6308 if seq == '*'
6309 let starpriority= spriority
6310 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006311 exe 'sil keepj '.w:netrw_bannercnt.',$g/'.seq.'/s/^/'.spriority.'/'
Bram Moolenaar5c736222010-01-06 20:54:52 +01006312 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006313 " sometimes multiple sorting patterns will match the same file or directory.
6314 " The following substitute is intended to remove the excess matches.
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006315 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 +02006316 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006317 endif
6318 let priority = priority + 1
6319 endwhile
6320 if exists("starpriority")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006321 exe 'sil keepj '.w:netrw_bannercnt.',$v/^\d\{3}'.g:netrw_sepchr.'/s/^/'.starpriority.'/'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006322 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006323 endif
6324
6325 " Following line associated with priority -- items that satisfy a priority
6326 " pattern get prefixed by ###/ which permits easy sorting by priority.
6327 " Sometimes files can satisfy multiple priority patterns -- only the latest
6328 " priority pattern needs to be retained. So, at this point, these excess
6329 " priority prefixes need to be removed, but not directories that happen to
6330 " be just digits themselves.
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006331 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 +02006332 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006333
6334" call Dret("SetSort")
6335endfun
6336
6337" =====================================================================
6338" s:NetrwSortStyle: change sorting style (name - time - size) and refresh display {{{2
6339fun! s:NetrwSortStyle(islocal)
6340" call Dfunc("s:NetrwSortStyle(islocal=".a:islocal.") netrw_sort_by<".g:netrw_sort_by.">")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006341 keepj call s:NetrwSaveWordPosn()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006342 let svpos= netrw#NetrwSavePosn()
6343
6344 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 +02006345 keepj norm! 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02006346 keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
6347 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006348
6349" call Dret("s:NetrwSortStyle : netrw_sort_by<".g:netrw_sort_by.">")
6350endfun
6351
6352" ---------------------------------------------------------------------
6353" s:NetrwSplit: mode {{{2
6354" =0 : net and o
6355" =1 : net and t
6356" =2 : net and v
6357" =3 : local and o
6358" =4 : local and t
6359" =5 : local and v
6360fun! s:NetrwSplit(mode)
6361" call Dfunc("s:NetrwSplit(mode=".a:mode.") alto=".g:netrw_alto." altv=".g:netrw_altv)
6362
6363 call s:SaveWinVars()
6364
6365 if a:mode == 0
6366 " remote and o
Bram Moolenaar15146672011-10-20 22:22:38 +02006367 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
6368" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s")
Bram Moolenaar251e1912011-06-19 05:09:16 +02006369 exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006370 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006371 keepj call s:RestoreWinVars()
6372 keepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006373 unlet s:didsplit
6374
6375 elseif a:mode == 1
6376 " remote and t
Bram Moolenaar5c736222010-01-06 20:54:52 +01006377 let newdir = s:NetrwBrowseChgDir(0,s:NetrwGetWord())
Bram Moolenaar446cb832008-06-24 21:56:24 +00006378" call Decho("tabnew")
6379 tabnew
6380 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006381 keepj call s:RestoreWinVars()
6382 keepj call s:NetrwBrowse(0,newdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006383 unlet s:didsplit
6384
6385 elseif a:mode == 2
6386 " remote and v
Bram Moolenaar15146672011-10-20 22:22:38 +02006387 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
6388" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v")
Bram Moolenaar251e1912011-06-19 05:09:16 +02006389 exe (g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006390 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006391 keepj call s:RestoreWinVars()
6392 keepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006393 unlet s:didsplit
6394
6395 elseif a:mode == 3
6396 " local and o
Bram Moolenaar15146672011-10-20 22:22:38 +02006397 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
6398" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s")
Bram Moolenaar251e1912011-06-19 05:09:16 +02006399 exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006400 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006401 keepj call s:RestoreWinVars()
6402 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006403 unlet s:didsplit
6404
6405 elseif a:mode == 4
6406 " local and t
Bram Moolenaar446cb832008-06-24 21:56:24 +00006407 let cursorword = s:NetrwGetWord()
Bram Moolenaar5c736222010-01-06 20:54:52 +01006408 let netrw_curdir= s:NetrwTreeDir()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006409" call Decho("tabnew")
6410 tabnew
6411 let b:netrw_curdir= netrw_curdir
6412 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006413 keepj call s:RestoreWinVars()
6414 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,cursorword))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006415 unlet s:didsplit
6416
6417 elseif a:mode == 5
6418 " local and v
Bram Moolenaar15146672011-10-20 22:22:38 +02006419 let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
6420" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v")
Bram Moolenaar251e1912011-06-19 05:09:16 +02006421 exe (g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006422 let s:didsplit= 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02006423 keepj call s:RestoreWinVars()
6424 keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006425 unlet s:didsplit
6426
6427 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02006428 keepj call netrw#ErrorMsg(s:ERROR,"(NetrwSplit) unsupported mode=".a:mode,45)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006429 endif
6430
6431" call Dret("s:NetrwSplit")
6432endfun
6433
6434" ---------------------------------------------------------------------
6435" NetrwStatusLine: {{{2
6436fun! NetrwStatusLine()
6437
6438" vvv NetrwStatusLine() debugging vvv
6439" let g:stlmsg=""
6440" if !exists("w:netrw_explore_bufnr")
6441" let g:stlmsg="!X<explore_bufnr>"
6442" elseif w:netrw_explore_bufnr != bufnr("%")
6443" let g:stlmsg="explore_bufnr!=".bufnr("%")
6444" endif
6445" if !exists("w:netrw_explore_line")
6446" let g:stlmsg=" !X<explore_line>"
6447" elseif w:netrw_explore_line != line(".")
6448" let g:stlmsg=" explore_line!={line(.)<".line(".").">"
6449" endif
6450" if !exists("w:netrw_explore_list")
6451" let g:stlmsg=" !X<explore_list>"
6452" endif
6453" ^^^ NetrwStatusLine() debugging ^^^
6454
6455 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")
6456 " restore user's status line
6457 let &stl = s:netrw_users_stl
6458 let &laststatus = s:netrw_users_ls
6459 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
6460 if exists("w:netrw_explore_line") |unlet w:netrw_explore_line |endif
6461 return ""
6462 else
6463 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
6464 endif
6465endfun
6466
6467" ---------------------------------------------------------------------
6468" s:NetrwTreeDir: determine tree directory given current cursor position {{{2
6469" (full path directory with trailing slash returned)
6470fun! s:NetrwTreeDir()
6471" call Dfunc("NetrwTreeDir() curline#".line(".")."<".getline('.')."> b:netrw_curdir<".b:netrw_curdir."> tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%").">")
6472
6473 let treedir= b:netrw_curdir
6474" call Decho("set initial treedir<".treedir.">")
6475 let s:treecurpos= netrw#NetrwSavePosn()
6476
6477 if w:netrw_liststyle == s:TREELIST
6478" call Decho("w:netrrw_liststyle is TREELIST:")
6479" call Decho("line#".line(".")." getline(.)<".getline('.')."> treecurpos<".string(s:treecurpos).">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01006480
6481 " extract tree directory if on a line specifying a subdirectory (ie. ends with "/")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006482 if getline('.') =~ '/$'
6483 let treedir= substitute(getline('.'),'^\%(| \)*\([^|].\{-}\)$','\1','e')
6484 else
6485 let treedir= ""
6486 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006487" call Decho("treedir<".treedir.">")
6488
6489 " detect user attempting to close treeroot
6490 if getline('.') !~ '|' && getline('.') != '..'
6491" call Decho("user attempted to close treeroot")
6492 " now force a refresh
6493" call Decho("clear buffer<".expand("%")."> with :%d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006494 sil! keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00006495" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
6496 return b:netrw_curdir
6497 endif
6498
6499 " elide all non-depth information
6500 let depth = substitute(getline('.'),'^\(\%(| \)*\)[^|].\{-}$','\1','e')
Bram Moolenaar5c736222010-01-06 20:54:52 +01006501" call Decho("depth<".depth."> 1st subst (non-depth info removed)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006502
6503 " elide first depth
6504 let depth = substitute(depth,'^| ','','')
Bram Moolenaar5c736222010-01-06 20:54:52 +01006505" call Decho("depth<".depth."> 2nd subst (first depth removed)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006506
6507 " construct treedir by searching backwards at correct depth
6508" call Decho("constructing treedir<".treedir."> depth<".depth.">")
6509 while depth != "" && search('^'.depth.'[^|].\{-}/$','bW')
6510 let dirname= substitute(getline('.'),'^\(| \)*','','e')
6511 let treedir= dirname.treedir
6512 let depth = substitute(depth,'^| ','','')
6513" call Decho("constructing treedir<".treedir.">: dirname<".dirname."> while depth<".depth.">")
6514 endwhile
6515 if w:netrw_treetop =~ '/$'
6516 let treedir= w:netrw_treetop.treedir
6517 else
6518 let treedir= w:netrw_treetop.'/'.treedir
6519 endif
6520" call Decho("bufnr(.)=".bufnr("%")." line($)=".line("$")." line(.)=".line("."))
6521 endif
6522 let treedir= substitute(treedir,'//$','/','')
6523
Bram Moolenaar446cb832008-06-24 21:56:24 +00006524" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
6525 return treedir
6526endfun
6527
6528" ---------------------------------------------------------------------
6529" s:NetrwTreeDisplay: recursive tree display {{{2
6530fun! s:NetrwTreeDisplay(dir,depth)
6531" call Dfunc("NetrwTreeDisplay(dir<".a:dir."> depth<".a:depth.">)")
6532
6533 " insure that there are no folds
6534 setlocal nofen
6535
6536 " install ../ and shortdir
6537 if a:depth == ""
6538 call setline(line("$")+1,'../')
6539" call Decho("setline#".line("$")." ../ (depth is zero)")
6540 endif
6541 if a:dir =~ '^\a\+://'
6542 if a:dir == w:netrw_treetop
6543 let shortdir= a:dir
6544 else
6545 let shortdir= substitute(a:dir,'^.*/\([^/]\+\)/$','\1/','e')
6546 endif
6547 call setline(line("$")+1,a:depth.shortdir)
6548 else
6549 let shortdir= substitute(a:dir,'^.*/','','e')
6550 call setline(line("$")+1,a:depth.shortdir.'/')
6551 endif
6552" call Decho("setline#".line("$")." shortdir<".a:depth.shortdir.">")
6553
6554 " append a / to dir if its missing one
6555 let dir= a:dir
6556 if dir !~ '/$'
6557 let dir= dir.'/'
6558 endif
6559
6560 " display subtrees (if any)
6561 let depth= "| ".a:depth
6562
6563" call Decho("display subtrees with depth<".depth."> and current leaves")
6564 for entry in w:netrw_treedict[a:dir]
6565 let direntry= substitute(dir.entry,'/$','','e')
6566" call Decho("dir<".dir."> entry<".entry."> direntry<".direntry.">")
6567 if entry =~ '/$' && has_key(w:netrw_treedict,direntry)
6568" call Decho("<".direntry."> is a key in treedict - display subtree for it")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006569 keepj call s:NetrwTreeDisplay(direntry,depth)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006570 elseif entry =~ '/$' && has_key(w:netrw_treedict,direntry.'/')
6571" call Decho("<".direntry."/> is a key in treedict - display subtree for it")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006572 keepj call s:NetrwTreeDisplay(direntry.'/',depth)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006573 else
6574" call Decho("<".entry."> is not a key in treedict (no subtree)")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006575 sil! keepj call setline(line("$")+1,depth.entry)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006576 endif
6577 endfor
6578" call Dret("NetrwTreeDisplay")
6579endfun
6580
6581" ---------------------------------------------------------------------
6582" s:NetrwTreeListing: displays tree listing from treetop on down, using NetrwTreeDisplay() {{{2
6583fun! s:NetrwTreeListing(dirname)
6584 if w:netrw_liststyle == s:TREELIST
6585" call Dfunc("NetrwTreeListing() bufname<".expand("%").">")
6586" call Decho("curdir<".a:dirname.">")
6587" 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"))
6588
6589 " update the treetop
6590" call Decho("update the treetop")
6591 if !exists("w:netrw_treetop")
6592 let w:netrw_treetop= a:dirname
6593" call Decho("w:netrw_treetop<".w:netrw_treetop."> (reusing)")
6594 elseif (w:netrw_treetop =~ ('^'.a:dirname) && s:Strlen(a:dirname) < s:Strlen(w:netrw_treetop)) || a:dirname !~ ('^'.w:netrw_treetop)
6595 let w:netrw_treetop= a:dirname
6596" call Decho("w:netrw_treetop<".w:netrw_treetop."> (went up)")
6597 endif
6598
6599 " insure that we have at least an empty treedict
6600 if !exists("w:netrw_treedict")
6601 let w:netrw_treedict= {}
6602 endif
6603
6604 " update the directory listing for the current directory
6605" call Decho("updating dictionary with ".a:dirname.":[..directory listing..]")
6606" call Decho("bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006607 exe "sil! keepj ".w:netrw_bannercnt.',$g@^\.\.\=/$@d'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006608 let w:netrw_treedict[a:dirname]= getline(w:netrw_bannercnt,line("$"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006609" call Decho("w:treedict[".a:dirname."]= ".string(w:netrw_treedict[a:dirname]))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006610 exe "sil! keepj ".w:netrw_bannercnt.",$d"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006611
6612 " if past banner, record word
6613 if exists("w:netrw_bannercnt") && line(".") > w:netrw_bannercnt
6614 let fname= expand("<cword>")
6615 else
6616 let fname= ""
6617 endif
6618" call Decho("fname<".fname.">")
6619
6620 " display from treetop on down
Bram Moolenaaradc21822011-04-01 18:03:16 +02006621 keepj call s:NetrwTreeDisplay(w:netrw_treetop,"")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006622
6623" call Dret("NetrwTreeListing : bufname<".expand("%").">")
6624 endif
6625endfun
6626
6627" ---------------------------------------------------------------------
6628" s:NetrwWideListing: {{{2
6629fun! s:NetrwWideListing()
6630
6631 if w:netrw_liststyle == s:WIDELIST
6632" call Dfunc("NetrwWideListing() w:netrw_liststyle=".w:netrw_liststyle.' fo='.&fo.' l:fo='.&l:fo)
6633 " look for longest filename (cpf=characters per filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01006634 " cpf: characters per filename
6635 " fpl: filenames per line
6636 " fpc: filenames per column
Bram Moolenaar446cb832008-06-24 21:56:24 +00006637 setlocal ma noro
6638" call Decho("setlocal ma noro")
6639 let b:netrw_cpf= 0
6640 if line("$") >= w:netrw_bannercnt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006641 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 +02006642 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006643 else
6644" call Dret("NetrwWideListing")
6645 return
6646 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006647 let b:netrw_cpf= b:netrw_cpf + 2
6648" call Decho("b:netrw_cpf=max_filename_length+2=".b:netrw_cpf)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006649
6650 " determine qty files per line (fpl)
6651 let w:netrw_fpl= winwidth(0)/b:netrw_cpf
6652 if w:netrw_fpl <= 0
6653 let w:netrw_fpl= 1
6654 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006655" call Decho("fpl= [winwidth=".winwidth(0)."]/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006656
6657 " make wide display
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006658 exe 'sil keepj '.w:netrw_bannercnt.',$s/^.*$/\=escape(printf("%-'.b:netrw_cpf.'s",submatch(0)),"\\")/'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006659 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006660 let fpc = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl
6661 let newcolstart = w:netrw_bannercnt + fpc
6662 let newcolend = newcolstart + fpc - 1
6663" call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006664 sil! let keepregstar = @*
Bram Moolenaar446cb832008-06-24 21:56:24 +00006665 while line("$") >= newcolstart
6666 if newcolend > line("$") | let newcolend= line("$") | endif
6667 let newcolqty= newcolend - newcolstart
6668 exe newcolstart
6669 if newcolqty == 0
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006670 exe "sil! keepj norm! 0\<c-v>$hx".w:netrw_bannercnt."G$p"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006671 else
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006672 exe "sil! keepj norm! 0\<c-v>".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006673 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006674 exe "sil! keepj ".newcolstart.','.newcolend.'d'
6675 exe 'sil! keepj '.w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006676 endwhile
Bram Moolenaaradc21822011-04-01 18:03:16 +02006677 sil! let @*= keepregstar
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006678 exe "sil! keepj ".w:netrw_bannercnt.',$s/\s\+$//e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006679 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006680 setlocal noma nomod ro
6681" call Dret("NetrwWideListing")
6682 endif
6683
6684endfun
6685
6686" ---------------------------------------------------------------------
6687" s:PerformListing: {{{2
6688fun! s:PerformListing(islocal)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006689" call Dfunc("s:PerformListing(islocal=".a:islocal.") bufnr(%)=".bufnr("%")."<".bufname("%").">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006690
Bram Moolenaar15146672011-10-20 22:22:38 +02006691 " set up syntax highlighting {{{3
6692" call Decho("set up syntax highlighting")
6693 if has("syntax")
6694 if !exists("g:syntax_on") || !g:syntax_on
6695" call Decho("but g:syntax_on".(exists("g:syntax_on")? "=".g:syntax_on : "<doesn't exist>"))
6696 setlocal ft=
6697 elseif &ft != "netrw"
6698 setlocal ft=netrw
6699 endif
6700 endif
6701
Bram Moolenaaradc21822011-04-01 18:03:16 +02006702 keepj call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006703 setlocal noro ma
6704" call Decho("setlocal noro ma")
6705
6706" if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 " Decho
6707" call Decho("(netrw) Processing your browsing request...")
6708" endif " Decho
6709
6710" call Decho('w:netrw_liststyle='.(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a'))
6711 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
6712 " force a refresh for tree listings
6713" call Decho("force refresh for treelisting: clear buffer<".expand("%")."> with :%d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006714 sil! keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00006715 endif
6716
6717 " save current directory on directory history list
Bram Moolenaaradc21822011-04-01 18:03:16 +02006718 keepj call s:NetrwBookHistHandler(3,b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006719
6720 " Set up the banner {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01006721 if g:netrw_banner
6722" call Decho("set up banner")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006723 keepj call setline(1,'" ============================================================================')
6724 keepj call setline(2,'" Netrw Directory Listing (netrw '.g:loaded_netrw.')')
6725 keepj call setline(3,'" '.b:netrw_curdir)
Bram Moolenaar5c736222010-01-06 20:54:52 +01006726 let w:netrw_bannercnt= 3
Bram Moolenaaradc21822011-04-01 18:03:16 +02006727 keepj exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01006728 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006729 keepj 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01006730 let w:netrw_bannercnt= 1
6731 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006732
6733 let sortby= g:netrw_sort_by
6734 if g:netrw_sort_direction =~ "^r"
6735 let sortby= sortby." reversed"
6736 endif
6737
6738 " Sorted by... {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01006739 if g:netrw_banner
6740" call Decho("handle specified sorting: g:netrw_sort_by<".g:netrw_sort_by.">")
6741 if g:netrw_sort_by =~ "^n"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006742" call Decho("directories will be sorted by name")
Bram Moolenaar5c736222010-01-06 20:54:52 +01006743 " sorted by name
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006744 keepj put ='\" Sorted by '.sortby
6745 keepj put ='\" Sort sequence: '.g:netrw_sort_sequence
Bram Moolenaar5c736222010-01-06 20:54:52 +01006746 let w:netrw_bannercnt= w:netrw_bannercnt + 2
6747 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00006748" call Decho("directories will be sorted by size or time")
Bram Moolenaar5c736222010-01-06 20:54:52 +01006749 " sorted by size or date
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006750 keepj put ='\" Sorted by '.sortby
Bram Moolenaar5c736222010-01-06 20:54:52 +01006751 let w:netrw_bannercnt= w:netrw_bannercnt + 1
6752 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006753 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006754 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006755
6756 " show copy/move target, if any
Bram Moolenaar5c736222010-01-06 20:54:52 +01006757 if g:netrw_banner
6758 if exists("s:netrwmftgt") && exists("s:netrwmftgt_islocal")
6759" call Decho("show copy/move target<".s:netrwmftgt.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006760 keepj put =''
Bram Moolenaar5c736222010-01-06 20:54:52 +01006761 if s:netrwmftgt_islocal
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006762 sil! keepj call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (local)')
Bram Moolenaar5c736222010-01-06 20:54:52 +01006763 else
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006764 sil! keepj call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (remote)')
Bram Moolenaar5c736222010-01-06 20:54:52 +01006765 endif
6766 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00006767 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01006768" call Decho("s:netrwmftgt does not exist, don't make Copy/Move Tgt")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006769 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006770 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006771 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006772
6773 " Hiding... -or- Showing... {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01006774 if g:netrw_banner
6775" call Decho("handle hiding/showing (g:netrw_hide=".g:netrw_list_hide." g:netrw_list_hide<".g:netrw_list_hide.">)")
6776 if g:netrw_list_hide != "" && g:netrw_hide
6777 if g:netrw_hide == 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006778 keepj put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaar5c736222010-01-06 20:54:52 +01006779 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006780 keepj put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaar5c736222010-01-06 20:54:52 +01006781 endif
6782 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00006783 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006784 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006785 keepj put ='\" Quick Help: <F1>:help -:go up dir D:delete R:rename s:sort-by x:exec'
6786 keepj put ='\" ============================================================================'
Bram Moolenaar5c736222010-01-06 20:54:52 +01006787 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00006788 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006789
6790 " bannercnt should index the line just after the banner
Bram Moolenaar5c736222010-01-06 20:54:52 +01006791 if g:netrw_banner
6792 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006793 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01006794" call Decho("bannercnt=".w:netrw_bannercnt." (should index line just after banner) line($)=".line("$"))
6795 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006796
Bram Moolenaar446cb832008-06-24 21:56:24 +00006797 " get list of files
6798" call Decho("Get list of files - islocal=".a:islocal)
6799 if a:islocal
Bram Moolenaaradc21822011-04-01 18:03:16 +02006800 keepj call s:LocalListing()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006801 else " remote
Bram Moolenaaradc21822011-04-01 18:03:16 +02006802 keepj call s:NetrwRemoteListing()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006803 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006804" call Decho("g:netrw_banner=".g:netrw_banner." w:netrw_bannercnt=".w:netrw_bannercnt." (banner complete)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006805
6806 " manipulate the directory listing (hide, sort) {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01006807 if !g:netrw_banner || line("$") >= w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006808" call Decho("manipulate directory listing (hide)")
6809" call Decho("g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">")
6810 if g:netrw_hide && g:netrw_list_hide != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02006811 keepj call s:NetrwListHide()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006812 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006813 if !g:netrw_banner || line("$") >= w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006814" call Decho("manipulate directory listing (sort) : g:netrw_sort_by<".g:netrw_sort_by.">")
6815
6816 if g:netrw_sort_by =~ "^n"
6817 " sort by name
Bram Moolenaaradc21822011-04-01 18:03:16 +02006818 keepj call s:NetrwSetSort()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006819
Bram Moolenaar5c736222010-01-06 20:54:52 +01006820 if !g:netrw_banner || w:netrw_bannercnt < line("$")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006821" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction." (bannercnt=".w:netrw_bannercnt.")")
6822 if g:netrw_sort_direction =~ 'n'
6823 " normal direction sorting
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006824 exe 'sil keepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00006825 else
6826 " reverse direction sorting
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006827 exe 'sil keepj '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00006828 endif
6829 endif
6830 " remove priority pattern prefix
6831" call Decho("remove priority pattern prefix")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006832 exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\d\{3}'.g:netrw_sepchr.'//e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006833 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006834
6835 elseif a:islocal
Bram Moolenaar5c736222010-01-06 20:54:52 +01006836 if !g:netrw_banner || w:netrw_bannercnt < line("$")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006837" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction)
6838 if g:netrw_sort_direction =~ 'n'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006839" call Decho('exe sil keepjumps '.w:netrw_bannercnt.',$sort')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006840 exe 'sil! keepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00006841 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02006842" call Decho('exe sil keepjumps '.w:netrw_bannercnt.',$sort!')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006843 exe 'sil! keepj '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00006844 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006845 exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02006846 keepj call histdel("/",-1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01006847 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006848 endif
6849
6850 elseif g:netrw_sort_direction =~ 'r'
6851" call Decho('reverse the sorted listing')
Bram Moolenaar5c736222010-01-06 20:54:52 +01006852 if !g:netrw_banner || w:netrw_bannercnt < line('$')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006853 exe 'sil! keepj '.w:netrw_bannercnt.',$g/^/m '.w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01006854 call histdel("/",-1)
6855 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006856 endif
6857 endif
6858
6859 " convert to wide/tree listing {{{3
6860" call Decho("modify display if wide/tree listing style")
Bram Moolenaaradc21822011-04-01 18:03:16 +02006861 keepj call s:NetrwWideListing()
6862 keepj call s:NetrwTreeListing(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006863
Bram Moolenaar5c736222010-01-06 20:54:52 +01006864 if exists("w:netrw_bannercnt") && (line("$") > w:netrw_bannercnt || !g:netrw_banner)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006865 " place cursor on the top-left corner of the file listing
6866" call Decho("place cursor on top-left corner of file listing")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006867 exe 'sil! keepj '.w:netrw_bannercnt
6868 sil! keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00006869 endif
6870
6871 " record previous current directory
6872 let w:netrw_prvdir= b:netrw_curdir
6873" call Decho("record netrw_prvdir<".w:netrw_prvdir.">")
6874
6875 " save certain window-oriented variables into buffer-oriented variables {{{3
Bram Moolenaaradc21822011-04-01 18:03:16 +02006876 keepj call s:SetBufWinVars()
6877 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006878
6879 " set display to netrw display settings
6880" call Decho("set display to netrw display settings (noma nomod etc)")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006881 exe "setl ".g:netrw_bufsettings
Bram Moolenaar446cb832008-06-24 21:56:24 +00006882 if exists("s:treecurpos")
6883
Bram Moolenaaradc21822011-04-01 18:03:16 +02006884 keepj call netrw#NetrwRestorePosn(s:treecurpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006885 unlet s:treecurpos
6886 endif
6887
6888" call Dret("s:PerformListing : curpos<".string(getpos(".")).">")
6889endfun
6890
6891" ---------------------------------------------------------------------
6892" s:SetupNetrwStatusLine: {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00006893fun! s:SetupNetrwStatusLine(statline)
6894" call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)")
6895
6896 if !exists("s:netrw_setup_statline")
6897 let s:netrw_setup_statline= 1
6898" call Decho("do first-time status line setup")
6899
6900 if !exists("s:netrw_users_stl")
6901 let s:netrw_users_stl= &stl
6902 endif
6903 if !exists("s:netrw_users_ls")
6904 let s:netrw_users_ls= &laststatus
6905 endif
6906
6907 " set up User9 highlighting as needed
6908 let keepa= @a
6909 redir @a
6910 try
6911 hi User9
6912 catch /^Vim\%((\a\+)\)\=:E411/
6913 if &bg == "dark"
6914 hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue
6915 else
6916 hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue
6917 endif
6918 endtry
6919 redir END
6920 let @a= keepa
6921 endif
6922
6923 " set up status line (may use User9 highlighting)
6924 " insure that windows have a statusline
6925 " make sure statusline is displayed
6926 let &stl=a:statline
6927 setlocal laststatus=2
6928" call Decho("stl=".&stl)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006929 redraw
Bram Moolenaar9964e462007-05-05 17:54:07 +00006930
6931" call Dret("SetupNetrwStatusLine : stl=".&stl)
6932endfun
6933
6934" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00006935" Remote Directory Browsing Support: {{{1
6936" ===========================================
Bram Moolenaar9964e462007-05-05 17:54:07 +00006937
6938" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00006939" s:NetrwRemoteListing: {{{2
6940fun! s:NetrwRemoteListing()
6941" call Dfunc("s:NetrwRemoteListing() b:netrw_curdir<".b:netrw_curdir.">)")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00006942
Bram Moolenaar446cb832008-06-24 21:56:24 +00006943 call s:RemotePathAnalysis(b:netrw_curdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00006944
Bram Moolenaar446cb832008-06-24 21:56:24 +00006945 " sanity check:
6946 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
6947" call Decho("b:netrw_method=".b:netrw_method)
6948 if !executable("ftp")
6949 if !exists("g:netrw_quiet")
6950 call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ftp",18)
6951 endif
6952 call s:NetrwOptionRestore("w:")
6953" call Dret("s:NetrwRemoteListing")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00006954 return
6955 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006956
6957 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
6958 if !exists("g:netrw_quiet")
6959 if g:netrw_list_cmd == ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02006960 keepj call netrw#ErrorMsg(s:ERROR,g:netrw_ssh_cmd." is not executable on your system",47)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006961 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02006962 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 +00006963 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00006964 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00006965
Bram Moolenaaradc21822011-04-01 18:03:16 +02006966 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006967" call Dret("s:NetrwRemoteListing")
6968 return
6969 endif " (remote handling sanity check)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00006970
Bram Moolenaar446cb832008-06-24 21:56:24 +00006971 if exists("b:netrw_method")
6972" call Decho("setting w:netrw_method<".b:netrw_method.">")
6973 let w:netrw_method= b:netrw_method
6974 endif
6975
6976 if s:method == "ftp"
Bram Moolenaaradc21822011-04-01 18:03:16 +02006977 " use ftp to get remote file listing {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +00006978" call Decho("use ftp to get remote file listing")
6979 let s:method = "ftp"
6980 let listcmd = g:netrw_ftp_list_cmd
6981 if g:netrw_sort_by =~ '^t'
6982 let listcmd= g:netrw_ftp_timelist_cmd
6983 elseif g:netrw_sort_by =~ '^s'
6984 let listcmd= g:netrw_ftp_sizelist_cmd
6985 endif
6986" call Decho("listcmd<".listcmd."> (using g:netrw_ftp_list_cmd)")
6987 call s:NetrwRemoteFtpCmd(s:path,listcmd)
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006988" exe "sil! keepalt keepj ".w:netrw_bannercnt.',$g/^./call Decho("raw listing: ".getline("."))'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006989
6990 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
6991 " shorten the listing
6992" call Decho("generate short listing")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006993 exe "sil! keepalt keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006994
6995 " cleanup
6996 if g:netrw_ftp_browse_reject != ""
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02006997 exe "sil! keepalt keepj g/".g:netrw_ftp_browse_reject."/keepj d"
Bram Moolenaaradc21822011-04-01 18:03:16 +02006998 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006999 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007000 sil! keepj %s/\r$//e
Bram Moolenaaradc21822011-04-01 18:03:16 +02007001 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007002
7003 " if there's no ../ listed, then put ./ and ../ in
7004 let line1= line(".")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007005 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00007006 let line2= search('^\.\.\/\%(\s\|$\)','cnW')
7007 if line2 == 0
7008" call Decho("netrw is putting ./ and ../ into listing")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007009 sil! keepj put='../'
7010 sil! keepj put='./'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007011 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007012 exe "sil! keepj ".line1
7013 sil! keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00007014
7015" call Decho("line1=".line1." line2=".line2." line(.)=".line("."))
7016 if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
7017" call Decho("M$ ftp cleanup")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007018 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 +02007019 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007020 else " normal ftp cleanup
7021" call Decho("normal ftp cleanup")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007022 exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
7023 exe "sil! keepj ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
7024 exe "sil! keepj ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007025 keepj call histdel("/",-1)
7026 keepj call histdel("/",-1)
7027 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007028 endif
7029 endif
7030
7031 else
7032 " use ssh to get remote file listing {{{3
7033" call Decho("use ssh to get remote file listing: s:path<".s:path.">")
7034 let listcmd= s:MakeSshCmd(g:netrw_list_cmd)
7035" call Decho("listcmd<".listcmd."> (using g:netrw_list_cmd)")
7036 if g:netrw_scp_cmd =~ '^pscp'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007037" call Decho("1: exe sil r! ".shellescape(listcmd.s:path, 1))
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007038 exe "sil! keepj r! ".listcmd.shellescape(s:path, 1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007039 " remove rubbish and adjust listing format of 'pscp' to 'ssh ls -FLa' like
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007040 sil! keepj g/^Listing directory/keepj d
7041 sil! keepj g/^d[-rwx][-rwx][-rwx]/keepj s+$+/+e
7042 sil! keepj g/^l[-rwx][-rwx][-rwx]/keepj s+$+@+e
Bram Moolenaaradc21822011-04-01 18:03:16 +02007043 keepj call histdel("/",-1)
7044 keepj call histdel("/",-1)
7045 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007046 if g:netrw_liststyle != s:LONGLIST
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007047 sil! keepj g/^[dlsp-][-rwx][-rwx][-rwx]/keepj s/^.*\s\(\S\+\)$/\1/e
Bram Moolenaaradc21822011-04-01 18:03:16 +02007048 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007049 endif
7050 else
7051 if s:path == ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02007052" call Decho("2: exe sil r! ".listcmd)
Bram Moolenaar15146672011-10-20 22:22:38 +02007053 exe "sil! keepj keepalt r! ".listcmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00007054 else
Bram Moolenaar251e1912011-06-19 05:09:16 +02007055" call Decho("3: exe sil r! ".listcmd.' '.shellescape(fnameescape(s:path),1))
Bram Moolenaar15146672011-10-20 22:22:38 +02007056 exe "sil! keepj keepalt r! ".listcmd.' '.shellescape(fnameescape(s:path),1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007057" call Decho("listcmd<".listcmd."> path<".s:path.">")
7058 endif
7059 endif
7060
7061 " cleanup
7062 if g:netrw_ftp_browse_reject != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02007063" call Decho("(cleanup) exe sil! g/".g:netrw_ssh_browse_reject."/keepjumps d")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007064 exe "sil! g/".g:netrw_ssh_browse_reject."/keepj d"
Bram Moolenaaradc21822011-04-01 18:03:16 +02007065 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007066 endif
7067 endif
7068
7069 if w:netrw_liststyle == s:LONGLIST
7070 " do a long listing; these substitutions need to be done prior to sorting {{{3
7071" call Decho("fix long listing:")
7072
7073 if s:method == "ftp"
7074 " cleanup
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007075 exe "sil! keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00007076 while getline('.') =~ g:netrw_ftp_browse_reject
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007077 sil! keepj d
Bram Moolenaar446cb832008-06-24 21:56:24 +00007078 endwhile
7079 " if there's no ../ listed, then put ./ and ../ in
7080 let line1= line(".")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007081 sil! keepj 1
7082 sil! keepj call search('^\.\.\/\%(\s\|$\)','W')
Bram Moolenaar446cb832008-06-24 21:56:24 +00007083 let line2= line(".")
7084 if line2 == 0
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007085 exe 'sil! keepj '.w:netrw_bannercnt."put='./'"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007086 if b:netrw_curdir != '/'
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007087 exe 'sil! keepj '.w:netrw_bannercnt."put='../'"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007088 endif
7089 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007090 exe "sil! keepj ".line1
7091 sil! keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00007092 endif
7093
7094 if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
7095" call Decho("M$ ftp site listing cleanup")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007096 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 +00007097 elseif exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$")
7098" call Decho("normal ftp site listing cleanup: bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007099 exe 'sil keepj '.w:netrw_bannercnt.',$s/ -> .*$//e'
7100 exe 'sil keepj '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
7101 exe 'sil keepj '.w:netrw_bannercnt
Bram Moolenaaradc21822011-04-01 18:03:16 +02007102 keepj call histdel("/",-1)
7103 keepj call histdel("/",-1)
7104 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007105 endif
7106 endif
7107
7108" if exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$") " Decho
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007109" exe "keepj ".w:netrw_bannercnt.',$g/^./call Decho("listing: ".getline("."))'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007110" endif " Decho
7111" call Dret("s:NetrwRemoteListing")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00007112endfun
7113
Bram Moolenaar446cb832008-06-24 21:56:24 +00007114" ---------------------------------------------------------------------
7115" s:NetrwRemoteRm: remove/delete a remote file or directory {{{2
7116fun! s:NetrwRemoteRm(usrhost,path) range
7117" call Dfunc("s:NetrwRemoteRm(usrhost<".a:usrhost."> path<".a:path.">) virtcol=".virtcol("."))
7118" call Decho("firstline=".a:firstline." lastline=".a:lastline)
7119 let svpos= netrw#NetrwSavePosn()
7120
7121 let all= 0
7122 if exists("s:netrwmarkfilelist_{bufnr('%')}")
7123 " remove all marked files
Bram Moolenaar5c736222010-01-06 20:54:52 +01007124" call Decho("remove all marked files with bufnr#".bufnr("%"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007125 for fname in s:netrwmarkfilelist_{bufnr("%")}
7126 let ok= s:NetrwRemoteRmFile(a:path,fname,all)
7127 if ok =~ 'q\%[uit]'
7128 break
7129 elseif ok =~ 'a\%[ll]'
7130 let all= 1
7131 endif
7132 endfor
Bram Moolenaar5c736222010-01-06 20:54:52 +01007133 call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007134
7135 else
7136 " remove files specified by range
Bram Moolenaar5c736222010-01-06 20:54:52 +01007137" call Decho("remove files specified by range")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007138
7139 " preparation for removing multiple files/directories
7140 let ctr= a:firstline
7141
7142 " remove multiple files and directories
7143 while ctr <= a:lastline
Bram Moolenaar15146672011-10-20 22:22:38 +02007144 exe "keepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00007145 let ok= s:NetrwRemoteRmFile(a:path,s:NetrwGetWord(),all)
7146 if ok =~ 'q\%[uit]'
7147 break
7148 elseif ok =~ 'a\%[ll]'
7149 let all= 1
7150 endif
7151 let ctr= ctr + 1
7152 endwhile
7153 endif
7154
7155 " refresh the (remote) directory listing
7156" call Decho("refresh remote directory listing")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007157 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
7158 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007159
7160" call Dret("s:NetrwRemoteRm")
7161endfun
7162
7163" ---------------------------------------------------------------------
7164" s:NetrwRemoteRmFile: {{{2
7165fun! s:NetrwRemoteRmFile(path,rmfile,all)
7166" call Dfunc("s:NetrwRemoteRmFile(path<".a:path."> rmfile<".a:rmfile.">) all=".a:all)
7167
7168 let all= a:all
7169 let ok = ""
7170
7171 if a:rmfile !~ '^"' && (a:rmfile =~ '@$' || a:rmfile !~ '[\/]$')
7172 " attempt to remove file
7173" call Decho("attempt to remove file (all=".all.")")
7174 if !all
7175 echohl Statement
7176" call Decho("case all=0:")
7177 call inputsave()
7178 let ok= input("Confirm deletion of file<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
7179 call inputrestore()
7180 echohl NONE
7181 if ok == ""
7182 let ok="no"
7183 endif
7184 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
7185 if ok =~ 'a\%[ll]'
7186 let all= 1
7187 endif
7188 endif
7189
7190 if all || ok =~ 'y\%[es]' || ok == ""
7191" call Decho("case all=".all." or ok<".ok.">".(exists("w:netrw_method")? ': netrw_method='.w:netrw_method : ""))
7192 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
7193" call Decho("case ftp:")
7194 let path= a:path
7195 if path =~ '^\a\+://'
7196 let path= substitute(path,'^\a\+://[^/]\+/','','')
7197 endif
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02007198 sil! keepj .,$d
Bram Moolenaar446cb832008-06-24 21:56:24 +00007199 call s:NetrwRemoteFtpCmd(path,"delete ".'"'.a:rmfile.'"')
7200 else
7201" call Decho("case ssh: g:netrw_rm_cmd<".g:netrw_rm_cmd.">")
7202 let netrw_rm_cmd= s:MakeSshCmd(g:netrw_rm_cmd)
7203" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">")
7204 if !exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007205 keepj call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007206 let ok="q"
7207 else
7208 let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
7209" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">")
7210" call Decho("remotedir<".remotedir.">")
7211" call Decho("rmfile<".a:rmfile.">")
7212 if remotedir != ""
7213 let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(remotedir.a:rmfile))
7214 else
7215 let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(a:rmfile))
7216 endif
7217" call Decho("call system(".netrw_rm_cmd.")")
7218 let ret= system(netrw_rm_cmd)
7219 if ret != 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02007220 keepj call netrw#ErrorMsg(s:WARNING,"cmd<".netrw_rm_cmd."> failed",60)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007221 endif
7222" call Decho("returned=".ret." errcode=".v:shell_error)
7223 endif
7224 endif
7225 elseif ok =~ 'q\%[uit]'
7226" call Decho("ok==".ok)
7227 break
7228 endif
7229
7230 else
7231 " attempt to remove directory
7232" call Decho("attempt to remove directory")
7233 if !all
7234 call inputsave()
7235 let ok= input("Confirm deletion of directory<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
7236 call inputrestore()
7237 if ok == ""
7238 let ok="no"
7239 endif
7240 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
7241 if ok =~ 'a\%[ll]'
7242 let all= 1
7243 endif
7244 endif
7245
7246 if all || ok =~ 'y\%[es]' || ok == ""
7247 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaaradc21822011-04-01 18:03:16 +02007248 keepj call s:NetrwRemoteFtpCmd(a:path,"rmdir ".a:rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007249 else
7250 let rmfile = substitute(a:path.a:rmfile,'/$','','')
Bram Moolenaar5c736222010-01-06 20:54:52 +01007251 let netrw_rmdir_cmd = s:MakeSshCmd(netrw#WinPath(g:netrw_rmdir_cmd)).' '.shellescape(netrw#WinPath(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007252" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
Bram Moolenaarc236c162008-07-13 17:41:49 +00007253 let ret= system(netrw_rmdir_cmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007254" call Decho("returned=".ret." errcode=".v:shell_error)
7255
7256 if v:shell_error != 0
Bram Moolenaarc236c162008-07-13 17:41:49 +00007257" call Decho("v:shell_error not 0")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007258 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 +00007259" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
7260 let ret= system(netrw_rmf_cmd)
7261" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007262
7263 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007264 keepj call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",22)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007265 endif
7266 endif
7267 endif
7268
7269 elseif ok =~ 'q\%[uit]'
7270 break
7271 endif
7272 endif
7273
7274" call Dret("s:NetrwRemoteRmFile ".ok)
7275 return ok
7276endfun
7277
7278" ---------------------------------------------------------------------
7279" s:NetrwRemoteFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
7280" This function assumes that a long listing will be received. Size, time,
7281" and reverse sorts will be requested of the server but not otherwise
7282" enforced here.
7283fun! s:NetrwRemoteFtpCmd(path,listcmd)
7284" call Dfunc("NetrwRemoteFtpCmd(path<".a:path."> listcmd<".a:listcmd.">) netrw_method=".w:netrw_method)
7285" call Decho("line($)=".line("$")." bannercnt=".w:netrw_bannercnt)
7286
7287 " because WinXX ftp uses unix style input
7288 let ffkeep= &ff
7289 setlocal ma ff=unix noro
7290" call Decho("setlocal ma ff=unix noro")
7291
7292 " clear off any older non-banner lines
7293 " note that w:netrw_bannercnt indexes the line after the banner
Bram Moolenaaradc21822011-04-01 18:03:16 +02007294" call Decho('exe sil! keepjumps '.w:netrw_bannercnt.",$d (clear off old non-banner lines)")
7295 exe "sil! keepjumps ".w:netrw_bannercnt.",$d"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007296
7297 ".........................................
7298 if w:netrw_method == 2 || w:netrw_method == 5
7299 " ftp + <.netrc>: Method #2
7300 if a:path != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007301 keepj put ='cd \"'.a:path.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007302 endif
7303 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007304 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00007305" call Decho("filter input: ".getline('.'))
7306 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02007307 keepj call setline(line("$")+1,a:listcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007308" exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
7309 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02007310" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
Bram Moolenaar15146672011-10-20 22:22:38 +02007311 exe s:netrw_silentxfer." keepj ".w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007312 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02007313" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
Bram Moolenaar15146672011-10-20 22:22:38 +02007314 exe s:netrw_silentxfer." keepj ".w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007315 endif
7316
7317 ".........................................
7318 elseif w:netrw_method == 3
7319 " ftp + machine,id,passwd,filename: Method #3
7320 setlocal ff=unix
7321 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007322 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00007323 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007324 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00007325 endif
7326
7327 if exists("g:netrw_ftp") && g:netrw_ftp == 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007328 keepj put =g:netrw_uid
7329 keepj put ='\"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007330 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007331 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007332 endif
7333
7334 if a:path != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007335 keepj put ='cd \"'.a:path.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007336 endif
7337 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007338 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00007339" call Decho("filter input: ".getline('.'))
7340 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007341 keepj call setline(line("$")+1,a:listcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007342
7343 " perform ftp:
7344 " -i : turns off interactive prompting from ftp
7345 " -n unix : DON'T use <.netrc>, even though it exists
7346 " -n win32: quit being obnoxious about password
7347" exe w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007348" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i -n")
7349 exe s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i -n"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007350
7351 ".........................................
7352 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02007353 keepj call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",23)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007354 endif
7355
7356 " cleanup for Windows
7357 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007358 sil! keepj %s/\r$//e
Bram Moolenaaradc21822011-04-01 18:03:16 +02007359 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007360 endif
7361 if a:listcmd == "dir"
7362 " infer directory/link based on the file permission string
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007363 sil! keepj g/d\%([-r][-w][-x]\)\{3}/keepj s@$@/@
7364 sil! keepj g/l\%([-r][-w][-x]\)\{3}/keepj s/$/@/
Bram Moolenaaradc21822011-04-01 18:03:16 +02007365 keepj call histdel("/",-1)
7366 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007367 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007368 exe "sil! keepj ".w:netrw_bannercnt.',$s/^\%(\S\+\s\+\)\{8}//e'
Bram Moolenaaradc21822011-04-01 18:03:16 +02007369 keepj call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007370 endif
7371 endif
7372
7373 " ftp's listing doesn't seem to include ./ or ../
7374 if !search('^\.\/$\|\s\.\/$','wn')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007375 exe 'keepj '.w:netrw_bannercnt
7376 keepj put ='./'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007377 endif
7378 if !search('^\.\.\/$\|\s\.\.\/$','wn')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007379 exe 'keepj '.w:netrw_bannercnt
7380 keepj put ='../'
Bram Moolenaar446cb832008-06-24 21:56:24 +00007381 endif
7382
7383 " restore settings
7384 let &ff= ffkeep
7385" call Dret("NetrwRemoteFtpCmd")
7386endfun
7387
7388" ---------------------------------------------------------------------
7389" s:NetrwRemoteRename: rename a remote file or directory {{{2
7390fun! s:NetrwRemoteRename(usrhost,path) range
7391" call Dfunc("NetrwRemoteRename(usrhost<".a:usrhost."> path<".a:path.">)")
7392
7393 " preparation for removing multiple files/directories
7394 let svpos = netrw#NetrwSavePosn()
7395 let ctr = a:firstline
7396 let rename_cmd = s:MakeSshCmd(g:netrw_rename_cmd)
7397
7398 " rename files given by the markfilelist
7399 if exists("s:netrwmarkfilelist_{bufnr('%')}")
7400 for oldname in s:netrwmarkfilelist_{bufnr("%")}
7401" call Decho("oldname<".oldname.">")
7402 if exists("subfrom")
7403 let newname= substitute(oldname,subfrom,subto,'')
7404" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
7405 else
7406 call inputsave()
7407 let newname= input("Moving ".oldname." to : ",oldname)
7408 call inputrestore()
7409 if newname =~ '^s/'
7410 let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
7411 let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
7412 let newname = substitute(oldname,subfrom,subto,'')
7413" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
7414 endif
7415 endif
7416
7417 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaaradc21822011-04-01 18:03:16 +02007418 keepj call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007419 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00007420 let oldname= shellescape(a:path.oldname)
7421 let newname= shellescape(a:path.newname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007422" call Decho("system(netrw#WinPath(".rename_cmd.") ".oldname.' '.newname.")")
7423 let ret = system(netrw#WinPath(rename_cmd).' '.oldname.' '.newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007424 endif
7425
7426 endfor
7427 call s:NetrwUnMarkFile(1)
7428
7429 else
7430
7431 " attempt to rename files/directories
7432 while ctr <= a:lastline
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007433 exe "keepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00007434
7435 let oldname= s:NetrwGetWord()
7436" call Decho("oldname<".oldname.">")
7437
7438 call inputsave()
7439 let newname= input("Moving ".oldname." to : ",oldname)
7440 call inputrestore()
7441
7442 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
7443 call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
7444 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00007445 let oldname= shellescape(a:path.oldname)
7446 let newname= shellescape(a:path.newname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007447" call Decho("system(netrw#WinPath(".rename_cmd.") ".oldname.' '.newname.")")
7448 let ret = system(netrw#WinPath(rename_cmd).' '.oldname.' '.newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007449 endif
7450
7451 let ctr= ctr + 1
7452 endwhile
7453 endif
7454
7455 " refresh the directory
Bram Moolenaaradc21822011-04-01 18:03:16 +02007456 keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
7457 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007458
7459" call Dret("NetrwRemoteRename")
7460endfun
7461
7462" ---------------------------------------------------------------------
7463" Local Directory Browsing Support: {{{1
7464" ==========================================
7465
7466" ---------------------------------------------------------------------
7467" netrw#LocalBrowseCheck: {{{2
7468fun! netrw#LocalBrowseCheck(dirname)
7469 " unfortunate interaction -- split window debugging can't be
7470 " used here, must use D-echoRemOn or D-echoTabOn -- the BufEnter
7471 " event triggers another call to LocalBrowseCheck() when attempts
7472 " to write to the DBG buffer are made.
7473 " The &ft == "netrw" test was installed because the BufEnter event
7474 " would hit when re-entering netrw windows, creating unexpected
7475 " refreshes (and would do so in the middle of NetrwSaveOptions(), too)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007476" call Decho("netrw#LocalBrowseCheck: isdir<".a:dirname.">=".isdirectory(a:dirname).((exists("s:treeforceredraw")? " treeforceredraw" : "")))
Bram Moolenaaradc21822011-04-01 18:03:16 +02007477" call Dredir("LocalBrowseCheck","ls!")|redraw!|sleep 3
Bram Moolenaar446cb832008-06-24 21:56:24 +00007478 if isdirectory(a:dirname)
7479" call Decho(" ft<".&ft."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : " doesn't exist")."> dirname<".a:dirname.">"." line($)=".line("$"))
7480 if &ft != "netrw" || (exists("b:netrw_curdir") && b:netrw_curdir != a:dirname)
Bram Moolenaaradc21822011-04-01 18:03:16 +02007481 sil! keepj call s:NetrwBrowse(1,a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007482 elseif &ft == "netrw" && line("$") == 1
Bram Moolenaaradc21822011-04-01 18:03:16 +02007483 sil! keepj call s:NetrwBrowse(1,a:dirname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007484 elseif exists("s:treeforceredraw")
7485 unlet s:treeforceredraw
Bram Moolenaaradc21822011-04-01 18:03:16 +02007486 sil! keepj call s:NetrwBrowse(1,a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007487 endif
7488 endif
7489 " not a directory, ignore it
7490endfun
7491
7492" ---------------------------------------------------------------------
7493" s:LocalListing: does the job of "ls" for local directories {{{2
7494fun! s:LocalListing()
7495" call Dfunc("s:LocalListing()")
7496" call Decho("&ma=".&ma)
7497" call Decho("&mod=".&mod)
7498" call Decho("&ro=".&ro)
7499" call Decho("bufname(%)<".bufname("%").">")
7500
7501" if exists("b:netrw_curdir") |call Decho('b:netrw_curdir<'.b:netrw_curdir.">") |else|call Decho("b:netrw_curdir doesn't exist") |endif
7502" 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
7503
7504 " get the list of files contained in the current directory
Bram Moolenaaradc21822011-04-01 18:03:16 +02007505 let dirname = b:netrw_curdir
Bram Moolenaar5c736222010-01-06 20:54:52 +01007506 let dirnamelen = s:Strlen(b:netrw_curdir)
Bram Moolenaar251e1912011-06-19 05:09:16 +02007507 let filelist = glob(s:ComposePath(fnameescape(dirname),"*"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007508" call Decho("glob(dirname<".dirname."/*>)=".filelist)
7509 if filelist != ""
7510 let filelist= filelist."\n"
7511 endif
Bram Moolenaar251e1912011-06-19 05:09:16 +02007512 let filelist= filelist.glob(s:ComposePath(fnameescape(dirname),".*"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007513" call Decho("glob(dirname<".dirname."/.*>)=".filelist)
7514
7515 " Coding choice: either elide ./ if present
7516 " or include ./ if not present
7517 if filelist =~ '[\\/]\.[\\/]\=\(\n\|$\)'
7518 " elide /path/. from glob() entries if present
7519" call Decho("elide /path/. from glob entries if present")
7520 let filelist = substitute(filelist,'\n','\t','g')
7521 let filelist = substitute(filelist,'^[^\t]\+[/\\]\.\t','','')
7522 let filelist = substitute(filelist,'[^\t]\+[/\\]\.$','','')
7523 let filelist = substitute(filelist,'\t\zs[^\t]\+[/\\]\.\t','','')
7524 let filelist = substitute(filelist,'\t','\n','g')
7525 endif
7526" call Decho("filelist<".filelist.">")
7527 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
7528 " include ../ in the glob() entry if its missing
7529" call Decho("forcibly tacking on ..")
7530 let filelist= filelist."\n".s:ComposePath(b:netrw_curdir,"../")
7531" call Decho("filelist<".filelist.">")
7532 endif
7533 if b:netrw_curdir == '/'
7534 " remove .. from filelist when current directory is root directory
7535" call Decho("remove .. from filelist")
7536 let filelist= substitute(filelist,'/\.\.\n','','')
7537 endif
7538 " remove multiple contiguous newlines
7539 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
7540 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
7541 " change all \s to /s
7542" call Decho('change all \s to /s')
7543 let filelist= substitute(filelist,'\','/','g')
7544 else
7545 " escape all \s to \\
7546" call Decho('escape all \s to \\')
7547 let filelist= substitute(filelist,'\','\\','g')
7548 endif
7549
7550" call Decho("(before while) dirname<".dirname.">")
7551" call Decho("(before while) dirnamelen<".dirnamelen.">")
7552" call Decho("(before while) filelist<".filelist.">")
7553
7554 while filelist != ""
7555 if filelist =~ '\n'
7556 let filename = substitute(filelist,'\n.*$','','e')
7557 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
7558 else
7559 let filename = filelist
7560 let filelist = ""
7561 endif
7562" call Decho(" ")
7563" call Decho("(while) filelist<".filelist.">")
7564" call Decho("(while) filename<".filename.">")
7565
7566 if getftype(filename) == "link"
7567 " indicate a symbolic link
7568" call Decho("indicate <".filename."> is a symbolic link with trailing @")
7569 let pfile= filename."@"
7570
7571 elseif getftype(filename) == "socket"
7572 " indicate a socket
7573" call Decho("indicate <".filename."> is a socket with trailing =")
7574 let pfile= filename."="
7575
7576 elseif getftype(filename) == "fifo"
7577 " indicate a fifo
7578" call Decho("indicate <".filename."> is a fifo with trailing |")
7579 let pfile= filename."|"
7580
7581 elseif isdirectory(filename)
7582 " indicate a directory
7583" call Decho("indicate <".filename."> is a directory with trailing /")
7584 let pfile= filename."/"
7585
7586 elseif exists("b:netrw_curdir") && b:netrw_curdir !~ '^.*://' && !isdirectory(filename)
7587 if (has("win32") || has("win95") || has("win64") || has("win16"))
7588 if filename =~ '\.[eE][xX][eE]$' || filename =~ '\.[cC][oO][mM]$' || filename =~ '\.[bB][aA][tT]$'
7589 " indicate an executable
7590" call Decho("indicate <".filename."> is executable with trailing *")
7591 let pfile= filename."*"
7592 else
7593 " normal file
7594 let pfile= filename
7595 endif
7596 elseif executable(filename)
7597 " indicate an executable
7598" call Decho("indicate <".filename."> is executable with trailing *")
7599 let pfile= filename."*"
7600 else
7601 " normal file
7602 let pfile= filename
7603 endif
7604
7605 else
7606 " normal file
7607 let pfile= filename
7608 endif
7609" call Decho("pfile<".pfile."> (after *@/ appending)")
7610
7611 if pfile =~ '//$'
7612 let pfile= substitute(pfile,'//$','/','e')
7613" call Decho("change // to /: pfile<".pfile.">")
7614 endif
7615 let pfile= strpart(pfile,dirnamelen)
7616 let pfile= substitute(pfile,'^[/\\]','','e')
7617" call Decho("filename<".filename.">")
7618" call Decho("pfile <".pfile.">")
7619
7620 if w:netrw_liststyle == s:LONGLIST
7621 let sz = getfsize(filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007622 let fsz = strpart(" ",1,15-strlen(sz)).sz
Bram Moolenaar446cb832008-06-24 21:56:24 +00007623 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
7624" call Decho("sz=".sz." fsz=".fsz)
7625 endif
7626
7627 if g:netrw_sort_by =~ "^t"
7628 " sort by time (handles time up to 1 quintillion seconds, US)
7629" call Decho("getftime(".filename.")=".getftime(filename))
7630 let t = getftime(filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007631 let ft = strpart("000000000000000000",1,18-strlen(t)).t
Bram Moolenaar446cb832008-06-24 21:56:24 +00007632" call Decho("exe keepjumps put ='".ft.'/'.filename."'")
7633 let ftpfile= ft.'/'.pfile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007634 sil! keepj put=ftpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00007635
7636 elseif g:netrw_sort_by =~ "^s"
7637 " sort by size (handles file sizes up to 1 quintillion bytes, US)
7638" call Decho("getfsize(".filename.")=".getfsize(filename))
7639 let sz = getfsize(filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007640 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
Bram Moolenaar446cb832008-06-24 21:56:24 +00007641" call Decho("exe keepjumps put ='".fsz.'/'.filename."'")
7642 let fszpfile= fsz.'/'.pfile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007643 sil! keepj put =fszpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00007644
7645 else
7646 " sort by name
7647" call Decho("exe keepjumps put ='".pfile."'")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007648 sil! keepj put=pfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00007649 endif
7650 endwhile
7651
7652 " cleanup any windows mess at end-of-line
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007653 sil! keepj g/^$/d
7654 sil! keepj %s/\r$//e
Bram Moolenaar5c736222010-01-06 20:54:52 +01007655 call histdel("/",-1)
Bram Moolenaar15146672011-10-20 22:22:38 +02007656 exe "setl ts=".g:netrw_maxfilenamelen
7657" call Decho("setl ts=".g:netrw_maxfilenamelen)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007658
7659" call Dret("s:LocalListing")
7660endfun
7661
7662" ---------------------------------------------------------------------
7663" s:LocalBrowseShellCmdRefresh: this function is called after a user has {{{2
7664" performed any shell command. The idea is to cause all local-browsing
7665" buffers to be refreshed after a user has executed some shell command,
7666" on the chance that s/he removed/created a file/directory with it.
7667fun! s:LocalBrowseShellCmdRefresh()
7668" call Dfunc("LocalBrowseShellCmdRefresh() browselist=".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "empty")." ".tabpagenr("$")." tabs")
7669 " determine which buffers currently reside in a tab
7670 if !exists("s:netrw_browselist")
7671" call Dret("LocalBrowseShellCmdRefresh : browselist is empty")
7672 return
7673 endif
7674 if !exists("w:netrw_bannercnt")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007675" call Dret("LocalBrowseShellCmdRefresh : don't refresh when focus not on netrw window")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007676 return
7677 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007678 if exists("s:locbrowseshellcmd")
7679 if s:locbrowseshellcmd
7680 let s:locbrowseshellcmd= 0
7681" call Dret("LocalBrowseShellCmdRefresh : NetrwBrowse itself caused the refresh")
7682 return
7683 endif
7684 let s:locbrowseshellcmd= 0
7685 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007686 let itab = 1
7687 let buftablist = []
7688 while itab <= tabpagenr("$")
7689 let buftablist = buftablist + tabpagebuflist()
7690 let itab = itab + 1
7691 tabn
7692 endwhile
7693" call Decho("buftablist".string(buftablist))
7694" call Decho("s:netrw_browselist<".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "").">")
7695 " GO through all buffers on netrw_browselist (ie. just local-netrw buffers):
7696 " | refresh any netrw window
7697 " | wipe out any non-displaying netrw buffer
7698 let curwin = winnr()
7699 let ibl = 0
7700 for ibuf in s:netrw_browselist
7701" call Decho("bufwinnr(".ibuf.") index(buftablist,".ibuf.")=".index(buftablist,ibuf))
7702 if bufwinnr(ibuf) == -1 && index(buftablist,ibuf) == -1
7703 " wipe out any non-displaying netrw buffer
7704" call Decho("wiping buf#".ibuf,"<".bufname(ibuf).">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007705 exe "sil! bd ".fnameescape(ibuf)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007706 call remove(s:netrw_browselist,ibl)
7707" call Decho("browselist=".string(s:netrw_browselist))
7708 continue
7709 elseif index(tabpagebuflist(),ibuf) != -1
7710 " refresh any netrw buffer
7711" call Decho("refresh buf#".ibuf.'-> win#'.bufwinnr(ibuf))
7712 exe bufwinnr(ibuf)."wincmd w"
Bram Moolenaaradc21822011-04-01 18:03:16 +02007713 keepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007714 endif
7715 let ibl= ibl + 1
7716 endfor
7717 exe curwin."wincmd w"
7718
7719" call Dret("LocalBrowseShellCmdRefresh")
7720endfun
7721
7722" ---------------------------------------------------------------------
7723" s:NetrwLocalRm: {{{2
7724fun! s:NetrwLocalRm(path) range
7725" call Dfunc("s:NetrwLocalRm(path<".a:path.">)")
7726" call Decho("firstline=".a:firstline." lastline=".a:lastline)
7727
7728 " preparation for removing multiple files/directories
7729 let ret = 0
7730 let all = 0
7731 let svpos = netrw#NetrwSavePosn()
7732
7733 if exists("s:netrwmarkfilelist_{bufnr('%')}")
7734 " remove all marked files
7735" call Decho("remove all marked files")
7736 for fname in s:netrwmarkfilelist_{bufnr("%")}
7737 let ok= s:NetrwLocalRmFile(a:path,fname,all)
7738 if ok =~ 'q\%[uit]' || ok == "no"
7739 break
7740 elseif ok =~ 'a\%[ll]'
7741 let all= 1
7742 endif
7743 endfor
7744 call s:NetrwUnMarkFile(1)
7745
7746 else
7747 " remove (multiple) files and directories
7748" call Decho("remove files in range [".a:firstline.",".a:lastline."]")
7749
7750 let ctr = a:firstline
7751 while ctr <= a:lastline
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007752 exe "keepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00007753
7754 " sanity checks
7755 if line(".") < w:netrw_bannercnt
7756 let ctr= ctr + 1
7757 continue
7758 endif
7759 let curword= s:NetrwGetWord()
7760 if curword == "./" || curword == "../"
7761 let ctr= ctr + 1
7762 continue
7763 endif
7764 let ok= s:NetrwLocalRmFile(a:path,curword,all)
7765 if ok =~ 'q\%[uit]' || ok == "no"
7766 break
7767 elseif ok =~ 'a\%[ll]'
7768 let all= 1
7769 endif
7770 let ctr= ctr + 1
7771 endwhile
7772 endif
7773
7774 " refresh the directory
7775" call Decho("bufname<".bufname("%").">")
7776 if bufname("%") != "NetrwMessage"
Bram Moolenaaradc21822011-04-01 18:03:16 +02007777 keepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
7778 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007779 endif
7780
7781" call Dret("s:NetrwLocalRm")
7782endfun
7783
7784" ---------------------------------------------------------------------
7785" s:NetrwLocalRmFile: remove file fname given the path {{{2
7786" Give confirmation prompt unless all==1
7787fun! s:NetrwLocalRmFile(path,fname,all)
7788" call Dfunc("s:NetrwLocalRmFile(path<".a:path."> fname<".a:fname."> all=".a:all)
7789
7790 let all= a:all
7791 let ok = ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007792 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00007793 let rmfile= s:ComposePath(a:path,a:fname)
7794" call Decho("rmfile<".rmfile.">")
7795
7796 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
7797 " attempt to remove file
7798" call Decho("attempt to remove file<".rmfile.">")
7799 if !all
7800 echohl Statement
7801 call inputsave()
7802 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
7803 call inputrestore()
7804 echohl NONE
7805 if ok == ""
7806 let ok="no"
7807 endif
7808" call Decho("response: ok<".ok.">")
7809 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
7810" call Decho("response: ok<".ok."> (after sub)")
7811 if ok =~ 'a\%[ll]'
7812 let all= 1
7813 endif
7814 endif
7815
7816 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00007817 let ret= s:NetrwDelete(rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007818" call Decho("errcode=".v:shell_error." ret=".ret)
7819 endif
7820
7821 else
7822 " attempt to remove directory
7823 if !all
7824 echohl Statement
7825 call inputsave()
7826 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
7827 call inputrestore()
7828 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
7829 if ok == ""
7830 let ok="no"
7831 endif
7832 if ok =~ 'a\%[ll]'
7833 let all= 1
7834 endif
7835 endif
7836 let rmfile= substitute(rmfile,'[\/]$','','e')
7837
7838 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar5c736222010-01-06 20:54:52 +01007839" call Decho("1st attempt: system(netrw#WinPath(".g:netrw_local_rmdir.') '.shellescape(rmfile).')')
7840 call system(netrw#WinPath(g:netrw_local_rmdir).' '.shellescape(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007841" call Decho("v:shell_error=".v:shell_error)
7842
7843 if v:shell_error != 0
7844" call Decho("2nd attempt to remove directory<".rmfile.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00007845 let errcode= s:NetrwDelete(rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007846" call Decho("errcode=".errcode)
7847
7848 if errcode != 0
7849 if has("unix")
7850" call Decho("3rd attempt to remove directory<".rmfile.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00007851 call system("rm ".shellescape(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007852 if v:shell_error != 0 && !exists("g:netrw_quiet")
7853 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",34)
7854 let ok="no"
7855 endif
7856 elseif !exists("g:netrw_quiet")
7857 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",35)
7858 let ok="no"
7859 endif
7860 endif
7861 endif
7862 endif
7863 endif
7864
7865" call Dret("s:NetrwLocalRmFile ".ok)
7866 return ok
7867endfun
7868
7869" ---------------------------------------------------------------------
7870" s:NetrwLocalRename: rename a remote file or directory {{{2
7871fun! s:NetrwLocalRename(path) range
7872" call Dfunc("NetrwLocalRename(path<".a:path.">)")
7873
7874 " preparation for removing multiple files/directories
7875 let ctr = a:firstline
7876 let svpos= netrw#NetrwSavePosn()
7877
7878 " rename files given by the markfilelist
7879 if exists("s:netrwmarkfilelist_{bufnr('%')}")
7880 for oldname in s:netrwmarkfilelist_{bufnr("%")}
7881" call Decho("oldname<".oldname.">")
7882 if exists("subfrom")
7883 let newname= substitute(oldname,subfrom,subto,'')
7884" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
7885 else
7886 call inputsave()
7887 let newname= input("Moving ".oldname." to : ",oldname)
7888 call inputrestore()
7889 if newname =~ '^s/'
7890 let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
7891 let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
7892" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
7893 let newname = substitute(oldname,subfrom,subto,'')
7894 endif
7895 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00007896 call rename(oldname,newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007897 endfor
Bram Moolenaar5c736222010-01-06 20:54:52 +01007898 call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007899
7900 else
7901
7902 " attempt to rename files/directories
7903 while ctr <= a:lastline
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007904 exe "keepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00007905
7906 " sanity checks
7907 if line(".") < w:netrw_bannercnt
7908 let ctr= ctr + 1
7909 continue
7910 endif
7911 let curword= s:NetrwGetWord()
7912 if curword == "./" || curword == "../"
7913 let ctr= ctr + 1
7914 continue
7915 endif
7916
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007917 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00007918 let oldname= s:ComposePath(a:path,curword)
7919" call Decho("oldname<".oldname.">")
7920
7921 call inputsave()
7922 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
7923 call inputrestore()
7924
Bram Moolenaare37d50a2008-08-06 17:06:04 +00007925 call rename(oldname,newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007926" call Decho("renaming <".oldname."> to <".newname.">")
7927
7928 let ctr= ctr + 1
7929 endwhile
7930 endif
7931
7932 " refresh the directory
7933" call Decho("refresh the directory listing")
Bram Moolenaaradc21822011-04-01 18:03:16 +02007934 keepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
7935 keepj call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007936
7937" call Dret("NetrwLocalRename")
7938endfun
7939
7940" ---------------------------------------------------------------------
7941" s:LocalFastBrowser: handles setting up/taking down fast browsing for the local browser {{{2
7942"
7943" g:netrw_ Directory Is
7944" fastbrowse Local Remote
7945" slow 0 D D D=Deleting a buffer implies it will not be re-used (slow)
7946" med 1 D H H=Hiding a buffer implies it may be re-used (fast)
7947" fast 2 H H
7948"
7949" Deleting a buffer means that it will be re-loaded when examined, hence "slow".
7950" Hiding a buffer means that it will be re-used when examined, hence "fast".
7951" (re-using a buffer may not be as accurate)
7952fun! s:LocalFastBrowser()
7953" call Dfunc("LocalFastBrowser() g:netrw_fastbrowse=".g:netrw_fastbrowse)
7954
7955 " initialize browselist, a list of buffer numbers that the local browser has used
7956 if !exists("s:netrw_browselist")
7957" call Decho("initialize s:netrw_browselist")
7958 let s:netrw_browselist= []
7959 endif
7960
7961 " append current buffer to fastbrowse list
7962 if empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1]
7963" call Decho("appendng current buffer to browselist")
7964 call add(s:netrw_browselist,bufnr("%"))
7965" call Decho("browselist=".string(s:netrw_browselist))
7966 endif
7967
7968 " enable autocmd events to handle refreshing/removing local browser buffers
7969 " If local browse buffer is currently showing: refresh it
7970 " If local browse buffer is currently hidden : wipe it
7971 if !exists("s:netrw_browser_shellcmd") && g:netrw_fastbrowse <= 1
7972" call Decho("setting up local-browser shell command refresh")
7973 let s:netrw_browser_shellcmd= 1
7974 augroup AuNetrwShellCmd
7975 au!
7976 if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01007977" call Decho("autocmd: ShellCmdPost * call s:LocalBrowseShellCmdRefresh()")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007978 au ShellCmdPost * call s:LocalBrowseShellCmdRefresh()
7979 else
7980 au ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()
Bram Moolenaar5c736222010-01-06 20:54:52 +01007981" call Decho("autocmd: ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007982 endif
7983 augroup END
7984 endif
7985
7986 " user must have changed fastbrowse to its fast setting, so remove
7987 " the associated autocmd events
7988 if g:netrw_fastbrowse > 1 && exists("s:netrw_browser_shellcmd")
7989" call Decho("remove AuNetrwShellCmd autcmd group")
7990 unlet s:netrw_browser_shellcmd
7991 augroup AuNetrwShellCmd
7992 au!
7993 augroup END
7994 augroup! AuNetrwShellCmd
7995 endif
7996
7997" call Dret("LocalFastBrowser : browselist<".string(s:netrw_browselist).">")
7998endfun
7999
8000" ---------------------------------------------------------------------
Bram Moolenaar15146672011-10-20 22:22:38 +02008001" netrw#FileUrlRead: handles reading file://* files {{{2
8002" Should accept: file://localhost/etc/fstab
8003" file:///etc/fstab
8004" file:///c:/WINDOWS/clock.avi
8005" file:///c|/WINDOWS/clock.avi
8006" file://localhost/c:/WINDOWS/clock.avi
8007" file://localhost/c|/WINDOWS/clock.avi
8008" file://c:/foo.txt
8009" file:///c:/foo.txt
8010" and %XX (where X is [0-9a-fA-F] is converted into a character with the given hexadecimal value
Bram Moolenaaradc21822011-04-01 18:03:16 +02008011fun! netrw#FileUrlRead(fname)
Bram Moolenaar15146672011-10-20 22:22:38 +02008012" call Dfunc("netrw#FileUrlRead(fname<".a:fname.">)")
8013 let fname = a:fname
8014 if fname =~ '^file://localhost/'
8015" call Decho('converting file://localhost/ -to- file:///')
8016 let fname= substitute(fname,'^file://localhost/','file:///','')
8017" call Decho("fname<".fname.">")
8018 endif
8019 if (has("win32") || has("win95") || has("win64") || has("win16"))
8020 if fname =~ '^file:///\=\a[|:]/'
8021" call Decho('converting file:///\a|/ -to- file://\a:/')
8022 let fname = substitute(fname,'^file:///\=\(\a\)[|:]/','file://\1:/','')
8023" call Decho("fname<".fname.">")
8024 endif
8025 endif
8026 let fname2396 = netrw#RFC2396(fname)
Bram Moolenaaradc21822011-04-01 18:03:16 +02008027 let fname2396e= fnameescape(fname2396)
8028 let plainfname= substitute(fname2396,'file://\(.*\)','\1',"")
Bram Moolenaar15146672011-10-20 22:22:38 +02008029 if (has("win32") || has("win95") || has("win64") || has("win16"))
8030" call Decho("windows exception for plainfname")
8031 if plainfname =~ '^/\+\a:'
8032" call Decho('removing leading "/"s')
8033 let plainfname= substitute(plainfname,'^/\+\(\a:\)','\1','')
8034 endif
8035 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02008036" call Decho("fname2396<".fname2396.">")
8037" call Decho("plainfname<".plainfname.">")
8038 exe "sil doau BufReadPre ".fname2396e
Bram Moolenaar15146672011-10-20 22:22:38 +02008039 exe 'keepj r '.plainfname
Bram Moolenaaradc21822011-04-01 18:03:16 +02008040 exe 'file! '.plainfname
Bram Moolenaar15146672011-10-20 22:22:38 +02008041 keepj 1d
8042 setl nomod
Bram Moolenaaradc21822011-04-01 18:03:16 +02008043" call Dret("netrw#FileUrlRead")
8044 exe "sil doau BufReadPost ".fname2396e
8045endfun
8046
8047" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008048" Support Functions: {{{1
8049
Bram Moolenaar488c6512005-08-11 20:09:58 +00008050" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008051" netrw#ErrorMsg: {{{2
8052" 0=note = s:NOTE
8053" 1=warning = s:WARNING
8054" 2=error = s:ERROR
Bram Moolenaar251e1912011-06-19 05:09:16 +02008055" Apr 18, 2011 : max errnum currently is 78
Bram Moolenaar9964e462007-05-05 17:54:07 +00008056fun! netrw#ErrorMsg(level,msg,errnum)
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00008057" 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 +00008058
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00008059 if a:level == 1
8060 let level= "**warning** (netrw) "
8061 elseif a:level == 2
8062 let level= "**error** (netrw) "
8063 else
8064 let level= "**note** (netrw) "
Bram Moolenaar9964e462007-05-05 17:54:07 +00008065 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008066" call Decho("level=".level)
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00008067
8068 if g:netrw_use_errorwindow
8069 " (default) netrw creates a one-line window to show error/warning
8070 " messages (reliably displayed)
8071
Bram Moolenaar446cb832008-06-24 21:56:24 +00008072 " record current window number for NetrwRestorePosn()'s benefit
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00008073 let s:winBeforeErr= winnr()
Bram Moolenaar446cb832008-06-24 21:56:24 +00008074" call Decho("s:winBeforeErr=".s:winBeforeErr)
8075
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00008076 " getting messages out reliably is just plain difficult!
8077 " This attempt splits the current window, creating a one line window.
8078 if bufexists("NetrwMessage") && bufwinnr("NetrwMessage") > 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00008079" call Decho("write to NetrwMessage buffer")
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00008080 exe bufwinnr("NetrwMessage")."wincmd w"
Bram Moolenaar15146672011-10-20 22:22:38 +02008081" call Decho("setl ma noro")
8082 setl ma noro
Bram Moolenaaradc21822011-04-01 18:03:16 +02008083 keepj call setline(line("$")+1,level.a:msg)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008084 keepj $
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00008085 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00008086" call Decho("create a NetrwMessage buffer window")
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00008087 bo 1split
Bram Moolenaar5c736222010-01-06 20:54:52 +01008088 call s:NetrwEnew()
Bram Moolenaaradc21822011-04-01 18:03:16 +02008089 keepj call s:NetrwSafeOptions()
Bram Moolenaar15146672011-10-20 22:22:38 +02008090 setl bt=nofile
Bram Moolenaaradc21822011-04-01 18:03:16 +02008091 keepj file NetrwMessage
Bram Moolenaar446cb832008-06-24 21:56:24 +00008092" call Decho("setlocal ma noro")
Bram Moolenaar15146672011-10-20 22:22:38 +02008093 setl ma noro
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00008094 call setline(line("$"),level.a:msg)
8095 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008096" call Decho("wrote msg<".level.a:msg."> to NetrwMessage win#".winnr())
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00008097 if &fo !~ '[ta]'
8098 syn clear
8099 syn match netrwMesgNote "^\*\*note\*\*"
8100 syn match netrwMesgWarning "^\*\*warning\*\*"
8101 syn match netrwMesgError "^\*\*error\*\*"
8102 hi link netrwMesgWarning WarningMsg
8103 hi link netrwMesgError Error
8104 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02008105 setl noma ro bh=wipe
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00008106
8107 else
8108 " (optional) netrw will show messages using echomsg. Even if the
8109 " message doesn't appear, at least it'll be recallable via :messages
Bram Moolenaar446cb832008-06-24 21:56:24 +00008110" redraw!
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00008111 if a:level == s:WARNING
8112 echohl WarningMsg
8113 elseif a:level == s:ERROR
8114 echohl Error
8115 endif
8116 echomsg level.a:msg
8117" call Decho("echomsg ***netrw*** ".a:msg)
8118 echohl None
8119 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00008120
8121" call Dret("netrw#ErrorMsg")
8122endfun
8123
8124" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008125" netrw#NetrwRestorePosn: restores the cursor and file position as saved by NetrwSavePosn() {{{2
8126fun! netrw#NetrwRestorePosn(...)
8127" 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))
8128 let eikeep= &ei
8129 set ei=all
8130 if expand("%") == "NetrwMessage"
8131 exe s:winBeforeErr."wincmd w"
8132 endif
8133
8134 if a:0 > 0
Bram Moolenaar15146672011-10-20 22:22:38 +02008135 exe "keepj ".a:1
Bram Moolenaarc236c162008-07-13 17:41:49 +00008136 endif
8137
8138 " restore window
8139 if exists("w:netrw_winnr")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008140" call Decho("restore window: exe sil! ".w:netrw_winnr."wincmd w")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008141 exe "sil! ".w:netrw_winnr."wincmd w"
Bram Moolenaarc236c162008-07-13 17:41:49 +00008142 endif
8143 if v:shell_error == 0
8144 " as suggested by Bram M: redraw on no error
8145 " allows protocol error messages to remain visible
8146" redraw!
8147 endif
8148
8149 " restore top-of-screen line
8150 if exists("w:netrw_hline")
Bram Moolenaar15146672011-10-20 22:22:38 +02008151" call Decho("restore topofscreen: exe keepj norm! ".w:netrw_hline."G0z")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008152 exe "keepj norm! ".w:netrw_hline."G0z\<CR>"
Bram Moolenaarc236c162008-07-13 17:41:49 +00008153 endif
8154
8155 " restore position
8156 if exists("w:netrw_line") && exists("w:netrw_col")
Bram Moolenaar15146672011-10-20 22:22:38 +02008157" call Decho("restore posn: exe keepj norm! ".w:netrw_line."G0".w:netrw_col."|")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008158 exe "keepj norm! ".w:netrw_line."G0".w:netrw_col."\<bar>"
Bram Moolenaarc236c162008-07-13 17:41:49 +00008159 endif
8160
8161 let &ei= eikeep
8162" call Dret("netrw#NetrwRestorePosn")
8163endfun
8164
8165" ---------------------------------------------------------------------
8166" netrw#NetrwSavePosn: saves position of cursor on screen {{{2
8167fun! netrw#NetrwSavePosn()
8168" call Dfunc("netrw#NetrwSavePosn()")
8169 " Save current line and column
8170 let w:netrw_winnr= winnr()
8171 let w:netrw_line = line(".")
8172 let w:netrw_col = virtcol(".")
Bram Moolenaar5c736222010-01-06 20:54:52 +01008173" call Decho("currently, win#".w:netrw_winnr." line#".w:netrw_line." col#".w:netrw_col)
Bram Moolenaarc236c162008-07-13 17:41:49 +00008174
8175 " Save top-of-screen line
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008176 keepj norm! H0
Bram Moolenaarc236c162008-07-13 17:41:49 +00008177 let w:netrw_hline= line(".")
8178
8179 " set up string holding position parameters
8180 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
8181
Bram Moolenaaradc21822011-04-01 18:03:16 +02008182 keepj call netrw#NetrwRestorePosn()
Bram Moolenaarc236c162008-07-13 17:41:49 +00008183" call Dret("netrw#NetrwSavePosn : winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline)
8184 return ret
8185endfun
8186
8187" ------------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008188" netrw#RFC2396: converts %xx into characters {{{2
8189fun! netrw#RFC2396(fname)
8190" call Dfunc("netrw#RFC2396(fname<".a:fname.">)")
8191 let fname = escape(substitute(a:fname,'%\(\x\x\)','\=nr2char("0x".submatch(1))','ge')," \t")
8192" call Dret("netrw#RFC2396 ".fname)
8193 return fname
8194endfun
8195
8196" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008197" s:ComposePath: Appends a new part to a path taking different systems into consideration {{{2
8198fun! s:ComposePath(base,subdir)
8199" call Dfunc("s:ComposePath(base<".a:base."> subdir<".a:subdir.">)")
8200
8201 if(has("amiga"))
8202" call Decho("amiga")
Bram Moolenaar5c736222010-01-06 20:54:52 +01008203 let ec = a:base[s:Strlen(a:base)-1]
Bram Moolenaarc236c162008-07-13 17:41:49 +00008204 if ec != '/' && ec != ':'
8205 let ret = a:base . "/" . a:subdir
8206 else
8207 let ret = a:base . a:subdir
8208 endif
8209
8210 elseif a:subdir =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16"))
8211" call Decho("windows")
8212 let ret= a:subdir
8213
Bram Moolenaar5c736222010-01-06 20:54:52 +01008214 elseif a:base =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16"))
8215" call Decho("windows")
8216 if a:base =~ '[/\\]$'
8217 let ret= a:base.a:subdir
8218 else
8219 let ret= a:base."/".a:subdir
8220 endif
8221
Bram Moolenaarc236c162008-07-13 17:41:49 +00008222 elseif a:base =~ '^\a\+://'
8223" call Decho("remote linux/macos")
8224 let urlbase = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\1','')
8225 let curpath = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\2','')
8226 if a:subdir == '../'
8227 if curpath =~ '[^/]/[^/]\+/$'
8228 let curpath= substitute(curpath,'[^/]\+/$','','')
8229 else
8230 let curpath=""
8231 endif
8232 let ret= urlbase.curpath
8233 else
8234 let ret= urlbase.curpath.a:subdir
8235 endif
8236" call Decho("urlbase<".urlbase.">")
8237" call Decho("curpath<".curpath.">")
8238" call Decho("ret<".ret.">")
8239
8240 else
8241" call Decho("local linux/macos")
8242 let ret = substitute(a:base."/".a:subdir,"//","/","g")
8243 if a:base =~ '^//'
8244 " keeping initial '//' for the benefit of network share listing support
8245 let ret= '/'.ret
8246 endif
8247 let ret= simplify(ret)
8248 endif
8249
8250" call Dret("s:ComposePath ".ret)
8251 return ret
8252endfun
8253
8254" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008255" s:FileReadable: o/s independent filereadable {{{2
8256fun! s:FileReadable(fname)
8257" call Dfunc("s:FileReadable(fname<".a:fname.">)")
8258
8259 if g:netrw_cygwin
8260 let ret= filereadable(substitute(a:fname,'/cygdrive/\(.\)','\1:/',''))
8261 else
8262 let ret= filereadable(a:fname)
8263 endif
8264
8265" call Dret("s:FileReadable ".ret)
8266 return ret
8267endfun
8268
8269" ---------------------------------------------------------------------
8270" s:GetTempfile: gets a tempname that'll work for various o/s's {{{2
8271" Places correct suffix on end of temporary filename,
8272" using the suffix provided with fname
8273fun! s:GetTempfile(fname)
8274" call Dfunc("s:GetTempfile(fname<".a:fname.">)")
8275
8276 if !exists("b:netrw_tmpfile")
8277 " get a brand new temporary filename
8278 let tmpfile= tempname()
8279" call Decho("tmpfile<".tmpfile."> : from tempname()")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008280
Bram Moolenaarc236c162008-07-13 17:41:49 +00008281 let tmpfile= substitute(tmpfile,'\','/','ge')
Bram Moolenaar9964e462007-05-05 17:54:07 +00008282" call Decho("tmpfile<".tmpfile."> : chgd any \\ -> /")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008283
Bram Moolenaar9964e462007-05-05 17:54:07 +00008284 " sanity check -- does the temporary file's directory exist?
8285 if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
Bram Moolenaarc236c162008-07-13 17:41:49 +00008286" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaaradc21822011-04-01 18:03:16 +02008287 keepj call netrw#ErrorMsg(s:ERROR,"your <".substitute(tmpfile,'[^/]\+$','','e')."> directory is missing!",2)
Bram Moolenaar9964e462007-05-05 17:54:07 +00008288" call Dret("s:GetTempfile getcwd<".getcwd().">")
8289 return ""
8290 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008291
Bram Moolenaar9964e462007-05-05 17:54:07 +00008292 " let netrw#NetSource() know about the tmpfile
Bram Moolenaar5c736222010-01-06 20:54:52 +01008293 let s:netrw_tmpfile= tmpfile " used by netrw#NetSource() and netrw#NetrwBrowseX()
Bram Moolenaar9964e462007-05-05 17:54:07 +00008294" call Decho("tmpfile<".tmpfile."> s:netrw_tmpfile<".s:netrw_tmpfile.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008295
Bram Moolenaar9964e462007-05-05 17:54:07 +00008296 " o/s dependencies
Bram Moolenaar446cb832008-06-24 21:56:24 +00008297 if g:netrw_cygwin != 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00008298 let tmpfile = substitute(tmpfile,'^\(\a\):','/cygdrive/\1','e')
8299 elseif has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008300 if !exists("+shellslash") || !&ssl
8301 let tmpfile = substitute(tmpfile,'/','\','g')
8302 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00008303 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00008304 let tmpfile = tmpfile
Bram Moolenaar9964e462007-05-05 17:54:07 +00008305 endif
8306 let b:netrw_tmpfile= tmpfile
8307" call Decho("o/s dependent fixed tempname<".tmpfile.">")
8308 else
8309 " re-use temporary filename
8310 let tmpfile= b:netrw_tmpfile
8311" call Decho("tmpfile<".tmpfile."> re-using")
8312 endif
8313
8314 " use fname's suffix for the temporary file
8315 if a:fname != ""
8316 if a:fname =~ '\.[^./]\+$'
8317" call Decho("using fname<".a:fname.">'s suffix")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008318 if a:fname =~ '\.tar\.gz$' || a:fname =~ '\.tar\.bz2$' || a:fname =~ '\.tar\.xz$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00008319 let suffix = ".tar".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008320 elseif a:fname =~ '.txz$'
8321 let suffix = ".txz".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
Bram Moolenaar9964e462007-05-05 17:54:07 +00008322 else
8323 let suffix = substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
8324 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00008325" call Decho("suffix<".suffix.">")
8326 let tmpfile= substitute(tmpfile,'\.tmp$','','e')
8327" call Decho("chgd tmpfile<".tmpfile."> (removed any .tmp suffix)")
8328 let tmpfile .= suffix
8329" call Decho("chgd tmpfile<".tmpfile."> (added ".suffix." suffix) netrw_fname<".b:netrw_fname.">")
8330 let s:netrw_tmpfile= tmpfile " supports netrw#NetSource()
8331 endif
8332 endif
8333
Bram Moolenaarc236c162008-07-13 17:41:49 +00008334" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar9964e462007-05-05 17:54:07 +00008335" call Dret("s:GetTempfile <".tmpfile.">")
8336 return tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00008337endfun
Bram Moolenaar9964e462007-05-05 17:54:07 +00008338
8339" ---------------------------------------------------------------------
8340" s:MakeSshCmd: transforms input command using USEPORT HOSTNAME into {{{2
Bram Moolenaarc236c162008-07-13 17:41:49 +00008341" a correct command for use with a system() call
Bram Moolenaar9964e462007-05-05 17:54:07 +00008342fun! s:MakeSshCmd(sshcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008343" call Dfunc("s:MakeSshCmd(sshcmd<".a:sshcmd.">) user<".s:user."> machine<".s:machine.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008344 let sshcmd = substitute(a:sshcmd,'\<HOSTNAME\>',s:user.s:machine,'')
8345 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00008346 let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.g:netrw_port,'')
Bram Moolenaar9964e462007-05-05 17:54:07 +00008347 elseif exists("s:port") && s:port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00008348 let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.s:port,'')
Bram Moolenaar9964e462007-05-05 17:54:07 +00008349 else
8350 let sshcmd= substitute(sshcmd,"USEPORT ",'','')
8351 endif
8352" call Dret("s:MakeSshCmd <".sshcmd.">")
8353 return sshcmd
8354endfun
8355
8356" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008357" s:NetrwBMShow: {{{2
8358fun! s:NetrwBMShow()
8359" call Dfunc("s:NetrwBMShow()")
8360 redir => bmshowraw
8361 menu
8362 redir END
8363 let bmshowlist = split(bmshowraw,'\n')
8364 if bmshowlist != []
8365 let bmshowfuncs= filter(bmshowlist,'v:val =~ "<SNR>\\d\\+_BMShow()"')
8366 if bmshowfuncs != []
8367 let bmshowfunc = substitute(bmshowfuncs[0],'^.*:\(call.*BMShow()\).*$','\1','')
8368 if bmshowfunc =~ '^call.*BMShow()'
Bram Moolenaaradc21822011-04-01 18:03:16 +02008369 exe "sil! keepj ".bmshowfunc
Bram Moolenaarc236c162008-07-13 17:41:49 +00008370 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008371 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008372 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00008373" call Dret("s:NetrwBMShow : bmshowfunc<".(exists("bmshowfunc")? bmshowfunc : 'n/a').">")
8374endfun
8375
8376" ---------------------------------------------------------------------
Bram Moolenaaradc21822011-04-01 18:03:16 +02008377" s:NetrwCursor: responsible for setting cursorline/cursorcolumn based upon g:netrw_cursor {{{2
8378fun! s:NetrwCursor()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008379 if !exists("w:netrw_liststyle")
8380 let w:netrw_liststyle= g:netrw_liststyle
8381 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02008382" call Dfunc("s:NetrwCursor() ft<".&ft."> liststyle=".w:netrw_liststyle." g:netrw_cursor=".g:netrw_cursor." s:netrw_usercuc=".s:netrw_usercuc." s:netrw_usercul=".s:netrw_usercul)
Bram Moolenaaradc21822011-04-01 18:03:16 +02008383
8384 if &ft != "netrw"
8385 " if the current window isn't a netrw directory listing window, then use user cursorline/column
8386 " settings. Affects when netrw is used to read/write a file using scp/ftp/etc.
Bram Moolenaar15146672011-10-20 22:22:38 +02008387" call Decho("case ft!=netrw: use user cul,cuc")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008388 let &l:cursorline = s:netrw_usercul
8389 let &l:cursorcolumn = s:netrw_usercuc
8390
8391 elseif g:netrw_cursor == 4
8392 " all styles: cursorline, cursorcolumn
Bram Moolenaar15146672011-10-20 22:22:38 +02008393" call Decho("case g:netrw_cursor==4: setl cul cuc")
8394 setl cursorline
8395 setl cursorcolumn
Bram Moolenaaradc21822011-04-01 18:03:16 +02008396
8397 elseif g:netrw_cursor == 3
8398 " thin-long-tree: cursorline, user's cursorcolumn
8399 " wide : cursorline, cursorcolumn
8400 if w:netrw_liststyle == s:WIDELIST
Bram Moolenaar15146672011-10-20 22:22:38 +02008401" call Decho("case g:netrw_cursor==3 and wide: setlocal cul cuc")
8402 setl cursorline
8403 setl cursorcolumn
Bram Moolenaaradc21822011-04-01 18:03:16 +02008404 else
Bram Moolenaar15146672011-10-20 22:22:38 +02008405" call Decho("case g:netrw_cursor==3 and not wide: setlocal cul (use user's cuc)")
8406 setl cursorline
Bram Moolenaaradc21822011-04-01 18:03:16 +02008407 let &l:cursorcolumn = s:netrw_usercuc
8408 endif
8409
8410 elseif g:netrw_cursor == 2
8411 " thin-long-tree: cursorline, user's cursorcolumn
8412 " wide : cursorline, user's cursorcolumn
Bram Moolenaar15146672011-10-20 22:22:38 +02008413" call Decho("case g:netrw_cursor==2: setlocal cuc (use user's cul)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008414 let &l:cursorcolumn = s:netrw_usercuc
Bram Moolenaar15146672011-10-20 22:22:38 +02008415 setl cursorline
Bram Moolenaaradc21822011-04-01 18:03:16 +02008416
8417 elseif g:netrw_cursor == 1
8418 " thin-long-tree: user's cursorline, user's cursorcolumn
8419 " wide : cursorline, user's cursorcolumn
8420 let &l:cursorcolumn = s:netrw_usercuc
8421 if w:netrw_liststyle == s:WIDELIST
Bram Moolenaar15146672011-10-20 22:22:38 +02008422" call Decho("case g:netrw_cursor==2 and wide: setlocal cul (use user's cuc)")
8423 set cursorline
Bram Moolenaaradc21822011-04-01 18:03:16 +02008424 else
Bram Moolenaar15146672011-10-20 22:22:38 +02008425" call Decho("case g:netrw_cursor==2 and not wide: (use user's cul,cuc)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008426 let &l:cursorline = s:netrw_usercul
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008427 endif
8428
8429 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02008430 " all styles: user's cursorline, user's cursorcolumn
Bram Moolenaar15146672011-10-20 22:22:38 +02008431" call Decho("default: (use user's cul,cuc)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008432 let &l:cursorline = s:netrw_usercul
8433 let &l:cursorcolumn = s:netrw_usercuc
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008434 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02008435
8436" call Dret("s:NetrwCursor : l:cursorline=".&l:cursorline." l:cursorcolumn=".&l:cursorcolumn)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008437endfun
8438
8439" ---------------------------------------------------------------------
8440" s:RestoreCursorline: restores cursorline/cursorcolumn to original user settings {{{2
8441fun! s:RestoreCursorline()
8442" call Dfunc("s:RestoreCursorline() currently, cul=".&l:cursorline." cuc=".&l:cursorcolumn." win#".winnr()." buf#".bufnr("%"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02008443 if exists("s:netrw_usercul")
8444 let &l:cursorline = s:netrw_usercul
8445 endif
8446 if exists("s:netrw_usercuc")
8447 let &l:cursorcolumn = s:netrw_usercuc
8448 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008449" call Dret("s:RestoreCursorline : restored cul=".&l:cursorline." cuc=".&l:cursorcolumn)
8450endfun
8451
8452" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008453" s:NetrwDelete: Deletes a file. {{{2
8454" Uses Steve Hall's idea to insure that Windows paths stay
8455" acceptable. No effect on Unix paths.
8456" Examples of use: let result= s:NetrwDelete(path)
8457fun! s:NetrwDelete(path)
8458" call Dfunc("s:NetrwDelete(path<".a:path.">)")
8459
Bram Moolenaar5c736222010-01-06 20:54:52 +01008460 let path = netrw#WinPath(a:path)
Bram Moolenaarc236c162008-07-13 17:41:49 +00008461 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
8462 if exists("+shellslash")
8463 let sskeep= &shellslash
8464 setlocal noshellslash
8465 let result = delete(path)
8466 let &shellslash = sskeep
8467 else
8468" call Decho("exe let result= ".a:cmd."('".path."')")
8469 let result= delete(path)
8470 endif
8471 else
8472" call Decho("let result= delete(".path.")")
8473 let result= delete(path)
8474 endif
8475 if result < 0
Bram Moolenaaradc21822011-04-01 18:03:16 +02008476 keepj call netrw#ErrorMsg(s:WARNING,"delete(".path.") failed!",71)
Bram Moolenaarc236c162008-07-13 17:41:49 +00008477 endif
8478
8479" call Dret("s:NetrwDelete ".result)
8480 return result
Bram Moolenaar446cb832008-06-24 21:56:24 +00008481endfun
8482
8483" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008484" s:NetrwEnew: opens a new buffer, passes netrw buffer variables through {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +01008485fun! s:NetrwEnew(...)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008486" call Dfunc("s:NetrwEnew() a:0=".a:0." bufnr($)=".bufnr("$"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01008487" call Decho("curdir<".((a:0>0)? a:1 : "")."> buf#".bufnr("%")."<".bufname("%").">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008488
Bram Moolenaar446cb832008-06-24 21:56:24 +00008489 " grab a function-local-variable copy of buffer variables
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008490" call Decho("make function-local copy of netrw variables")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008491 if exists("b:netrw_bannercnt") |let netrw_bannercnt = b:netrw_bannercnt |endif
8492 if exists("b:netrw_browser_active") |let netrw_browser_active = b:netrw_browser_active |endif
8493 if exists("b:netrw_cpf") |let netrw_cpf = b:netrw_cpf |endif
8494 if exists("b:netrw_curdir") |let netrw_curdir = b:netrw_curdir |endif
8495 if exists("b:netrw_explore_bufnr") |let netrw_explore_bufnr = b:netrw_explore_bufnr |endif
8496 if exists("b:netrw_explore_indx") |let netrw_explore_indx = b:netrw_explore_indx |endif
8497 if exists("b:netrw_explore_line") |let netrw_explore_line = b:netrw_explore_line |endif
8498 if exists("b:netrw_explore_list") |let netrw_explore_list = b:netrw_explore_list |endif
8499 if exists("b:netrw_explore_listlen")|let netrw_explore_listlen = b:netrw_explore_listlen|endif
8500 if exists("b:netrw_explore_mtchcnt")|let netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
8501 if exists("b:netrw_fname") |let netrw_fname = b:netrw_fname |endif
8502 if exists("b:netrw_lastfile") |let netrw_lastfile = b:netrw_lastfile |endif
8503 if exists("b:netrw_liststyle") |let netrw_liststyle = b:netrw_liststyle |endif
8504 if exists("b:netrw_method") |let netrw_method = b:netrw_method |endif
8505 if exists("b:netrw_option") |let netrw_option = b:netrw_option |endif
8506 if exists("b:netrw_prvdir") |let netrw_prvdir = b:netrw_prvdir |endif
8507
Bram Moolenaaradc21822011-04-01 18:03:16 +02008508 keepj call s:NetrwOptionRestore("w:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00008509" call Decho("generate a buffer with keepjumps keepalt enew!")
Bram Moolenaar5ac3b1a2010-07-27 22:50:36 +02008510 let netrw_keepdiff= &l:diff
Bram Moolenaaradc21822011-04-01 18:03:16 +02008511 " COMBAK: Benzinger: using tree mode, vim -o Foo/ file shows Foo/ Foo/ instead. Place return here, problem goes away (beeps result, but who knows)
8512" call Dredir("Benzinger 1:","ls!")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008513 keepj keepalt enew!
Bram Moolenaaradc21822011-04-01 18:03:16 +02008514" call Dredir("Benzinger 2:","ls!")
8515 " 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 +02008516 let &l:diff= netrw_keepdiff
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008517" call Decho("bufnr($)=".bufnr("$"))
Bram Moolenaaradc21822011-04-01 18:03:16 +02008518 keepj call s:NetrwOptionSave("w:")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008519
Bram Moolenaar446cb832008-06-24 21:56:24 +00008520 " copy function-local-variables to buffer variable equivalents
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008521" call Decho("copy function-local variables back to buffer netrw variables")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008522 if exists("netrw_bannercnt") |let b:netrw_bannercnt = netrw_bannercnt |endif
8523 if exists("netrw_browser_active") |let b:netrw_browser_active = netrw_browser_active |endif
8524 if exists("netrw_cpf") |let b:netrw_cpf = netrw_cpf |endif
8525 if exists("netrw_curdir") |let b:netrw_curdir = netrw_curdir |endif
8526 if exists("netrw_explore_bufnr") |let b:netrw_explore_bufnr = netrw_explore_bufnr |endif
8527 if exists("netrw_explore_indx") |let b:netrw_explore_indx = netrw_explore_indx |endif
8528 if exists("netrw_explore_line") |let b:netrw_explore_line = netrw_explore_line |endif
8529 if exists("netrw_explore_list") |let b:netrw_explore_list = netrw_explore_list |endif
8530 if exists("netrw_explore_listlen")|let b:netrw_explore_listlen = netrw_explore_listlen|endif
8531 if exists("netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = netrw_explore_mtchcnt|endif
8532 if exists("netrw_fname") |let b:netrw_fname = netrw_fname |endif
8533 if exists("netrw_lastfile") |let b:netrw_lastfile = netrw_lastfile |endif
8534 if exists("netrw_liststyle") |let b:netrw_liststyle = netrw_liststyle |endif
8535 if exists("netrw_method") |let b:netrw_method = netrw_method |endif
8536 if exists("netrw_option") |let b:netrw_option = netrw_option |endif
8537 if exists("netrw_prvdir") |let b:netrw_prvdir = netrw_prvdir |endif
8538
Bram Moolenaar5c736222010-01-06 20:54:52 +01008539 if a:0 > 0
8540 let b:netrw_curdir= a:1
8541 if b:netrw_curdir =~ '/$'
8542 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
8543 file NetrwTreeListing
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008544 set bt=nowrite noswf
Bram Moolenaaradc21822011-04-01 18:03:16 +02008545 nno <silent> <buffer> [ :sil call <SID>TreeListMove('[')<cr>
8546 nno <silent> <buffer> ] :sil call <SID>TreeListMove(']')<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01008547 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008548 exe "sil! keepalt file ".fnameescape(b:netrw_curdir)
Bram Moolenaar5c736222010-01-06 20:54:52 +01008549 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00008550 endif
8551 endif
8552
Bram Moolenaar446cb832008-06-24 21:56:24 +00008553" call Dret("s:NetrwEnew : buf#".bufnr("%")."<".bufname("%")."> expand(%)<".expand("%")."> expand(#)<".expand("#").">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008554endfun
8555
8556" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008557" s:NetrwSaveWordPosn: used to keep cursor on same word after refresh, {{{2
8558" changed sorting, etc. Also see s:NetrwRestoreWordPosn().
8559fun! s:NetrwSaveWordPosn()
8560" call Dfunc("NetrwSaveWordPosn()")
8561 let s:netrw_saveword= '^'.fnameescape(getline('.')).'$'
8562" call Dret("NetrwSaveWordPosn : saveword<".s:netrw_saveword.">")
8563endfun
8564
8565" ---------------------------------------------------------------------
8566" s:NetrwRestoreWordPosn: used to keep cursor on same word after refresh, {{{2
8567" changed sorting, etc. Also see s:NetrwSaveWordPosn().
8568fun! s:NetrwRestoreWordPosn()
8569" call Dfunc("NetrwRestoreWordPosn()")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008570 sil! call search(s:netrw_saveword,'w')
Bram Moolenaar446cb832008-06-24 21:56:24 +00008571" call Dret("NetrwRestoreWordPosn")
8572endfun
8573
8574" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008575" s:RestoreBufVars: {{{2
8576fun! s:RestoreBufVars()
8577" call Dfunc("s:RestoreBufVars()")
8578
8579 if exists("s:netrw_curdir") |let b:netrw_curdir = s:netrw_curdir |endif
8580 if exists("s:netrw_lastfile") |let b:netrw_lastfile = s:netrw_lastfile |endif
8581 if exists("s:netrw_method") |let b:netrw_method = s:netrw_method |endif
8582 if exists("s:netrw_fname") |let b:netrw_fname = s:netrw_fname |endif
8583 if exists("s:netrw_machine") |let b:netrw_machine = s:netrw_machine |endif
8584 if exists("s:netrw_browser_active")|let b:netrw_browser_active = s:netrw_browser_active|endif
8585
8586" call Dret("s:RestoreBufVars")
8587endfun
8588
8589" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008590" s:RemotePathAnalysis: {{{2
8591fun! s:RemotePathAnalysis(dirname)
Bram Moolenaar251e1912011-06-19 05:09:16 +02008592" call Dfunc("s:RemotePathAnalysis(a:dirname<".a:dirname.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008593
8594 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/:#]\+\)\%([:#]\(\d\+\)\)\=/\(.*\)$'
8595 let s:method = substitute(a:dirname,dirpat,'\1','')
8596 let s:user = substitute(a:dirname,dirpat,'\2','')
8597 let s:machine = substitute(a:dirname,dirpat,'\3','')
8598 let s:port = substitute(a:dirname,dirpat,'\4','')
8599 let s:path = substitute(a:dirname,dirpat,'\5','')
8600 let s:fname = substitute(a:dirname,'^.*/\ze.','','')
8601
8602" call Decho("set up s:method <".s:method .">")
8603" call Decho("set up s:user <".s:user .">")
8604" call Decho("set up s:machine<".s:machine.">")
8605" call Decho("set up s:port <".s:port.">")
8606" call Decho("set up s:path <".s:path .">")
8607" call Decho("set up s:fname <".s:fname .">")
8608
8609" call Dret("s:RemotePathAnalysis")
8610endfun
8611
8612" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008613" s:RemoteSystem: runs a command on a remote host using ssh {{{2
8614" Returns status
8615" Runs system() on
8616" [cd REMOTEDIRPATH;] a:cmd
8617" Note that it doesn't do shellescape(a:cmd)!
8618fun! s:RemoteSystem(cmd)
8619" call Dfunc("s:RemoteSystem(cmd<".a:cmd.">)")
8620 if !executable(g:netrw_ssh_cmd)
Bram Moolenaaradc21822011-04-01 18:03:16 +02008621 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 +00008622 elseif !exists("b:netrw_curdir")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008623 keepj call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
Bram Moolenaarc236c162008-07-13 17:41:49 +00008624 else
8625 let cmd = s:MakeSshCmd(g:netrw_ssh_cmd." USEPORT HOSTNAME")
8626 let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
8627 if remotedir != ""
8628 let cmd= cmd.' cd '.shellescape(remotedir).";"
8629 else
8630 let cmd= cmd.' '
8631 endif
8632 let cmd= cmd.a:cmd
8633" call Decho("call system(".cmd.")")
8634 let ret= system(cmd)
8635 endif
8636" call Dret("s:RemoteSystem ".ret)
8637 return ret
Bram Moolenaar9964e462007-05-05 17:54:07 +00008638endfun
8639
8640" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008641" s:RestoreWinVars: (used by Explore() and NetrwSplit()) {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00008642fun! s:RestoreWinVars()
8643" call Dfunc("s:RestoreWinVars()")
Bram Moolenaar488c6512005-08-11 20:09:58 +00008644 if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00008645 if exists("s:col") |let w:netrw_col = s:col |unlet s:col |endif
8646 if exists("s:curdir") |let w:netrw_curdir = s:curdir |unlet s:curdir |endif
8647 if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif
8648 if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif
8649 if exists("s:explore_line") |let w:netrw_explore_line = s:explore_line |unlet s:explore_line |endif
8650 if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
8651 if exists("s:explore_list") |let w:netrw_explore_list = s:explore_list |unlet s:explore_list |endif
8652 if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
8653 if exists("s:fpl") |let w:netrw_fpl = s:fpl |unlet s:fpl |endif
8654 if exists("s:hline") |let w:netrw_hline = s:hline |unlet s:hline |endif
8655 if exists("s:line") |let w:netrw_line = s:line |unlet s:line |endif
8656 if exists("s:liststyle") |let w:netrw_liststyle = s:liststyle |unlet s:liststyle |endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00008657 if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif
8658 if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00008659 if exists("s:treedict") |let w:netrw_treedict = s:treedict |unlet s:treedict |endif
8660 if exists("s:treetop") |let w:netrw_treetop = s:treetop |unlet s:treetop |endif
8661 if exists("s:winnr") |let w:netrw_winnr = s:winnr |unlet s:winnr |endif
8662" call Dret("s:RestoreWinVars")
Bram Moolenaar488c6512005-08-11 20:09:58 +00008663endfun
8664
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008665" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008666" s:Rexplore: implements returning from a buffer to a netrw directory {{{2
8667"
8668" s:SetRexDir() sets up <2-leftmouse> maps (if g:netrw_retmap
8669" is true) and a command, :Rexplore, which call this function.
8670"
8671" s:nbcd_curpos_{bufnr('%')} is set up by s:NetrwBrowseChgDir()
8672fun! s:NetrwRexplore(islocal,dirname)
Bram Moolenaaradc21822011-04-01 18:03:16 +02008673" call Dfunc("s:NetrwRexplore() w:netrw_rexlocal=".w:netrw_rexlocal." w:netrw_rexdir<".w:netrw_rexdir.">")
Bram Moolenaar15146672011-10-20 22:22:38 +02008674 if !exists("w:netrw_rexlocal")
8675 " call Dret("s:NetrwRexplore() w:netrw_rexlocal doesn't exist")
8676 return
8677 endif
Bram Moolenaaradc21822011-04-01 18:03:16 +02008678 if w:netrw_rexlocal
8679 keepj call netrw#LocalBrowseCheck(w:netrw_rexdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008680 else
Bram Moolenaaradc21822011-04-01 18:03:16 +02008681 keepj call s:NetrwBrowse(0,w:netrw_rexdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008682 endif
Bram Moolenaar15146672011-10-20 22:22:38 +02008683 if exists("s:initbeval")
8684 set beval
8685 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008686 if exists("s:nbcd_curpos_{bufnr('%')}")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008687 keepj call netrw#NetrwRestorePosn(s:nbcd_curpos_{bufnr('%')})
Bram Moolenaar15146672011-10-20 22:22:38 +02008688" unlet s:nbcd_curpos_{bufnr('%')}
Bram Moolenaar446cb832008-06-24 21:56:24 +00008689 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01008690 if exists("s:explore_match")
8691 exe "2match netrwMarkFile /".s:explore_match."/"
8692 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008693" call Dret("s:NetrwRexplore")
8694endfun
8695
8696" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008697" s:SaveBufVars: {{{2
8698fun! s:SaveBufVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +01008699" call Dfunc("s:SaveBufVars() buf#".bufnr("%"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00008700
8701 if exists("b:netrw_curdir") |let s:netrw_curdir = b:netrw_curdir |endif
8702 if exists("b:netrw_lastfile") |let s:netrw_lastfile = b:netrw_lastfile |endif
8703 if exists("b:netrw_method") |let s:netrw_method = b:netrw_method |endif
8704 if exists("b:netrw_fname") |let s:netrw_fname = b:netrw_fname |endif
8705 if exists("b:netrw_machine") |let s:netrw_machine = b:netrw_machine |endif
8706 if exists("b:netrw_browser_active")|let s:netrw_browser_active = b:netrw_browser_active|endif
8707
8708" call Dret("s:SaveBufVars")
8709endfun
8710
8711" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008712" s:SaveWinVars: (used by Explore() and NetrwSplit()) {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00008713fun! s:SaveWinVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +01008714" call Dfunc("s:SaveWinVars() win#".winnr())
Bram Moolenaar9964e462007-05-05 17:54:07 +00008715 if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif
8716 if exists("w:netrw_col") |let s:col = w:netrw_col |endif
8717 if exists("w:netrw_curdir") |let s:curdir = w:netrw_curdir |endif
8718 if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif
8719 if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif
8720 if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif
8721 if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
8722 if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif
8723 if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
8724 if exists("w:netrw_fpl") |let s:fpl = w:netrw_fpl |endif
8725 if exists("w:netrw_hline") |let s:hline = w:netrw_hline |endif
8726 if exists("w:netrw_line") |let s:line = w:netrw_line |endif
8727 if exists("w:netrw_liststyle") |let s:liststyle = w:netrw_liststyle |endif
8728 if exists("w:netrw_method") |let s:method = w:netrw_method |endif
8729 if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif
8730 if exists("w:netrw_treedict") |let s:treedict = w:netrw_treedict |endif
8731 if exists("w:netrw_treetop") |let s:treetop = w:netrw_treetop |endif
8732 if exists("w:netrw_winnr") |let s:winnr = w:netrw_winnr |endif
8733" call Dret("s:SaveWinVars")
8734endfun
8735
8736" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008737" s:SetBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck()) {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008738" To allow separate windows to have their own activities, such as
8739" Explore **/pattern, several variables have been made window-oriented.
8740" However, when the user splits a browser window (ex: ctrl-w s), these
Bram Moolenaar1afcace2005-11-25 19:54:28 +00008741" variables are not inherited by the new window. SetBufWinVars() and
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008742" UseBufWinVars() get around that.
Bram Moolenaar1afcace2005-11-25 19:54:28 +00008743fun! s:SetBufWinVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +01008744" call Dfunc("s:SetBufWinVars() win#".winnr())
Bram Moolenaar9964e462007-05-05 17:54:07 +00008745 if exists("w:netrw_liststyle") |let b:netrw_liststyle = w:netrw_liststyle |endif
8746 if exists("w:netrw_bannercnt") |let b:netrw_bannercnt = w:netrw_bannercnt |endif
8747 if exists("w:netrw_method") |let b:netrw_method = w:netrw_method |endif
8748 if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif
8749 if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif
8750 if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen= w:netrw_explore_listlen|endif
8751 if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt= w:netrw_explore_mtchcnt|endif
8752 if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif
8753 if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif
8754 if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif
8755" call Dret("s:SetBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008756endfun
8757
8758" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008759" s:SetRexDir: set directory for :Rexplore {{{2
8760fun! s:SetRexDir(islocal,dirname)
8761" call Dfunc("s:SetRexDir(islocal=".a:islocal." dirname<".a:dirname.">)")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008762 let w:netrw_rexdir = a:dirname
8763 let w:netrw_rexlocal = a:islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00008764" call Dret("s:SetRexDir")
8765endfun
8766
8767" ---------------------------------------------------------------------
8768" s:Strlen: this function returns the length of a string, even if its {{{2
8769" using two-byte etc characters.
Bram Moolenaar5c736222010-01-06 20:54:52 +01008770" Solution from Nicolai Weibull, vim docs (:help strlen()), Tony Mechelynck,
8771" and a bit from me.
8772" if g:netrw_xstrlen is zero (default), then the builtin strlen() function is used.
Bram Moolenaar446cb832008-06-24 21:56:24 +00008773fun! s:Strlen(x)
8774" call Dfunc("s:Strlen(x<".a:x.">")
8775 if g:netrw_xstrlen == 1
8776 " number of codepoints (Latin a + combining circumflex is two codepoints)
8777 " (comment from TM, solution from NW)
8778 let ret= strlen(substitute(a:x,'.','c','g'))
8779
8780 elseif g:netrw_xstrlen == 2
8781 " number of spacing codepoints (Latin a + combining circumflex is one spacing
8782 " codepoint; a hard tab is one; wide and narrow CJK are one each; etc.)
8783 " (comment from TM, solution from TM)
8784 let ret=strlen(substitute(a:x, '.\Z', 'x', 'g'))
8785
8786 elseif g:netrw_xstrlen == 3
8787 " virtual length (counting, for instance, tabs as anything between 1 and
8788 " 'tabstop', wide CJK as 2 rather than 1, Arabic alif as zero when immediately
8789 " preceded by lam, one otherwise, etc.)
8790 " (comment from TM, solution from me)
8791 let modkeep= &mod
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008792 exe "keepj norm! o\<esc>"
Bram Moolenaar446cb832008-06-24 21:56:24 +00008793 call setline(line("."),a:x)
8794 let ret= virtcol("$") - 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008795 keepj d
Bram Moolenaar446cb832008-06-24 21:56:24 +00008796 let &mod= modkeep
8797
8798 else
8799 " at least give a decent default
Bram Moolenaar5c736222010-01-06 20:54:52 +01008800 let ret= strlen(a:x)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008801 endif
8802" call Dret("s:Strlen ".ret)
8803 return ret
8804endfun
8805
8806" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008807" s:TreeListMove: {{{2
8808fun! s:TreeListMove(dir)
8809" call Dfunc("s:TreeListMove(dir<".a:dir.">)")
8810 let curline = getline('.')
8811 let prvline = (line(".") > 1)? getline(line(".")-1) : ''
8812 let nxtline = (line(".") < line("$"))? getline(line(".")+1) : ''
8813 let curindent= substitute(curline,'^\([| ]*\).\{-}$','\1','')
8814 let indentm1 = substitute(curindent,'^| ','','')
8815" call Decho("prvline <".prvline."> #".line(".")-1)
8816" call Decho("curline <".curline."> #".line("."))
8817" call Decho("nxtline <".nxtline."> #".line(".")+1)
8818" call Decho("curindent<".curindent.">")
8819" call Decho("indentm1 <".indentm1.">")
8820
8821 if curline !~ '/$'
8822" call Decho('regfile')
8823 if a:dir == '[' && prvline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008824 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00008825 let nl = search('^'.indentm1.'[^|]','bWe') " search backwards from regular file
8826" call Decho("regfile srch back: ".nl)
8827 elseif a:dir == ']' && nxtline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008828 keepj norm! $
Bram Moolenaar446cb832008-06-24 21:56:24 +00008829 let nl = search('^'.indentm1.'[^|]','We') " search forwards from regular file
8830" call Decho("regfile srch fwd: ".nl)
8831 endif
8832
8833 elseif a:dir == '[' && prvline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008834 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00008835 let curline= line(".")
8836 let nl = search('^'.curindent.'[^|]','bWe') " search backwards From directory, same indentation
8837" call Decho("dir srch back ind: ".nl)
8838 if nl != 0
8839 if line(".") == curline-1
8840 let nl= search('^'.indentm1.'[^|]','bWe') " search backwards from directory, indentation - 1
8841" call Decho("dir srch back ind-1: ".nl)
8842 endif
8843 endif
8844
8845 elseif a:dir == ']' && nxtline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008846 keepj norm! $
Bram Moolenaar446cb832008-06-24 21:56:24 +00008847 let curline = line(".")
8848 let nl = search('^'.curindent.'[^|]','We') " search forwards from directory, same indentation
8849" call Decho("dir srch fwd ind: ".nl)
8850 if nl != 0
8851 if line(".") == curline+1
8852 let nl= search('^'.indentm1.'[^|]','We') " search forwards from directory, indentation - 1
8853" call Decho("dir srch fwd ind-1: ".nl)
8854 endif
8855 endif
8856
8857 endif
8858
8859" call Dret("s:TreeListMove")
8860endfun
8861
8862" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008863" s:UpdateBuffersMenu: does emenu Buffers.Refresh (but due to locale, the menu item may not be called that) {{{2
8864" The Buffers.Refresh menu calls s:BMShow(); unfortunately, that means that that function
8865" can't be called except via emenu. But due to locale, that menu line may not be called
8866" Buffers.Refresh; hence, s:NetrwBMShow() utilizes a "cheat" to call that function anyway.
8867fun! s:UpdateBuffersMenu()
8868" call Dfunc("s:UpdateBuffersMenu()")
Bram Moolenaaradc21822011-04-01 18:03:16 +02008869 if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
Bram Moolenaarc236c162008-07-13 17:41:49 +00008870 try
Bram Moolenaaradc21822011-04-01 18:03:16 +02008871 sil emenu Buffers.Refresh\ menu
Bram Moolenaarc236c162008-07-13 17:41:49 +00008872 catch /^Vim\%((\a\+)\)\=:E/
8873 let v:errmsg= ""
Bram Moolenaaradc21822011-04-01 18:03:16 +02008874 sil keepj call s:NetrwBMShow()
Bram Moolenaarc236c162008-07-13 17:41:49 +00008875 endtry
8876 endif
8877" call Dret("s:UpdateBuffersMenu")
8878endfun
8879
8880" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008881" s:UseBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck() {{{2
Bram Moolenaaradc21822011-04-01 18:03:16 +02008882" Matching function to s:SetBufWinVars()
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008883fun! s:UseBufWinVars()
Bram Moolenaar9964e462007-05-05 17:54:07 +00008884" call Dfunc("s:UseBufWinVars()")
8885 if exists("b:netrw_liststyle") && !exists("w:netrw_liststyle") |let w:netrw_liststyle = b:netrw_liststyle |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008886 if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif
8887 if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif
8888 if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif
8889 if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif
8890 if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
8891 if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
8892 if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif
8893 if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif
8894 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 +00008895" call Dret("s:UseBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008896endfun
8897
Bram Moolenaar1afcace2005-11-25 19:54:28 +00008898" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01008899" netrw#WinPath: tries to insure that the path is windows-acceptable, whether cygwin is used or not {{{2
8900fun! netrw#WinPath(path)
8901" call Dfunc("netrw#WinPath(path<".a:path.">)")
8902 if (!g:netrw_cygwin || &shell !~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$') && (has("win32") || has("win95") || has("win64") || has("win16"))
8903 " remove cygdrive prefix, if present
8904 let path = substitute(a:path,'/cygdrive/\(.\)','\1:','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00008905 " remove trailing slash (Win95)
Bram Moolenaar5c736222010-01-06 20:54:52 +01008906 let path = substitute(path, '\(\\\|/\)$', '', 'g')
Bram Moolenaarc236c162008-07-13 17:41:49 +00008907 " remove escaped spaces
8908 let path = substitute(path, '\ ', ' ', 'g')
8909 " convert slashes to backslashes
8910 let path = substitute(path, '/', '\', 'g')
8911 else
8912 let path= a:path
8913 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01008914" call Dret("netrw#WinPath <".path.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00008915 return path
8916endfun
8917
8918" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00008919" Settings Restoration: {{{2
Bram Moolenaar83bab712005-08-01 21:58:57 +00008920let &cpo= s:keepcpo
8921unlet s:keepcpo
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00008922
Bram Moolenaar071d4272004-06-13 20:20:40 +00008923" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00008924" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +00008925" vim:ts=8 fdm=marker