blob: 70b146d6481ee0b87f56cb4405d897203a29cdee [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 Moolenaar00a927d2010-05-14 23:24:24 +02003" Date: May 14, 2010
4" Version: 138
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 Moolenaar5c736222010-01-06 20:54:52 +01007" Copyright: Copyright (C) 1999-2009 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 Moolenaar00a927d2010-05-14 23:24:24 +020025let g:loaded_netrw = "v138"
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 Moolenaar1afcace2005-11-25 19:54:28 +000081if !exists("g:netrw_dav_cmd")
Bram Moolenaar5c736222010-01-06 20:54:52 +010082 if executable("cadaver")
Bram Moolenaar1afcace2005-11-25 19:54:28 +000083 let g:netrw_dav_cmd = "cadaver"
Bram Moolenaar5c736222010-01-06 20:54:52 +010084 elseif executable("curl")
85 let g:netrw_dav_cmd = "curl"
86 else
87 let g:netrw_dav_cmd = ""
88 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000089endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +000090if !exists("g:netrw_fetch_cmd")
91 if executable("fetch")
92 let g:netrw_fetch_cmd = "fetch -o"
93 else
94 let g:netrw_fetch_cmd = ""
95 endif
96endif
97if !exists("g:netrw_ftp_cmd")
98 let g:netrw_ftp_cmd = "ftp"
99endif
100if !exists("g:netrw_http_cmd")
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000101 if executable("elinks")
102 let g:netrw_http_cmd = "elinks"
Bram Moolenaar5c736222010-01-06 20:54:52 +0100103 call s:NetrwInit("g:netrw_http_xcmd","-source >")
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000104 elseif executable("links")
105 let g:netrw_http_cmd = "links"
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("curl")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100108 let g:netrw_http_cmd = "curl"
109 call s:NetrwInit("g:netrw_http_xcmd","-o")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000110 elseif executable("wget")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100111 let g:netrw_http_cmd = "wget"
112 call s:NetrwInit("g:netrw_http_xcmd","-q -O")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000113 elseif executable("fetch")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100114 let g:netrw_http_cmd = "fetch"
115 call s:NetrwInit("g:netrw_http_xcmd","-o")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000116 else
117 let g:netrw_http_cmd = ""
118 endif
119endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100120call s:NetrwInit("g:netrw_rcp_cmd" , "rcp")
121call s:NetrwInit("g:netrw_rsync_cmd", "rsync")
122call s:NetrwInit("g:netrw_scp_cmd" , "scp -q")
123call s:NetrwInit("g:netrw_sftp_cmd" , "sftp")
124call s:NetrwInit("g:netrw_ssh_cmd" , "ssh")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000125
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000126if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000127 \ && exists("g:netrw_use_nt_rcp")
128 \ && g:netrw_use_nt_rcp
129 \ && executable( $SystemRoot .'/system32/rcp.exe')
130 let s:netrw_has_nt_rcp = 1
131 let s:netrw_rcpmode = '-b'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000132else
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000133 let s:netrw_has_nt_rcp = 0
134 let s:netrw_rcpmode = ''
135endif
136
137" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000138" Default values for netrw's global variables {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +0000139" Cygwin Detection ------- {{{3
140if !exists("g:netrw_cygwin")
141 if has("win32") || has("win95") || has("win64") || has("win16")
142 if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$'
143 let g:netrw_cygwin= 1
144 else
145 let g:netrw_cygwin= 0
146 endif
147 else
148 let g:netrw_cygwin= 0
149 endif
150endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000151" Default values - a-c ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100152call s:NetrwInit("g:netrw_alto" , &sb)
153call s:NetrwInit("g:netrw_altv" , &spr)
154call s:NetrwInit("g:netrw_banner" , 1)
155call s:NetrwInit("g:netrw_browse_split", 0)
156call s:NetrwInit("g:netrw_chgwin" , -1)
157call s:NetrwInit("g:netrw_compress" , "gzip")
158call s:NetrwInit("g:netrw_ctags" , "ctags")
159if !exists("g:netrw_cursorline")
160 let g:netrw_cursorline= 1
161 let s:netrw_usercul = &cursorline
162 let s:netrw_usercuc = &cursorcolumn
Bram Moolenaar446cb832008-06-24 21:56:24 +0000163endif
164" Default values - d-g ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100165call s:NetrwInit("g:netrw_dirhist_cnt" , 0)
166call s:NetrwInit("g:netrw_decompress" , '{ ".gz" : "gunzip", ".bz2" : "bunzip2", ".zip" : "unzip", ".tar" : "tar -xf"}')
167call s:NetrwInit("g:netrw_dirhistmax" , 10)
168call s:NetrwInit("g:netrw_fastbrowse" , 1)
169call 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 +0000170if !exists("g:netrw_ftp_list_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000171 if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)
172 let g:netrw_ftp_list_cmd = "ls -lF"
173 let g:netrw_ftp_timelist_cmd = "ls -tlF"
174 let g:netrw_ftp_sizelist_cmd = "ls -slF"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000175 else
Bram Moolenaar9964e462007-05-05 17:54:07 +0000176 let g:netrw_ftp_list_cmd = "dir"
177 let g:netrw_ftp_timelist_cmd = "dir"
178 let g:netrw_ftp_sizelist_cmd = "dir"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000179 endif
180endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100181call s:NetrwInit("g:netrw_ftpmode",'binary')
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000182" Default values - h-lh ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100183call s:NetrwInit("g:netrw_hide",1)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000184if !exists("g:netrw_ignorenetrc")
185 if &shell =~ '\c\<\%(cmd\|4nt\)\.exe$'
186 let g:netrw_ignorenetrc= 1
187 else
188 let g:netrw_ignorenetrc= 0
189 endif
190endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100191call s:NetrwInit("g:netrw_keepdir",1)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000192if !exists("g:netrw_list_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000193 if g:netrw_scp_cmd =~ '^pscp' && executable("pscp")
194 " provide a 'pscp' listing command
195 if (has("win32") || has("win95") || has("win64") || has("win16")) && filereadable("c:\\private.ppk")
196 let g:netrw_scp_cmd ="pscp -i C:\\private.ppk"
197 endif
198 let g:netrw_list_cmd= g:netrw_scp_cmd." -ls USEPORT HOSTNAME:"
199 elseif executable(g:netrw_ssh_cmd)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000200 " provide a default listing command
Bram Moolenaar9964e462007-05-05 17:54:07 +0000201 let g:netrw_list_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME ls -FLa"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000202 else
Bram Moolenaar9964e462007-05-05 17:54:07 +0000203" call Decho(g:netrw_ssh_cmd." is not executable")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000204 let g:netrw_list_cmd= ""
205 endif
206endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100207call s:NetrwInit("g:netrw_list_hide","")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000208" Default values - lh-lz ---------- {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +0000209if !exists("g:netrw_localcopycmd")
210 if has("win32") || has("win95") || has("win64") || has("win16")
211 if g:netrw_cygwin
212 let g:netrw_localcopycmd= "cp"
213 else
214 let g:netrw_localcopycmd= "copy"
215 endif
216 elseif has("unix") || has("macunix")
217 let g:netrw_localcopycmd= "cp"
218 else
219 let g:netrw_localcopycmd= ""
220 endif
221endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100222call s:NetrwInit("g:netrw_local_mkdir","mkdir")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000223if !exists("g:netrw_localmovecmd")
224 if has("win32") || has("win95") || has("win64") || has("win16")
225 if g:netrw_cygwin
226 let g:netrw_localmovecmd= "mv"
227 else
228 let g:netrw_localmovecmd= "move"
229 endif
230 elseif has("unix") || has("macunix")
231 let g:netrw_localmovecmd= "mv"
232 else
233 let g:netrw_localmovecmd= ""
234 endif
235endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100236call s:NetrwInit("g:netrw_local_rmdir", "rmdir")
237call s:NetrwInit("g:netrw_liststyle" , s:THINLIST)
238" sanity checks
Bram Moolenaar9964e462007-05-05 17:54:07 +0000239if g:netrw_liststyle < 0 || g:netrw_liststyle >= s:MAXLIST
Bram Moolenaar9964e462007-05-05 17:54:07 +0000240 let g:netrw_liststyle= s:THINLIST
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000241endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000242if g:netrw_liststyle == s:LONGLIST && g:netrw_scp_cmd !~ '^pscp'
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000243 let g:netrw_list_cmd= g:netrw_list_cmd." -l"
244endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000245" Default values - m-r ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100246call s:NetrwInit("g:netrw_markfileesc" , '*./[\~')
247call s:NetrwInit("g:netrw_maxfilenamelen", 32)
248call s:NetrwInit("g:netrw_menu" , 1)
249call s:NetrwInit("g:netrw_mkdir_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME mkdir")
250call s:NetrwInit("g:netrw_mousemaps" , (exists("&mouse") && &mouse =~ '[anh]'))
251call s:NetrwInit("g:netrw_retmap" , 0)
252if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)
253 call s:NetrwInit("g:netrw_chgperm" , "chmod PERM FILENAME")
254elseif has("win32") || has("win95") || has("win64") || has("win16")
255 call s:NetrwInit("g:netrw_chgperm" , "cacls FILENAME /e /p PERM")
256else
257 call s:NetrwInit("g:netrw_chgperm" , "chmod PERM FILENAME")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000258endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100259call s:NetrwInit("g:netrw_preview" , 0)
260call s:NetrwInit("g:netrw_scpport" , "-P")
261call s:NetrwInit("g:netrw_sshport" , "-p")
262call s:NetrwInit("g:netrw_rename_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME mv")
263call s:NetrwInit("g:netrw_rm_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rm")
264call s:NetrwInit("g:netrw_rmdir_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rmdir")
265call s:NetrwInit("g:netrw_rmf_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rm -f")
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000266" Default values - s ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100267" g:netrw_sepchr: picking a character that doesn't appear in filenames that can be used to separate priority from filename
268call s:NetrwInit("g:netrw_sepchr" , (&enc == "euc-jp")? "\<Char-0x01>" : "\<Char-0xff>")
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200269call s:NetrwInit("s:netrw_silentxfer" , (exists("g:netrw_silent") && g:netrw_silent != 0)? "silent keepj " : "keepj ")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100270call s:NetrwInit("g:netrw_sort_by" , "name") " alternatives: date , size
271call s:NetrwInit("g:netrw_sort_options" , "")
272call s:NetrwInit("g:netrw_sort_direction", "normal") " alternative: reverse (z y x ...)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000273if !exists("g:netrw_sort_sequence")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100274 if has("unix")
275 let g:netrw_sort_sequence= '[\/]$,\<core\%(\.\d\+\)\=\>,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
276 else
277 let g:netrw_sort_sequence= '[\/]$,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000278 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000279endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100280call s:NetrwInit("g:netrw_special_syntax" , 0)
281call s:NetrwInit("g:netrw_ssh_browse_reject", '^total\s\+\d\+$')
282call s:NetrwInit("g:netrw_use_noswf" , 0)
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000283" Default values - t-w ---------- {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100284call s:NetrwInit("g:netrw_timefmt","%c")
285call s:NetrwInit("g:netrw_xstrlen",0)
286call s:NetrwInit("g:NetrwTopLvlMenu","Netrw.")
287call s:NetrwInit("g:netrw_use_errorwindow",1)
288call s:NetrwInit("g:netrw_win95ftp",1)
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200289call s:NetrwInit("g:netrw_winsize",25)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000290" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000291" Default values for netrw's script variables: {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +0100292call s:NetrwInit("g:netrw_fname_escape",' ?&;%')
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200293if has("win32") || has("win95") || has("win64") || has("win16")
294 call s:NetrwInit("g:netrw_glob_escape",'[]*?`{$')
295else
296 call s:NetrwInit("g:netrw_glob_escape",'[]*?`{~$\')
297endif
298call s:NetrwInit("g:netrw_menu_escape",'./&? \')
Bram Moolenaar5c736222010-01-06 20:54:52 +0100299call s:NetrwInit("g:netrw_tmpfile_escape",' &;')
300call s:NetrwInit("s:netrw_map_escape","<|\n\r\\\<C-V>\"")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000301
302" BufEnter event ignored by decho when following variable is true
303" Has a side effect that doau BufReadPost doesn't work, so
304" files read by network transfer aren't appropriately highlighted.
305"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000306
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000307" ==============================
308" Netrw Utility Functions: {{{1
309" ==============================
310
Bram Moolenaar071d4272004-06-13 20:20:40 +0000311" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000312" s:NetrwOptionSave: save options and set to "standard" form {{{2
313" 06/08/07 : removed call to NetrwSafeOptions(), either placed
314" immediately after NetrwOptionSave() calls in NetRead
315" and NetWrite, or after the s:NetrwEnew() call in
316" NetrwBrowse.
317" vt: normally its "w:" or "s:" (a variable type)
318fun! s:NetrwOptionSave(vt)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100319" call Dfunc("s:NetrwOptionSave(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">"." winnr($)=".winnr("$"))
Bram Moolenaar071d4272004-06-13 20:20:40 +0000320
Bram Moolenaar446cb832008-06-24 21:56:24 +0000321" call Decho(a:vt."netrw_optionsave".(exists("{a:vt}netrw_optionsave")? ("=".{a:vt}netrw_optionsave) : " doesn't exist"))
322 if !exists("{a:vt}netrw_optionsave")
323 let {a:vt}netrw_optionsave= 1
Bram Moolenaar9964e462007-05-05 17:54:07 +0000324 else
Bram Moolenaar446cb832008-06-24 21:56:24 +0000325" call Dret("s:NetrwOptionSave : options already saved")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000326 return
327 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000328" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist"))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000329
330 " Save current settings and current directory
331 let s:yykeep = @@
332 if exists("&l:acd")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000333 let {a:vt}netrw_acdkeep = &l:acd
Bram Moolenaar9964e462007-05-05 17:54:07 +0000334 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000335 let {a:vt}netrw_aikeep = &l:ai
336 let {a:vt}netrw_awkeep = &l:aw
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200337 let {a:vt}netrw_bombkeep = &l:bomb
Bram Moolenaar446cb832008-06-24 21:56:24 +0000338 let {a:vt}netrw_cikeep = &l:ci
339 let {a:vt}netrw_cinkeep = &l:cin
340 let {a:vt}netrw_cinokeep = &l:cino
341 let {a:vt}netrw_comkeep = &l:com
342 let {a:vt}netrw_cpokeep = &l:cpo
Bram Moolenaar9964e462007-05-05 17:54:07 +0000343 if g:netrw_keepdir
Bram Moolenaar446cb832008-06-24 21:56:24 +0000344 let {a:vt}netrw_dirkeep = getcwd()
Bram Moolenaar9964e462007-05-05 17:54:07 +0000345 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000346 let {a:vt}netrw_fokeep = &l:fo " formatoptions
347 let {a:vt}netrw_gdkeep = &l:gd " gdefault
348 let {a:vt}netrw_hidkeep = &l:hidden
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200349 let {a:vt}netrw_imkeep = &l:im
Bram Moolenaar446cb832008-06-24 21:56:24 +0000350 let {a:vt}netrw_magickeep = &l:magic
351 let {a:vt}netrw_repkeep = &l:report
352 let {a:vt}netrw_spellkeep = &l:spell
353 let {a:vt}netrw_twkeep = &l:tw " textwidth
354 let {a:vt}netrw_wigkeep = &l:wig " wildignore
Bram Moolenaar9964e462007-05-05 17:54:07 +0000355 if has("win32") && !has("win95")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000356 let {a:vt}netrw_swfkeep = &l:swf " swapfile
Bram Moolenaar9964e462007-05-05 17:54:07 +0000357 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000358 if &go =~ 'a' | silent! let {a:vt}netrw_regstar = @* | endif
359 silent! let {a:vt}netrw_regslash= @/
Bram Moolenaar9964e462007-05-05 17:54:07 +0000360
Bram Moolenaar446cb832008-06-24 21:56:24 +0000361" call Dret("s:NetrwOptionSave : win#".winnr()." buf#".bufnr("%"))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000362endfun
363
364" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000365" s:NetrwOptionRestore: restore options {{{2
366fun! s:NetrwOptionRestore(vt)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100367" call Dfunc("s:NetrwOptionRestore(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")." winnr($)=".winnr("$"))
Bram Moolenaar446cb832008-06-24 21:56:24 +0000368 if !exists("{a:vt}netrw_optionsave")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000369" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000370" call Dret("s:NetrwOptionRestore : ".a:vt."netrw_optionsave doesn't exist")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000371 return
372 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000373 unlet {a:vt}netrw_optionsave
Bram Moolenaar9964e462007-05-05 17:54:07 +0000374
375 if exists("&acd")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000376 if exists("{a:vt}netrw_acdkeep")
377" call Decho("g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
378 let curdir = getcwd()
379 let &l:acd = {a:vt}netrw_acdkeep
380 unlet {a:vt}netrw_acdkeep
381 if &l:acd
382" call Decho("exe keepjumps lcd ".fnameescape(curdir)) " NOTE: was g:netrw_fname_escape for some reason
383 try
384 if !exists("&l:acd") && !&l:acd
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200385 exe 'keepj lcd '.fnameescape(curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000386 endif
387 catch /^Vim\%((\a\+)\)\=:E472/
388 call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".curdir."> (permissions?)",61)
389 endtry
390 endif
391 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000392 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000393 if exists("{a:vt}netrw_aikeep") |let &l:ai = {a:vt}netrw_aikeep |unlet {a:vt}netrw_aikeep |endif
394 if exists("{a:vt}netrw_awkeep") |let &l:aw = {a:vt}netrw_awkeep |unlet {a:vt}netrw_awkeep |endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200395 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 +0000396 if exists("{a:vt}netrw_cikeep") |let &l:ci = {a:vt}netrw_cikeep |unlet {a:vt}netrw_cikeep |endif
397 if exists("{a:vt}netrw_cinkeep") |let &l:cin = {a:vt}netrw_cinkeep |unlet {a:vt}netrw_cinkeep |endif
398 if exists("{a:vt}netrw_cinokeep") |let &l:cino = {a:vt}netrw_cinokeep |unlet {a:vt}netrw_cinokeep |endif
399 if exists("{a:vt}netrw_comkeep") |let &l:com = {a:vt}netrw_comkeep |unlet {a:vt}netrw_comkeep |endif
400 if exists("{a:vt}netrw_cpokeep") |let &l:cpo = {a:vt}netrw_cpokeep |unlet {a:vt}netrw_cpokeep |endif
401 if exists("{a:vt}netrw_dirkeep") && isdirectory({a:vt}netrw_dirkeep) && g:netrw_keepdir
402 let dirkeep = substitute({a:vt}netrw_dirkeep,'\\','/','g')
403 if exists("{a:vt}netrw_dirkeep") |exe "keepjumps lcd ".fnameescape(dirkeep)|unlet {a:vt}netrw_dirkeep |endif
404 endif
405 if exists("{a:vt}netrw_fokeep") |let &l:fo = {a:vt}netrw_fokeep |unlet {a:vt}netrw_fokeep |endif
406 if exists("{a:vt}netrw_gdkeep") |let &l:gd = {a:vt}netrw_gdkeep |unlet {a:vt}netrw_gdkeep |endif
407 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 +0200408 if exists("{a:vt}netrw_imkeep") |let &l:im = {a:vt}netrw_imkeep |unlet {a:vt}netrw_imkeep |endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000409 if exists("{a:vt}netrw_magic") |let &l:magic = {a:vt}netrw_magic |unlet {a:vt}netrw_magic |endif
410 if exists("{a:vt}netrw_repkeep") |let &l:report = {a:vt}netrw_repkeep |unlet {a:vt}netrw_repkeep |endif
411 if exists("{a:vt}netrw_spellkeep")|let &l:spell = {a:vt}netrw_spellkeep |unlet {a:vt}netrw_spellkeep|endif
412 if exists("{a:vt}netrw_twkeep") |let &l:tw = {a:vt}netrw_twkeep |unlet {a:vt}netrw_twkeep |endif
413 if exists("{a:vt}netrw_wigkeep") |let &l:wig = {a:vt}netrw_wigkeep |unlet {a:vt}netrw_wigkeep |endif
414 if exists("s:yykeep") |let @@ = s:yykeep |unlet s:yykeep |endif
415 if exists("{a:vt}netrw_swfkeep")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000416 if &directory == ""
417 " user hasn't specified a swapfile directory;
418 " netrw will temporarily set the swapfile directory
419 " to the current directory as returned by getcwd().
420 let &l:directory = getcwd()
Bram Moolenaar446cb832008-06-24 21:56:24 +0000421 silent! let &l:swf = {a:vt}netrw_swfkeep
Bram Moolenaar9964e462007-05-05 17:54:07 +0000422 setlocal directory=
Bram Moolenaar446cb832008-06-24 21:56:24 +0000423 unlet {a:vt}netrw_swfkeep
424 elseif &l:swf != {a:vt}netrw_swfkeep
425 " following line causes a Press ENTER in windows -- can't seem to work around it!!!
426 silent! let &l:swf= {a:vt}netrw_swfkeep
427 unlet {a:vt}netrw_swfkeep
Bram Moolenaar9964e462007-05-05 17:54:07 +0000428 endif
429 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000430 if exists("{a:vt}netrw_regstar") |silent! let @*= {a:vt}netrw_regstar |unlet {a:vt}netrw_regstar |endif
431 if exists("{a:vt}netrw_regslash")|silent! let @/= {a:vt}netrw_regslash|unlet {a:vt}netrw_regslash|endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000432
Bram Moolenaar446cb832008-06-24 21:56:24 +0000433" call Decho("g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
434" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist"))
Bram Moolenaarc236c162008-07-13 17:41:49 +0000435" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000436" call Dret("s:NetrwOptionRestore : win#".winnr()." buf#".bufnr("%"))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000437endfun
438
439" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000440" s:NetrwSafeOptions: sets options to help netrw do its job {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +0000441fun! s:NetrwSafeOptions()
Bram Moolenaar5c736222010-01-06 20:54:52 +0100442" call Dfunc("s:NetrwSafeOptions() win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%"))."> winnr($)=".winnr("$"))
443" call Decho("win#".winnr()."'s ft=".&ft)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000444 setlocal cino=
445 setlocal com=
446 setlocal cpo-=aA
Bram Moolenaar446cb832008-06-24 21:56:24 +0000447 if exists("&acd") | setlocal noacd | endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200448 setlocal nocin noai nobomb noci magic nospell nohid wig= noaw noim
Bram Moolenaar446cb832008-06-24 21:56:24 +0000449 setlocal fo=nroql2
Bram Moolenaar9964e462007-05-05 17:54:07 +0000450 setlocal tw=0
451 setlocal report=10000
Bram Moolenaar5c736222010-01-06 20:54:52 +0100452 setlocal isk+=@ isk+=* isk+=/
Bram Moolenaar9964e462007-05-05 17:54:07 +0000453 if g:netrw_use_noswf && has("win32") && !has("win95")
454 setlocal noswf
455 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200456 call s:NetrwCursorline()
Bram Moolenaar5c736222010-01-06 20:54:52 +0100457
458 " allow the user to override safe options
459 if &ft == "netrw"
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200460" call Decho("do any netrw FileType autocmds")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100461 silent keepalt keepjumps doau FileType netrw
462 endif
463
Bram Moolenaar446cb832008-06-24 21:56:24 +0000464" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist"))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000465" call Dret("s:NetrwSafeOptions")
466endfun
467
Bram Moolenaar446cb832008-06-24 21:56:24 +0000468" ---------------------------------------------------------------------
469" netrw#NetrwClean: remove netrw {{{2
470" supports :NetrwClean -- remove netrw from first directory on runtimepath
471" :NetrwClean! -- remove netrw from all directories on runtimepath
472fun! netrw#NetrwClean(sys)
473" call Dfunc("netrw#NetrwClean(sys=".a:sys.")")
474
475 if a:sys
476 let choice= confirm("Remove personal and system copies of netrw?","&Yes\n&No")
477 else
478 let choice= confirm("Remove personal copy of netrw?","&Yes\n&No")
479 endif
480" call Decho("choice=".choice)
481 let diddel= 0
482 let diddir= ""
483
484 if choice == 1
485 for dir in split(&rtp,',')
486 if filereadable(dir."/plugin/netrwPlugin.vim")
487" call Decho("removing netrw-related files from ".dir)
Bram Moolenaarc236c162008-07-13 17:41:49 +0000488 if s:NetrwDelete(dir."/plugin/netrwPlugin.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/plugin/netrwPlugin.vim",55) |endif
489 if s:NetrwDelete(dir."/autoload/netrwFileHandlers.vim")|call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwFileHandlers.vim",55)|endif
490 if s:NetrwDelete(dir."/autoload/netrwSettings.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwSettings.vim",55) |endif
491 if s:NetrwDelete(dir."/autoload/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrw.vim",55) |endif
492 if s:NetrwDelete(dir."/syntax/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrw.vim",55) |endif
493 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 +0000494 let diddir= dir
495 let diddel= diddel + 1
496 if !a:sys|break|endif
497 endif
498 endfor
499 endif
500
501 echohl WarningMsg
502 if diddel == 0
503 echomsg "netrw is either not installed or not removable"
504 elseif diddel == 1
505 echomsg "removed one copy of netrw from <".diddir.">"
506 else
507 echomsg "removed ".diddel." copies of netrw"
508 endif
509 echohl None
510
511" call Dret("netrw#NetrwClean")
512endfun
513
Bram Moolenaar5c736222010-01-06 20:54:52 +0100514" ---------------------------------------------------------------------
515" netrw#Nread: {{{2
516fun! netrw#Nread(mode,fname)
517" call Dfunc("netrw#Nread(mode=".a:mode." fname<".a:fname.">)")
518 call netrw#NetrwSavePosn()
519 call netrw#NetRead(a:mode,a:fname)
520 call netrw#NetrwRestorePosn()
521" call Dret("netrw#Nread")
522endfun
523
Bram Moolenaar9964e462007-05-05 17:54:07 +0000524" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000525" Netrw Transfer Functions: {{{1
526" ===============================
527
Bram Moolenaar071d4272004-06-13 20:20:40 +0000528" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000529" netrw#NetRead: responsible for reading a file over the net {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +0000530" mode: =0 read remote file and insert before current line
531" =1 read remote file and insert after current line
532" =2 replace with remote file
533" =3 obtain file, but leave in temporary format
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000534fun! netrw#NetRead(mode,...)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000535" call Dfunc("netrw#NetRead(mode=".a:mode.",...) a:0=".a:0." ".g:loaded_netrw)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000536
Bram Moolenaar5c736222010-01-06 20:54:52 +0100537 " NetRead: save options {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +0000538 call s:NetrwOptionSave("w:")
539 call s:NetrwSafeOptions()
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200540 call s:RestoreCursorline()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000541
Bram Moolenaar5c736222010-01-06 20:54:52 +0100542 " NetRead: interpret mode into a readcmd {{{3
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000543 if a:mode == 0 " read remote file before current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000544 let readcmd = "0r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000545 elseif a:mode == 1 " read file after current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000546 let readcmd = "r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000547 elseif a:mode == 2 " replace with remote file
548 let readcmd = "%r"
Bram Moolenaar9964e462007-05-05 17:54:07 +0000549 elseif a:mode == 3 " skip read of file (leave as temporary)
550 let readcmd = "t"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000551 else
552 exe a:mode
553 let readcmd = "r"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000554 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000555 let ichoice = (a:0 == 0)? 0 : 1
556" call Decho("readcmd<".readcmd."> ichoice=".ichoice)
557
Bram Moolenaar5c736222010-01-06 20:54:52 +0100558 " NetRead: get temporary filename {{{3
Bram Moolenaar9964e462007-05-05 17:54:07 +0000559 let tmpfile= s:GetTempfile("")
560 if tmpfile == ""
561" call Dret("netrw#NetRead : unable to get a tempfile!")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000562 return
563 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000564
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000565 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000566
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000567 " attempt to repeat with previous host-file-etc
568 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000569" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000570 let choice = b:netrw_lastfile
571 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000572
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000573 else
574 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000575" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000576
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000577 if match(choice,"?") == 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000578 " give help
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000579 echomsg 'NetRead Usage:'
580 echomsg ':Nread machine:path uses rcp'
581 echomsg ':Nread "machine path" uses ftp with <.netrc>'
582 echomsg ':Nread "machine id password path" uses ftp'
583 echomsg ':Nread dav://machine[:port]/path uses cadaver'
584 echomsg ':Nread fetch://machine/path uses fetch'
585 echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
586 echomsg ':Nread http://[user@]machine/path uses http wget'
587 echomsg ':Nread rcp://[user@]machine/path uses rcp'
588 echomsg ':Nread rsync://machine[:port]/path uses rsync'
589 echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
590 echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000591 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000592 break
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000593
Bram Moolenaar9964e462007-05-05 17:54:07 +0000594 elseif match(choice,'^"') != -1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000595 " Reconstruct Choice if choice starts with '"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000596" call Decho("reconstructing choice")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000597 if match(choice,'"$') != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000598 " case "..."
599 let choice=strpart(choice,1,strlen(choice)-2)
600 else
601 " case "... ... ..."
602 let choice = strpart(choice,1,strlen(choice)-1)
603 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000604
Bram Moolenaar9964e462007-05-05 17:54:07 +0000605 while match(choice,'"$') == -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000606 let wholechoice = wholechoice . " " . choice
607 let ichoice = ichoice + 1
608 if ichoice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000609 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000610 call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",3)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000611 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000612" call Dret("netrw#NetRead :2 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000613 return
614 endif
615 let choice= a:{ichoice}
616 endwhile
617 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
618 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000619 endif
620 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000621
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000622" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000623 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000624
Bram Moolenaar5c736222010-01-06 20:54:52 +0100625 " NetRead: Determine method of read (ftp, rcp, etc) {{{3
Bram Moolenaar446cb832008-06-24 21:56:24 +0000626 call s:NetrwMethod(choice)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100627 if !exists("b:netrw_method") || b:netrw_method < 0
628" call Dfunc("netrw#NetRead : unsupported method")
629 return
630 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000631 let tmpfile= s:GetTempfile(b:netrw_fname) " apply correct suffix
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000632
Bram Moolenaar446cb832008-06-24 21:56:24 +0000633 " Check if NetrwBrowse() should be handling this request
634" call Decho("checking if NetrwBrowse() should handle choice<".choice."> with netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000635 if choice =~ "^.*[\/]$" && b:netrw_method != 5 && choice !~ '^http://'
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000636" call Decho("yes, choice matches '^.*[\/]$'")
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200637 keepj call s:NetrwBrowse(0,choice)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000638" call Dret("netrw#NetRead :3 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000639 return
Bram Moolenaar071d4272004-06-13 20:20:40 +0000640 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000641
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000642 " ============
Bram Moolenaar5c736222010-01-06 20:54:52 +0100643 " NetRead: Perform Protocol-Based Read {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000644 " ===========================
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000645 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
646 echo "(netrw) Processing your read request..."
647 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000648
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000649 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100650 " NetRead: (rcp) NetRead Method #1 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000651 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000652" call Decho("read via rcp (method #1)")
Bram Moolenaard68071d2006-05-02 22:08:30 +0000653 " ER: nothing done with g:netrw_uid yet?
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000654 " ER: on Win2K" rcp machine[.user]:file tmpfile
655 " ER: if machine contains '.' adding .user is required (use $USERNAME)
656 " ER: the tmpfile is full path: rcp sees C:\... as host C
657 if s:netrw_has_nt_rcp == 1
658 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
659 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
660 else
661 " Any way needed it machine contains a '.'
662 let uid_machine = g:netrw_machine .'.'. $USERNAME
663 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000664 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000665 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
666 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
667 else
668 let uid_machine = g:netrw_machine
669 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000670 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +0000671" 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 +0100672 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 +0000673 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000674 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000675
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000676 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100677 " NetRead: (ftp + <.netrc>) NetRead Method #2 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000678 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000679" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaar8dff8182006-04-06 20:18:50 +0000680 let netrw_fname= b:netrw_fname
Bram Moolenaar446cb832008-06-24 21:56:24 +0000681 call s:SaveBufVars()|new|call s:RestoreBufVars()
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000682 let filtbuf= bufnr("%")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000683 setlocal ff=unix
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200684 keepj put =g:netrw_ftpmode
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000685" call Decho("filter input: ".getline(line("$")))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000686 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200687 keepj put =g:netrw_ftpextracmd
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000688" call Decho("filter input: ".getline(line("$")))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000689 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000690 call setline(line("$")+1,'get "'.netrw_fname.'" '.tmpfile)
691" call Decho("filter input: ".getline(line("$")))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000692 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +0000693" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine." ".g:netrw_port,1))
694 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine." ".g:netrw_port,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000695 else
Bram Moolenaarc236c162008-07-13 17:41:49 +0000696" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
697 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000698 endif
699 " 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 +0000700 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
Bram Moolenaarc236c162008-07-13 17:41:49 +0000701 let debugkeep = &debug
Bram Moolenaar9964e462007-05-05 17:54:07 +0000702 setlocal debug=msg
703 call netrw#ErrorMsg(s:ERROR,getline(1),4)
Bram Moolenaarc236c162008-07-13 17:41:49 +0000704 let &debug = debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000705 endif
Bram Moolenaared39e1d2008-08-09 17:55:22 +0000706 call s:SaveBufVars()
707 bd!
Bram Moolenaar5c736222010-01-06 20:54:52 +0100708 if bufname("%") == "" && getline("$") == "" && line('$') == 1
709 " needed when one sources a file in a nolbl setting window via ftp
Bram Moolenaared39e1d2008-08-09 17:55:22 +0000710 q!
711 endif
712 call s:RestoreBufVars()
Bram Moolenaar446cb832008-06-24 21:56:24 +0000713 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000714 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000715
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000716 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100717 " NetRead: (ftp + machine,id,passwd,filename) NetRead Method #3 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000718 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
719 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000720" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000721 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000722 call s:SaveBufVars()|new|call s:RestoreBufVars()
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000723 let filtbuf= bufnr("%")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000724 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000725 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200726 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +0000727" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000728 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200729 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +0000730" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000731 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000732
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000733 if exists("g:netrw_ftp") && g:netrw_ftp == 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200734 keepj put =g:netrw_uid
Bram Moolenaar446cb832008-06-24 21:56:24 +0000735" call Decho("filter input: ".getline('.'))
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200736 keepj put ='\"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +0000737" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000738 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200739 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +0000740" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000741 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000742
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000743 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200744 keepj put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +0000745" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000746 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000747 if exists("g:netrw_ftpextracmd")
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000748 put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +0000749" call Decho("filter input: ".getline('.'))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000750 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200751 keepj put ='get \"'.netrw_fname.'\" '.tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +0000752" call Decho("filter input: ".getline('.'))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000753
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000754 " perform ftp:
755 " -i : turns off interactive prompting from ftp
756 " -n unix : DON'T use <.netrc>, even though it exists
757 " -n win32: quit being obnoxious about password
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000758 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000759" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaar446cb832008-06-24 21:56:24 +0000760 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000761 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
762 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000763" call Decho("error<".getline(1).">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000764 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000765 call netrw#ErrorMsg(s:ERROR,getline(1),5)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000766 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000767 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000768 call s:SaveBufVars()|bd!|call s:RestoreBufVars()
769 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000770 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000771
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000772 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100773 " NetRead: (scp) NetRead Method #4 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000774 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000775" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000776 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +0000777 let useport= " ".g:netrw_scpport." ".g:netrw_port
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000778 else
779 let useport= ""
780 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100781" 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 +0000782 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 +0000783 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000784 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000785
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000786 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100787 " NetRead: (http) NetRead Method #5 (wget) {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000788 elseif b:netrw_method == 5
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000789" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000790 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000791 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000792 call netrw#ErrorMsg(s:ERROR,"neither the wget nor the fetch command is available",6)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000793 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000794" call Dret("netrw#NetRead :4 getcwd<".getcwd().">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000795 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000796 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000797
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000798 if match(b:netrw_fname,"#") == -1 || exists("g:netrw_http_xcmd")
799 " using g:netrw_http_cmd (usually elinks, links, curl, wget, or fetch)
Bram Moolenaarc236c162008-07-13 17:41:49 +0000800" call Decho('using '.g:netrw_http_cmd.' (# not in b:netrw_fname<'.b:netrw_fname.">)")
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000801 if exists("g:netrw_http_xcmd")
802" 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))
803 exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)." ".g:netrw_http_xcmd." ".shellescape(tmpfile,1)
804 else
805" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1))
806 exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)
807 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000808 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000809
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000810 else
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000811 " wget/curl/fetch plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
Bram Moolenaar446cb832008-06-24 21:56:24 +0000812" call Decho(("wget/curl plus jump (# in b:netrw_fname<".b:netrw_fname.">)")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000813 let netrw_html= substitute(b:netrw_fname,"#.*$","","")
814 let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000815" call Decho("netrw_html<".netrw_html.">")
816" call Decho("netrw_tag <".netrw_tag.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000817" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.netrw_html,1))
818 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 +0000819 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000820" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000821 exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
822 endif
823 let b:netrw_lastfile = choice
Bram Moolenaar9964e462007-05-05 17:54:07 +0000824 setlocal ro
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000825
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000826 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100827 " NetRead: (dav) NetRead Method #6 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000828 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000829" call Decho("read via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000830
Bram Moolenaar5c736222010-01-06 20:54:52 +0100831 if !executable(g:netrw_dav_cmd)
832 call netrw#ErrorMsg(s:ERROR,g:netrw_dav_cmd." is not executable",73)
833" call Dret("netrw#NetRead : ".g:netrw_dav_cmd." not executable")
834 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000835 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100836 if g:netrw_dav_cmd =~ "curl"
837" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_dav_cmd." ".shellescape("dav://".g:netrw_machine.b:netrw_fname,1)." ".shellescape(tmpfile,1))
838 exe s:netrw_silentxfer."!".g:netrw_dav_cmd." ".shellescape("dav://".g:netrw_machine.b:netrw_fname,1)." ".shellescape(tmpfile,1)
839 else
840 " Construct execution string (four lines) which will be passed through filter
841 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
842 new
843 setlocal ff=unix
844 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200845 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar5c736222010-01-06 20:54:52 +0100846 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200847 keepj put ='open '.g:netrw_machine
Bram Moolenaar5c736222010-01-06 20:54:52 +0100848 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200849 keepj put ='user '.g:netrw_uid.' '.s:netrw_passwd
850 keepj put ='get '.netrw_fname.' '.tmpfile
851 keepj put ='quit'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000852
Bram Moolenaar5c736222010-01-06 20:54:52 +0100853 " perform cadaver operation:
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200854 keepj norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000855" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100856 exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
857 bd!
858 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000859 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000860 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000861
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000862 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100863 " NetRead: (rsync) NetRead Method #7 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000864 elseif b:netrw_method == 7
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000865" call Decho("read via rsync (method #7)")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000866" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
867 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 +0000868 let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000869 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000870
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000871 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100872 " NetRead: (fetch) NetRead Method #8 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000873 " fetch://[user@]host[:http]/path
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000874 elseif b:netrw_method == 8
Bram Moolenaar9964e462007-05-05 17:54:07 +0000875" call Decho("read via fetch (method #8)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000876 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000877 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000878 call netrw#ErrorMsg(s:ERROR,"fetch command not available",7)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000879 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000880" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000881 endif
882 if exists("g:netrw_option") && g:netrw_option == ":http"
883 let netrw_option= "http"
884 else
885 let netrw_option= "ftp"
886 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000887" call Decho("read via fetch for ".netrw_option)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000888
Bram Moolenaar446cb832008-06-24 21:56:24 +0000889 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("s:netrw_passwd") && s:netrw_passwd != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +0000890" 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))
891 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 +0000892 else
Bram Moolenaarc236c162008-07-13 17:41:49 +0000893" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_machine."/".b:netrw_fname,1))
894 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 +0000895 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000896
Bram Moolenaar446cb832008-06-24 21:56:24 +0000897 let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000898 let b:netrw_lastfile = choice
Bram Moolenaar9964e462007-05-05 17:54:07 +0000899 setlocal ro
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000900
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000901 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100902 " NetRead: (sftp) NetRead Method #9 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000903 elseif b:netrw_method == 9
Bram Moolenaar9964e462007-05-05 17:54:07 +0000904" call Decho("read via sftp (method #9)")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000905" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile)
906 exe s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +0000907 let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000908 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000909
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000910 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +0100911 " NetRead: Complain {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000912 else
Bram Moolenaar9964e462007-05-05 17:54:07 +0000913 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",8)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000914 endif
915 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000916
Bram Moolenaar5c736222010-01-06 20:54:52 +0100917 " NetRead: cleanup {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000918 if exists("b:netrw_method")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000919" call Decho("cleanup b:netrw_method and b:netrw_fname")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000920 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000921 unlet b:netrw_fname
922 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000923 if s:FileReadable(tmpfile) && tmpfile !~ '.tar.bz2$' && tmpfile !~ '.tar.gz$' && tmpfile !~ '.zip' && tmpfile !~ '.tar' && readcmd != 't'
924" call Decho("cleanup by deleting tmpfile<".tmpfile.">")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100925 call s:NetrwDelete(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000926 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000927 call s:NetrwOptionRestore("w:")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000928
Bram Moolenaar9964e462007-05-05 17:54:07 +0000929" call Dret("netrw#NetRead :5 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000930endfun
931
932" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +0000933" netrw#NetWrite: responsible for writing a file over the net {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000934fun! netrw#NetWrite(...) range
Bram Moolenaar9964e462007-05-05 17:54:07 +0000935" call Dfunc("netrw#NetWrite(a:0=".a:0.") ".g:loaded_netrw)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000936
Bram Moolenaar5c736222010-01-06 20:54:52 +0100937 " NetWrite: option handling {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000938 let mod= 0
Bram Moolenaar446cb832008-06-24 21:56:24 +0000939 call s:NetrwOptionSave("w:")
940 call s:NetrwSafeOptions()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000941
Bram Moolenaar5c736222010-01-06 20:54:52 +0100942 " NetWrite: Get Temporary Filename {{{3
Bram Moolenaar9964e462007-05-05 17:54:07 +0000943 let tmpfile= s:GetTempfile("")
944 if tmpfile == ""
945" call Dret("netrw#NetWrite : unable to get a tempfile!")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000946 return
947 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000948
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000949 if a:0 == 0
950 let ichoice = 0
951 else
952 let ichoice = 1
953 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000954
Bram Moolenaar9964e462007-05-05 17:54:07 +0000955 let curbufname= expand("%")
956" call Decho("curbufname<".curbufname.">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000957 if &binary
Bram Moolenaar9964e462007-05-05 17:54:07 +0000958 " For binary writes, always write entire file.
959 " (line numbers don't really make sense for that).
960 " Also supports the writing of tar and zip files.
Bram Moolenaarc236c162008-07-13 17:41:49 +0000961" call Decho("(write entire file) silent exe w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile))
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200962 exe "silent keepj w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000963 elseif g:netrw_cygwin
964 " write (selected portion of) file to temporary
965 let cygtmpfile= substitute(tmpfile,'/cygdrive/\(.\)','\1:','')
Bram Moolenaarc236c162008-07-13 17:41:49 +0000966" call Decho("(write selected portion) silent exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile))
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200967 exe "sil keepj ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000968 else
969 " write (selected portion of) file to temporary
Bram Moolenaarc236c162008-07-13 17:41:49 +0000970" call Decho("(write selected portion) silent exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile))
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200971 exe "sil keepj ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000972 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000973
Bram Moolenaar9964e462007-05-05 17:54:07 +0000974 if curbufname == ""
975 " if the file is [No Name], and one attempts to Nwrite it, the buffer takes
976 " on the temporary file's name. Deletion of the temporary file during
977 " cleanup then causes an error message.
978 0file!
979 endif
980
Bram Moolenaar5c736222010-01-06 20:54:52 +0100981 " NetWrite: while choice loop: {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000982 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000983
Bram Moolenaar9964e462007-05-05 17:54:07 +0000984 " Process arguments: {{{4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000985 " attempt to repeat with previous host-file-etc
986 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000987" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000988 let choice = b:netrw_lastfile
989 let ichoice= ichoice + 1
990 else
991 exe "let choice= a:" . ichoice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000992
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000993 " Reconstruct Choice if choice starts with '"'
994 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000995 echomsg 'NetWrite Usage:"'
996 echomsg ':Nwrite machine:path uses rcp'
997 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
998 echomsg ':Nwrite "machine id password path" uses ftp'
999 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
1000 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
1001 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
1002 echomsg ':Nwrite rcp://machine/path uses rcp'
1003 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
1004 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
1005 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaar9964e462007-05-05 17:54:07 +00001006 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001007 break
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001008
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001009 elseif match(choice,"^\"") != -1
1010 if match(choice,"\"$") != -1
1011 " case "..."
1012 let choice=strpart(choice,1,strlen(choice)-2)
1013 else
1014 " case "... ... ..."
1015 let choice = strpart(choice,1,strlen(choice)-1)
1016 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001017
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001018 while match(choice,"\"$") == -1
1019 let wholechoice= wholechoice . " " . choice
1020 let ichoice = ichoice + 1
1021 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001022 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001023 call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",13)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001024 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001025" call Dret("netrw#NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001026 return
1027 endif
1028 let choice= a:{ichoice}
1029 endwhile
1030 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
1031 endif
1032 endif
1033 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001034 let ichoice= ichoice + 1
Bram Moolenaar9964e462007-05-05 17:54:07 +00001035" call Decho("choice<" . choice . "> ichoice=".ichoice)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001036
Bram Moolenaar9964e462007-05-05 17:54:07 +00001037 " Determine method of write (ftp, rcp, etc) {{{4
Bram Moolenaar446cb832008-06-24 21:56:24 +00001038 call s:NetrwMethod(choice)
Bram Moolenaar5c736222010-01-06 20:54:52 +01001039 if !exists("b:netrw_method") || b:netrw_method < 0
1040" call Dfunc("netrw#NetWrite : unsupported method")
1041 return
1042 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001043
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001044 " =============
Bram Moolenaar5c736222010-01-06 20:54:52 +01001045 " NetWrite: Perform Protocol-Based Write {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001046 " ============================
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001047 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
1048 echo "(netrw) Processing your write request..."
Bram Moolenaar446cb832008-06-24 21:56:24 +00001049" call Decho("(netrw) Processing your write request...")
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001050 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001051
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001052 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001053 " NetWrite: (rcp) NetWrite Method #1 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001054 if b:netrw_method == 1
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001055" call Decho("write via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001056 if s:netrw_has_nt_rcp == 1
1057 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1058 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
1059 else
1060 let uid_machine = g:netrw_machine .'.'. $USERNAME
1061 endif
1062 else
1063 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1064 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1065 else
1066 let uid_machine = g:netrw_machine
1067 endif
1068 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00001069" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(tmpfile,1)." ".shellescape(uid_machine.":".b:netrw_fname,1))
1070 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 +00001071 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001072
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001073 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001074 " NetWrite: (ftp + <.netrc>) NetWrite Method #2 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001075 elseif b:netrw_method == 2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001076" call Decho("write via ftp+.netrc (method #2)")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001077 let netrw_fname = b:netrw_fname
1078
1079 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
1080 let bhkeep = &l:bh
1081 let curbuf = bufnr("%")
1082 setlocal bh=hide
1083 enew
1084
Bram Moolenaar446cb832008-06-24 21:56:24 +00001085" call Decho("filter input window#".winnr())
Bram Moolenaar8299df92004-07-10 09:47:34 +00001086 setlocal ff=unix
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001087 keepj put =g:netrw_ftpmode
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001088" call Decho("filter input: ".getline('$'))
Bram Moolenaar9964e462007-05-05 17:54:07 +00001089 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001090 keepj put =g:netrw_ftpextracmd
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001091" call Decho("filter input: ".getline("$"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00001092 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001093 call setline(line("$")+1,'put "'.tmpfile.'" "'.netrw_fname.'"')
1094" call Decho("filter input: ".getline("$"))
Bram Moolenaar071d4272004-06-13 20:20:40 +00001095 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00001096" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
1097 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001098 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00001099" call Decho("filter input window#".winnr())
Bram Moolenaarc236c162008-07-13 17:41:49 +00001100" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
1101 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001102 endif
1103 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1104 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001105 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001106 call netrw#ErrorMsg(s:ERROR,getline(1),14)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001107 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001108 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +00001109 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001110
1111 " remove enew buffer (quietly)
1112 let filtbuf= bufnr("%")
1113 exe curbuf."b!"
1114 let &l:bh = bhkeep
1115 exe filtbuf."bw!"
1116
Bram Moolenaar071d4272004-06-13 20:20:40 +00001117 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001118
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001119 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001120 " NetWrite: (ftp + machine, id, passwd, filename) NetWrite Method #3 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001121 elseif b:netrw_method == 3
Bram Moolenaar5c736222010-01-06 20:54:52 +01001122 " Construct execution string (three or more lines) which will be passed through filter
Bram Moolenaar9964e462007-05-05 17:54:07 +00001123" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001124 let netrw_fname = b:netrw_fname
1125 let bhkeep = &l:bh
1126
1127 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
1128 let curbuf = bufnr("%")
1129 setlocal bh=hide
1130 enew
Bram Moolenaar8299df92004-07-10 09:47:34 +00001131 setlocal ff=unix
Bram Moolenaar5c736222010-01-06 20:54:52 +01001132
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001133 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001134 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00001135" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001136 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001137 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00001138" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001139 endif
1140 if exists("g:netrw_ftp") && g:netrw_ftp == 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001141 keepj put =g:netrw_uid
Bram Moolenaar446cb832008-06-24 21:56:24 +00001142" call Decho("filter input: ".getline('.'))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001143 keepj put ='\"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001144" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001145 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001146 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001147" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001148 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001149 keepj put =g:netrw_ftpmode
Bram Moolenaar5c736222010-01-06 20:54:52 +01001150" call Decho("filter input: ".getline('$'))
1151 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001152 keepj put =g:netrw_ftpextracmd
Bram Moolenaar5c736222010-01-06 20:54:52 +01001153" call Decho("filter input: ".getline("$"))
1154 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001155 keepj put ='put \"'.tmpfile.'\" \"'.netrw_fname.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001156" call Decho("filter input: ".getline('.'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001157 " save choice/id/password for future use
1158 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001159
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001160 " perform ftp:
1161 " -i : turns off interactive prompting from ftp
1162 " -n unix : DON'T use <.netrc>, even though it exists
1163 " -n win32: quit being obnoxious about password
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001164 keepj norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001165" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001166 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001167 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1168 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001169 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001170 call netrw#ErrorMsg(s:ERROR,getline(1),15)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001171 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001172 let mod=1
1173 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001174
1175 " remove enew buffer (quietly)
1176 let filtbuf= bufnr("%")
1177 exe curbuf."b!"
1178 let &l:bh= bhkeep
1179 exe filtbuf."bw!"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001180
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001181 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001182 " NetWrite: (scp) NetWrite Method #4 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001183 elseif b:netrw_method == 4
Bram Moolenaar9964e462007-05-05 17:54:07 +00001184" call Decho("write via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001185 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00001186 let useport= " ".g:netrw_scpport." ".fnameescape(g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001187 else
1188 let useport= ""
1189 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00001190" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1))
1191 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 +00001192 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001193
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001194 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001195 " NetWrite: (http) NetWrite Method #5 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001196 elseif b:netrw_method == 5
Bram Moolenaar9964e462007-05-05 17:54:07 +00001197" call Decho("write via http (method #5)")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001198 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001199 call netrw#ErrorMsg(s:ERROR,"currently <netrw.vim> does not support writing using http:",16)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001200 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001201
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001202 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001203 " NetWrite: (dav) NetWrite Method #6 (cadaver) {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001204 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001205" call Decho("write via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001206
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001207 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaar5c736222010-01-06 20:54:52 +01001208 let netrw_fname = escape(b:netrw_fname,g:netrw_fname_escape)
1209 let bhkeep = &l:bh
1210
1211 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
1212 let curbuf = bufnr("%")
1213 setlocal bh=hide
1214 enew
1215
Bram Moolenaar8299df92004-07-10 09:47:34 +00001216 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001217 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001218 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001219 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001220 keepj put ='open '.g:netrw_machine
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001221 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001222 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001223 keepj put ='user '.g:netrw_uid.' '.s:netrw_passwd
Bram Moolenaar446cb832008-06-24 21:56:24 +00001224 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001225 keepj put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001226
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001227 " perform cadaver operation:
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001228 keepj norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001229" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001230 exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
Bram Moolenaar5c736222010-01-06 20:54:52 +01001231
1232 " remove enew buffer (quietly)
1233 let filtbuf= bufnr("%")
1234 exe curbuf."b!"
1235 let &l:bh = bhkeep
1236 exe filtbuf."bw!"
1237
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001238 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001239
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001240 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001241 " NetWrite: (rsync) NetWrite Method #7 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001242 elseif b:netrw_method == 7
Bram Moolenaar9964e462007-05-05 17:54:07 +00001243" call Decho("write via rsync (method #7)")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001244" call Decho("executing: !".g:netrw_rsync_cmd." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1))
1245 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 +00001246 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001247
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001248 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001249 " NetWrite: (sftp) NetWrite Method #9 {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001250 elseif b:netrw_method == 9
Bram Moolenaar9964e462007-05-05 17:54:07 +00001251" call Decho("read via sftp (method #9)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001252 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001253 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1254 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1255 else
1256 let uid_machine = g:netrw_machine
1257 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001258
1259 " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
1260 let bhkeep = &l:bh
1261 let curbuf = bufnr("%")
1262 setlocal bh=hide
1263 enew
1264
Bram Moolenaar8299df92004-07-10 09:47:34 +00001265 setlocal ff=unix
Bram Moolenaar5c736222010-01-06 20:54:52 +01001266 call setline(1,'put "'.escape(tmpfile,'\').'" '.netrw_fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001267" call Decho("filter input: ".getline('.'))
Bram Moolenaarc236c162008-07-13 17:41:49 +00001268" call Decho("executing: %!".g:netrw_sftp_cmd.' '.shellescape(uid_machine,1))
1269 exe s:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.shellescape(uid_machine,1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01001270 let filtbuf= bufnr("%")
1271 exe curbuf."b!"
1272 let &l:bh = bhkeep
1273 exe filtbuf."bw!"
1274 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001275
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001276 ".........................................
Bram Moolenaar5c736222010-01-06 20:54:52 +01001277 " NetWrite: Complain {{{3
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001278 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001279 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",17)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001280 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001281 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001282
Bram Moolenaar5c736222010-01-06 20:54:52 +01001283 " NetWrite: Cleanup: {{{3
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001284" call Decho("cleanup")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001285 if s:FileReadable(tmpfile)
1286" call Decho("tmpfile<".tmpfile."> readable, will now delete it")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001287 call s:NetrwDelete(tmpfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001288 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001289 call s:NetrwOptionRestore("w:")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001290
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001291 if a:firstline == 1 && a:lastline == line("$")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001292 " restore modifiability; usually equivalent to set nomod
1293 let &mod= mod
Bram Moolenaar071d4272004-06-13 20:20:40 +00001294 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001295
Bram Moolenaar5c736222010-01-06 20:54:52 +01001296 " restore equalalways
Bram Moolenaar9964e462007-05-05 17:54:07 +00001297" call Dret("netrw#NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001298endfun
1299
1300" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001301" netrw#NetSource: source a remotely hosted vim script {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001302" uses NetRead to get a copy of the file into a temporarily file,
1303" then sources that file,
1304" then removes that file.
1305fun! netrw#NetSource(...)
1306" call Dfunc("netrw#NetSource() a:0=".a:0)
1307 if a:0 > 0 && a:1 == '?'
1308 " give help
1309 echomsg 'NetSource Usage:'
1310 echomsg ':Nsource dav://machine[:port]/path uses cadaver'
1311 echomsg ':Nsource fetch://machine/path uses fetch'
1312 echomsg ':Nsource ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
1313 echomsg ':Nsource http://[user@]machine/path uses http wget'
1314 echomsg ':Nsource rcp://[user@]machine/path uses rcp'
1315 echomsg ':Nsource rsync://machine[:port]/path uses rsync'
1316 echomsg ':Nsource scp://[user@]machine[[:#]port]/path uses scp'
1317 echomsg ':Nsource sftp://[user@]machine[[:#]port]/path uses sftp'
1318 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001319 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001320 let i= 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001321 while i <= a:0
Bram Moolenaar9964e462007-05-05 17:54:07 +00001322 call netrw#NetRead(3,a:{i})
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001323" call Decho("(netrw#NetSource) s:netread_tmpfile<".s:netrw_tmpfile.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001324 if s:FileReadable(s:netrw_tmpfile)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001325" call Decho("(netrw#NetSource) exe so ".fnameescape(s:netrw_tmpfile))
1326 exe "so ".fnameescape(s:netrw_tmpfile)
1327" call Decho("(netrw#NetSource) delete(".s:netrw_tmpfile.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001328 call delete(s:netrw_tmpfile)
1329 unlet s:netrw_tmpfile
1330 else
1331 call netrw#ErrorMsg(s:ERROR,"unable to source <".a:{i}.">!",48)
1332 endif
1333 let i= i + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001334 endwhile
Bram Moolenaar9964e462007-05-05 17:54:07 +00001335 endif
1336" call Dret("netrw#NetSource")
1337endfun
1338
1339" ===========================================
Bram Moolenaar446cb832008-06-24 21:56:24 +00001340" s:NetrwGetFile: Function to read temporary file "tfile" with command "readcmd". {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001341" readcmd == %r : replace buffer with newly read file
1342" == 0r : read file at top of buffer
1343" == r : read file after current line
1344" == t : leave file in temporary form (ie. don't read into buffer)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001345fun! s:NetrwGetFile(readcmd, tfile, method)
1346" call Dfunc("NetrwGetFile(readcmd<".a:readcmd.">,tfile<".a:tfile."> method<".a:method.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001347
1348 " readcmd=='t': simply do nothing
1349 if a:readcmd == 't'
Bram Moolenaarc236c162008-07-13 17:41:49 +00001350" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001351" call Dret("NetrwGetFile : skip read of <".a:tfile.">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001352 return
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001353 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001354
Bram Moolenaar9964e462007-05-05 17:54:07 +00001355 " get name of remote filename (ie. url and all)
1356 let rfile= bufname("%")
1357" call Decho("rfile<".rfile.">")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001358
Bram Moolenaar9964e462007-05-05 17:54:07 +00001359 if exists("*NetReadFixup")
1360 " for the use of NetReadFixup (not otherwise used internally)
1361 let line2= line("$")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001362 endif
1363
Bram Moolenaar9964e462007-05-05 17:54:07 +00001364 if a:readcmd[0] == '%'
1365 " get file into buffer
1366" call Decho("get file into buffer")
1367
1368 " rename the current buffer to the temp file (ie. tfile)
1369 if g:netrw_cygwin
1370 let tfile= substitute(a:tfile,'/cygdrive/\(.\)','\1:','')
1371 else
1372 let tfile= a:tfile
1373 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00001374" call Decho("exe silent! keepalt file ".fnameescape(tfile))
1375 exe "silent! keepalt file ".fnameescape(tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001376
1377 " edit temporary file (ie. read the temporary file in)
1378 if rfile =~ '\.zip$'
1379" call Decho("handling remote zip file with zip#Browse(tfile<".tfile.">)")
1380 call zip#Browse(tfile)
1381 elseif rfile =~ '\.tar$'
1382" call Decho("handling remote tar file with tar#Browse(tfile<".tfile.">)")
1383 call tar#Browse(tfile)
1384 elseif rfile =~ '\.tar\.gz'
1385" call Decho("handling remote gzip-compressed tar file")
1386 call tar#Browse(tfile)
1387 elseif rfile =~ '\.tar\.bz2'
1388" call Decho("handling remote bz2-compressed tar file")
1389 call tar#Browse(tfile)
1390 else
1391" call Decho("edit temporary file")
1392 e!
1393 endif
1394
1395 " rename buffer back to remote filename
Bram Moolenaarc236c162008-07-13 17:41:49 +00001396" call Decho("exe silent! keepalt file ".fnameescape(rfile))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001397 exe "sil! keepalt file ".fnameescape(rfile)
Bram Moolenaar5c736222010-01-06 20:54:52 +01001398 filetype detect
Bram Moolenaar9964e462007-05-05 17:54:07 +00001399" call Dredir("renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">","ls!")
1400 let line1 = 1
1401 let line2 = line("$")
1402
1403 elseif s:FileReadable(a:tfile)
1404 " read file after current line
1405" call Decho("read file<".a:tfile."> after current line")
1406 let curline = line(".")
1407 let lastline= line("$")
Bram Moolenaarc236c162008-07-13 17:41:49 +00001408" call Decho("exe<".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)."> line#".curline)
1409 exe a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001410 let line1= curline + 1
1411 let line2= line("$") - lastline + 1
1412
1413 else
1414 " not readable
Bram Moolenaarc236c162008-07-13 17:41:49 +00001415" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001416" call Decho("tfile<".a:tfile."> not readable")
1417 call netrw#ErrorMsg(s:WARNING,"file <".a:tfile."> not readable",9)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001418" call Dret("NetrwGetFile : tfile<".a:tfile."> not readable")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001419 return
1420 endif
1421
1422 " User-provided (ie. optional) fix-it-up command
1423 if exists("*NetReadFixup")
1424" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
1425 call NetReadFixup(a:method, line1, line2)
1426" else " Decho
1427" call Decho("NetReadFixup() not called, doesn't exist (line1=".line1." line2=".line2.")")
1428 endif
1429
Bram Moolenaar5c736222010-01-06 20:54:52 +01001430 if has("gui") && has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu
Bram Moolenaar446cb832008-06-24 21:56:24 +00001431 " update the Buffers menu
1432 call s:UpdateBuffersMenu()
Bram Moolenaar9964e462007-05-05 17:54:07 +00001433 endif
1434
1435" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> tfile<".a:tfile."> readable=".s:FileReadable(a:tfile))
1436
1437 " make sure file is being displayed
Bram Moolenaar446cb832008-06-24 21:56:24 +00001438" redraw!
1439
Bram Moolenaarc236c162008-07-13 17:41:49 +00001440" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001441" call Dret("NetrwGetFile")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001442endfun
1443
Bram Moolenaar9964e462007-05-05 17:54:07 +00001444" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001445" s:NetrwMethod: determine method of transfer {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +01001446" Input:
1447" choice = url [protocol:]//[userid@]hostname[:port]/[path-to-file]
1448" Output:
1449" b:netrw_method= 1: rcp
1450" 2: ftp + <.netrc>
1451" 3: ftp + machine, id, password, and [path]filename
1452" 4: scp
1453" 5: http (wget)
1454" 6: dav
1455" 7: rsync
1456" 8: fetch
1457" 9: sftp
1458" g:netrw_machine= hostname
1459" b:netrw_fname = filename
1460" g:netrw_port = optional port number (for ftp)
1461" g:netrw_choice = copy of input url (choice)
1462fun! s:NetrwMethod(choice)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001463" call Dfunc("NetrwMethod(a:choice<".a:choice.">)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001464
Bram Moolenaar5c736222010-01-06 20:54:52 +01001465 " record current g:netrw_machine, if any
1466 " curmachine used if protocol == ftp and no .netrc
1467 if exists("g:netrw_machine")
1468 let curmachine= g:netrw_machine
1469" call Decho("curmachine<".curmachine.">")
1470 else
1471 let curmachine= "N O T A HOST"
1472 endif
1473
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001474 " initialization
1475 let b:netrw_method = 0
1476 let g:netrw_machine = ""
1477 let b:netrw_fname = ""
1478 let g:netrw_port = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001479 let g:netrw_choice = a:choice
1480
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001481 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001482 " mipf : a:machine a:id password filename Use ftp
Bram Moolenaar446cb832008-06-24 21:56:24 +00001483 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
1484 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001485 " rcpurm : rcp://[user@]host/filename Use rcp
1486 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001487 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001488 " httpurm : http://[user@]host/filename Use wget
Bram Moolenaar5c736222010-01-06 20:54:52 +01001489 " davurm : dav[s]://host[:port]/path Use cadaver/curl
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001490 " rsyncurm : rsync://host[:port]/path Use rsync
1491 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
1492 " sftpurm : sftp://[user@]host/filename Use scp
1493 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
1494 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
1495 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
Bram Moolenaar83bab712005-08-01 21:58:57 +00001496 let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001497 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001498 let scpurm = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001499 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001500 let davurm = '^davs\=://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001501 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
1502 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
1503 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001504
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001505" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001506 " Determine Method
1507 " rcp://user@hostname/...path-to-file
1508 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001509" call Decho("rcp://...")
Bram Moolenaar83bab712005-08-01 21:58:57 +00001510 let b:netrw_method = 1
1511 let userid = substitute(a:choice,rcpurm,'\1',"")
1512 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
1513 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001514 if userid != ""
1515 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00001516 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001517
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001518 " scp://user@hostname/...path-to-file
1519 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001520" call Decho("scp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001521 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00001522 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
1523 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
1524 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001525
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001526 " http://user@hostname/...path-to-file
1527 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001528" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001529 let b:netrw_method = 5
1530 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
1531 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001532
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001533 " dav://hostname[:port]/..path-to-file..
1534 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001535" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001536 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001537 if a:choice =~ '^s'
1538 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
1539 else
1540 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
1541 endif
1542 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001543
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001544 " rsync://user@hostname/...path-to-file
1545 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001546" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001547 let b:netrw_method = 7
1548 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
1549 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001550
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001551 " ftp://[user@]hostname[[:#]port]/...path-to-file
1552 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001553" call Decho("ftp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001554 let userid = substitute(a:choice,ftpurm,'\2',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001555 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
1556 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
1557 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001558" call Decho("g:netrw_machine<".g:netrw_machine.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001559 if userid != ""
1560 let g:netrw_uid= userid
1561 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001562 if exists("s:netrw_passwd") && curmachine != g:netrw_machine
1563 " if there's a change in hostname, require password re-entry
1564 unlet s:netrw_passwd
1565 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001566 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001567 let b:netrw_method = 3
1568 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001569 if s:FileReadable(expand("$HOME/.netrc")) && !g:netrw_ignorenetrc
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001570 let b:netrw_method= 2
1571 else
1572 if !exists("g:netrw_uid") || g:netrw_uid == ""
1573 call NetUserPass()
Bram Moolenaar446cb832008-06-24 21:56:24 +00001574 elseif !exists("s:netrw_passwd") || s:netrw_passwd == ""
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001575 call NetUserPass(g:netrw_uid)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001576 " else just use current g:netrw_uid and s:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001577 endif
1578 let b:netrw_method= 3
1579 endif
1580 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001581
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001582 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001583" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001584 let b:netrw_method = 8
1585 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
1586 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
1587 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
1588 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001589
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001590 " Issue an ftp : "machine id password [path/]filename"
1591 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001592" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001593 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001594 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
1595 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001596 let s:netrw_passwd = substitute(a:choice,mipf,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001597 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001598
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001599 " Issue an ftp: "hostname [path/]filename"
1600 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001601" call Decho("(ftp) host file")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001602 if exists("g:netrw_uid") && exists("s:netrw_passwd")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001603 let b:netrw_method = 3
1604 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
1605 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001606
Bram Moolenaar9964e462007-05-05 17:54:07 +00001607 elseif s:FileReadable(expand("$HOME/.netrc"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001608 let b:netrw_method = 2
1609 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
1610 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
1611 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001612
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001613 " sftp://user@hostname/...path-to-file
1614 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001615" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001616 let b:netrw_method = 9
1617 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
1618 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001619
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001620 " Issue an rcp: hostname:filename" (this one should be last)
1621 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001622" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001623 let b:netrw_method = 1
1624 let userid = substitute(a:choice,rcphf,'\2',"")
1625 let g:netrw_machine = substitute(a:choice,rcphf,'\3',"")
1626 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001627" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
1628" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
1629" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
1630" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001631 if userid != ""
1632 let g:netrw_uid= userid
1633 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001634
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001635 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001636 if !exists("g:netrw_quiet")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001637 call netrw#ErrorMsg(s:WARNING,"cannot determine method (format: protocol://[user@]hostname[:port]/[path])",45)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001638 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001639 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00001640 endif
Bram Moolenaar81695252004-12-29 20:58:21 +00001641
1642 " remove any leading [:#] from port number
1643 if g:netrw_port != ""
1644 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
1645 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001646
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001647" call Decho("a:choice <".a:choice.">")
1648" call Decho("b:netrw_method <".b:netrw_method.">")
1649" call Decho("g:netrw_machine<".g:netrw_machine.">")
1650" call Decho("g:netrw_port <".g:netrw_port.">")
1651" if exists("g:netrw_uid") "Decho
1652" call Decho("g:netrw_uid <".g:netrw_uid.">")
1653" endif "Decho
Bram Moolenaar446cb832008-06-24 21:56:24 +00001654" if exists("s:netrw_passwd") "Decho
1655" call Decho("s:netrw_passwd <".s:netrw_passwd.">")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001656" endif "Decho
1657" call Decho("b:netrw_fname <".b:netrw_fname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001658" call Dret("NetrwMethod : b:netrw_method=".b:netrw_method)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001659endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001660
1661" ------------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00001662" NetReadFixup: this sort of function is typically written by the user {{{2
1663" to handle extra junk that their system's ftp dumps
1664" into the transfer. This function is provided as an
1665" example and as a fix for a Windows 95 problem: in my
1666" experience, win95's ftp always dumped four blank lines
1667" at the end of the transfer.
1668if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp
1669 fun! NetReadFixup(method, line1, line2)
1670" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001671
1672 " sanity checks -- attempt to convert inputs to integers
1673 let method = a:method + 0
1674 let line1 = a:line1 + 0
1675 let line2 = a:line2 + 0
1676 if type(method) != 0 || type(line1) != 0 || type(line2) != 0 || method < 0 || line1 <= 0 || line2 <= 0
1677" call Dret("NetReadFixup")
1678 return
1679 endif
1680
Bram Moolenaar9964e462007-05-05 17:54:07 +00001681 if method == 3 " ftp (no <.netrc>)
1682 let fourblanklines= line2 - 3
Bram Moolenaar5c736222010-01-06 20:54:52 +01001683 if fourblanklines >= line1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001684 exe "sil keepj ".fourblanklines.",".line2."g/^\s*$/d"
Bram Moolenaar5c736222010-01-06 20:54:52 +01001685 call histdel("/",-1)
1686 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001687 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01001688
Bram Moolenaar9964e462007-05-05 17:54:07 +00001689" call Dret("NetReadFixup")
1690 endfun
1691endif
1692
1693" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001694" NetUserPass: set username and password for subsequent ftp transfer {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +00001695" Usage: :call NetUserPass() -- will prompt for userid and password
1696" :call NetUserPass("uid") -- will prompt for password
1697" :call NetUserPass("uid","password") -- sets global userid and password
1698fun! NetUserPass(...)
1699
1700 " get/set userid
1701 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001702" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001703 if !exists("g:netrw_uid") || g:netrw_uid == ""
1704 " via prompt
1705 let g:netrw_uid= input('Enter username: ')
1706 endif
1707 else " from command line
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001708" call Dfunc("NetUserPass(a:1<".a:1.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001709 let g:netrw_uid= a:1
1710 endif
1711
1712 " get password
1713 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001714" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001715 let s:netrw_passwd= inputsecret("Enter Password: ")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001716 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001717" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001718 let s:netrw_passwd=a:2
Bram Moolenaar071d4272004-06-13 20:20:40 +00001719 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001720
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001721" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001722endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001723
Bram Moolenaar9964e462007-05-05 17:54:07 +00001724" ===========================================
1725" Shared Browsing Support: {{{1
1726" ===========================================
Bram Moolenaar071d4272004-06-13 20:20:40 +00001727
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001728" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00001729" s:BrowserMaps: {{{2
1730fun! s:BrowserMaps(islocal)
1731" call Dfunc("s:BrowserMaps(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
1732 if a:islocal
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001733" call Decho("make local maps")
Bram Moolenaar446cb832008-06-24 21:56:24 +00001734 nnoremap <buffer> <silent> <cr> :call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
1735 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,'../'))<cr>
1736 nnoremap <buffer> <silent> a :call <SID>NetrwHide(1)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01001737 nnoremap <buffer> <silent> mb :<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001738 nnoremap <buffer> <silent> mc :<c-u>call <SID>NetrwMarkFileCopy(1)<cr>
1739 nnoremap <buffer> <silent> md :<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
1740 nnoremap <buffer> <silent> me :<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
1741 nnoremap <buffer> <silent> mf :<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
1742 nnoremap <buffer> <silent> mg :<c-u>call <SID>NetrwMarkFileGrep(1)<cr>
1743 nnoremap <buffer> <silent> mh :<c-u>call <SID>NetrwMarkHideSfx(1)<cr>
1744 nnoremap <buffer> <silent> mm :<c-u>call <SID>NetrwMarkFileMove(1)<cr>
1745 nnoremap <buffer> <silent> mp :<c-u>call <SID>NetrwMarkFilePrint(1)<cr>
1746 nnoremap <buffer> <silent> mr :<c-u>call <SID>NetrwMarkFileRegexp(1)<cr>
1747 nnoremap <buffer> <silent> ms :<c-u>call <SID>NetrwMarkFileSource(1)<cr>
1748 nnoremap <buffer> <silent> mT :<c-u>call <SID>NetrwMarkFileTag(1)<cr>
1749 nnoremap <buffer> <silent> mt :<c-u>call <SID>NetrwMarkFileTgt(1)<cr>
1750 nnoremap <buffer> <silent> mu :<c-u>call <SID>NetrwUnMarkFile(1)<cr>
1751 nnoremap <buffer> <silent> mx :<c-u>call <SID>NetrwMarkFileExe(1)<cr>
1752 nnoremap <buffer> <silent> mz :<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01001753 nnoremap <buffer> <silent> gb :<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001754 nnoremap <buffer> <silent> gh :<c-u>call <SID>NetrwHidden(1)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01001755 nnoremap <buffer> <silent> gp :<c-u>call <SID>NetrwChgPerm(1,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001756 nnoremap <buffer> <silent> c :exe "keepjumps lcd ".fnameescape(b:netrw_curdir)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001757 nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001758 nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("")<cr>
1759 nnoremap <buffer> <silent> i :call <SID>NetrwListStyle(1)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01001760 nnoremap <buffer> <silent> I :call <SID>NetrwBannerCtrl(1)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001761 nnoremap <buffer> <silent> o :call <SID>NetrwSplit(3)<cr>
1762 nnoremap <buffer> <silent> O :call <SID>NetrwObtain(1)<cr>
1763 nnoremap <buffer> <silent> p :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
1764 nnoremap <buffer> <silent> P :call <SID>NetrwPrevWinOpen(1)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01001765 nnoremap <buffer> <silent> qb :<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
1766 nnoremap <buffer> <silent> mB :<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001767 nnoremap <buffer> <silent> qf :<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
1768 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>
1769 nnoremap <buffer> <silent> s :call <SID>NetrwSortStyle(1)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001770 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001771 nnoremap <buffer> <silent> t :call <SID>NetrwSplit(4)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01001772 nnoremap <buffer> <silent> T :call <SID>NetrwSplit(4)<bar>norm! gT<cr>
1773 nnoremap <buffer> <silent> u :<c-u>call <SID>NetrwBookHistHandler(4,expand("%"))<cr>
1774 nnoremap <buffer> <silent> U :<c-u>call <SID>NetrwBookHistHandler(5,expand("%"))<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001775 nnoremap <buffer> <silent> v :call <SID>NetrwSplit(5)<cr>
1776 nnoremap <buffer> <silent> x :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr>
Bram Moolenaarc236c162008-07-13 17:41:49 +00001777 nnoremap <buffer> <silent> % :call <SID>NetrwOpenFile(1)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001778 inoremap <buffer> <silent> <cr> <c-o>:call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
1779 inoremap <buffer> <silent> - <c-o>:exe "norm! 0"<bar>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,'../'))<cr>
1780 inoremap <buffer> <silent> a <c-o>:call <SID>NetrwHide(1)<cr>
1781 inoremap <buffer> <silent> mb <c-o>:<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
1782 inoremap <buffer> <silent> mc <c-o>:<c-u>call <SID>NetrwMarkFileCopy(1)<cr>
1783 inoremap <buffer> <silent> md <c-o>:<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
1784 inoremap <buffer> <silent> me <c-o>:<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
1785 inoremap <buffer> <silent> mf <c-o>:<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
1786 inoremap <buffer> <silent> mg <c-o>:<c-u>call <SID>NetrwMarkFileGrep(1)<cr>
1787 inoremap <buffer> <silent> mh <c-o>:<c-u>call <SID>NetrwMarkHideSfx(1)<cr>
1788 inoremap <buffer> <silent> mm <c-o>:<c-u>call <SID>NetrwMarkFileMove(1)<cr>
1789 inoremap <buffer> <silent> mp <c-o>:<c-u>call <SID>NetrwMarkFilePrint(1)<cr>
1790 inoremap <buffer> <silent> mr <c-o>:<c-u>call <SID>NetrwMarkFileRegexp(1)<cr>
1791 inoremap <buffer> <silent> ms <c-o>:<c-u>call <SID>NetrwMarkFileSource(1)<cr>
1792 inoremap <buffer> <silent> mT <c-o>:<c-u>call <SID>NetrwMarkFileTag(1)<cr>
1793 inoremap <buffer> <silent> mt <c-o>:<c-u>call <SID>NetrwMarkFileTgt(1)<cr>
1794 inoremap <buffer> <silent> mu <c-o>:<c-u>call <SID>NetrwUnMarkFile(1)<cr>
1795 inoremap <buffer> <silent> mx <c-o>:<c-u>call <SID>NetrwMarkFileExe(1)<cr>
1796 inoremap <buffer> <silent> mz <c-o>:<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
1797 inoremap <buffer> <silent> gb <c-o>:<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
1798 inoremap <buffer> <silent> gh <c-o>:<c-u>call <SID>NetrwHidden(1)<cr>
1799 inoremap <buffer> <silent> gp <c-o>:<c-u>call <SID>NetrwChgPerm(1,b:netrw_curdir)<cr>
1800 inoremap <buffer> <silent> c <c-o>:exe "keepjumps lcd ".fnameescape(b:netrw_curdir)<cr>
1801 inoremap <buffer> <silent> C <c-o>:let g:netrw_chgwin= winnr()<cr>
1802 inoremap <buffer> <silent> d <c-o>:call <SID>NetrwMakeDir("")<cr>
1803 inoremap <buffer> <silent> i <c-o>:call <SID>NetrwListStyle(1)<cr>
1804 inoremap <buffer> <silent> I <c-o>:call <SID>NetrwBannerCtrl(1)<cr>
1805 inoremap <buffer> <silent> o <c-o>:call <SID>NetrwSplit(3)<cr>
1806 inoremap <buffer> <silent> O <c-o>:call <SID>NetrwObtain(1)<cr>
1807 inoremap <buffer> <silent> p <c-o>:call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
1808 inoremap <buffer> <silent> P <c-o>:call <SID>NetrwPrevWinOpen(1)<cr>
1809 inoremap <buffer> <silent> qb <c-o>:<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
1810 inoremap <buffer> <silent> mB <c-o>:<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
1811 inoremap <buffer> <silent> qf <c-o>:<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
1812 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>
1813 inoremap <buffer> <silent> s <c-o>:call <SID>NetrwSortStyle(1)<cr>
1814 inoremap <buffer> <silent> S <c-o>:call <SID>NetSortSequence(1)<cr>
1815 inoremap <buffer> <silent> t <c-o>:call <SID>NetrwSplit(4)<cr>
1816 inoremap <buffer> <silent> T <c-o>:call <SID>NetrwSplit(4)<bar>norm! gT<cr>
1817 inoremap <buffer> <silent> u <c-o>:<c-u>call <SID>NetrwBookHistHandler(4,expand("%"))<cr>
1818 inoremap <buffer> <silent> U <c-o>:<c-u>call <SID>NetrwBookHistHandler(5,expand("%"))<cr>
1819 inoremap <buffer> <silent> v <c-o>:call <SID>NetrwSplit(5)<cr>
1820 inoremap <buffer> <silent> x <c-o>:call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr>
1821 inoremap <buffer> <silent> % <c-o>:call <SID>NetrwOpenFile(1)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001822 if !hasmapto('<Plug>NetrwHideEdit')
1823 nmap <buffer> <unique> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001824 imap <buffer> <unique> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar446cb832008-06-24 21:56:24 +00001825 endif
1826 nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(1)<cr>
1827 if !hasmapto('<Plug>NetrwRefresh')
1828 nmap <buffer> <unique> <c-l> <Plug>NetrwRefresh
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001829 imap <buffer> <unique> <c-l> <Plug>NetrwRefresh
Bram Moolenaar446cb832008-06-24 21:56:24 +00001830 endif
1831 nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,'./'))<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001832 if s:didstarstar || !mapcheck("<s-down>","n")
1833 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001834 inoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001835 endif
1836 if s:didstarstar || !mapcheck("<s-up>","n")
1837 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001838 inoremap <buffer> <silent> <s-up> :Pexplore<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001839 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001840 let mapsafecurdir = escape(b:netrw_curdir, s:netrw_map_escape)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001841 if g:netrw_mousemaps == 1
1842 nnoremap <buffer> <silent> <leftmouse> <leftmouse>:call <SID>NetrwLeftmouse(1)<cr>
1843 nnoremap <buffer> <silent> <middlemouse> <leftmouse>:call <SID>NetrwPrevWinOpen(1)<cr>
1844 nnoremap <buffer> <silent> <s-leftmouse> <leftmouse>:call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001845 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
1846 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001847 inoremap <buffer> <silent> <leftmouse> <c-o><leftmouse><c-o>:call <SID>NetrwLeftmouse(1)<cr>
1848 inoremap <buffer> <silent> <middlemouse> <c-o><leftmouse><c-o>:call <SID>NetrwPrevWinOpen(1)<cr>
1849 inoremap <buffer> <silent> <s-leftmouse> <c-o><leftmouse><c-o>:call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
1850 exe 'inoremap <buffer> <silent> <rightmouse> <c-o><leftmouse><c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001851 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001852 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001853 exe 'nnoremap <buffer> <silent> D :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001854 exe 'nnoremap <buffer> <silent> R :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001855 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetrwMakeDir("")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001856 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
1857 exe 'vnoremap <buffer> <silent> D :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
1858 exe 'vnoremap <buffer> <silent> R :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
1859 exe 'inoremap <buffer> <silent> <del> <c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
1860 exe 'inoremap <buffer> <silent> D <c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
1861 exe 'inoremap <buffer> <silent> R <c-o>:call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
1862 exe 'inoremap <buffer> <silent> <Leader>m <c-o>:call <SID>NetrwMakeDir("")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001863 nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001864
Bram Moolenaar9964e462007-05-05 17:54:07 +00001865 else " remote
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001866" call Decho("make remote maps")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001867 call s:RemotePathAnalysis(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00001868 nnoremap <buffer> <silent> <cr> :call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr>
1869 nnoremap <buffer> <silent> <c-l> :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
1870 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'../'))<cr>
1871 nnoremap <buffer> <silent> a :call <SID>NetrwHide(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01001872 nnoremap <buffer> <silent> mb :<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001873 nnoremap <buffer> <silent> mc :<c-u>call <SID>NetrwMarkFileCopy(0)<cr>
1874 nnoremap <buffer> <silent> md :<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
1875 nnoremap <buffer> <silent> me :<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
1876 nnoremap <buffer> <silent> mf :<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
1877 nnoremap <buffer> <silent> mg :<c-u>call <SID>NetrwMarkFileGrep(0)<cr>
1878 nnoremap <buffer> <silent> mh :<c-u>call <SID>NetrwMarkHideSfx(0)<cr>
1879 nnoremap <buffer> <silent> mm :<c-u>call <SID>NetrwMarkFileMove(0)<cr>
1880 nnoremap <buffer> <silent> mp :<c-u>call <SID>NetrwMarkFilePrint(0)<cr>
1881 nnoremap <buffer> <silent> mr :<c-u>call <SID>NetrwMarkFileRegexp(0)<cr>
1882 nnoremap <buffer> <silent> ms :<c-u>call <SID>NetrwMarkFileSource(0)<cr>
1883 nnoremap <buffer> <silent> mT :<c-u>call <SID>NetrwMarkFileTag(0)<cr>
1884 nnoremap <buffer> <silent> mt :<c-u>call <SID>NetrwMarkFileTgt(0)<cr>
1885 nnoremap <buffer> <silent> mu :<c-u>call <SID>NetrwUnMarkFile(0)<cr>
1886 nnoremap <buffer> <silent> mx :<c-u>call <SID>NetrwMarkFileExe(0)<cr>
1887 nnoremap <buffer> <silent> mz :<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01001888 nnoremap <buffer> <silent> gb :<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_cur)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001889 nnoremap <buffer> <silent> gh :<c-u>call <SID>NetrwHidden(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01001890 nnoremap <buffer> <silent> gp :<c-u>call <SID>NetrwChgPerm(0,b:netrw_curdir)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001891 nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001892 nnoremap <buffer> <silent> i :call <SID>NetrwListStyle(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01001893 nnoremap <buffer> <silent> I :call <SID>NetrwBannerCtrl(1)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001894 nnoremap <buffer> <silent> o :call <SID>NetrwSplit(0)<cr>
1895 nnoremap <buffer> <silent> O :call <SID>NetrwObtain(0)<cr>
1896 nnoremap <buffer> <silent> p :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
1897 nnoremap <buffer> <silent> P :call <SID>NetrwPrevWinOpen(0)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01001898 nnoremap <buffer> <silent> qb :<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
1899 nnoremap <buffer> <silent> mB :<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001900 nnoremap <buffer> <silent> qf :<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
1901 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>
1902 nnoremap <buffer> <silent> s :call <SID>NetrwSortStyle(0)<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001903 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001904 nnoremap <buffer> <silent> t :call <SID>NetrwSplit(1)<cr>
Bram Moolenaar5c736222010-01-06 20:54:52 +01001905 nnoremap <buffer> <silent> T :call <SID>NetrwSplit(1)<bar>norm! gT<cr>
1906 nnoremap <buffer> <silent> u :<c-u>call <SID>NetrwBookHistHandler(4,b:netrw_curdir)<cr>
1907 nnoremap <buffer> <silent> U :<c-u>call <SID>NetrwBookHistHandler(5,b:netrw_curdir)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001908 nnoremap <buffer> <silent> v :call <SID>NetrwSplit(2)<cr>
1909 nnoremap <buffer> <silent> x :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
Bram Moolenaarc236c162008-07-13 17:41:49 +00001910 nnoremap <buffer> <silent> % :call <SID>NetrwOpenFile(0)<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001911 inoremap <buffer> <silent> <cr> <c-o>:call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr>
1912 inoremap <buffer> <silent> <c-l> <c-o>:call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
1913 inoremap <buffer> <silent> - <c-o>:exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'../'))<cr>
1914 inoremap <buffer> <silent> a <c-o>:call <SID>NetrwHide(0)<cr>
1915 inoremap <buffer> <silent> mb <c-o>:<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
1916 inoremap <buffer> <silent> mc <c-o>:<c-u>call <SID>NetrwMarkFileCopy(0)<cr>
1917 inoremap <buffer> <silent> md <c-o>:<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
1918 inoremap <buffer> <silent> me <c-o>:<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
1919 inoremap <buffer> <silent> mf <c-o>:<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
1920 inoremap <buffer> <silent> mg <c-o>:<c-u>call <SID>NetrwMarkFileGrep(0)<cr>
1921 inoremap <buffer> <silent> mh <c-o>:<c-u>call <SID>NetrwMarkHideSfx(0)<cr>
1922 inoremap <buffer> <silent> mm <c-o>:<c-u>call <SID>NetrwMarkFileMove(0)<cr>
1923 inoremap <buffer> <silent> mp <c-o>:<c-u>call <SID>NetrwMarkFilePrint(0)<cr>
1924 inoremap <buffer> <silent> mr <c-o>:<c-u>call <SID>NetrwMarkFileRegexp(0)<cr>
1925 inoremap <buffer> <silent> ms <c-o>:<c-u>call <SID>NetrwMarkFileSource(0)<cr>
1926 inoremap <buffer> <silent> mT <c-o>:<c-u>call <SID>NetrwMarkFileTag(0)<cr>
1927 inoremap <buffer> <silent> mt <c-o>:<c-u>call <SID>NetrwMarkFileTgt(0)<cr>
1928 inoremap <buffer> <silent> mu <c-o>:<c-u>call <SID>NetrwUnMarkFile(0)<cr>
1929 inoremap <buffer> <silent> mx <c-o>:<c-u>call <SID>NetrwMarkFileExe(0)<cr>
1930 inoremap <buffer> <silent> mz <c-o>:<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
1931 inoremap <buffer> <silent> gb <c-o>:<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_cur)<cr>
1932 inoremap <buffer> <silent> gh <c-o>:<c-u>call <SID>NetrwHidden(0)<cr>
1933 inoremap <buffer> <silent> gp <c-o>:<c-u>call <SID>NetrwChgPerm(0,b:netrw_curdir)<cr>
1934 inoremap <buffer> <silent> C <c-o>:let g:netrw_chgwin= winnr()<cr>
1935 inoremap <buffer> <silent> i <c-o>:call <SID>NetrwListStyle(0)<cr>
1936 inoremap <buffer> <silent> I <c-o>:call <SID>NetrwBannerCtrl(1)<cr>
1937 inoremap <buffer> <silent> o <c-o>:call <SID>NetrwSplit(0)<cr>
1938 inoremap <buffer> <silent> O <c-o>:call <SID>NetrwObtain(0)<cr>
1939 inoremap <buffer> <silent> p <c-o>:call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
1940 inoremap <buffer> <silent> P <c-o>:call <SID>NetrwPrevWinOpen(0)<cr>
1941 inoremap <buffer> <silent> qb <c-o>:<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
1942 inoremap <buffer> <silent> mB <c-o>:<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
1943 inoremap <buffer> <silent> qf <c-o>:<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
1944 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>
1945 inoremap <buffer> <silent> s <c-o>:call <SID>NetrwSortStyle(0)<cr>
1946 inoremap <buffer> <silent> S <c-o>:call <SID>NetSortSequence(0)<cr>
1947 inoremap <buffer> <silent> t <c-o>:call <SID>NetrwSplit(1)<cr>
1948 inoremap <buffer> <silent> T <c-o>:call <SID>NetrwSplit(1)<bar>norm! gT<cr>
1949 inoremap <buffer> <silent> u <c-o>:<c-u>call <SID>NetrwBookHistHandler(4,b:netrw_curdir)<cr>
1950 inoremap <buffer> <silent> U <c-o>:<c-u>call <SID>NetrwBookHistHandler(5,b:netrw_curdir)<cr>
1951 inoremap <buffer> <silent> v <c-o>:call <SID>NetrwSplit(2)<cr>
1952 inoremap <buffer> <silent> x <c-o>:call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
1953 inoremap <buffer> <silent> % <c-o>:call <SID>NetrwOpenFile(0)<cr>
Bram Moolenaar446cb832008-06-24 21:56:24 +00001954 if !hasmapto('<Plug>NetrwHideEdit')
1955 nmap <buffer> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001956 imap <buffer> <c-h> <Plug>NetrwHideEdit
Bram Moolenaar446cb832008-06-24 21:56:24 +00001957 endif
1958 nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(0)<cr>
1959 if !hasmapto('<Plug>NetrwRefresh')
1960 nmap <buffer> <c-l> <Plug>NetrwRefresh
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001961 imap <buffer> <c-l> <Plug>NetrwRefresh
Bram Moolenaar446cb832008-06-24 21:56:24 +00001962 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001963
1964 let mapsafepath = escape(s:path, s:netrw_map_escape)
1965 let mapsafeusermach = escape(s:user.s:machine, s:netrw_map_escape)
1966
Bram Moolenaar446cb832008-06-24 21:56:24 +00001967 nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
1968 if g:netrw_mousemaps == 1
1969 nnoremap <buffer> <silent> <leftmouse> <leftmouse>:call <SID>NetrwLeftmouse(0)<cr>
1970 nnoremap <buffer> <silent> <middlemouse> <leftmouse>:call <SID>NetrwPrevWinOpen(0)<cr>
1971 nnoremap <buffer> <silent> <s-leftmouse> <leftmouse>:call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001972 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
1973 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001974 inoremap <buffer> <silent> <leftmouse> <c-o><leftmouse><c-o>:call <SID>NetrwLeftmouse(0)<cr>
1975 inoremap <buffer> <silent> <middlemouse> <c-o><leftmouse><c-o>:call <SID>NetrwPrevWinOpen(0)<cr>
1976 inoremap <buffer> <silent> <s-leftmouse> <c-o><leftmouse><c-o>:call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
1977 exe 'inoremap <buffer> <silent> <rightmouse> <c-o><leftmouse><c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00001978 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001979 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001980 exe 'nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("'.mapsafeusermach.'")<cr>'
1981 exe 'nnoremap <buffer> <silent> D :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
1982 exe 'nnoremap <buffer> <silent> R :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001983 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001984 exe 'vnoremap <buffer> <silent> D :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
1985 exe 'vnoremap <buffer> <silent> R :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
1986 exe 'inoremap <buffer> <silent> <del> <c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
1987 exe 'inoremap <buffer> <silent> d <c-o>:call <SID>NetrwMakeDir("'.mapsafeusermach.'")<cr>'
1988 exe 'inoremap <buffer> <silent> D <c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
1989 exe 'inoremap <buffer> <silent> R <c-o>:call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
Bram Moolenaarc236c162008-07-13 17:41:49 +00001990 nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001991 inoremap <buffer> <F1> <c-o>:he netrw-quickhelp<cr>
Bram Moolenaar9964e462007-05-05 17:54:07 +00001992 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00001993 call s:SetRexDir(a:islocal,b:netrw_curdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001994" call Dret("s:BrowserMaps")
1995endfun
1996
1997" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00001998" s:ExplorePatHls: converts an Explore pattern into a regular expression search pattern {{{2
1999fun! s:ExplorePatHls(pattern)
2000" call Dfunc("s:ExplorePatHls(pattern<".a:pattern.">)")
2001 let repat= substitute(a:pattern,'^**/\{1,2}','','')
2002" call Decho("repat<".repat.">")
2003 let repat= escape(repat,'][.\')
2004" call Decho("repat<".repat.">")
2005 let repat= '\<'.substitute(repat,'\*','\\(\\S\\+ \\)*\\S\\+','g').'\>'
2006" call Dret("s:ExplorePatHls repat<".repat.">")
2007 return repat
Bram Moolenaar9964e462007-05-05 17:54:07 +00002008endfun
2009
2010" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01002011" s:NetrwBookHistHandler: {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00002012" 0: (user: <mb>) bookmark current directory
2013" 1: (user: <gb>) change to the bookmarked directory
2014" 2: (user: <qb>) list bookmarks
2015" 3: (browsing) record current directory history
2016" 4: (user: <u>) go up (previous) bookmark
2017" 5: (user: <U>) go down (next) bookmark
2018" 6: (user: <mB>) delete bookmark
Bram Moolenaar5c736222010-01-06 20:54:52 +01002019fun! s:NetrwBookHistHandler(chg,curdir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002020" 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 +00002021
2022 if a:chg == 0
2023 " bookmark the current directory
2024" call Decho("(user: <b>) bookmark the current directory")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002025 if !exists("g:netrw_bookmarklist")
2026 let g:netrw_bookmarklist= []
2027 endif
2028 if index(g:netrw_bookmarklist,a:curdir) == -1
2029 " curdir not currently in g:netrw_bookmarklist, so include it
2030 call add(g:netrw_bookmarklist,a:curdir)
2031 call sort(g:netrw_bookmarklist)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002032 endif
2033 echo "bookmarked the current directory"
2034
2035 elseif a:chg == 1
2036 " change to the bookmarked directory
Bram Moolenaar5c736222010-01-06 20:54:52 +01002037" call Decho("(user: <".v:count."mb>) change to the bookmarked directory")
2038 if exists("g:netrw_bookmarklist[v:count-1]")
2039 exe "e ".fnameescape(g:netrw_bookmarklist[v:count-1])
Bram Moolenaar9964e462007-05-05 17:54:07 +00002040 else
2041 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
2042 endif
2043
2044 elseif a:chg == 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00002045" redraw!
Bram Moolenaar9964e462007-05-05 17:54:07 +00002046 let didwork= 0
2047 " list user's bookmarks
2048" call Decho("(user: <q>) list user's bookmarks")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002049 if exists("g:netrw_bookmarklist")
2050" call Decho('list '.len(g:netrw_bookmarklist).' bookmarks')
2051 let cnt= 1
2052 for bmd in g:netrw_bookmarklist
2053" call Decho("Netrw Bookmark#".cnt.": ".g:netrw_bookmarklist[cnt-1])
2054 echo "Netrw Bookmark#".cnt.": ".g:netrw_bookmarklist[cnt-1]
2055 let didwork = 1
2056 let cnt = cnt + 1
2057 endfor
Bram Moolenaar9964e462007-05-05 17:54:07 +00002058 endif
2059
2060 " list directory history
Bram Moolenaar5c736222010-01-06 20:54:52 +01002061 let cnt = g:netrw_dirhist_cnt
Bram Moolenaar9964e462007-05-05 17:54:07 +00002062 let first = 1
2063 let histcnt = 0
Bram Moolenaar5c736222010-01-06 20:54:52 +01002064 while ( first || cnt != g:netrw_dirhist_cnt )
2065" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:netrw_dirhist_cnt)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002066 let histcnt= histcnt + 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01002067 if exists("g:netrw_dirhist_{cnt}")
2068" call Decho("Netrw History#".histcnt.": ".g:netrw_dirhist_{cnt})
2069 echo "Netrw History#".histcnt.": ".g:netrw_dirhist_{cnt}
Bram Moolenaar9964e462007-05-05 17:54:07 +00002070 let didwork= 1
2071 endif
2072 let first = 0
2073 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
2074 if cnt < 0
2075 let cnt= cnt + g:netrw_dirhistmax
2076 endif
2077 endwhile
2078 if didwork
2079 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2080 endif
2081
2082 elseif a:chg == 3
2083 " saves most recently visited directories (when they differ)
2084" call Decho("(browsing) record curdir history")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002085 if !exists("g:netrw_dirhist_cnt") || !exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}") || g:netrw_dirhist_{g:netrw_dirhist_cnt} != a:curdir
2086 let g:netrw_dirhist_cnt = ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
2087 let g:netrw_dirhist_{g:netrw_dirhist_cnt} = a:curdir
2088" call Decho("save dirhist#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002089 endif
2090
2091 elseif a:chg == 4
2092 " u: change to the previous directory stored on the history list
2093" call Decho("(user: <u>) chg to prev dir from history")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002094 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt - 1 ) % g:netrw_dirhistmax
2095 if g:netrw_dirhist_cnt < 0
2096 let g:netrw_dirhist_cnt= g:netrw_dirhist_cnt + g:netrw_dirhistmax
Bram Moolenaar9964e462007-05-05 17:54:07 +00002097 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002098 if exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}")
2099" call Decho("changedir u#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002100 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
2101 setlocal ma noro
Bram Moolenaar446cb832008-06-24 21:56:24 +00002102" call Decho("setlocal ma noro")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002103 keepj %d
Bram Moolenaar9964e462007-05-05 17:54:07 +00002104 setlocal nomod
Bram Moolenaar446cb832008-06-24 21:56:24 +00002105" call Decho("setlocal nomod")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002106 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002107" " call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt}))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002108 exe "keepj e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt})
Bram Moolenaar9964e462007-05-05 17:54:07 +00002109 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01002110 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
Bram Moolenaar9964e462007-05-05 17:54:07 +00002111 echo "Sorry, no predecessor directory exists yet"
2112 endif
2113
2114 elseif a:chg == 5
2115 " U: change to the subsequent directory stored on the history list
2116" call Decho("(user: <U>) chg to next dir from history")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002117 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
2118 if exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}")
2119" call Decho("changedir U#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002120 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
2121 setlocal ma noro
Bram Moolenaar446cb832008-06-24 21:56:24 +00002122" call Decho("setlocal ma noro")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002123 keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00002124" call Decho("removed all lines from buffer (%d)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002125 setlocal nomod
Bram Moolenaar446cb832008-06-24 21:56:24 +00002126" call Decho("setlocal nomod")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002127 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002128" call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt}))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002129 exe "keepj e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt})
Bram Moolenaar9964e462007-05-05 17:54:07 +00002130 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01002131 let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt - 1 ) % g:netrw_dirhistmax
2132 if g:netrw_dirhist_cnt < 0
2133 let g:netrw_dirhist_cnt= g:netrw_dirhist_cnt + g:netrw_dirhistmax
Bram Moolenaar9964e462007-05-05 17:54:07 +00002134 endif
2135 echo "Sorry, no successor directory exists yet"
2136 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002137
2138 elseif a:chg == 6
Bram Moolenaar5c736222010-01-06 20:54:52 +01002139 " delete the v:count'th bookmark
2140" call Decho("delete bookmark#".v:count."<".g:netrw_bookmarklist[v:count-1].">")
2141 let savefile= s:NetrwHome()."/.netrwbook"
2142 if filereadable(savefile)
2143 call s:NetrwBookHistSave() " done here to merge bookmarks first
2144 call delete(savefile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002145 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002146 call remove(g:netrw_bookmarklist,v:count-1)
Bram Moolenaar9964e462007-05-05 17:54:07 +00002147 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002148 call s:NetrwBookmarkMenu()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002149" call Dret("s:NetrwBookHistHandler")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002150endfun
2151
2152" ---------------------------------------------------------------------
2153" s:NetrwBookHistRead: this function reads bookmarks and history {{{2
2154" Sister function: s:NetrwBookHistSave()
2155fun! s:NetrwBookHistRead()
2156" call Dfunc("s:NetrwBookHistRead()")
2157 if !exists("s:netrw_initbookhist")
2158 let home = s:NetrwHome()
2159 let savefile= home."/.netrwbook"
2160 if filereadable(savefile)
2161" call Decho("sourcing .netrwbook")
2162 exe "so ".savefile
2163 endif
2164 let savefile= home."/.netrwhist"
2165 if filereadable(savefile)
2166" call Decho("sourcing .netrwhist")
2167 exe "so ".savefile
2168 endif
2169 let s:netrw_initbookhist= 1
2170 au VimLeave * call s:NetrwBookHistSave()
2171 endif
2172" call Dret("s:NetrwBookHistRead")
2173endfun
2174
2175" ---------------------------------------------------------------------
2176" s:NetrwBookHistSave: this function saves bookmarks and history {{{2
2177" Sister function: s:NetrwBookHistRead()
2178" I used to do this via viminfo but that appears to
2179" be unreliable for long-term storage
2180" COMBAK: does $HOME work under windows???
2181fun! s:NetrwBookHistSave()
2182" call Dfunc("s:NetrwBookHistSave() dirhistmax=".g:netrw_dirhistmax)
2183 let savefile= s:NetrwHome()."/.netrwhist"
2184 1split
2185 call s:NetrwEnew()
2186 setlocal cino= com= cpo-=aA fo=nroql2 tw=0 report=10000 noswf
2187 setlocal nocin noai noci magic nospell nohid wig= noaw
2188 setlocal ma noro write
2189 if exists("&acd") | setlocal noacd | endif
2190 silent %d
2191
2192 " save .netrwhist -- no attempt to merge
2193 silent! file .netrwhist
2194 call setline(1,"let g:netrw_dirhistmax =".g:netrw_dirhistmax)
2195 call setline(2,"let g:netrw_dirhist_cnt =".g:netrw_dirhist_cnt)
2196 let lastline = line("$")
2197 let cnt = 1
2198 while cnt <= g:netrw_dirhist_cnt
2199 call setline((cnt+lastline),'let g:netrw_dirhist_'.cnt."='".g:netrw_dirhist_{cnt}."'")
2200 let cnt= cnt + 1
2201 endwhile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002202 exe "sil! w! ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01002203
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002204 sil keepj %d
Bram Moolenaar5c736222010-01-06 20:54:52 +01002205 if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != []
2206 " merge and write .netrwbook
2207 let savefile= s:NetrwHome()."/.netrwbook"
2208
2209 if filereadable(savefile)
2210 let booklist= deepcopy(g:netrw_bookmarklist)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002211 exe "sil keepj so ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01002212 for bdm in booklist
2213 if index(g:netrw_bookmarklist,bdm) == -1
2214 call add(g:netrw_bookmarklist,bdm)
2215 endif
2216 endfor
2217 call sort(g:netrw_bookmarklist)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002218 exe "sil! w! ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01002219 endif
2220
2221 " construct and save .netrwbook
2222 call setline(1,"let g:netrw_bookmarklist= ".string(g:netrw_bookmarklist))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002223 exe "sil! w! ".savefile
Bram Moolenaar5c736222010-01-06 20:54:52 +01002224 endif
2225 let bgone= bufnr("%")
2226 q!
2227 exe bgone."bwipe!"
2228
2229" call Dret("s:NetrwBookHistSave")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002230endfun
2231
2232" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002233" s:NetrwBrowse: This function uses the command in g:netrw_list_cmd to provide a {{{2
2234" list of the contents of a local or remote directory. It is assumed that the
2235" g:netrw_list_cmd has a string, USEPORT HOSTNAME, that needs to be substituted
2236" with the requested remote hostname first.
2237fun! s:NetrwBrowse(islocal,dirname)
2238 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002239" 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 +00002240" call Decho("tab#".tabpagenr()." win#".winnr())
2241" call Dredir("ls!")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002242 if !exists("s:netrw_initbookhist")
2243 call s:NetrwBookHistRead()
2244 endif
2245" call FOTEST(7)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002246"call Decho("COMBAK#01 buf(%)#".bufnr("%")."<".bufname("%")."> win#".winnr()." bufnr(win#1)=".winbufnr(1)."<".bufname(winbufnr(1))." bufnr(win#2)=".winbufnr(2)."<".bufname(winbufnr(2)).">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002247
2248 " simplify the dirname (especially for ".."s in dirnames)
2249 if a:dirname !~ '^\a\+://'
2250 let dirname= simplify(a:dirname)
2251 else
2252 let dirname= a:dirname
2253 endif
2254" call FOTEST(8)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002255"call Decho("COMBAK#02 buf(%)#".bufnr("%")."<".bufname("%")."> win#".winnr()." bufnr(win#1)=".winbufnr(1)."<".bufname(winbufnr(1))." bufnr(win#2)=".winbufnr(2)."<".bufname(winbufnr(2)).">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002256
2257 if exists("s:netrw_skipbrowse")
2258 unlet s:netrw_skipbrowse
Bram Moolenaarc236c162008-07-13 17:41:49 +00002259" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002260" call Dret("s:NetrwBrowse : s:netrw_skipbrowse=".s:netrw_skipbrowse)
2261 return
2262 endif
2263 if !exists("*shellescape")
2264 call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing shellescape()",69)
2265" call Dret("s:NetrwBrowse : missing shellescape()")
2266 return
2267 endif
2268 if !exists("*fnameescape")
2269 call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing fnameescape()",70)
2270" call Dret("s:NetrwBrowse : missing fnameescape()")
2271 return
2272 endif
2273
2274 call s:NetrwOptionSave("w:")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002275" call FOTEST(9)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002276"call Decho("COMBAK#03 buf(%)#".bufnr("%")."<".bufname("%")."> win#".winnr()." bufnr(win#1)=".winbufnr(1)."<".bufname(winbufnr(1))." bufnr(win#2)=".winbufnr(2)."<".bufname(winbufnr(2)).">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002277
2278 " re-instate any marked files
2279 if exists("s:netrwmarkfilelist_{bufnr('%')}")
2280" call Decho("clearing marked files")
2281 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
2282 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002283" call FOTEST(10)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002284"call Decho("COMBAK#04 buf(%)#".bufnr("%")."<".bufname("%")."> win#".winnr()." bufnr(win#1)=".winbufnr(1)."<".bufname(winbufnr(1))." bufnr(win#2)=".winbufnr(2)."<".bufname(winbufnr(2)).">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002285
2286 if a:islocal && exists("w:netrw_acdkeep") && w:netrw_acdkeep
2287" call Decho("handle w:netrw_acdkeep:")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002288" call Decho("keepjumps lcd ".fnameescape(dirname)." (due to w:netrw_acdkeep=".w:netrw_acdkeep." - acd=".&acd.")")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002289 exe 'keepj lcd '.fnameescape(dirname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002290 call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00002291" call Decho("getcwd<".getcwd().">")
2292
Bram Moolenaar5c736222010-01-06 20:54:52 +01002293 elseif !a:islocal && dirname !~ '[\/]$' && dirname !~ '^"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00002294 " looks like a regular file, attempt transfer
Bram Moolenaar5c736222010-01-06 20:54:52 +01002295" call Decho("attempt transfer as regular file<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002296
2297 " remove any filetype indicator from end of dirname, except for the {{{3
2298 " "this is a directory" indicator (/).
2299 " There shouldn't be one of those here, anyway.
Bram Moolenaar5c736222010-01-06 20:54:52 +01002300 let path= substitute(dirname,'[*=@|]\r\=$','','e')
Bram Moolenaar446cb832008-06-24 21:56:24 +00002301" call Decho("new path<".path.">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002302 call s:RemotePathAnalysis(dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002303
2304 " remote-read the requested file into current buffer {{{3
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002305 keepj mark '
Bram Moolenaar5c736222010-01-06 20:54:52 +01002306 call s:NetrwEnew(dirname)
2307 call s:NetrwSafeOptions()
Bram Moolenaar446cb832008-06-24 21:56:24 +00002308 setlocal ma noro
2309" call Decho("setlocal ma noro")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002310 let b:netrw_curdir= dirname
Bram Moolenaarc236c162008-07-13 17:41:49 +00002311" call Decho("exe silent! keepalt file ".fnameescape(s:method."://".s:user.s:machine."/".s:path)." (bt=".&bt.")")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002312 exe "sil! keepalt file ".fnameescape(s:method."://".s:user.s:machine."/".s:path)
2313 exe "sil keepalt doau BufReadPre ".fnameescape(s:fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002314 silent call netrw#NetRead(2,s:method."://".s:user.s:machine."/".s:path)
2315 if s:path !~ '.tar.bz2$' && s:path !~ '.tar.gz'
2316 " netrw.vim and tar.vim have already handled decompression of the tarball; avoiding gzip.vim error
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002317 exe "sil keepalt doau BufReadPost ".fnameescape(s:fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002318 endif
2319
2320 " save certain window-oriented variables into buffer-oriented variables {{{3
2321 call s:SetBufWinVars()
2322 call s:NetrwOptionRestore("w:")
2323 setlocal ma nomod
2324
Bram Moolenaarc236c162008-07-13 17:41:49 +00002325" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002326" call Dret("s:NetrwBrowse : file<".s:fname.">")
2327 return
2328 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002329" call FOTEST(11)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002330"call Decho("COMBAK#05 buf(%)#".bufnr("%")."<".bufname("%")."> win#".winnr()." bufnr(win#1)=".winbufnr(1)."<".bufname(winbufnr(1))." bufnr(win#2)=".winbufnr(2)."<".bufname(winbufnr(2)).">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002331
2332 " use buffer-oriented WinVars if buffer ones exist but window ones don't {{{3
2333 call s:UseBufWinVars()
2334
2335 " set up some variables {{{3
2336 let b:netrw_browser_active = 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01002337 let dirname = dirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00002338 let s:last_sort_by = g:netrw_sort_by
2339
2340 " set up menu {{{3
2341 call s:NetrwMenu(1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002342" call FOTEST(12)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002343"call Decho("COMBAK#06 buf(%)#".bufnr("%")."<".bufname("%")."> win#".winnr()." bufnr(win#1)=".winbufnr(1)."<".bufname(winbufnr(1))." bufnr(win#2)=".winbufnr(2)."<".bufname(winbufnr(2)).">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002344
2345 " set up buffer {{{3
2346 let reusing= s:NetrwGetBuffer(a:islocal,dirname)
2347 " maintain markfile highlighting
2348 if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
2349" call Decho("bufnr(%)=".bufnr('%'))
2350" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
2351 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
2352 else
2353" call Decho("2match none")
2354 2match none
2355 endif
2356 if reusing
2357 call s:NetrwOptionRestore("w:")
2358 setlocal noma nomod nowrap
Bram Moolenaarc236c162008-07-13 17:41:49 +00002359" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002360" call Dret("s:NetrwBrowse : re-using buffer")
2361 return
2362 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002363"" call FOTEST(13) " PROBLEM WITH LISTING
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002364"call Decho("COMBAK#07 buf(%)#".bufnr("%")."<".bufname("%")."> win#".winnr()." bufnr(win#1)=".winbufnr(1)."<".bufname(winbufnr(1))." bufnr(win#2)=".winbufnr(2)."<".bufname(winbufnr(2)).">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002365
2366 " set b:netrw_curdir to the new directory name {{{3
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002367" call Decho("set b:netrw_curdir to the new directory name: (buf#".bufnr("%").")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002368 let b:netrw_curdir= dirname
2369 if b:netrw_curdir =~ '[/\\]$'
2370 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
2371 endif
2372 if b:netrw_curdir == ''
2373 if has("amiga")
2374 " On the Amiga, the empty string connotes the current directory
2375 let b:netrw_curdir= getcwd()
2376 else
2377 " under unix, when the root directory is encountered, the result
2378 " from the preceding substitute is an empty string.
2379 let b:netrw_curdir= '/'
2380 endif
2381 endif
2382 if !a:islocal && b:netrw_curdir !~ '/$'
2383 let b:netrw_curdir= b:netrw_curdir.'/'
2384 endif
2385" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002386"" call FOTEST(14) " PROBLEM WITH LISTING
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002387"call Decho("COMBAK#08 buf(%)#".bufnr("%")."<".bufname("%")."> win#".winnr()." bufnr(win#1)=".winbufnr(1)."<".bufname(winbufnr(1))." bufnr(win#2)=".winbufnr(2)."<".bufname(winbufnr(2)).">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002388
2389 " ------------
2390 " (local only) {{{3
2391 " ------------
2392 if a:islocal
2393" call Decho("local only:")
2394
2395 " Set up ShellCmdPost handling. Append current buffer to browselist
2396 call s:LocalFastBrowser()
2397
2398 " handle g:netrw_keepdir: set vim's current directory to netrw's notion of the current directory {{{3
2399 if !g:netrw_keepdir
2400" call Decho("handle g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
2401" call Decho("l:acd".(exists("&l:acd")? "=".&l:acd : " doesn't exist"))
2402 if !exists("&l:acd") || !&l:acd
2403" call Decho('exe keepjumps lcd '.fnameescape(b:netrw_curdir))
2404 try
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002405 exe 'keepj lcd '.fnameescape(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002406 catch /^Vim\%((\a\+)\)\=:E472/
2407 call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".b:netrw_curdir."> (permissions?)",61)
2408 if exists("w:netrw_prvdir")
2409 let b:netrw_curdir= w:netrw_prvdir
2410 else
2411 call s:NetrwOptionRestore("w:")
2412 setlocal noma nomod nowrap
2413 let b:netrw_curdir= dirname
Bram Moolenaarc236c162008-07-13 17:41:49 +00002414" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002415" call Dret("s:NetrwBrowse : reusing buffer#".(exists("bufnum")? bufnum : 'N/A')."<".dirname."> getcwd<".getcwd().">")
2416 return
2417 endif
2418 endtry
2419 endif
2420 endif
2421
2422 " --------------------------------
2423 " remote handling: {{{3
2424 " --------------------------------
2425 else
2426" call Decho("remote only:")
2427
Bram Moolenaar5c736222010-01-06 20:54:52 +01002428 " analyze dirname and g:netrw_list_cmd {{{4
2429" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist")."> dirname<".dirname.">")
2430 if dirname =~ "^NetrwTreeListing\>"
Bram Moolenaar446cb832008-06-24 21:56:24 +00002431 let dirname= b:netrw_curdir
Bram Moolenaar5c736222010-01-06 20:54:52 +01002432" call Decho("(dirname was ".dirname.") dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002433 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
2434 let dirname= substitute(b:netrw_curdir,'\\','/','g')
2435 if dirname !~ '/$'
2436 let dirname= dirname.'/'
2437 endif
2438 let b:netrw_curdir = dirname
2439" call Decho("(liststyle is TREELIST) dirname<".dirname.">")
2440 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01002441 let dirname = substitute(dirname,'\\','/','g')
Bram Moolenaar446cb832008-06-24 21:56:24 +00002442" call Decho("(normal) dirname<".dirname.">")
2443 endif
2444
2445 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
2446 if dirname !~ dirpat
2447 if !exists("g:netrw_quiet")
2448 call netrw#ErrorMsg(s:ERROR,"netrw doesn't understand your dirname<".dirname.">",20)
2449 endif
2450 call s:NetrwOptionRestore("w:")
2451 setlocal noma nomod nowrap
Bram Moolenaarc236c162008-07-13 17:41:49 +00002452" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002453" call Dret("s:NetrwBrowse : badly formatted dirname<".dirname.">")
2454 return
2455 endif
2456 let b:netrw_curdir= dirname
2457" call Decho("b:netrw_curdir<".b:netrw_curdir."> (remote)")
2458 endif " (additional remote handling)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002459"" call FOTEST(15) " PROBLEM WITH LISTING
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002460"call Decho("COMBAK#09 buf(%)#".bufnr("%")."<".bufname("%")."> win#".winnr()." bufnr(win#1)=".winbufnr(1)."<".bufname(winbufnr(1))." bufnr(win#2)=".winbufnr(2)."<".bufname(winbufnr(2)).">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002461
2462 " -----------------------
2463 " Directory Listing: {{{3
2464 " -----------------------
2465 call s:BrowserMaps(a:islocal)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002466"" call FOTEST(16) " PROBLEM WITH LISTING
Bram Moolenaar446cb832008-06-24 21:56:24 +00002467 call s:PerformListing(a:islocal)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002468" call FOTEST(17)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002469"call Decho("COMBAK#10 buf(%)#".bufnr("%")."<".bufname("%")."> win#".winnr()." bufnr(win#1)=".winbufnr(1)."<".bufname(winbufnr(1))." bufnr(win#2)=".winbufnr(2)."<".bufname(winbufnr(2)).">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01002470
2471 " The s:LocalBrowseShellCmdRefresh() function is called by an autocmd
2472 " installed by s:LocalFastBrowser() when g:netrw_fastbrowse <= 1 (ie. slow, medium speed).
2473 " However, s:NetrwBrowse() causes the ShellCmdPost event itself to fire once; setting
2474 " the variable below avoids that second refresh of the screen. The s:LocalBrowseShellCmdRefresh()
2475 " function gets called due to that autocmd; it notices that the following variable is set
2476 " and skips the refresh and sets s:locbrowseshellcmd to zero. Oct 13, 2008
2477 let s:locbrowseshellcmd= 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00002478
Bram Moolenaarc236c162008-07-13 17:41:49 +00002479" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002480" call Dret("s:NetrwBrowse : did PerformListing")
2481 return
2482endfun
2483
2484" ---------------------------------------------------------------------
2485" s:NetrwFileInfo: supports qf (query for file information) {{{2
2486fun! s:NetrwFileInfo(islocal,fname)
2487" call Dfunc("s:NetrwFileInfo(islocal=".a:islocal." fname<".a:fname.">)")
2488 if a:islocal
2489 if (has("unix") || has("macunix")) && executable("/bin/ls")
2490 if exists("b:netrw_curdir")
2491" call Decho('using ls with b:netrw_curdir<'.b:netrw_curdir.'>')
2492 if b:netrw_curdir =~ '/$'
2493 echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir.a:fname))
2494 else
2495 echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir."/".a:fname))
2496 endif
2497 else
2498" call Decho('using ls '.a:fname." using cwd<".getcwd().">")
2499 echo system("/bin/ls -lsad ".shellescape(a:fname))
2500 endif
2501 else
2502 " use vim functions to return information about file below cursor
2503" call Decho("using vim functions to query for file info")
2504 if !isdirectory(a:fname) && !filereadable(a:fname) && a:fname =~ '[*@/]'
2505 let fname= substitute(a:fname,".$","","")
2506 else
2507 let fname= a:fname
2508 endif
2509 let t = getftime(fname)
2510 let sz = getfsize(fname)
2511 echo a:fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname))
2512" call Decho(fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname)))
2513 endif
2514 else
2515 echo "sorry, \"qf\" not supported yet for remote files"
2516 endif
2517" call Dret("s:NetrwFileInfo")
2518endfun
2519
2520" ---------------------------------------------------------------------
2521" s:NetrwGetBuffer: {{{2
2522" returns 0=cleared buffer
2523" 1=re-used buffer
2524fun! s:NetrwGetBuffer(islocal,dirname)
2525" call Dfunc("s:NetrwGetBuffer(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".g:netrw_liststyle)
2526 let dirname= a:dirname
2527
2528 " re-use buffer if possible {{{3
2529" call Decho("--re-use a buffer if possible--")
2530 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2531 " find NetrwTreeList buffer if there is one
Bram Moolenaar5c736222010-01-06 20:54:52 +01002532" call Decho("find NetrwTreeList buffer if there is one")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002533 if exists("w:netrw_treebufnr") && w:netrw_treebufnr > 0
2534" call Decho(" re-use w:netrw_treebufnr=".w:netrw_treebufnr)
2535 let eikeep= &ei
2536 set ei=all
2537 exe "b ".w:netrw_treebufnr
2538 let &ei= eikeep
Bram Moolenaar5c736222010-01-06 20:54:52 +01002539" call Dret("s:NetrwGetBuffer : bufnum#".w:netrw_treebufnr."<NetrwTreeListing>")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002540 return
2541 endif
2542 let bufnum= -1
2543" call Decho(" liststyle=TREE but w:netrw_treebufnr doesn't exist")
2544
2545 else
2546 " find buffer number of buffer named precisely the same as dirname {{{3
2547" call Decho("--find buffer numnber of buffer named precisely the same as dirname--")
2548" call Dredir("ls!")
2549
2550 " get dirname and associated buffer number
2551 let bufnum = bufnr(escape(dirname,'\'))
2552" call Decho(" find buffer<".dirname.">'s number ")
2553" call Decho(" bufnr(dirname<".escape(dirname,'\').">)=".bufnum)
2554
2555 if bufnum < 0 && dirname !~ '/$'
Bram Moolenaar5c736222010-01-06 20:54:52 +01002556 " try appending a trailing /
Bram Moolenaar446cb832008-06-24 21:56:24 +00002557" call Decho(" try appending a trailing / to dirname<".dirname.">")
2558 let bufnum= bufnr(escape(dirname.'/','\'))
2559 if bufnum > 0
2560 let dirname= dirname.'/'
2561 endif
2562 endif
2563
2564 if bufnum < 0 && dirname =~ '/$'
Bram Moolenaar5c736222010-01-06 20:54:52 +01002565 " try removing a trailing /
Bram Moolenaar446cb832008-06-24 21:56:24 +00002566" call Decho(" try removing a trailing / from dirname<".dirname.">")
2567 let bufnum= bufnr(escape(substitute(dirname,'/$','',''),'\'))
2568 if bufnum > 0
2569 let dirname= substitute(dirname,'/$','','')
2570 endif
2571 endif
2572
2573" call Decho(" findbuf1: bufnum=bufnr('".dirname."')=".bufnum." bufname(".bufnum.")<".bufname(bufnum)."> (initial)")
2574 " note: !~ was used just below, but that means using ../ to go back would match (ie. abc/def/ and abc/ matches)
2575 if bufnum > 0 && bufname(bufnum) != dirname && bufname(bufnum) != '.'
2576 " handle approximate matches
Bram Moolenaar5c736222010-01-06 20:54:52 +01002577" call Decho(" handling approx match: bufnum#".bufnum."<".bufname(bufnum)."> approx-dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002578 let ibuf = 1
2579 let buflast = bufnr("$")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002580" call Decho(" findbuf2: buflast=bufnr($)=".buflast)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002581 while ibuf <= buflast
2582 let bname= substitute(bufname(ibuf),'\\','/','g')
Bram Moolenaarc236c162008-07-13 17:41:49 +00002583 let bname= substitute(bname,'.\zs/$','','')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002584" call Decho(" findbuf3: while [ibuf=",ibuf."]<=[buflast=".buflast."]: dirname<".dirname."> bname=bufname(".ibuf.")<".bname.">")
2585 if bname != '' && dirname =~ '/'.bname.'/\=$' && dirname !~ '^/'
2586 " bname is not empty
2587 " dirname ends with bname,
2588 " dirname doesn't start with /, so its not a absolute path
2589" call Decho(" findbuf3a: passes test 1 : dirname<".dirname.'> =~ /'.bname.'/\=$ && dirname !~ ^/')
Bram Moolenaar5c736222010-01-06 20:54:52 +01002590 break
2591 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002592 if bname =~ '^'.dirname.'/\=$'
2593 " bname begins with dirname
2594" call Decho(' findbuf3b: passes test 2 : bname<'.bname.'>=~^'.dirname.'/\=$')
Bram Moolenaar5c736222010-01-06 20:54:52 +01002595 break
2596 endif
2597 if dirname =~ '^'.bname.'/$'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002598" call Decho(' findbuf3c: passes test 3 : dirname<'.dirname.'>=~^'.bname.'/$')
2599 break
2600 endif
2601 if bname != '' && dirname =~ '/'.bname.'$' && bname == bufname("%") && line("$") == 1
2602" call Decho(' findbuf3d: passes test 4 : dirname<'.dirname.'>=~ /'.bname.'$')
Bram Moolenaar5c736222010-01-06 20:54:52 +01002603 break
2604 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002605 let ibuf= ibuf + 1
2606 endwhile
2607 if ibuf > buflast
2608 let bufnum= -1
2609 else
2610 let bufnum= ibuf
2611 endif
2612" call Decho(" findbuf4: bufnum=".bufnum." (ibuf=".ibuf." buflast=".buflast.")")
2613 endif
2614 endif
2615
2616 " get enew buffer and name it -or- re-use buffer {{{3
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002617 keepj mark '
Bram Moolenaar446cb832008-06-24 21:56:24 +00002618 if bufnum < 0 || !bufexists(bufnum)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002619" call Decho("--get enew buffer and name it (bufexists([bufnum=".bufnum."])=".bufexists(bufnum).")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002620 call s:NetrwEnew(dirname)
2621" call Decho(" got enew buffer#".bufnr("%")." (altbuf<".expand("#").">)")
2622 " name the buffer
2623 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2624 " Got enew buffer; transform into a NetrwTreeListing
2625" call Decho("--transform enew buffer#".bufnr("%")." into a NetrwTreeListing --")
2626 if !exists("s:netrw_treelistnum")
2627 let s:netrw_treelistnum= 1
2628 else
2629 let s:netrw_treelistnum= s:netrw_treelistnum + 1
2630 endif
2631 let w:netrw_treebufnr= bufnr("%")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002632" call Decho(" exe silent! keepalt file NetrwTreeListing ".fnameescape(s:netrw_treelistnum))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002633 exe 'sil! keepalt file NetrwTreeListing\ '.fnameescape(s:netrw_treelistnum)
2634 set bt=nofile noswf
Bram Moolenaar446cb832008-06-24 21:56:24 +00002635 nnoremap <silent> <buffer> [ :silent call <SID>TreeListMove('[')<cr>
2636 nnoremap <silent> <buffer> ] :silent call <SID>TreeListMove(']')<cr>
2637 nnoremap <silent> <buffer> [[ :silent call <SID>TreeListMove('[')<cr>
2638 nnoremap <silent> <buffer> ]] :silent call <SID>TreeListMove(']')<cr>
2639" call Decho(" tree listing#".s:netrw_treelistnum." bufnr=".w:netrw_treebufnr)
2640 else
2641" let v:errmsg= "" " Decho
2642 let escdirname= fnameescape(dirname)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002643" call Decho(" errmsg<".v:errmsg."> bufnr(escdirname<".escdirname.">)=".bufnr(escdirname)." bufname()<".bufname(bufnr(escdirname)).">")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00002644" call Decho(' exe silent! keepalt file '.escdirname)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002645" let v:errmsg= "" " Decho
2646 exe 'sil! keepalt file '.escdirname
Bram Moolenaar446cb832008-06-24 21:56:24 +00002647" call Decho(" errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">")
2648 endif
2649" call Decho(" named enew buffer#".bufnr("%")."<".bufname("%").">")
2650
2651 else " Re-use the buffer
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002652" call Decho("--re-use buffer#".bufnum." (bufexists([bufnum=".bufnum."])=".bufexists(bufnum).")")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002653 let eikeep= &ei
2654 set ei=all
2655 if getline(2) =~ '^" Netrw Directory Listing'
2656" call Decho(" re-use buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using: keepalt b ".bufnum)
2657 exe "keepalt b ".bufnum
2658 else
2659" call Decho(" reusing buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using: b ".bufnum)
2660 exe "b ".bufnum
2661 endif
2662 if bufname("%") == '.'
Bram Moolenaarc236c162008-07-13 17:41:49 +00002663" call Decho("exe silent! keepalt file ".fnameescape(getcwd()))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002664 exe "sil! keepalt file ".fnameescape(getcwd())
Bram Moolenaar446cb832008-06-24 21:56:24 +00002665 endif
2666 let &ei= eikeep
2667 if line("$") <= 1
2668 call s:NetrwListSettings(a:islocal)
2669" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but its empty, so refresh it")
2670 return 0
2671 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2672" call Decho("--re-use tree listing--")
2673" call Decho(" clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002674 sil keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00002675 call s:NetrwListSettings(a:islocal)
2676" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but treelist mode always needs a refresh")
2677 return 0
2678 else
2679" call Dret("s:NetrwGetBuffer 1 : buf#".bufnr("%"))
2680 return 1
2681 endif
2682 endif
2683
2684 " do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc {{{3
2685 " fastbrowse Local Remote Hiding a buffer implies it may be re-used (fast)
2686 " slow 0 D D Deleting a buffer implies it will not be re-used (slow)
2687 " med 1 D H
2688 " fast 2 H H
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002689" call Decho("--do netrw settings: make this buffer#".bufnr("%")." not-a-file, modifiable, not line-numbered, etc--")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002690 let fname= expand("%")
2691 call s:NetrwListSettings(a:islocal)
Bram Moolenaarc236c162008-07-13 17:41:49 +00002692" call Decho("exe keepalt file ".fnameescape(fname))
2693 exe "keepalt file ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002694
2695 " delete all lines from buffer {{{3
2696" call Decho("--delete all lines from buffer--")
2697" call Decho(" clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002698 sil! keepalt keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00002699
2700" call Dret("s:NetrwGetBuffer 0 : buf#".bufnr("%"))
2701 return 0
2702endfun
2703
2704" ---------------------------------------------------------------------
2705" s:NetrwGetcwd: get the current directory. {{{2
2706" Change backslashes to forward slashes, if any.
2707" If doesc is true, escape certain troublesome characters
2708fun! s:NetrwGetcwd(doesc)
2709" call Dfunc("NetrwGetcwd(doesc=".a:doesc.")")
2710 let curdir= substitute(getcwd(),'\\','/','ge')
2711 if curdir !~ '[\/]$'
2712 let curdir= curdir.'/'
2713 endif
2714 if a:doesc
2715 let curdir= fnameescape(curdir)
2716 endif
2717" call Dret("NetrwGetcwd <".curdir.">")
2718 return curdir
2719endfun
2720
2721" ---------------------------------------------------------------------
2722" s:NetrwGetWord: it gets the directory/file named under the cursor {{{2
2723fun! s:NetrwGetWord()
2724" call Dfunc("s:NetrwGetWord() line#".line(".")." liststyle=".g:netrw_liststyle." virtcol=".virtcol("."))
2725 call s:UseBufWinVars()
2726
2727 " insure that w:netrw_liststyle is set up
2728 if !exists("w:netrw_liststyle")
2729 if exists("g:netrw_liststyle")
2730 let w:netrw_liststyle= g:netrw_liststyle
2731 else
2732 let w:netrw_liststyle= s:THINLIST
2733 endif
2734" call Decho("w:netrw_liststyle=".w:netrw_liststyle)
2735 endif
2736
2737 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
2738 " Active Banner support
2739" call Decho("active banner handling")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002740 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00002741 let dirname= "./"
2742 let curline= getline('.')
2743
2744 if curline =~ '"\s*Sorted by\s'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002745 keepj norm s
Bram Moolenaar446cb832008-06-24 21:56:24 +00002746 let s:netrw_skipbrowse= 1
2747 echo 'Pressing "s" also works'
2748
2749 elseif curline =~ '"\s*Sort sequence:'
2750 let s:netrw_skipbrowse= 1
2751 echo 'Press "S" to edit sorting sequence'
2752
2753 elseif curline =~ '"\s*Quick Help:'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002754 keepj norm ?
Bram Moolenaar446cb832008-06-24 21:56:24 +00002755 let s:netrw_skipbrowse= 1
2756 echo 'Pressing "?" also works'
2757
2758 elseif curline =~ '"\s*\%(Hiding\|Showing\):'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002759 keepj norm a
Bram Moolenaar446cb832008-06-24 21:56:24 +00002760 let s:netrw_skipbrowse= 1
2761 echo 'Pressing "a" also works'
2762
2763 elseif line("$") > w:netrw_bannercnt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002764 exe 'sil keepj '.w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00002765 endif
2766
2767 elseif w:netrw_liststyle == s:THINLIST
2768" call Decho("thin column handling")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002769 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00002770 let dirname= getline('.')
2771
2772 elseif w:netrw_liststyle == s:LONGLIST
2773" call Decho("long column handling")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002774 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00002775 let dirname= substitute(getline('.'),'^\(\%(\S\+ \)*\S\+\).\{-}$','\1','e')
2776
2777 elseif w:netrw_liststyle == s:TREELIST
2778" call Decho("treelist handling")
2779 let dirname= substitute(getline('.'),'^\(| \)*','','e')
2780
2781 else
2782" call Decho("obtain word from wide listing")
2783 let dirname= getline('.')
2784
2785 if !exists("b:netrw_cpf")
2786 let b:netrw_cpf= 0
2787 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
Bram Moolenaar5c736222010-01-06 20:54:52 +01002788 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002789" call Decho("computed cpf=".b:netrw_cpf)
2790 endif
2791
2792" call Decho("buf#".bufnr("%")."<".bufname("%").">")
2793 let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf
2794" call Decho("filestart= ([virtcol=".virtcol(".")."]/[b:netrw_cpf=".b:netrw_cpf."])*b:netrw_cpf=".filestart." bannercnt=".w:netrw_bannercnt)
2795" call Decho("1: dirname<".dirname.">")
2796 if filestart == 0
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002797 keepj norm! 0ma
Bram Moolenaar446cb832008-06-24 21:56:24 +00002798 else
2799 call cursor(line("."),filestart+1)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002800 keepj norm! ma
Bram Moolenaar446cb832008-06-24 21:56:24 +00002801 endif
2802 let rega= @a
Bram Moolenaarc236c162008-07-13 17:41:49 +00002803 let eofname= filestart + b:netrw_cpf + 1
2804 if eofname <= col("$")
2805 call cursor(line("."),filestart+b:netrw_cpf+1)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002806 keepj norm! "ay`a
Bram Moolenaarc236c162008-07-13 17:41:49 +00002807 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002808 keepj norm! "ay$
Bram Moolenaarc236c162008-07-13 17:41:49 +00002809 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002810 let dirname = @a
2811 let @a = rega
2812" call Decho("2: dirname<".dirname.">")
2813 let dirname= substitute(dirname,'\s\+$','','e')
2814" call Decho("3: dirname<".dirname.">")
2815 endif
2816
2817 " symlinks are indicated by a trailing "@". Remove it before further processing.
2818 let dirname= substitute(dirname,"@$","","")
2819
2820 " executables are indicated by a trailing "*". Remove it before further processing.
2821 let dirname= substitute(dirname,"\*$","","")
2822
2823" call Dret("s:NetrwGetWord <".dirname.">")
2824 return dirname
2825endfun
2826
2827" ---------------------------------------------------------------------
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002828" s:NetrwListSettings: make standard settings for a netrw listing {{{2
Bram Moolenaar446cb832008-06-24 21:56:24 +00002829fun! s:NetrwListSettings(islocal)
2830" call Dfunc("s:NetrwListSettings(islocal=".a:islocal.")")
2831 let fname= bufname("%")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002832" call Decho("setlocal bt=nofile nobl ma nonu nowrap noro")
Bram Moolenaarc236c162008-07-13 17:41:49 +00002833 setlocal bt=nofile nobl ma nonu nowrap noro
2834" call Decho("exe keepalt file ".fnameescape(fname))
2835 exe "keepalt file ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002836 if g:netrw_use_noswf
2837 setlocal noswf
2838 endif
2839" call Dredir("ls!")
2840" call Decho("exe setlocal ts=".g:netrw_maxfilenamelen)
2841 exe "setlocal ts=".g:netrw_maxfilenamelen
2842 setlocal isk+=.,~,-
2843 if g:netrw_fastbrowse > a:islocal
2844 setlocal bh=hide
2845 else
2846 setlocal bh=delete
2847 endif
2848" call Dret("s:NetrwListSettings")
2849endfun
2850
2851" ---------------------------------------------------------------------
2852" s:NetrwListStyle: {{{2
2853" islocal=0: remote browsing
2854" =1: local browsing
2855fun! s:NetrwListStyle(islocal)
2856" call Dfunc("NetrwListStyle(islocal=".a:islocal.") w:netrw_liststyle=".w:netrw_liststyle)
2857 let fname = s:NetrwGetWord()
2858 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
2859 let w:netrw_liststyle = (w:netrw_liststyle + 1) % s:MAXLIST
2860" call Decho("fname<".fname.">")
2861" call Decho("chgd w:netrw_liststyle to ".w:netrw_liststyle)
2862" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist").">")
2863
2864 if w:netrw_liststyle == s:THINLIST
2865 " use one column listing
2866" call Decho("use one column list")
2867 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2868
2869 elseif w:netrw_liststyle == s:LONGLIST
2870 " use long list
2871" call Decho("use long list")
2872 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
2873
2874 elseif w:netrw_liststyle == s:WIDELIST
2875 " give wide list
2876" call Decho("use wide list")
2877 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2878
2879 elseif w:netrw_liststyle == s:TREELIST
2880" call Decho("use tree list")
2881 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2882
2883 else
2884 call netrw#ErrorMsg(s:WARNING,"bad value for g:netrw_liststyle (=".w:netrw_liststyle.")",46)
2885 let g:netrw_liststyle = s:THINLIST
2886 let w:netrw_liststyle = g:netrw_liststyle
2887 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2888 endif
2889 setlocal ma noro
2890" call Decho("setlocal ma noro")
2891
2892 " clear buffer - this will cause NetrwBrowse/LocalBrowseCheck to do a refresh
2893" call Decho("clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002894 keepj %d
2895 " following prevents tree listing buffer from being marked "modified"
2896 setlocal nomod
Bram Moolenaar446cb832008-06-24 21:56:24 +00002897
2898 " refresh the listing
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002899" call Decho("refresh the listing")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002900 let svpos= netrw#NetrwSavePosn()
2901 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
2902 call netrw#NetrwRestorePosn(svpos)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002903 call s:NetrwCursorline()
Bram Moolenaar446cb832008-06-24 21:56:24 +00002904
2905 " keep cursor on the filename
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002906 sil keepj $
Bram Moolenaar446cb832008-06-24 21:56:24 +00002907 let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
2908" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'))
2909 if result <= 0 && exists("w:netrw_bannercnt")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002910 exe "keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00002911 endif
2912
2913" call Dret("NetrwListStyle".(exists("w:netrw_liststyle")? ' : w:netrw_liststyle='.w:netrw_liststyle : ""))
2914endfun
2915
2916" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01002917" s:NetrwBannerCtrl: toggles the display of the banner {{{2
2918fun! s:NetrwBannerCtrl(islocal)
2919" call Dfunc("s:NetrwBannerCtrl(islocal=".a:islocal.") g:netrw_banner=".g:netrw_banner)
2920
2921 " toggle the banner (enable/suppress)
2922 let g:netrw_banner= !g:netrw_banner
2923
2924 " refresh the listing
2925 let svpos= netrw#NetrwSavePosn()
2926 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
2927
2928 " keep cursor on the filename
2929 let fname= s:NetrwGetWord()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002930 sil keepj $
Bram Moolenaar5c736222010-01-06 20:54:52 +01002931 let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
2932" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'))
2933 if result <= 0 && exists("w:netrw_bannercnt")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002934 exe "keepj ".w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01002935 endif
2936" call Dret("s:NetrwBannerCtrl : g:netrw_banner=".g:netrw_banner)
2937endfun
2938
2939" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00002940" s:NetrwBookmarkMenu: Uses menu priorities {{{2
2941" .2.[cnt] for bookmarks, and
2942" .3.[cnt] for history
2943" (see s:NetrwMenu())
2944fun! s:NetrwBookmarkMenu()
Bram Moolenaar9964e462007-05-05 17:54:07 +00002945 if !exists("s:netrw_menucnt")
2946 return
2947 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01002948" call Dfunc("NetrwBookmarkMenu() histcnt=".g:netrw_dirhist_cnt." menucnt=".s:netrw_menucnt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00002949
2950 " the following test assures that gvim is running, has menus available, and has menus enabled.
2951 if has("gui") && has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu
Bram Moolenaar9964e462007-05-05 17:54:07 +00002952 if exists("g:NetrwTopLvlMenu")
Bram Moolenaar446cb832008-06-24 21:56:24 +00002953" call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002954 exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Bookmarks'
2955 exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete'
Bram Moolenaar5c736222010-01-06 20:54:52 +01002956 endif
2957 if !exists("s:netrw_initbookhist")
2958 call s:NetrwBookHistRead()
Bram Moolenaar9964e462007-05-05 17:54:07 +00002959 endif
2960
2961 " show bookmarked places
Bram Moolenaar5c736222010-01-06 20:54:52 +01002962 if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != []
2963 let cnt= 1
2964 for bmd in g:netrw_bookmarklist
2965" call Decho('silent! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmark.'.bmd.' :e '.bmd)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002966 let bmd= escape(bmd,g:netrw_menu_escape)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002967
2968 " show bookmarks for goto menu
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002969 exe 'sil! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks.'.bmd.' :e '.bmd."\<cr>"
Bram Moolenaar5c736222010-01-06 20:54:52 +01002970
2971 " show bookmarks for deletion menu
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002972 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 +01002973 let cnt= cnt + 1
2974 endfor
2975
2976 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002977
2978 " show directory browsing history
Bram Moolenaar5c736222010-01-06 20:54:52 +01002979 let cnt = g:netrw_dirhist_cnt
Bram Moolenaar9964e462007-05-05 17:54:07 +00002980 let first = 1
2981 let histcnt = 0
Bram Moolenaar5c736222010-01-06 20:54:52 +01002982 while ( first || cnt != g:netrw_dirhist_cnt )
Bram Moolenaar9964e462007-05-05 17:54:07 +00002983 let histcnt = histcnt + 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01002984 let priority = g:netrw_dirhist_cnt + histcnt
2985 if exists("g:netrw_dirhist_{cnt}")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002986 let histdir= escape(g:netrw_dirhist_{cnt},g:netrw_menu_escape)
Bram Moolenaar5c736222010-01-06 20:54:52 +01002987" call Decho('silent! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002988 exe 'sil! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir."\<cr>"
Bram Moolenaar9964e462007-05-05 17:54:07 +00002989 endif
2990 let first = 0
2991 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
2992 if cnt < 0
2993 let cnt= cnt + g:netrw_dirhistmax
2994 endif
2995 endwhile
Bram Moolenaar5c736222010-01-06 20:54:52 +01002996
Bram Moolenaar9964e462007-05-05 17:54:07 +00002997 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00002998" call Dret("NetrwBookmarkMenu")
Bram Moolenaar9964e462007-05-05 17:54:07 +00002999endfun
3000
3001" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003002" s:NetrwBrowseChgDir: constructs a new directory based on the current {{{2
3003" directory and a new directory name. Also, if the
3004" "new directory name" is actually a file,
3005" NetrwBrowseChgDir() edits the file.
3006fun! s:NetrwBrowseChgDir(islocal,newdir,...)
3007" 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 +00003008
Bram Moolenaar446cb832008-06-24 21:56:24 +00003009 if !exists("b:netrw_curdir")
3010 " Don't try to change-directory: this can happen, for example, when netrw#ErrorMsg has been called
3011 " and the current window is the NetrwMessage window.
3012" call Decho("(NetrwBrowseChgDir) b:netrw_curdir doesn't exist!")
3013" call Decho("getcwd<".getcwd().">")
3014" call Dredir("ls!")
3015" call Dret("s:NetrwBrowseChgDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003016 return
Bram Moolenaar9964e462007-05-05 17:54:07 +00003017 endif
3018
Bram Moolenaar446cb832008-06-24 21:56:24 +00003019 call s:NetrwOptionSave("s:")
3020 call s:NetrwSafeOptions()
3021 let nbcd_curpos = netrw#NetrwSavePosn()
3022 let s:nbcd_curpos_{bufnr('%')} = nbcd_curpos
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003023 if (has("win32") || has("win95") || has("win64") || has("win16"))
3024 let dirname = substitute(b:netrw_curdir,'\\','/','ge')
3025 else
3026 let dirname= b:netrw_curdir
3027 endif
3028 let newdir = a:newdir
3029 let dolockout = 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00003030
Bram Moolenaar446cb832008-06-24 21:56:24 +00003031 " set up o/s-dependent directory recognition pattern
3032 if has("amiga")
3033 let dirpat= '[\/:]$'
Bram Moolenaar9964e462007-05-05 17:54:07 +00003034 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003035 let dirpat= '[\/]$'
3036 endif
3037" call Decho("dirname<".dirname."> dirpat<".dirpat.">")
3038
3039 if dirname !~ dirpat
3040 " apparently vim is "recognizing" that it is in a directory and
3041 " is removing the trailing "/". Bad idea, so I put it back.
3042 let dirname= dirname.'/'
3043" call Decho("adjusting dirname<".dirname.">")
3044 endif
3045
3046 if newdir !~ dirpat
3047 " ------------
3048 " edit a file:
3049 " ------------
3050" call Decho('case "handling a file": newdir<'.newdir.'> !~ dirpat<'.dirpat.">")
3051 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") && newdir !~ '^\(/\|\a:\)'
3052 let dirname= s:NetrwTreeDir()
3053 if dirname =~ '/$'
3054 let dirname= dirname.newdir
3055 else
3056 let dirname= s:NetrwTreeDir()."/".newdir
3057 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003058" call Decho("dirname<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003059" call Decho("tree listing")
3060 elseif newdir =~ '^\(/\|\a:\)'
3061 let dirname= newdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00003062 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003063 let dirname= s:ComposePath(dirname,newdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003064 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003065" call Decho("handling a file: dirname<".dirname."> (a:0=".a:0.")")
3066 " this lets NetrwBrowseX avoid the edit
3067 if a:0 < 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00003068" call Decho("set up windows for editing<".fnameescape(dirname)."> didsplit=".(exists("s:didsplit")? s:didsplit : "doesn't exist"))
3069 call s:NetrwOptionRestore("s:")
3070 if !exists("s:didsplit")
3071 if g:netrw_browse_split == 1
3072 new
Bram Moolenaar5c736222010-01-06 20:54:52 +01003073 if !&ea
3074 wincmd _
3075 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003076 elseif g:netrw_browse_split == 2
3077 rightb vert new
Bram Moolenaar5c736222010-01-06 20:54:52 +01003078 if !&ea
3079 wincmd |
3080 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003081 elseif g:netrw_browse_split == 3
3082 tabnew
3083 elseif g:netrw_browse_split == 4
3084 if s:NetrwPrevWinOpen(2) == 3
3085" call Dret("s:NetrwBrowseChgDir")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003086 return
3087 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003088 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003089 " handling a file, didn't split, so remove menu
3090" call Decho("handling a file+didn't split, so remove menu")
3091 call s:NetrwMenu(0)
3092 " optional change to window
3093 if g:netrw_chgwin >= 1
3094 exe "keepjumps ".g:netrw_chgwin."wincmd w"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003095 endif
3096 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003097 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003098 " the point where netrw actually edits the (local) file
3099 " if its local only: LocalBrowseCheck() doesn't edit a file, but NetrwBrowse() will
3100 if a:islocal
3101" call Decho("edit local file: exe e! ".fnameescape(dirname))
3102 exe "e! ".fnameescape(dirname)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003103 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003104" call Decho("remote file: NetrwBrowse will edit it")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003105 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003106 let dolockout= 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01003107
3108 " handle g:Netrw_funcref -- call external-to-netrw functions
3109 " This code will handle g:Netrw_funcref as an individual function reference
3110 " or as a list of function references. It will ignore anything that's not
3111 " a function reference. See :help Funcref for information about function references.
3112 if exists("g:Netrw_funcref")
3113 if type(g:Netrw_funcref) == 2
3114 call g:Netrw_funcref()
3115 elseif type(g:Netrw_funcref) == 3
3116 for Fncref in g:Netrw_funcref
3117 if type(FncRef) == 2
3118 call FncRef()
3119 endif
3120 endfor
3121 endif
3122 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003123 endif
3124
3125 elseif newdir =~ '^/'
3126 " ---------------------------------
3127 " just go to the new directory spec
3128 " ---------------------------------
3129" call Decho('case "just go to new directory spec": newdir<'.newdir.'>')
3130 let dirname= newdir
3131 call s:SetRexDir(a:islocal,dirname)
3132 call s:NetrwOptionRestore("s:")
3133
3134 elseif newdir == './'
3135 " --------------------------
3136 " refresh the directory list
3137 " --------------------------
3138" call Decho('case "refresh directory listing": newdir == "./"')
3139 call s:SetRexDir(a:islocal,dirname)
3140
3141 elseif newdir == '../'
3142 " -------------------
3143 " go up one directory
3144 " -------------------
3145" call Decho('case "go up one directory": newdir == "../"')
3146
3147 if w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
3148 " force a refresh
3149" call Decho("clear buffer<".expand("%")."> with :%d")
3150 setlocal noro ma
3151" call Decho("setlocal noro ma")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003152 keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00003153 endif
3154
3155 if has("amiga")
3156 " amiga
3157" call Decho('case "go up one directory": newdir == "../" and amiga')
3158 if a:islocal
3159 let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+$\)','\1','')
3160 let dirname= substitute(dirname,'/$','','')
3161 else
3162 let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+/$\)','\1','')
3163 endif
3164" call Decho("amiga: dirname<".dirname."> (go up one dir)")
3165
3166 else
3167 " unix or cygwin
3168" call Decho('case "go up one directory": newdir == "../" and unix or cygwin')
3169 if a:islocal
3170 let dirname= substitute(dirname,'^\(.*\)/\([^/]\+\)/$','\1','')
3171 if dirname == ""
3172 let dirname= '/'
3173 endif
3174 else
3175 let dirname= substitute(dirname,'^\(\a\+://.\{-}/\{1,2}\)\(.\{-}\)\([^/]\+\)/$','\1\2','')
3176 endif
3177" call Decho("unix: dirname<".dirname."> (go up one dir)")
3178 endif
3179 call s:SetRexDir(a:islocal,dirname)
3180
3181 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
3182" call Decho('case liststyle is TREELIST and w:netrw_treedict exists')
3183 " force a refresh (for TREELIST, wait for NetrwTreeDir() to force the refresh)
3184 setlocal noro ma
3185" call Decho("setlocal noro ma")
3186 if !(exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir"))
3187" call Decho("clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003188 keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00003189 endif
3190 let treedir = s:NetrwTreeDir()
3191 let s:treecurpos = nbcd_curpos
3192 let haskey= 0
3193" call Decho("w:netrw_treedict<".string(w:netrw_treedict).">")
3194
3195 " search treedict for tree dir as-is
3196 if has_key(w:netrw_treedict,treedir)
3197" call Decho('....searched for treedir<'.treedir.'> : found it!')
3198 let haskey= 1
3199 else
3200" call Decho('....searched for treedir<'.treedir.'> : not found')
3201 endif
3202
3203 " search treedict for treedir with a / appended
3204 if !haskey && treedir !~ '/$'
3205 if has_key(w:netrw_treedict,treedir."/")
3206 let treedir= treedir."/"
3207" call Decho('....searched.for treedir<'.treedir.'> found it!')
3208 let haskey = 1
3209 else
3210" call Decho('....searched for treedir<'.treedir.'/> : not found')
3211 endif
3212 endif
3213
3214 " search treedict for treedir with any trailing / elided
3215 if !haskey && treedir =~ '/$'
3216 let treedir= substitute(treedir,'/$','','')
3217 if has_key(w:netrw_treedict,treedir)
3218" call Decho('....searched.for treedir<'.treedir.'> found it!')
3219 let haskey = 1
3220 else
3221" call Decho('....searched for treedir<'.treedir.'> : not found')
3222 endif
3223 endif
3224
3225 if haskey
3226 " close tree listing for selected subdirectory
3227" call Decho("closing selected subdirectory<".dirname.">")
3228 call remove(w:netrw_treedict,treedir)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003229" call Decho("removed entry<".treedir."> from treedict")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003230" call Decho("yielding treedict<".string(w:netrw_treedict).">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003231 let dirname= w:netrw_treetop
Bram Moolenaar446cb832008-06-24 21:56:24 +00003232 else
3233 " go down one directory
3234 let dirname= substitute(treedir,'/*$','/','')
3235" call Decho("go down one dir: treedir<".treedir.">")
3236 endif
3237 call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003238 let s:treeforceredraw = 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00003239
3240 else
3241 " go down one directory
3242 let dirname= s:ComposePath(dirname,newdir)
3243" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
3244 call s:SetRexDir(a:islocal,dirname)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003245 endif
3246
Bram Moolenaar446cb832008-06-24 21:56:24 +00003247 call s:NetrwOptionRestore("s:")
3248 if dolockout
3249" call Decho("doing modification lockout settings: ma nomod noro")
3250 setlocal ma nomod noro
3251" call Decho("setlocal ma nomod noro")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003252 endif
3253
Bram Moolenaar446cb832008-06-24 21:56:24 +00003254" call Dret("s:NetrwBrowseChgDir <".dirname."> : curpos<".string(getpos(".")).">")
3255 return dirname
Bram Moolenaar9964e462007-05-05 17:54:07 +00003256endfun
3257
3258" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01003259" s:NetrwBrowseX: (implements "x") executes a special "viewer" script or program for the {{{2
3260" given filename; typically this means given their extension.
3261" 0=local, 1=remote
Bram Moolenaar446cb832008-06-24 21:56:24 +00003262fun! netrw#NetrwBrowseX(fname,remote)
3263" call Dfunc("NetrwBrowseX(fname<".a:fname."> remote=".a:remote.")")
3264
Bram Moolenaar5c736222010-01-06 20:54:52 +01003265 " special core dump handler
3266 if a:fname =~ '/core\(\.\d\+\)\=$'
3267 if exists("g:Netrw_corehandler")
3268 if type(g:Netrw_corehandler) == 2
3269 " g:Netrw_corehandler is a function reference (see :help Funcref)
3270" call Decho("g:Netrw_corehandler is a funcref")
3271 call g:Netrw_corehandler(a:fname)
3272 elseif type(g:netrw_corehandler) == 3)
3273 " g:Netrw_corehandler is a List of function references (see :help Funcref)
3274" call Decho("g:Netrw_corehandler is a List")
3275 for Fncref in g:Netrw_corehandler
3276 if type(FncRef) == 2
3277 call FncRef(a:fname)
3278 endif
3279 endfor
3280 endif
3281" call Dret("NetrwBrowseX : coredump handler invoked")
3282 return
3283 endif
3284 endif
3285
Bram Moolenaar446cb832008-06-24 21:56:24 +00003286 " set up the filename
3287 " (lower case the extension, make a local copy of a remote file)
3288 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
3289 if has("win32") || has("win95") || has("win64") || has("win16")
3290 let exten= substitute(exten,'^.*$','\L&\E','')
Bram Moolenaar9964e462007-05-05 17:54:07 +00003291 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003292" call Decho("exten<".exten.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003293
3294 " seems kde systems often have gnome-open due to dependencies, even though
3295 " gnome-open's subsidiary display tools are largely absent. Kde systems
3296 " usually have "kdeinit" running, though... (tnx Mikolaj Machowski)
3297 if !exists("s:haskdeinit")
3298 if has("unix")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003299 let s:haskdeinit= system("ps -e") =~ 'kdeinit'
Bram Moolenaar446cb832008-06-24 21:56:24 +00003300 if v:shell_error
3301 let s:haskdeinit = 0
3302 endif
3303 else
3304 let s:haskdeinit= 0
3305 endif
3306" call Decho("setting s:haskdeinit=".s:haskdeinit)
3307 endif
3308
3309 if a:remote == 1
3310 " create a local copy
Bram Moolenaar5c736222010-01-06 20:54:52 +01003311" call Decho("a:remote=".a:remote.": create a local copy of <".a:fname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003312 setlocal bh=delete
Bram Moolenaar5c736222010-01-06 20:54:52 +01003313 call netrw#NetRead(3,a:fname)
3314 " attempt to rename tempfile
3315 let basename= substitute(a:fname,'^\(.*\)/\(.*\)\.\([^.]*\)$','\2','')
3316 let newname= substitute(s:netrw_tmpfile,'^\(.*\)/\(.*\)\.\([^.]*\)$','\1/'.basename.'.\3','')
3317" call Decho("basename<".basename.">")
3318" call Decho("newname <".newname.">")
3319 if rename(s:netrw_tmpfile,newname) == 0
3320 " renaming succeeded
3321 let fname= newname
3322 else
3323 " renaming failed
3324 let fname= s:netrw_tmpfile
3325 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00003326 else
3327 let fname= a:fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003328 " special ~ handler for local
3329 if fname =~ '^\~' && expand("$HOME") != ""
3330" call Decho('invoking special ~ handler')
3331 let fname= substitute(fname,'^\~',expand("$HOME"),'')
3332 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003333 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003334" call Decho("fname<".fname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003335" call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten))
3336
3337 " set up redirection
3338 if &srr =~ "%s"
3339 if (has("win32") || has("win95") || has("win64") || has("win16"))
3340 let redir= substitute(&srr,"%s","nul","")
3341 else
3342 let redir= substitute(&srr,"%s","/dev/null","")
3343 endif
3344 elseif (has("win32") || has("win95") || has("win64") || has("win16"))
3345 let redir= &srr . "nul"
3346 else
3347 let redir= &srr . "/dev/null"
3348 endif
3349" call Decho("redir{".redir."} srr{".&srr."}")
3350
3351 " extract any viewing options. Assumes that they're set apart by quotes.
3352 if exists("g:netrw_browsex_viewer")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003353" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003354 if g:netrw_browsex_viewer =~ '\s'
3355 let viewer = substitute(g:netrw_browsex_viewer,'\s.*$','','')
3356 let viewopt = substitute(g:netrw_browsex_viewer,'^\S\+\s*','','')." "
3357 let oviewer = ''
3358 let cnt = 1
3359 while !executable(viewer) && viewer != oviewer
3360 let viewer = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\1','')
3361 let viewopt = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\3','')." "
3362 let cnt = cnt + 1
3363 let oviewer = viewer
3364" call Decho("!exe: viewer<".viewer."> viewopt<".viewopt.">")
3365 endwhile
3366 else
3367 let viewer = g:netrw_browsex_viewer
3368 let viewopt = ""
3369 endif
3370" call Decho("viewer<".viewer."> viewopt<".viewopt.">")
3371 endif
3372
3373 " execute the file handler
3374 if exists("g:netrw_browsex_viewer") && g:netrw_browsex_viewer == '-'
3375" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
3376 let ret= netrwFileHandlers#Invoke(exten,fname)
3377
3378 elseif exists("g:netrw_browsex_viewer") && executable(viewer)
3379" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003380" call Decho("exe silent !".viewer." ".viewopt.shellescape(fname,1).redir)
3381 exe "silent !".viewer." ".viewopt.shellescape(fname,1).redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003382 let ret= v:shell_error
3383
3384 elseif has("win32") || has("win64")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003385 if executable("start")
3386" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1))
3387 exe 'silent !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)
3388 elseif executable("rundll32")
3389" call Decho('exe silent !rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1))
3390 exe 'silent !rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)
3391 else
3392 call netrw#ErrorMsg(s:WARNING,"rundll32 not on path",74)
3393 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003394 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3395 let ret= v:shell_error
3396
3397 elseif has("unix") && executable("gnome-open") && !s:haskdeinit
Bram Moolenaarc236c162008-07-13 17:41:49 +00003398" call Decho("exe silent !gnome-open ".shellescape(fname,1)." ".redir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003399 exe "sil !gnome-open ".shellescape(fname,1).redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003400 let ret= v:shell_error
3401
3402 elseif has("unix") && executable("kfmclient") && s:haskdeinit
Bram Moolenaarc236c162008-07-13 17:41:49 +00003403" call Decho("exe silent !kfmclient exec ".shellescape(fname,1)." ".redir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003404 exe "sil !kfmclient exec ".shellescape(fname,1)." ".redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003405 let ret= v:shell_error
3406
3407 elseif has("macunix") && executable("open")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003408" call Decho("exe silent !open ".shellescape(fname,1)." ".redir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003409 exe "sil !open ".shellescape(fname,1)." ".redir
Bram Moolenaar446cb832008-06-24 21:56:24 +00003410 let ret= v:shell_error
3411
3412 else
3413 " netrwFileHandlers#Invoke() always returns 0
3414 let ret= netrwFileHandlers#Invoke(exten,fname)
3415 endif
3416
3417 " if unsuccessful, attempt netrwFileHandlers#Invoke()
3418 if ret
3419 let ret= netrwFileHandlers#Invoke(exten,fname)
3420 endif
3421
Bram Moolenaarc236c162008-07-13 17:41:49 +00003422 " restoring redraw! after external file handlers
3423 redraw!
Bram Moolenaar446cb832008-06-24 21:56:24 +00003424
3425 " cleanup: remove temporary file,
3426 " delete current buffer if success with handler,
3427 " return to prior buffer (directory listing)
3428 " Feb 12, 2008: had to de-activiate removal of
3429 " temporary file because it wasn't getting seen.
3430" if a:remote == 1 && fname != a:fname
3431" call Decho("deleting temporary file<".fname.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00003432" call s:NetrwDelete(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003433" endif
3434
3435 if a:remote == 1
3436 setlocal bh=delete bt=nofile
3437 if g:netrw_use_noswf
3438 setlocal noswf
3439 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003440 exe "keepj norm! \<c-o>"
Bram Moolenaar446cb832008-06-24 21:56:24 +00003441" redraw!
3442 endif
3443
3444" call Dret("NetrwBrowseX")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003445endfun
3446
3447" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01003448" s:NetrwChgPerm: (implements "gp") change file permission {{{2
3449fun! s:NetrwChgPerm(islocal,curdir)
3450" call Dfunc("s:NetrwChgPerm(islocal=".a:islocal." curdir<".a:curdir.">)")
3451 call inputsave()
3452 let newperm= input("Enter new permission: ")
3453 call inputrestore()
3454 let chgperm= substitute(g:netrw_chgperm,'\<FILENAME\>',shellescape(expand("<cfile>")),'')
3455 let chgperm= substitute(chgperm,'\<PERM\>',shellescape(newperm),'')
3456" call Decho("chgperm<".chgperm.">")
3457 call system(chgperm)
3458 if v:shell_error != 0
3459 call netrw#ErrorMsg(1,"changing permission on file<".expand("<cfile>")."> seems to have failed",75)
3460 endif
3461 if a:islocal
3462 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3463 endif
3464" call Dret("s:NetrwChgPerm")
3465endfun
3466
3467" ---------------------------------------------------------------------
3468" s:NetrwClearExplore: clear explore variables (if any) {{{2
3469fun! s:NetrwClearExplore()
3470" call Dfunc("s:NetrwClearExplore()")
3471 2match none
3472 if exists("s:explore_match") |unlet s:explore_match |endif
3473 if exists("s:explore_indx") |unlet s:explore_indx |endif
3474 if exists("s:netrw_explore_prvdir") |unlet s:netrw_explore_prvdir |endif
3475 if exists("s:dirstarstar") |unlet s:dirstarstar |endif
3476 if exists("s:explore_prvdir") |unlet s:explore_prvdir |endif
3477 if exists("w:netrw_explore_indx") |unlet w:netrw_explore_indx |endif
3478 if exists("w:netrw_explore_listlen")|unlet w:netrw_explore_listlen|endif
3479 if exists("w:netrw_explore_list") |unlet w:netrw_explore_list |endif
3480 if exists("w:netrw_explore_bufnr") |unlet w:netrw_explore_bufnr |endif
3481" redraw!
3482 echo " "
3483 echo " "
3484" call Dret("s:NetrwClearExplore")
3485endfun
3486
3487" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00003488" netrw#Explore: launch the local browser in the directory of the current file {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +01003489" indx: == -1: Nexplore
3490" == -2: Pexplore
3491" == +: this is overloaded:
3492" * If Nexplore/Pexplore is in use, then this refers to the
3493" indx'th item in the w:netrw_explore_list[] of items which
3494" matched the */pattern **/pattern *//pattern **//pattern
3495" * If Hexplore or Vexplore, then this will override
3496" g:netrw_winsize to specify the qty of rows or columns the
3497" newly split window should have.
3498" dosplit==0: the window will be split iff the current file has been modified
3499" dosplit==1: the window will be split before running the local browser
3500" style == 0: Explore style == 1: Explore!
3501" == 2: Hexplore style == 3: Hexplore!
3502" == 4: Vexplore style == 5: Vexplore!
3503" == 6: Texplore
Bram Moolenaar9964e462007-05-05 17:54:07 +00003504fun! netrw#Explore(indx,dosplit,style,...)
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003505" 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 +00003506 if !exists("b:netrw_curdir")
3507 let b:netrw_curdir= getcwd()
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003508" call Decho("set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003509 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003510 let curdir = simplify(b:netrw_curdir)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003511 let curfiledir = substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
3512" call Decho("curdir<".curdir."> curfiledir<".curfiledir.">")
3513" call FOTEST(1)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003514
3515 " save registers
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003516 sil! let keepregstar = @*
3517 sil! let keepregplus = @+
3518 sil! let keepregslash= @/
Bram Moolenaar9964e462007-05-05 17:54:07 +00003519
3520 " if dosplit or file has been modified
3521 if a:dosplit || &modified || a:style == 6
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003522" 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 +00003523 call s:SaveWinVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +01003524 let winsize= g:netrw_winsize
3525 if a:indx > 0
3526 let winsize= a:indx
3527 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003528
3529 if a:style == 0 " Explore, Sexplore
3530" call Decho("style=0: Explore or Sexplore")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003531 exe winsize."wincmd s"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003532
3533 elseif a:style == 1 "Explore!, Sexplore!
3534" call Decho("style=1: Explore! or Sexplore!")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003535 exe winsize."wincmd v"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003536
3537 elseif a:style == 2 " Hexplore
3538" call Decho("style=2: Hexplore")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003539 exe "bel ".winsize."wincmd s"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003540
3541 elseif a:style == 3 " Hexplore!
3542" call Decho("style=3: Hexplore!")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003543 exe "abo ".winsize."wincmd s"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003544
3545 elseif a:style == 4 " Vexplore
3546" call Decho("style=4: Vexplore")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003547 exe "lefta ".winsize."wincmd v"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003548
3549 elseif a:style == 5 " Vexplore!
3550" call Decho("style=5: Vexplore!")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003551 exe "rightb ".winsize."wincmd v"
Bram Moolenaar9964e462007-05-05 17:54:07 +00003552
3553 elseif a:style == 6 " Texplore
3554 call s:SaveBufVars()
3555" call Decho("style = 6: Texplore")
3556 tabnew
3557 call s:RestoreBufVars()
3558 endif
3559 call s:RestoreWinVars()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003560" else " Decho
3561" 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 +00003562 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003563 keepj norm! 0
Bram Moolenaar5c736222010-01-06 20:54:52 +01003564" call FOTEST(2)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003565
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003566 if a:0 > 0
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003567" call Decho("case [a:0=".a:0."] > 0: a:1<".a:1.">")
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003568 if a:1 =~ '^\~' && (has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003569" call Decho("case a:1: ~ and unix or cygwin")
3570 let dirname= simplify(substitute(a:1,'\~',expand("$HOME"),''))
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003571" call Decho("using dirname<".dirname."> (case: ~ && unix||cygwin)")
3572 elseif a:1 == '.'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003573" call Decho("case a:1: .")
3574 let dirname= simplify(exists("b:netrw_curdir")? b:netrw_curdir : getcwd())
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00003575 if dirname !~ '/$'
3576 let dirname= dirname."/"
3577 endif
3578" call Decho("using dirname<".dirname."> (case: ".(exists("b:netrw_curdir")? "b:netrw_curdir" : "getcwd()").")")
3579 elseif a:1 =~ '\$'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003580" call Decho("case a:1: $")
3581 let dirname= simplify(expand(a:1))
Bram Moolenaar5c736222010-01-06 20:54:52 +01003582" call Decho("using user-specified dirname<".dirname."> with $env-var")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003583 elseif a:1 !~ '^\*/'
3584" call Decho("case a:1: other, not pattern or filepattern")
3585 let dirname= simplify(a:1)
Bram Moolenaar5c736222010-01-06 20:54:52 +01003586" call Decho("using user-specified dirname<".dirname.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003587 else
3588" call Decho("case a:1: pattern or filepattern")
3589 let dirname= a:1
Bram Moolenaar9964e462007-05-05 17:54:07 +00003590 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003591 else
3592 " clear explore
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003593" call Decho("case a:0=".a:0.": clearing Explore list")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003594 call s:NetrwClearExplore()
Bram Moolenaar446cb832008-06-24 21:56:24 +00003595" call Dret("netrw#Explore : cleared list")
3596 return
Bram Moolenaar9964e462007-05-05 17:54:07 +00003597 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003598
Bram Moolenaar5c736222010-01-06 20:54:52 +01003599" call FOTEST(3)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003600" call Decho("dirname<".dirname.">")
3601 if dirname =~ '\.\./\=$'
3602 let dirname= simplify(fnamemodify(dirname,':p:h'))
3603 elseif dirname =~ '\.\.' || dirname == '.'
3604 let dirname= simplify(fnamemodify(dirname,':p'))
3605 endif
3606" call Decho("dirname<".dirname."> (after simplify)")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003607
Bram Moolenaar446cb832008-06-24 21:56:24 +00003608 if dirname =~ '/\*\*/'
3609 " handle .../**/.../filepat
3610" call Decho("case Explore .../**/.../filepat")
3611 let prefixdir= substitute(dirname,'^\(.\{-}\)\*\*.*$','\1','')
3612 if prefixdir =~ '^/' || (prefixdir =~ '^\a:/' && (has("win32") || has("win95") || has("win64") || has("win16")))
3613 let b:netrw_curdir = prefixdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00003614 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003615 let b:netrw_curdir= getcwd().'/'.prefixdir
Bram Moolenaar9964e462007-05-05 17:54:07 +00003616 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003617 let dirname= substitute(dirname,'^.\{-}\(\*\*/.*\)$','\1','')
3618 let starpat= 4;
3619" call Decho("pwd<".getcwd()."> dirname<".dirname.">")
3620" call Decho("case Explore ../**/../filepat (starpat=".starpat.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003621
Bram Moolenaar446cb832008-06-24 21:56:24 +00003622 elseif dirname =~ '^\*//'
3623 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
3624" call Decho("case Explore *//pattern")
3625 let pattern= substitute(dirname,'^\*//\(.*\)$','\1','')
3626 let starpat= 1
3627" call Decho("Explore *//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
3628 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
3629
3630 elseif dirname =~ '^\*\*//'
3631 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
3632" call Decho("case Explore **//pattern")
3633 let pattern= substitute(dirname,'^\*\*//','','')
3634 let starpat= 2
3635" call Decho("Explore **//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
3636
3637 elseif dirname =~ '^\*/'
3638 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
3639 let starpat= 3
3640" call Decho("case Explore */filepat (starpat=".starpat.")")
3641
3642 elseif dirname=~ '^\*\*/'
3643 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
3644 let starpat= 4
3645" call Decho("case Explore **/filepat (starpat=".starpat.")")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003646
Bram Moolenaar446cb832008-06-24 21:56:24 +00003647 else
3648 let starpat= 0
Bram Moolenaar5c736222010-01-06 20:54:52 +01003649" call Decho("default case: starpat=".starpat)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003650 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003651" call FOTEST(4)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003652
3653 if starpat == 0 && a:indx >= 0
3654 " [Explore Hexplore Vexplore Sexplore] [dirname]
Bram Moolenaar5c736222010-01-06 20:54:52 +01003655" call Decho("case starpat==0 && a:indx=".a:indx.": dirname<".dirname."> Explore Hexplore Vexplore Sexplore")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003656 if dirname == ""
Bram Moolenaar5c736222010-01-06 20:54:52 +01003657 let dirname= curfiledir
3658" call Decho("empty dirname, using current file's directory<".dirname.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003659 endif
3660 if dirname =~ '^scp:' || dirname =~ '^ftp:'
3661" call Decho("calling NetrwBrowse(0,dirname<".dirname.">)")
3662 call s:NetrwBrowse(0,dirname)
3663 else
3664 if dirname == ""|let dirname= getcwd()|endif
3665" call Decho("calling LocalBrowseCheck(dirname<".dirname.">)")
3666 call netrw#LocalBrowseCheck(dirname)
3667 endif
3668
Bram Moolenaar5c736222010-01-06 20:54:52 +01003669" call Decho("curdir<".curdir.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003670 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003671 keepj call search('\<'.substitute(curdir,'^.*[/\\]','','e').'\>','cW')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003672 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003673 keepj call search('\<'.substitute(curdir,'^.*/','','e').'\>','cW')
Bram Moolenaar446cb832008-06-24 21:56:24 +00003674 endif
3675
3676 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
3677 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
3678 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
3679 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
3680 elseif a:indx <= 0
3681 " Nexplore, Pexplore, Explore: handle starpat
Bram Moolenaar5c736222010-01-06 20:54:52 +01003682" 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 +00003683 if !mapcheck("<s-up>","n") && !mapcheck("<s-down>","n") && exists("b:netrw_curdir")
3684" call Decho("set up <s-up> and <s-down> maps")
3685 let s:didstarstar= 1
3686 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
3687 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
3688 endif
3689
3690 if has("path_extra")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003691" call Decho("starpat=".starpat.": has +path_extra")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003692 if !exists("w:netrw_explore_indx")
3693 let w:netrw_explore_indx= 0
3694 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003695
Bram Moolenaar9964e462007-05-05 17:54:07 +00003696 let indx = a:indx
Bram Moolenaar446cb832008-06-24 21:56:24 +00003697" call Decho("starpat=".starpat.": set indx= [a:indx=".indx."]")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003698
Bram Moolenaar9964e462007-05-05 17:54:07 +00003699 if indx == -1
Bram Moolenaar446cb832008-06-24 21:56:24 +00003700 " Nexplore
3701" call Decho("case Nexplore with starpat=".starpat.": (indx=".indx.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003702 if !exists("w:netrw_explore_list") " sanity check
3703 call netrw#ErrorMsg(s:WARNING,"using Nexplore or <s-down> improperly; see help for netrw-starstar",40)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003704 sil! let @* = keepregstar
3705 sil! let @+ = keepregstar
3706 sil! let @/ = keepregslash
Bram Moolenaar9964e462007-05-05 17:54:07 +00003707" call Dret("netrw#Explore")
3708 return
3709 endif
3710 let indx= w:netrw_explore_indx
3711 if indx < 0 | let indx= 0 | endif
3712 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
3713 let curfile= w:netrw_explore_list[indx]
3714" call Decho("indx=".indx." curfile<".curfile.">")
3715 while indx < w:netrw_explore_listlen && curfile == w:netrw_explore_list[indx]
3716 let indx= indx + 1
3717" call Decho("indx=".indx." (Nexplore while loop)")
3718 endwhile
3719 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
3720" call Decho("Nexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
3721
3722 elseif indx == -2
Bram Moolenaar446cb832008-06-24 21:56:24 +00003723 " Pexplore
3724" call Decho("case Pexplore with starpat=".starpat.": (indx=".indx.")")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003725 if !exists("w:netrw_explore_list") " sanity check
3726 call netrw#ErrorMsg(s:WARNING,"using Pexplore or <s-up> improperly; see help for netrw-starstar",41)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003727 sil! let @* = keepregstar
3728 sil! let @+ = keepregstar
3729 sil! let @/ = keepregslash
Bram Moolenaar9964e462007-05-05 17:54:07 +00003730" call Dret("netrw#Explore")
3731 return
3732 endif
3733 let indx= w:netrw_explore_indx
3734 if indx < 0 | let indx= 0 | endif
3735 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
3736 let curfile= w:netrw_explore_list[indx]
3737" call Decho("indx=".indx." curfile<".curfile.">")
3738 while indx >= 0 && curfile == w:netrw_explore_list[indx]
3739 let indx= indx - 1
3740" call Decho("indx=".indx." (Pexplore while loop)")
3741 endwhile
3742 if indx < 0 | let indx= 0 | endif
3743" call Decho("Pexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
3744
3745 else
3746 " Explore -- initialize
3747 " build list of files to Explore with Nexplore/Pexplore
Bram Moolenaar446cb832008-06-24 21:56:24 +00003748" call Decho("starpat=".starpat.": case Explore: initialize (indx=".indx.")")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003749 call s:NetrwClearExplore()
Bram Moolenaar9964e462007-05-05 17:54:07 +00003750 let w:netrw_explore_indx= 0
3751 if !exists("b:netrw_curdir")
3752 let b:netrw_curdir= getcwd()
3753 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003754" call Decho("starpat=".starpat.": b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003755
Bram Moolenaar446cb832008-06-24 21:56:24 +00003756 " switch on starpat to build the w:netrw_explore_list of files
3757 if starpat == 1
3758 " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
3759" call Decho("starpat=".starpat.": build *//pattern list")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003760" call Decho("pattern<".pattern.">")
3761 try
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003762 exe "keepj noautocmd vimgrep /".pattern."/gj ".fnameescape(b:netrw_curdir)."/*"
Bram Moolenaar5c736222010-01-06 20:54:52 +01003763 catch /^Vim\%((\a\+)\)\=:E480/
3764 call netrw#ErrorMsg(s:WARNING,"no match with pattern<".pattern.">",76)
3765" call Dret("netrw#Explore : unable to find pattern<".pattern.">")
3766 return
3767 endtry
3768 let w:netrw_explore_list = s:NetrwExploreListUniq(map(getqflist(),'bufname(v:val.bufnr)'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003769 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
3770
3771 elseif starpat == 2
3772 " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
3773" call Decho("starpat=".starpat.": build **//pattern list")
3774 try
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003775 exe "sil keepj noautocmd vimgrep /".pattern."/gj "."**/*"
Bram Moolenaar446cb832008-06-24 21:56:24 +00003776 catch /^Vim\%((\a\+)\)\=:E480/
Bram Moolenaar5c736222010-01-06 20:54:52 +01003777 call netrw#ErrorMsg(s:WARNING,'no files matched pattern<'.pattern.'>',45)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003778 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003779 silent! let @* = keepregstar
3780 silent! let @+ = keepregstar
3781 silent! let @/ = keepregslash
3782" call Dret("netrw#Explore : no files matched pattern")
3783 return
3784 endtry
3785 let s:netrw_curdir = b:netrw_curdir
3786 let w:netrw_explore_list = getqflist()
Bram Moolenaar5c736222010-01-06 20:54:52 +01003787 let w:netrw_explore_list = s:NetrwExploreListUniq(map(w:netrw_explore_list,'s:netrw_curdir."/".bufname(v:val.bufnr)'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003788
3789 elseif starpat == 3
3790 " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
3791" call Decho("starpat=".starpat.": build */filepat list")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003792 let filepat= substitute(dirname,'^\*/','','')
3793 let filepat= substitute(filepat,'^[%#<]','\\&','')
3794" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
3795" call Decho("filepat<".filepat.">")
3796 let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".filepat),'\n'))
3797 if &hls | let keepregslash= s:ExplorePatHls(filepat) | endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003798
3799 elseif starpat == 4
3800 " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
3801" call Decho("starpat=".starpat.": build **/filepat list")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003802 let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".dirname),'\n'))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003803 if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif
3804 endif " switch on starpat to build w:netrw_explore_list
Bram Moolenaar9964e462007-05-05 17:54:07 +00003805
3806 let w:netrw_explore_listlen = len(w:netrw_explore_list)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003807" call Decho("w:netrw_explore_list<".string(w:netrw_explore_list).">")
3808" call Decho("w:netrw_explore_listlen=".w:netrw_explore_listlen)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003809
3810 if w:netrw_explore_listlen == 0 || (w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/')
3811 call netrw#ErrorMsg(s:WARNING,"no files matched",42)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003812 sil! let @* = keepregstar
3813 sil! let @+ = keepregstar
3814 sil! let @/ = keepregslash
Bram Moolenaar9964e462007-05-05 17:54:07 +00003815" call Dret("netrw#Explore : no files matched")
3816 return
3817 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00003818 endif " if indx ... endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00003819
3820 " NetrwStatusLine support - for exploring support
3821 let w:netrw_explore_indx= indx
Bram Moolenaar5c736222010-01-06 20:54:52 +01003822" call Decho("w:netrw_explore_list<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003823
3824 " wrap the indx around, but issue a note
3825 if indx >= w:netrw_explore_listlen || indx < 0
3826" call Decho("wrap indx (indx=".indx." listlen=".w:netrw_explore_listlen.")")
3827 let indx = (indx < 0)? ( w:netrw_explore_listlen - 1 ) : 0
3828 let w:netrw_explore_indx= indx
3829 call netrw#ErrorMsg(s:NOTE,"no more files match Explore pattern",43)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003830 endif
3831
3832 exe "let dirfile= w:netrw_explore_list[".indx."]"
3833" call Decho("dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">")
3834 let newdir= substitute(dirfile,'/[^/]*$','','e')
3835" call Decho("newdir<".newdir.">")
3836
3837" call Decho("calling LocalBrowseCheck(newdir<".newdir.">)")
3838 call netrw#LocalBrowseCheck(newdir)
3839 if !exists("w:netrw_liststyle")
3840 let w:netrw_liststyle= g:netrw_liststyle
3841 endif
3842 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:LONGLIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003843 keepj call search('^'.substitute(dirfile,"^.*/","","").'\>',"W")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003844 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003845 keepj call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003846 endif
3847 let w:netrw_explore_mtchcnt = indx + 1
3848 let w:netrw_explore_bufnr = bufnr("%")
3849 let w:netrw_explore_line = line(".")
3850 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}')
3851" call Decho("explore: mtchcnt=".w:netrw_explore_mtchcnt." bufnr=".w:netrw_explore_bufnr." line#".w:netrw_explore_line)
3852
3853 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003854" call Decho("your vim does not have +path_extra")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003855 if !exists("g:netrw_quiet")
3856 call netrw#ErrorMsg(s:WARNING,"your vim needs the +path_extra feature for Exploring with **!",44)
3857 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003858 sil! let @* = keepregstar
3859 sil! let @+ = keepregstar
3860 sil! let @/ = keepregslash
Bram Moolenaar9964e462007-05-05 17:54:07 +00003861" call Dret("netrw#Explore : missing +path_extra")
3862 return
3863 endif
3864
3865 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01003866" call Decho("default case: Explore newdir<".dirname.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00003867 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && dirname =~ '/'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003868 sil! unlet w:netrw_treedict
3869 sil! unlet w:netrw_treetop
Bram Moolenaar9964e462007-05-05 17:54:07 +00003870 endif
3871 let newdir= dirname
3872 if !exists("b:netrw_curdir")
3873 call netrw#LocalBrowseCheck(getcwd())
3874 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00003875 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,newdir))
Bram Moolenaar9964e462007-05-05 17:54:07 +00003876 endif
3877 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003878" call FOTEST(5)
Bram Moolenaar9964e462007-05-05 17:54:07 +00003879
Bram Moolenaar446cb832008-06-24 21:56:24 +00003880 " visual display of **/ **// */ Exploration files
Bram Moolenaar5c736222010-01-06 20:54:52 +01003881" call Decho("w:netrw_explore_indx=".(exists("w:netrw_explore_indx")? w:netrw_explore_indx : "doesn't exist"))
3882" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "n/a").">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003883 if exists("w:netrw_explore_indx") && exists("b:netrw_curdir")
Bram Moolenaar5c736222010-01-06 20:54:52 +01003884" call Decho("s:explore_prvdir<".(exists("s:explore_prvdir")? s:explore_prvdir : "-doesn't exist-"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00003885 if !exists("s:explore_prvdir") || s:explore_prvdir != b:netrw_curdir
3886 " only update match list if current directory isn't the same as before
Bram Moolenaar5c736222010-01-06 20:54:52 +01003887" call Decho("only update match list if current directory not the same as before")
Bram Moolenaar446cb832008-06-24 21:56:24 +00003888 let s:explore_prvdir = b:netrw_curdir
3889 let s:explore_match = ""
Bram Moolenaar5c736222010-01-06 20:54:52 +01003890 let dirlen = s:Strlen(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003891 if b:netrw_curdir !~ '/$'
3892 let dirlen= dirlen + 1
3893 endif
3894 let prvfname= ""
3895 for fname in w:netrw_explore_list
3896" call Decho("fname<".fname.">")
3897 if fname =~ '^'.b:netrw_curdir
3898 if s:explore_match == ""
Bram Moolenaar5c736222010-01-06 20:54:52 +01003899 let s:explore_match= '\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00003900 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01003901 let s:explore_match= s:explore_match.'\|\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00003902 endif
3903 elseif fname !~ '^/' && fname != prvfname
3904 if s:explore_match == ""
Bram Moolenaar5c736222010-01-06 20:54:52 +01003905 let s:explore_match= '\<'.escape(fname,g:netrw_markfileesc).'\>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00003906 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01003907 let s:explore_match= s:explore_match.'\|\<'.escape(fname,g:netrw_markfileesc).'\>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00003908 endif
3909 endif
3910 let prvfname= fname
3911 endfor
3912" call Decho("explore_match<".s:explore_match.">")
3913 exe "2match netrwMarkFile /".s:explore_match."/"
3914 endif
3915 echo "<s-up>==Pexplore <s-down>==Nexplore"
3916 else
3917 2match none
3918 if exists("s:explore_match") | unlet s:explore_match | endif
3919 if exists("s:explore_prvdir") | unlet s:explore_prvdir | endif
3920 echo " "
3921" call Decho("cleared explore match list")
3922 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01003923" call FOTEST(6)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003924
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003925 sil! let @* = keepregstar
3926 sil! let @+ = keepregstar
3927 sil! let @/ = keepregslash
Bram Moolenaar9964e462007-05-05 17:54:07 +00003928" call Dret("netrw#Explore : @/<".@/.">")
3929endfun
3930
3931" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01003932" s:NetrwExploreListUniq: {{{2
3933fun! s:NetrwExploreListUniq(explist)
3934" call Dfunc("s:NetrwExploreListUniq(explist)")
3935
3936 " this assumes that the list is already sorted
3937 let newexplist= []
3938 for member in a:explist
3939 if !exists("uniqmember") || member != uniqmember
3940 let uniqmember = member
3941 let newexplist = newexplist + [ member ]
3942 endif
3943 endfor
3944
3945" call Dret("s:NetrwExploreListUniq")
3946 return newexplist
3947endfun
3948
3949" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00003950" s:NetrwHide: this function is invoked by the "a" map for browsing {{{2
3951" and switches the hiding mode. The actual hiding is done by
3952" s:NetrwListHide().
3953" g:netrw_hide= 0: show all
3954" 1: show not-hidden files
3955" 2: show hidden files only
3956fun! s:NetrwHide(islocal)
3957" call Dfunc("NetrwHide(islocal=".a:islocal.") g:netrw_hide=".g:netrw_hide)
3958 let svpos= netrw#NetrwSavePosn()
3959
3960 if exists("s:netrwmarkfilelist_{bufnr('%')}")
3961" call Decho(((g:netrw_hide == 1)? "unhide" : "hide")." files in markfilelist<".string(s:netrwmarkfilelist_{bufnr("%")}).">")
3962" call Decho("g:netrw_list_hide<".g:netrw_list_hide.">")
3963
3964 " hide the files in the markfile list
3965 for fname in s:netrwmarkfilelist_{bufnr("%")}
3966" call Decho("match(g:netrw_list_hide<".g:netrw_list_hide.'> fname<\<'.fname.'\>>)='.match(g:netrw_list_hide,'\<'.fname.'\>')." isk=".&isk)
3967 if match(g:netrw_list_hide,'\<'.fname.'\>') != -1
3968 " remove fname from hiding list
3969 let g:netrw_list_hide= substitute(g:netrw_list_hide,'..\<'.escape(fname,g:netrw_fname_escape).'\>..','','')
3970 let g:netrw_list_hide= substitute(g:netrw_list_hide,',,',',','g')
3971 let g:netrw_list_hide= substitute(g:netrw_list_hide,'^,\|,$','','')
3972" call Decho("unhide: g:netrw_list_hide<".g:netrw_list_hide.">")
3973 else
3974 " append fname to hiding list
3975 if exists("g:netrw_list_hide") && g:netrw_list_hide != ""
3976 let g:netrw_list_hide= g:netrw_list_hide.',\<'.escape(fname,g:netrw_fname_escape).'\>'
3977 else
3978 let g:netrw_list_hide= '\<'.escape(fname,g:netrw_fname_escape).'\>'
3979 endif
3980" call Decho("hide: g:netrw_list_hide<".g:netrw_list_hide.">")
3981 endif
3982 endfor
Bram Moolenaar5c736222010-01-06 20:54:52 +01003983 call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003984 let g:netrw_hide= 1
3985
3986 else
3987
3988 " switch between show-all/show-not-hidden/show-hidden
3989 let g:netrw_hide=(g:netrw_hide+1)%3
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003990 exe "keepj norm! 0"
Bram Moolenaar446cb832008-06-24 21:56:24 +00003991 if g:netrw_hide && g:netrw_list_hide == ""
3992 call netrw#ErrorMsg(s:WARNING,"your hiding list is empty!",49)
3993" call Dret("NetrwHide")
3994 return
3995 endif
3996 endif
3997
3998 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3999 call netrw#NetrwRestorePosn(svpos)
4000" call Dret("NetrwHide")
Bram Moolenaar9964e462007-05-05 17:54:07 +00004001endfun
4002
4003" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004004" s:NetrwHidden: invoked by "gh" {{{2
4005fun! s:NetrwHidden(islocal)
4006" call Dfunc("s:NetrwHidden()")
4007 " save current position
4008 let svpos= netrw#NetrwSavePosn()
4009
4010 if g:netrw_list_hide =~ '\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+'
4011 " remove pattern from hiding list
4012 let g:netrw_list_hide= substitute(g:netrw_list_hide,'\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+','','')
Bram Moolenaar5c736222010-01-06 20:54:52 +01004013 elseif s:Strlen(g:netrw_list_hide) >= 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00004014 let g:netrw_list_hide= g:netrw_list_hide . ',\(^\|\s\s\)\zs\.\S\+'
4015 else
4016 let g:netrw_list_hide= '\(^\|\s\s\)\zs\.\S\+'
4017 endif
4018
4019 " refresh screen and return to saved position
4020 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4021 call netrw#NetrwRestorePosn(svpos)
4022" call Dret("s:NetrwHidden")
4023endfun
4024
4025" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01004026" s:NetrwHome: this function determines a "home" for saving bookmarks and history {{{2
4027fun! s:NetrwHome()
4028 if exists("g:netrw_home")
4029 let home= g:netrw_home
4030 else
4031 " go to vim plugin home
4032 for home in split(&rtp,',') + ['']
4033 if isdirectory(home) && filewritable(home) | break | endif
4034 let basehome= substitute(home,'[/\\]\.vim$','','')
4035 if isdirectory(basehome) && filewritable(basehome)
4036 let home= basehome."/.vim"
4037 break
4038 endif
4039 endfor
4040 if home == ""
4041 " just pick the first directory
4042 let home= substitute(&rtp,',.*$','','')
4043 endif
4044 if (has("win32") || has("win95") || has("win64") || has("win16"))
4045 let home= substitute(home,'/','\\','g')
4046 endif
4047 endif
4048 " insure that the home directory exists
4049 if !isdirectory(home)
4050 if exists("g:netrw_mkdir")
4051 call system(g:netrw_mkdir." ".shellescape(home))
4052 else
4053 call mkdir(home)
4054 endif
4055 endif
4056 let g:netrw_home= home
4057 return home
4058endfun
4059
4060" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00004061" s:NetrwLeftmouse: handles the <leftmouse> when in a netrw browsing window {{{2
4062fun! s:NetrwLeftmouse(islocal)
4063" call Dfunc("s:NetrwLeftmouse(islocal=".a:islocal.")")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004064
4065 " check if the status bar was clicked on instead of a file/directory name
4066 call feedkeys("\<LeftMouse>")
4067 let c= getchar()
4068 let mouse_lnum = v:mouse_lnum
4069 let wlastline = line('w$')
4070 let lastline = line('$')
4071" call Decho("v:mouse_lnum=".mouse_lnum." line(w$)=".wlastline." line($)=".lastline." v:mouse_win=".v:mouse_win." winnr#".winnr())
4072" call Decho("v:mouse_col =".v:mouse_col." col=".col(".")." wincol =".wincol()." winwidth =".winwidth(0))
4073 if mouse_lnum >= wlastline + 1 || v:mouse_win != winnr()
4074 " appears to be a status bar leftmouse click
4075" call Dret("s:NetrwLeftmouse : detected a status bar leftmouse click")
4076 return
4077 endif
4078 if v:mouse_col != col('.')
4079" call Dret("s:NetrwLeftmouse : detected a vertical separator bar leftmouse click")
4080 return
4081 endif
4082
Bram Moolenaar446cb832008-06-24 21:56:24 +00004083 if a:islocal
4084 if exists("b:netrw_curdir")
4085 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
4086 endif
4087 else
4088 if exists("b:netrw_curdir")
4089 call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
4090 endif
4091 endif
4092" call Dret("s:NetrwLeftmouse")
4093endfun
4094
4095" ---------------------------------------------------------------------
4096" s:NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
4097" separated patterns given in g:netrw_list_hide
4098fun! s:NetrwListHide()
4099" call Dfunc("NetrwListHide() hide=".g:netrw_hide." listhide<".g:netrw_list_hide.">")
4100
4101 " find a character not in the "hide" string to use as a separator for :g and :v commands
4102 " How-it-works: take the hiding command, convert it into a range. Duplicate
4103 " characters don't matter. Remove all such characters from the '/~...90'
4104 " string. Use the first character left as a separator character.
4105 let listhide= g:netrw_list_hide
4106 let sep = strpart(substitute('/~@#$%^&*{};:,<.>?|1234567890','['.escape(listhide,'-]^\').']','','ge'),1,1)
4107" call Decho("sep=".sep)
4108
4109 while listhide != ""
4110 if listhide =~ ','
4111 let hide = substitute(listhide,',.*$','','e')
4112 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
4113 else
4114 let hide = listhide
4115 let listhide = ""
4116 endif
4117
4118 " Prune the list by hiding any files which match
4119 if g:netrw_hide == 1
4120" call Decho("hiding<".hide."> listhide<".listhide.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004121 exe 'sil keepj '.w:netrw_bannercnt.',$g'.sep.hide.sep.'d'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004122 elseif g:netrw_hide == 2
4123" call Decho("showing<".hide."> listhide<".listhide.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004124 exe 'sil keepj '.w:netrw_bannercnt.',$g'.sep.hide.sep.'s@^@ /-KEEP-/ @'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004125 endif
4126 endwhile
4127 if g:netrw_hide == 2
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004128 exe 'sil keepj '.w:netrw_bannercnt.',$v@^ /-KEEP-/ @d'
4129 exe 'sil keepj '.w:netrw_bannercnt.',$s@^\%( /-KEEP-/ \)\+@@e'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004130 endif
4131
4132" call Dret("NetrwListHide")
4133endfun
4134
4135" ---------------------------------------------------------------------
4136" NetrwHideEdit: allows user to edit the file/directory hiding list
4137fun! s:NetrwHideEdit(islocal)
4138" call Dfunc("NetrwHideEdit(islocal=".a:islocal.")")
4139
4140 " save current cursor position
4141 let svpos= netrw#NetrwSavePosn()
4142
4143 " get new hiding list from user
4144 call inputsave()
4145 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
4146 call inputrestore()
4147 let g:netrw_list_hide= newhide
4148" call Decho("new g:netrw_list_hide<".g:netrw_list_hide.">")
4149
4150 " refresh the listing
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004151 silent keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,"./"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004152
4153 " restore cursor position
4154 call netrw#NetrwRestorePosn(svpos)
4155
4156" call Dret("NetrwHideEdit")
4157endfun
4158
4159" ---------------------------------------------------------------------
4160" NetSortSequence: allows user to edit the sorting sequence
4161fun! s:NetSortSequence(islocal)
4162" call Dfunc("NetSortSequence(islocal=".a:islocal.")")
4163
4164 let svpos= netrw#NetrwSavePosn()
4165 call inputsave()
4166 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
4167 call inputrestore()
4168
4169 " refresh the listing
4170 let g:netrw_sort_sequence= newsortseq
4171 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4172 call netrw#NetrwRestorePosn(svpos)
4173
4174" call Dret("NetSortSequence")
4175endfun
4176
4177" ---------------------------------------------------------------------
4178" s:NetrwMakeDir: this function makes a directory (both local and remote) {{{2
4179fun! s:NetrwMakeDir(usrhost)
4180" call Dfunc("NetrwMakeDir(usrhost<".a:usrhost.">)")
4181
4182 " get name of new directory from user. A bare <CR> will skip.
4183 " if its currently a directory, also request will be skipped, but with
4184 " a message.
4185 call inputsave()
4186 let newdirname= input("Please give directory name: ")
4187 call inputrestore()
4188" call Decho("newdirname<".newdirname.">")
4189
4190 if newdirname == ""
4191" call Dret("NetrwMakeDir : user aborted with bare <cr>")
4192 return
4193 endif
4194
4195 if a:usrhost == ""
4196" call Decho("local mkdir")
4197
4198 " Local mkdir:
4199 " sanity checks
4200 let fullnewdir= b:netrw_curdir.'/'.newdirname
4201" call Decho("fullnewdir<".fullnewdir.">")
4202 if isdirectory(fullnewdir)
4203 if !exists("g:netrw_quiet")
4204 call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a directory!",24)
4205 endif
4206" call Dret("NetrwMakeDir : directory<".newdirname."> exists previously")
4207 return
4208 endif
4209 if s:FileReadable(fullnewdir)
4210 if !exists("g:netrw_quiet")
4211 call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a file!",25)
4212 endif
4213" call Dret("NetrwMakeDir : file<".newdirname."> exists previously")
4214 return
4215 endif
4216
4217 " requested new local directory is neither a pre-existing file or
4218 " directory, so make it!
4219 if exists("*mkdir")
4220 call mkdir(fullnewdir,"p")
4221 else
4222 let netrw_origdir= s:NetrwGetcwd(1)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004223 exe 'keepj lcd '.fnameescape(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004224" call Decho("netrw_origdir<".netrw_origdir.">: lcd b:netrw_curdir<".fnameescape(b:netrw_curdir).">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00004225" call Decho("exe silent! !".g:netrw_local_mkdir.' '.shellescape(newdirname,1))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004226 exe "sil! !".g:netrw_local_mkdir.' '.shellescape(newdirname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004227 if !g:netrw_keepdir
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004228 exe 'keepj lcd '.fnameescape(netrw_origdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004229" call Decho("netrw_keepdir=".g:netrw_keepdir.": keepjumps lcd ".fnameescape(netrw_origdir)." getcwd<".getcwd().">")
4230 endif
4231 endif
4232
4233 if v:shell_error == 0
4234 " refresh listing
4235" call Decho("refresh listing")
4236 let svpos= netrw#NetrwSavePosn()
4237 call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
4238 call netrw#NetrwRestorePosn(svpos)
4239 elseif !exists("g:netrw_quiet")
4240 call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",26)
4241 endif
4242" redraw!
4243
4244 elseif !exists("b:netrw_method") || b:netrw_method == 4
4245 " Remote mkdir:
4246" call Decho("remote mkdir")
4247 let mkdircmd = s:MakeSshCmd(g:netrw_mkdir_cmd)
4248 let newdirname= substitute(b:netrw_curdir,'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname
Bram Moolenaarc236c162008-07-13 17:41:49 +00004249" call Decho("exe silent! !".mkdircmd." ".shellescape(newdirname,1))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004250 exe "sil! !".mkdircmd." ".shellescape(newdirname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004251 if v:shell_error == 0
4252 " refresh listing
4253 let svpos= netrw#NetrwSavePosn()
4254 call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
4255 call netrw#NetrwRestorePosn(svpos)
4256 elseif !exists("g:netrw_quiet")
4257 call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",27)
4258 endif
4259" redraw!
4260
4261 elseif b:netrw_method == 2
4262 " COMBAK -- future work
4263 call netrw#ErrorMsg(s:ERROR,"making directories via ftp not currently supported",68)
4264 elseif b:netrw_method == 3
4265 " COMBAK -- future work
4266 call netrw#ErrorMsg(s:ERROR,"making directories via ftp not currently supported",68)
4267 endif
4268
4269" call Dret("NetrwMakeDir")
4270endfun
4271
4272" ---------------------------------------------------------------------
4273" s:NetrwMarkFile: (invoked by mf) This function is used to both {{{2
4274" mark and unmark files. If a markfile list exists,
4275" then the rename and delete functions will use it instead
4276" of whatever may happen to be under the cursor at that
4277" moment. When the mouse and gui are available,
4278" shift-leftmouse may also be used to mark files.
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004279"
4280" Creates two lists
4281" s:netrwmarkfilelist -- holds complete paths to all marked files
4282" s:netrwmarkfilelist_# -- holds list of marked files in current-buffer's directory (#==bufnr())
4283"
4284" Creates a marked file match string
4285" s:netrwmarfilemtch_# -- used with 2match to display marked files
4286"
Bram Moolenaared39e1d2008-08-09 17:55:22 +00004287" Creates a buffer version of islocal
4288" b:netrw_islocal
4289"
Bram Moolenaar446cb832008-06-24 21:56:24 +00004290fun! s:NetrwMarkFile(islocal,fname)
4291" call Dfunc("s:NetrwMarkFile(islocal=".a:islocal." fname<".a:fname.">)")
4292 let curbufnr= bufnr("%")
4293 let curdir = b:netrw_curdir
Bram Moolenaar5c736222010-01-06 20:54:52 +01004294 let trailer = '[@=|\/\*]\=\>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00004295 if exists("s:netrwmarkfilelist_{curbufnr}")
4296 " markfile list exists
4297" call Decho("starting s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
4298" call Decho("starting s:netrwmarkfilemtch_{curbufnr}<".s:netrwmarkfilemtch_{curbufnr}.">")
Bram Moolenaared39e1d2008-08-09 17:55:22 +00004299 let b:netrw_islocal= a:islocal
Bram Moolenaar446cb832008-06-24 21:56:24 +00004300
4301 if index(s:netrwmarkfilelist_{curbufnr},a:fname) == -1
Bram Moolenaared39e1d2008-08-09 17:55:22 +00004302 " append filename to buffer's markfilelist
Bram Moolenaar446cb832008-06-24 21:56:24 +00004303" call Decho("append filename<".a:fname."> to local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
4304 call add(s:netrwmarkfilelist_{curbufnr},a:fname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004305 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(a:fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00004306
4307 else
Bram Moolenaared39e1d2008-08-09 17:55:22 +00004308 " remove filename from buffer's markfilelist
Bram Moolenaar446cb832008-06-24 21:56:24 +00004309" call Decho("remove filename<".a:fname."> from local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
4310 call filter(s:netrwmarkfilelist_{curbufnr},'v:val != a:fname')
4311 if s:netrwmarkfilelist_{curbufnr} == []
4312 " local markfilelist is empty; remove it entirely
Bram Moolenaar5c736222010-01-06 20:54:52 +01004313" call Decho("markfile list now empty")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004314 call s:NetrwUnmarkList(curbufnr,curdir)
4315 else
4316 " rebuild match list to display markings correctly
4317" call Decho("rebuild s:netrwmarkfilemtch_".curbufnr)
4318 let s:netrwmarkfilemtch_{curbufnr}= ""
4319 let first = 1
4320 for fname in s:netrwmarkfilelist_{curbufnr}
4321 if first
Bram Moolenaar5c736222010-01-06 20:54:52 +01004322 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00004323 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01004324 let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00004325 endif
4326 let first= 0
4327 endfor
4328" call Decho("ending s:netrwmarkfilelist_"curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
4329" call Decho("ending s:netrwmarkfilemtch_"curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">")
4330 endif
4331 endif
4332
4333 else
4334 " initialize new markfilelist
4335
4336" call Decho("add fname<".a:fname."> to new markfilelist_".curbufnr)
4337 let s:netrwmarkfilelist_{curbufnr}= []
4338 call add(s:netrwmarkfilelist_{curbufnr},a:fname)
4339" call Decho("ending s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
4340
4341 " build initial markfile matching pattern
4342 if a:fname =~ '/$'
4343 let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc)
4344 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01004345 let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc).trailer
Bram Moolenaar446cb832008-06-24 21:56:24 +00004346 endif
4347" call Decho("ending s:netrwmarkfilemtch_".curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">")
4348 endif
4349
4350 " handle global markfilelist
4351 if exists("s:netrwmarkfilelist")
4352 let dname= s:ComposePath(b:netrw_curdir,a:fname)
4353 if index(s:netrwmarkfilelist,dname) == -1
4354 " append new filename to global markfilelist
4355 call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
4356" call Decho("append filename<".a:fname."> to global markfilelist<".string(s:netrwmarkfilelist).">")
4357 else
4358 " remove new filename from global markfilelist
4359" call Decho("filter(".string(s:netrwmarkfilelist).",'v:val != '.".dname.")")
4360 call filter(s:netrwmarkfilelist,'v:val != "'.dname.'"')
4361" call Decho("ending s:netrwmarkfilelist <".string(s:netrwmarkfilelist).">")
4362 if s:netrwmarkfilelist == []
4363 unlet s:netrwmarkfilelist
4364 endif
4365 endif
4366 else
4367 " initialize new global-directory markfilelist
4368 let s:netrwmarkfilelist= []
4369 call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
4370" call Decho("init s:netrwmarkfilelist<".string(s:netrwmarkfilelist).">")
4371 endif
4372
4373 " set up 2match'ing to netrwmarkfilemtch list
4374 if exists("s:netrwmarkfilemtch_{curbufnr}") && s:netrwmarkfilemtch_{curbufnr} != ""
4375" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004376 if exists("g:did_drchip_netrwlist_syntax")
4377 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/"
4378 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004379 else
4380" call Decho("2match none")
4381 2match none
4382 endif
4383" call Dret("s:NetrwMarkFile : netrwmarkfilelist_".curbufnr."<".(exists("s:netrwmarkfilelist_{curbufnr}")? string(s:netrwmarkfilelist_{curbufnr}) : " doesn't exist").">")
4384endfun
4385
4386" ---------------------------------------------------------------------
4387" s:NetrwMarkFileCompress: (invoked by mz) This function is used to {{{2
4388" compress/decompress files using the programs
4389" in g:netrw_compress and g:netrw_uncompress,
4390" using g:netrw_compress_suffix to know which to
4391" do. By default:
4392" g:netrw_compress = "gzip"
4393" g:netrw_decompress = { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf"}
4394fun! s:NetrwMarkFileCompress(islocal)
4395" call Dfunc("s:NetrwMarkFileCompress(islocal=".a:islocal.")")
4396 let svpos = netrw#NetrwSavePosn()
4397 let curdir = b:netrw_curdir
4398 let curbufnr = bufnr("%")
4399
4400 if exists("s:netrwmarkfilelist_{curbufnr}") && exists("g:netrw_compress") && exists("g:netrw_decompress")
4401 for fname in s:netrwmarkfilelist_{curbufnr}
4402 " for every filename in the marked list
4403 for sfx in sort(keys(g:netrw_decompress))
4404 if fname =~ '\'.sfx.'$'
4405 " fname has a suffix indicating that its compressed; apply associated decompression routine
Bram Moolenaar5c736222010-01-06 20:54:52 +01004406 let exe= netrw#WinPath(g:netrw_decompress[sfx])
Bram Moolenaar446cb832008-06-24 21:56:24 +00004407" call Decho("fname<".fname."> is compressed so decompress with <".exe.">")
4408 if a:islocal
4409 if g:netrw_keepdir
Bram Moolenaarc236c162008-07-13 17:41:49 +00004410 let fname= shellescape(s:ComposePath(curdir,fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004411 endif
4412 else
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004413 let fname= shellescape(b:netrw_curdir.fname,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004414 endif
4415 if executable(exe)
4416 if a:islocal
4417 call system(exe." ".fname)
4418 else
4419 call s:RemoteSystem(exe." ".fname)
4420 endif
4421 else
4422 call netrw#ErrorMsg(s:WARNING,"unable to apply<".exe."> to file<".fname.">",50)
4423 endif
4424 break
4425 endif
4426 endfor
4427 if exists("exe")
4428 unlet exe
4429 elseif a:islocal
4430 " fname not a compressed file, so compress it
Bram Moolenaar5c736222010-01-06 20:54:52 +01004431 call system(netrw#WinPath(g:netrw_compress)." ".shellescape(s:ComposePath(b:netrw_curdir,fname)))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004432 else
4433 " fname not a compressed file, so compress it
Bram Moolenaar5c736222010-01-06 20:54:52 +01004434 call s:RemoteSystem(netrw#WinPath(g:netrw_compress)." ".shellescape(fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004435 endif
4436 endfor
4437 call s:NetrwUnmarkList(curbufnr,curdir)
4438 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4439 call netrw#NetrwRestorePosn(svpos)
4440 endif
4441" call Dret("s:NetrwMarkFileCompress")
4442endfun
4443
4444" ---------------------------------------------------------------------
4445" s:NetrwMarkFileCopy: (invoked by mc) copy marked files to target {{{2
4446" If no marked files, then set up directory as the
4447" target. Currently does not support copying entire
4448" directories. Uses the local-buffer marked file list.
4449" Returns 1=success (used by NetrwMarkFileMove())
4450" 0=failure
4451fun! s:NetrwMarkFileCopy(islocal)
4452" call Dfunc("s:NetrwMarkFileCopy(islocal=".a:islocal.") target<".(exists("s:netrwmftgt")? s:netrwmftgt : '---').">")
4453
4454 " sanity checks
4455 if !exists("s:netrwmarkfilelist_{bufnr('%')}") || empty(s:netrwmarkfilelist_{bufnr('%')})
4456 call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
4457" call Dret("s:NetrwMarkFileCopy 0")
4458 return 0
4459 endif
4460" call Decho("sanity chk passed: s:netrwmarkfilelist_".bufnr('%')."<".string(s:netrwmarkfilelist_{bufnr('%')}))
4461 if !exists("s:netrwmftgt")
4462 call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67)
4463" call Dret("s:NetrwMarkFileCopy 0")
4464 return 0
4465 endif
4466" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
4467 let curdir = b:netrw_curdir
4468 let curbufnr = bufnr("%")
4469
4470 if a:islocal && s:netrwmftgt_islocal
4471 " Copy marked files, local directory to local directory
4472" call Decho("copy from local to local")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004473 let args= join(map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),"shellescape(b:netrw_curdir.\"/\".v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004474" call Decho("system(".g:netrw_localcopycmd." ".args." ".shellescape(s:netrwmftgt).")")
Bram Moolenaar5c736222010-01-06 20:54:52 +01004475 call system(netrw#WinPath(g:netrw_localcopycmd)." ".args." ".shellescape(s:netrwmftgt))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004476
4477 elseif a:islocal && !s:netrwmftgt_islocal
4478 " Copy marked files, local directory to remote directory
4479" call Decho("copy from local to remote")
4480 call s:NetrwUpload(s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
4481
4482 elseif !a:islocal && s:netrwmftgt_islocal
4483" call Decho("copy from remote to local")
4484 call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
4485
4486 elseif !a:islocal && !s:netrwmftgt_islocal
4487" call Decho("copy from remote to remote")
4488 let curdir = getcwd()
4489 let tmpdir = s:GetTempfile("")
4490 if tmpdir !~ '/'
4491 let tmpdir= curdir."/".tmpdir
4492 endif
4493 if exists("*mkdir")
4494 call mkdir(tmpdir)
4495 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004496 exe "sil! !".g:netrw_local_mkdir.' '.shellescape(tmpdir,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004497 endif
4498 if isdirectory(tmpdir)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004499 exe "keepj lcd ".fnameescape(tmpdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004500 call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},tmpdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004501 let localfiles= map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),'substitute(v:val,"^.*/","","")')
Bram Moolenaar446cb832008-06-24 21:56:24 +00004502 call s:NetrwUpload(localfiles,s:netrwmftgt)
4503 if getcwd() == tmpdir
4504 for fname in s:netrwmarkfilelist_{bufnr('%')}
Bram Moolenaarc236c162008-07-13 17:41:49 +00004505 call s:NetrwDelete(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004506 endfor
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004507 exe "keepj lcd ".fnameescape(curdir)
4508 exe "sil !".g:netrw_local_rmdir." ".shellescape(tmpdir,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004509 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004510 exe "keepj lcd ".fnameescape(curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004511 endif
4512 endif
4513 endif
4514
4515 " -------
4516 " cleanup
4517 " -------
4518" call Decho("cleanup")
4519
4520 " remove markings from local buffer
4521 call s:NetrwUnmarkList(curbufnr,curdir)
4522
4523 " refresh buffers
4524 if !s:netrwmftgt_islocal
4525 call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
4526 endif
4527 if a:islocal
4528 call s:NetrwRefreshDir(a:islocal,b:netrw_curdir)
4529 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01004530 if g:netrw_fastbrowse <= 1
4531 call s:LocalBrowseShellCmdRefresh()
4532 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004533
4534" call Dret("s:NetrwMarkFileCopy 1")
4535 return 1
4536endfun
4537
4538" ---------------------------------------------------------------------
4539" s:NetrwMarkFileDiff: (invoked by md) This function is used to {{{2
4540" invoke vim's diff mode on the marked files.
4541" Either two or three files can be so handled.
4542" Uses the global marked file list.
4543fun! s:NetrwMarkFileDiff(islocal)
4544" call Dfunc("s:NetrwMarkFileDiff(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
4545 let curbufnr= bufnr("%")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004546
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004547 if exists("s:netrwmarkfilelist_{curbufnr}")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004548 let cnt = 0
4549 let curdir = b:netrw_curdir
4550 for fname in s:netrwmarkfilelist
4551 let cnt= cnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00004552 if cnt == 1
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004553" call Decho("diffthis: fname<".fname.">")
4554 exe "e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004555 diffthis
4556 elseif cnt == 2 || cnt == 3
4557 vsplit
4558 wincmd l
4559" call Decho("diffthis: ".fname)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004560 exe "e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004561 diffthis
4562 else
4563 break
4564 endif
4565 endfor
4566 call s:NetrwUnmarkList(curbufnr,curdir)
4567 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004568
Bram Moolenaar446cb832008-06-24 21:56:24 +00004569" call Dret("s:NetrwMarkFileDiff")
4570endfun
4571
4572" ---------------------------------------------------------------------
4573" s:NetrwMarkFileEdit: (invoked by me) put marked files on arg list and start editing them {{{2
4574" Uses global markfilelist
4575fun! s:NetrwMarkFileEdit(islocal)
4576" call Dfunc("s:NetrwMarkFileEdit(islocal=".a:islocal.")")
4577
4578 let curdir = b:netrw_curdir
4579 let curbufnr = bufnr("%")
4580 if exists("s:netrwmarkfilelist_{curbufnr}")
4581 call s:SetRexDir(a:islocal,curdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004582 let flist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004583 " unmark markedfile list
4584" call s:NetrwUnmarkList(curbufnr,curdir)
4585 call s:NetrwUnmarkAll()
4586" call Decho("exe silent args ".flist)
4587 exe "silent args ".flist
4588 endif
4589
4590" call Dret("s:NetrwMarkFileEdit")
4591endfun
4592
4593" ---------------------------------------------------------------------
4594" s:NetrwMarkFileExe: (invoked by mx) execute arbitrary command on marked files, one at a time {{{2
4595" Uses the local marked-file list.
4596fun! s:NetrwMarkFileExe(islocal)
4597" call Dfunc("s:NetrwMarkFileExe(islocal=".a:islocal.")")
4598 let svpos = netrw#NetrwSavePosn()
4599 let curdir = b:netrw_curdir
4600 let curbufnr = bufnr("%")
4601
4602 if exists("s:netrwmarkfilelist_{curbufnr}")
4603 " get the command
4604 call inputsave()
4605 let cmd= input("Enter command: ","","file")
4606 call inputrestore()
4607" call Decho("cmd<".cmd.">")
4608
4609 " apply command to marked files. Substitute: filename -> %
4610 " If no %, then append a space and the filename to the command
4611 for fname in s:netrwmarkfilelist_{curbufnr}
4612 if a:islocal
4613 if g:netrw_keepdir
Bram Moolenaar5c736222010-01-06 20:54:52 +01004614 let fname= shellescape(netrw#WinPath(s:ComposePath(curdir,fname)))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004615 endif
4616 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01004617 let fname= shellescape(netrw#WinPath(b:netrw_curdir.fname))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004618 endif
4619 if cmd =~ '%'
4620 let xcmd= substitute(cmd,'%',fname,'g')
4621 else
4622 let xcmd= cmd.' '.fname
4623 endif
4624 if a:islocal
4625" call Decho("local: xcmd<".xcmd.">")
4626 let ret= system(xcmd)
4627 else
4628" call Decho("remote: xcmd<".xcmd.">")
4629 let ret= s:RemoteSystem(xcmd)
4630 endif
4631 if v:shell_error < 0
4632 call netrw#ErrorMsg(s:ERROR,"command<".xcmd."> failed, aborting",54)
4633 break
4634 else
4635 echo ret
4636 endif
4637 endfor
4638
4639 " unmark marked file list
4640 call s:NetrwUnmarkList(curbufnr,curdir)
4641
4642 " refresh the listing
4643 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4644 call netrw#NetrwRestorePosn(svpos)
4645 else
4646 call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
4647 endif
4648
4649" call Dret("s:NetrwMarkFileExe")
4650endfun
4651
4652" ---------------------------------------------------------------------
4653" s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix
4654" as the marked file(s) (toggles suffix presence)
4655" Uses the local marked file list.
4656fun! s:NetrwMarkHideSfx(islocal)
4657" call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")")
4658 let svpos = netrw#NetrwSavePosn()
4659 let curbufnr = bufnr("%")
4660
4661 " s:netrwmarkfilelist_{curbufnr}: the List of marked files
4662 if exists("s:netrwmarkfilelist_{curbufnr}")
4663
4664 for fname in s:netrwmarkfilelist_{curbufnr}
4665" call Decho("s:NetrwMarkFileCopy: fname<".fname.">")
4666 " construct suffix pattern
4667 if fname =~ '\.'
4668 let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','')
4669 else
4670 let sfxpat= '^\%(\%(\.\)\@!.\)*$'
4671 endif
4672 " determine if its in the hiding list or not
4673 let inhidelist= 0
4674 if g:netrw_list_hide != ""
4675 let itemnum = 0
4676 let hidelist= split(g:netrw_list_hide,',')
4677 for hidepat in hidelist
4678 if sfxpat == hidepat
4679 let inhidelist= 1
4680 break
4681 endif
4682 let itemnum= itemnum + 1
4683 endfor
4684 endif
4685" call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">")
4686 if inhidelist
4687 " remove sfxpat from list
4688 call remove(hidelist,itemnum)
4689 let g:netrw_list_hide= join(hidelist,",")
4690 elseif g:netrw_list_hide != ""
4691 " append sfxpat to non-empty list
4692 let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat
4693 else
4694 " set hiding list to sfxpat
4695 let g:netrw_list_hide= sfxpat
4696 endif
4697 endfor
4698
4699 " refresh the listing
4700 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4701 call netrw#NetrwRestorePosn(svpos)
4702 else
4703 call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
4704 endif
4705
4706" call Dret("s:NetrwMarkHideSfx")
4707endfun
4708
4709" ---------------------------------------------------------------------
4710" s:NetrwMarkFileGrep: (invoked by mg) This function applies vimgrep to marked files {{{2
4711" Uses the global markfilelist
4712fun! s:NetrwMarkFileGrep(islocal)
4713" call Dfunc("s:NetrwMarkFileGrep(islocal=".a:islocal.")")
4714 let svpos = netrw#NetrwSavePosn()
Bram Moolenaar446cb832008-06-24 21:56:24 +00004715 let curbufnr = bufnr("%")
4716
4717 if exists("s:netrwmarkfilelist")
4718" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004719 let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004720 call s:NetrwUnmarkAll()
4721
4722 " ask user for pattern
4723 call inputsave()
4724 let pat= input("Enter pattern: ","")
4725 call inputrestore()
4726 if pat !~ '^\s'
4727 if pat !~ '^/'
4728 let pat= '/'.pat.'/'
4729 endif
4730 let pat= " ".pat
4731 endif
4732
4733 " use vimgrep for both local and remote
4734" call Decho("exe vimgrep".pat." ".netrwmarkfilelist)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004735 try
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004736 exe "keepj noautocmd vimgrep".pat." ".netrwmarkfilelist
Bram Moolenaar5c736222010-01-06 20:54:52 +01004737 catch /^Vim\%((\a\+)\)\=:E480/
4738 call netrw#ErrorMsg(s:WARNING,"no match with pattern<".pattern.">",76)
4739" call Dret("s:NetrwMarkFileGrep : unable to find pattern<".pattern.">")
4740 return
4741 endtry
Bram Moolenaar446cb832008-06-24 21:56:24 +00004742
4743 2match none
4744 call netrw#NetrwRestorePosn(svpos)
4745 endif
4746
4747" call Dret("s:NetrwMarkFileGrep")
4748endfun
4749
4750" ---------------------------------------------------------------------
4751" s:NetrwMarkFileMove: (invoked by mm) execute arbitrary command on marked files, one at a time {{{2
4752" uses the global marked file list
4753" s:netrwmfloc= 0: target directory is remote
4754" = 1: target directory is local
4755fun! s:NetrwMarkFileMove(islocal)
4756" call Dfunc("s:NetrwMarkFileMove(islocal=".a:islocal.")")
4757 let curdir = b:netrw_curdir
4758 let curbufnr = bufnr("%")
4759
4760 " sanity check
4761 if !exists("s:netrwmarkfilelist_{bufnr('%')}") || empty(s:netrwmarkfilelist_{bufnr('%')})
4762 call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
4763" call Dret("s:NetrwMarkFileMove")
4764 return
4765 endif
4766" call Decho("sanity chk passed: s:netrwmarkfilelist_".bufnr('%')."<".string(s:netrwmarkfilelist_{bufnr('%')}))
4767 if !exists("s:netrwmftgt")
4768 call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67)
4769" call Dret("s:NetrwMarkFileCopy 0")
4770 return 0
4771 endif
4772" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
4773
4774 if a:islocal && s:netrwmftgt_islocal
4775 " move: local -> local
4776" call Decho("move from local to local")
4777" call Decho("(s:NetrwMarkFileMove) local to local move")
4778 if executable(g:netrw_localmovecmd)
4779 for fname in s:netrwmarkfilelist_{bufnr("%")}
4780" call Decho("system(".g:netrw_localmovecmd." ".shellescape(fname)." ".shellescape(s:netrwmftgt).")")
4781 let ret= system(g:netrw_localmovecmd." ".shellescape(fname)." ".shellescape(s:netrwmftgt))
4782 if v:shell_error < 0
4783 call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> failed, aborting",54)
4784 break
4785 endif
4786 endfor
4787 else
4788 call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> is not executable!",57)
4789 endif
4790
4791 elseif a:islocal && !s:netrwmftgt_islocal
4792 " move: local -> remote
4793" call Decho("move from local to remote")
4794" call Decho("copy")
4795 let mflist= s:netrwmarkfilelist_{bufnr("%")}
4796 call s:NetrwMarkFileCopy(a:islocal)
4797" call Decho("remove")
4798 for fname in mflist
4799 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
4800 let ok = s:NetrwLocalRmFile(b:netrw_curdir,barefname,1)
4801 endfor
4802 unlet mflist
4803
4804 elseif !a:islocal && s:netrwmftgt_islocal
4805 " move: remote -> local
4806" call Decho("move from remote to local")
4807" call Decho("copy")
4808 let mflist= s:netrwmarkfilelist_{bufnr("%")}
4809 call s:NetrwMarkFileCopy(a:islocal)
4810" call Decho("remove")
4811 for fname in mflist
4812 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
4813 let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
4814 endfor
4815 unlet mflist
4816
4817 elseif !a:islocal && !s:netrwmftgt_islocal
4818 " move: remote -> remote
4819" call Decho("move from remote to remote")
4820" call Decho("copy")
4821 let mflist= s:netrwmarkfilelist_{bufnr("%")}
4822 call s:NetrwMarkFileCopy(a:islocal)
4823" call Decho("remove")
4824 for fname in mflist
4825 let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
4826 let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
4827 endfor
4828 unlet mflist
4829 endif
4830
4831 " -------
4832 " cleanup
4833 " -------
4834" call Decho("cleanup")
4835
4836 " remove markings from local buffer
4837 call s:NetrwUnmarkList(curbufnr,curdir) " remove markings from local buffer
4838
4839 " refresh buffers
4840 if !s:netrwmftgt_islocal
4841 call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
4842 endif
4843 if a:islocal
4844 call s:NetrwRefreshDir(a:islocal,b:netrw_curdir)
4845 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01004846 if g:netrw_fastbrowse <= 1
4847 call s:LocalBrowseShellCmdRefresh()
4848 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00004849
4850" call Dret("s:NetrwMarkFileMove")
4851endfun
4852
4853" ---------------------------------------------------------------------
4854" s:NetrwMarkFilePrint: (invoked by mp) This function prints marked files {{{2
4855" using the hardcopy command. Local marked-file list only.
4856fun! s:NetrwMarkFilePrint(islocal)
4857" call Dfunc("s:NetrwMarkFilePrint(islocal=".a:islocal.")")
4858 let curbufnr= bufnr("%")
4859 if exists("s:netrwmarkfilelist_{curbufnr}")
4860 let netrwmarkfilelist = s:netrwmarkfilelist_{curbufnr}
4861 let curdir = b:netrw_curdir
4862 call s:NetrwUnmarkList(curbufnr,curdir)
4863 for fname in netrwmarkfilelist
4864 if a:islocal
4865 if g:netrw_keepdir
4866 let fname= s:ComposePath(curdir,fname)
4867 endif
4868 else
4869 let fname= curdir.fname
4870 endif
4871 1split
4872 " the autocmds will handle both local and remote files
4873" call Decho("exe silent e ".escape(fname,' '))
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004874 exe "silent e ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004875" call Decho("hardcopy")
4876 hardcopy
4877 q
4878 endfor
4879 2match none
4880 endif
4881" call Dret("s:NetrwMarkFilePrint")
4882endfun
4883
4884" ---------------------------------------------------------------------
4885" s:NetrwMarkFileRegexp: (invoked by mr) This function is used to mark {{{2
4886" files when given a regexp (for which a prompt is
4887" issued).
4888fun! s:NetrwMarkFileRegexp(islocal)
4889" call Dfunc("s:NetrwMarkFileRegexp(islocal=".a:islocal.")")
4890
4891 " get the regular expression
4892 call inputsave()
4893 let regexp= input("Enter regexp: ","","file")
4894 call inputrestore()
4895
4896 if a:islocal
4897 " get the matching list of files using local glob()
4898" call Decho("handle local regexp")
4899 let dirname = escape(b:netrw_curdir,g:netrw_glob_escape)
Bram Moolenaar5c736222010-01-06 20:54:52 +01004900 let files = glob(s:ComposePath(dirname,regexp))
4901" call Decho("files<".files.">")
4902 let filelist= split(files,"\n")
Bram Moolenaar446cb832008-06-24 21:56:24 +00004903
4904 " mark the list of files
Bram Moolenaar5c736222010-01-06 20:54:52 +01004905 for fname in filelist
4906" call Decho("fname<".fname.">")
4907 call s:NetrwMarkFile(a:islocal,substitute(fname,'^.*/','',''))
4908 endfor
Bram Moolenaar446cb832008-06-24 21:56:24 +00004909
4910 else
4911" call Decho("handle remote regexp")
4912
4913 " convert displayed listing into a filelist
4914 let eikeep = &ei
4915 let areg = @a
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004916 sil keepj %y a
Bram Moolenaar446cb832008-06-24 21:56:24 +00004917 set ei=all ma
4918" call Decho("set ei=all ma")
4919 1split
Bram Moolenaar5c736222010-01-06 20:54:52 +01004920 call s:NetrwEnew()
4921 call s:NetrwSafeOptions()
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004922 sil keepj norm! "ap
4923 keepj 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00004924 let bannercnt= search('^" =====','W')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004925 exe "sil keepj 1,".bannercnt."d"
Bram Moolenaar446cb832008-06-24 21:56:24 +00004926 set bt=nofile
4927 if g:netrw_liststyle == s:LONGLIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004928 sil keepj %s/\s\{2,}\S.*$//e
Bram Moolenaar5c736222010-01-06 20:54:52 +01004929 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004930 elseif g:netrw_liststyle == s:WIDELIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004931 sil keepj %s/\s\{2,}/\r/ge
Bram Moolenaar5c736222010-01-06 20:54:52 +01004932 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004933 elseif g:netrw_liststyle == s:TREELIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004934 sil keepj %s/^| //e
4935 sil! keepj g/^ .*$/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01004936 call histdel("/",-1)
4937 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004938 endif
4939 " convert regexp into the more usual glob-style format
4940 let regexp= substitute(regexp,'\*','.*','g')
4941" call Decho("regexp<".regexp.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004942 exe "sil! keepj v/".escape(regexp,'/')."/d"
Bram Moolenaar5c736222010-01-06 20:54:52 +01004943 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004944 let filelist= getline(1,line("$"))
4945 q!
4946 for filename in filelist
4947 call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','',''))
4948 endfor
4949 unlet filelist
4950 let @a = areg
4951 let &ei = eikeep
4952 endif
4953
4954" call Dret("s:NetrwMarkFileRegexp")
4955endfun
4956
4957" ---------------------------------------------------------------------
4958" s:NetrwMarkFileSource: (invoked by ms) This function sources marked files {{{2
4959" Uses the local marked file list.
4960fun! s:NetrwMarkFileSource(islocal)
4961" call Dfunc("s:NetrwMarkFileSource(islocal=".a:islocal.")")
4962 let curbufnr= bufnr("%")
4963 if exists("s:netrwmarkfilelist_{curbufnr}")
4964 let netrwmarkfilelist = s:netrwmarkfilelist_{bufnr("%")}
4965 let curdir = b:netrw_curdir
4966 call s:NetrwUnmarkList(curbufnr,curdir)
4967 for fname in netrwmarkfilelist
4968 if a:islocal
4969 if g:netrw_keepdir
4970 let fname= s:ComposePath(curdir,fname)
4971 endif
4972 else
4973 let fname= curdir.fname
4974 endif
4975 " the autocmds will handle sourcing both local and remote files
Bram Moolenaarc236c162008-07-13 17:41:49 +00004976" call Decho("exe so ".fnameescape(fname))
4977 exe "so ".fnameescape(fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00004978 endfor
4979 2match none
4980 endif
4981" call Dret("s:NetrwMarkFileSource")
4982endfun
4983
4984" ---------------------------------------------------------------------
4985" s:NetrwMarkFileTag: (invoked by mT) This function applies g:netrw_ctags to marked files {{{2
4986" Uses the global markfilelist
4987fun! s:NetrwMarkFileTag(islocal)
4988" call Dfunc("s:NetrwMarkFileTag(islocal=".a:islocal.")")
4989 let svpos = netrw#NetrwSavePosn()
4990 let curdir = b:netrw_curdir
4991 let curbufnr = bufnr("%")
4992
4993 if exists("s:netrwmarkfilelist")
4994" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
Bram Moolenaare37d50a2008-08-06 17:06:04 +00004995 let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "shellescape(v:val,".!a:islocal.")"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00004996 call s:NetrwUnmarkAll()
4997
4998 if a:islocal
4999 if executable(g:netrw_ctags)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005000" call Decho("call system(".g:netrw_ctags." ".netrwmarkfilelist.")")
5001 call system(g:netrw_ctags." ".netrwmarkfilelist)
5002 else
5003 call netrw#ErrorMsg(s:ERROR,"g:netrw_ctags<".g:netrw_ctags."> is not executable!",51)
5004 endif
5005 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00005006 let cmd = s:RemoteSystem(g:netrw_ctags." ".netrwmarkfilelist)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005007 call netrw#NetrwObtain(a:islocal,"tags")
5008 let curdir= b:netrw_curdir
5009 1split
5010 e tags
5011 let path= substitute(curdir,'^\(.*\)/[^/]*$','\1/','')
5012" call Decho("curdir<".curdir."> path<".path.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005013 exe 'keepj %s/\t\(\S\+\)\t/\t'.escape(path,"/\n\r\\").'\1\t/e'
Bram Moolenaar5c736222010-01-06 20:54:52 +01005014 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005015 wq!
5016 endif
5017 2match none
5018 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5019 call netrw#NetrwRestorePosn(svpos)
5020 endif
5021
5022" call Dret("s:NetrwMarkFileTag")
5023endfun
5024
5025" ---------------------------------------------------------------------
5026" s:NetrwMarkFileTgt: (invoked by mt) This function sets up a marked file target {{{2
5027" Sets up two variables,
5028" s:netrwmftgt : holds the target directory
5029" s:netrwmftgt_islocal : 0=target directory is remote
5030" 1=target directory is local
5031fun! s:NetrwMarkFileTgt(islocal)
5032" call Dfunc("s:NetrwMarkFileTgt(islocal=".a:islocal.")")
5033 let svpos = netrw#NetrwSavePosn()
5034 let curdir = b:netrw_curdir
5035 let hadtgt = exists("s:netrwmftgt")
5036 if !exists("w:netrw_bannercnt")
5037 let w:netrw_bannercnt= b:netrw_bannercnt
5038 endif
5039
5040 " set up target
5041 if line(".") < w:netrw_bannercnt
5042 " if cursor in banner region, use b:netrw_curdir for the target
5043 let s:netrwmftgt= b:netrw_curdir
5044" call Decho("inbanner: s:netrwmftgt<".s:netrwmftgt.">")
5045
5046 else
5047 " get word under cursor.
5048 " * If directory, use it for the target.
5049 " * If file, use b:netrw_curdir for the target
5050 let curword= s:NetrwGetWord()
5051 let tgtdir = s:ComposePath(curdir,curword)
5052 if a:islocal && isdirectory(tgtdir)
5053 let s:netrwmftgt = tgtdir
5054" call Decho("local isdir: s:netrwmftgt<".s:netrwmftgt.">")
5055 elseif !a:islocal && tgtdir =~ '/$'
5056 let s:netrwmftgt = tgtdir
5057" call Decho("remote isdir: s:netrwmftgt<".s:netrwmftgt.">")
5058 else
5059 let s:netrwmftgt = curdir
5060" call Decho("isfile: s:netrwmftgt<".s:netrwmftgt.">")
5061 endif
5062 endif
5063 if a:islocal
5064 " simplify the target (eg. /abc/def/../ghi -> /abc/ghi)
5065 let s:netrwmftgt= simplify(s:netrwmftgt)
5066" call Decho("simplify: s:netrwmftgt<".s:netrwmftgt.">")
5067 endif
5068 if g:netrw_cygwin
5069 let s:netrwmftgt= substitute(system("cygpath ".shellescape(s:netrwmftgt)),'\n$','','')
5070 let s:netrwmftgt= substitute(s:netrwmftgt,'\n$','','')
5071 endif
5072 let s:netrwmftgt_islocal= a:islocal
5073
Bram Moolenaar5c736222010-01-06 20:54:52 +01005074 if g:netrw_fastbrowse <= 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00005075 call s:LocalBrowseShellCmdRefresh()
5076 endif
5077 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5078 call netrw#NetrwRestorePosn(svpos)
5079 if !hadtgt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005080 sil! keepj norm! j
Bram Moolenaar446cb832008-06-24 21:56:24 +00005081 endif
5082
5083" call Dret("s:NetrwMarkFileTgt : netrwmftgt<".(exists("s:netrwmftgt")? s:netrwmftgt : "").">")
5084endfun
5085
5086" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00005087" s:NetrwOpenFile: query user for a filename and open it {{{2
5088fun! s:NetrwOpenFile(islocal)
5089" call Dfunc("s:NetrwOpenFile(islocal=".a:islocal.")")
5090 call inputsave()
5091 let fname= input("Enter filename: ")
5092 call inputrestore()
5093 if fname !~ '[/\\]'
5094 if exists("b:netrw_curdir")
5095 if exists("g:netrw_quiet")
5096 let netrw_quiet_keep = g:netrw_quiet
5097 endif
5098 let g:netrw_quiet = 1
5099 if b:netrw_curdir =~ '/$'
5100 exe "e ".fnameescape(b:netrw_curdir.fname)
5101 else
5102 exe "e ".fnameescape(b:netrw_curdir."/".fname)
5103 endif
5104 if exists("netrw_quiet_keep")
5105 let g:netrw_quiet= netrw_quiet_keep
5106 else
5107 unlet g:netrw_quiet
5108 endif
5109 endif
5110 else
5111 exe "e ".fnameescape(fname)
5112 endif
5113" call Dret("s:NetrwOpenFile")
5114endfun
5115
5116" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00005117" s:NetrwUnmarkList: delete local marked file lists and remove their contents from the global marked-file list {{{2
5118fun! s:NetrwUnmarkList(curbufnr,curdir)
5119" call Dfunc("s:NetrwUnmarkList(curbufnr=".a:curbufnr." curdir<".a:curdir.">)")
5120
5121 " remove all files in local marked-file list from global list
5122 if exists("s:netrwmarkfilelist_{a:curbufnr}")
5123 for mfile in s:netrwmarkfilelist_{a:curbufnr}
5124 let dfile = s:ComposePath(a:curdir,mfile) " prepend directory to mfile
5125 let idx = index(s:netrwmarkfilelist,dfile) " get index in list of dfile
5126 call remove(s:netrwmarkfilelist,idx) " remove from global list
5127 endfor
5128 if s:netrwmarkfilelist == []
5129 unlet s:netrwmarkfilelist
5130 endif
5131
5132 " getting rid of the local marked-file lists is easy
5133 unlet s:netrwmarkfilelist_{a:curbufnr}
5134 endif
5135 if exists("s:netrwmarkfilemtch_{a:curbufnr}")
5136 unlet s:netrwmarkfilemtch_{a:curbufnr}
5137 endif
5138 2match none
5139" call Dret("s:NetrwUnmarkList")
5140endfun
5141
5142" ---------------------------------------------------------------------
5143" s:NetrwUnmarkAll: remove the global marked file list and all local ones {{{2
5144fun! s:NetrwUnmarkAll()
5145" call Dfunc("s:NetrwUnmarkAll()")
5146 if exists("s:netrwmarkfilelist")
5147 unlet s:netrwmarkfilelist
5148 endif
5149 silent call s:NetrwUnmarkAll2()
5150 2match none
5151" call Dret("s:NetrwUnmarkAll")
5152endfun
5153
5154" ---------------------------------------------------------------------
5155" s:NetrwUnmarkAll2: {{{2
5156fun! s:NetrwUnmarkAll2()
5157" call Dfunc("s:NetrwUnmarkAll2()")
5158 redir => netrwmarkfilelist_let
5159 let
5160 redir END
5161 let netrwmarkfilelist_list= split(netrwmarkfilelist_let,'\n') " convert let string into a let list
5162 call filter(netrwmarkfilelist_list,"v:val =~ '^s:netrwmarkfilelist_'") " retain only those vars that start as s:netrwmarkfilelist_
5163 call map(netrwmarkfilelist_list,"substitute(v:val,'\\s.*$','','')") " remove what the entries are equal to
5164 for flist in netrwmarkfilelist_list
5165 let curbufnr= substitute(flist,'s:netrwmarkfilelist_','','')
5166 unlet s:netrwmarkfilelist_{curbufnr}
5167 unlet s:netrwmarkfilemtch_{curbufnr}
5168 endfor
5169" call Dret("s:NetrwUnmarkAll2")
5170endfun
5171
5172" ---------------------------------------------------------------------
5173" s:NetrwUnMarkFile: {{{2
5174fun! s:NetrwUnMarkFile(islocal)
5175" call Dfunc("s:NetrwUnMarkFile(islocal=".a:islocal.")")
5176 let svpos = netrw#NetrwSavePosn()
5177 let curbufnr = bufnr("%")
5178
5179 " unmark marked file list (although I expect s:NetrwUpload()
5180 " to do it, I'm just making sure)
5181 if exists("s:netrwmarkfilelist_{bufnr('%')}")
5182" call Decho("unlet'ing: s:netrwmarkfile[list|mtch]_".bufnr("%"))
5183 unlet s:netrwmarkfilelist
5184 unlet s:netrwmarkfilelist_{curbufnr}
5185 unlet s:netrwmarkfilemtch_{curbufnr}
5186 2match none
5187 endif
5188
5189" call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5190 call netrw#NetrwRestorePosn(svpos)
5191" call Dret("s:NetrwUnMarkFile")
5192endfun
5193
5194" ---------------------------------------------------------------------
5195" s:NetrwMenu: generates the menu for gvim and netrw {{{2
5196fun! s:NetrwMenu(domenu)
5197
5198 if !exists("g:NetrwMenuPriority")
5199 let g:NetrwMenuPriority= 80
5200 endif
5201
5202 if has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu
5203" call Dfunc("NetrwMenu(domenu=".a:domenu.")")
5204
5205 if !exists("s:netrw_menu_enabled") && a:domenu
5206" call Decho("initialize menu")
5207 let s:netrw_menu_enabled= 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005208 exe 'sil! menu '.g:NetrwMenuPriority.'.1 '.g:NetrwTopLvlMenu.'Help<tab><F1> <F1>'
5209 exe 'sil! menu '.g:NetrwMenuPriority.'.5 '.g:NetrwTopLvlMenu.'-Sep1- :'
5210 exe 'sil! menu '.g:NetrwMenuPriority.'.6 '.g:NetrwTopLvlMenu.'Go\ Up\ Directory<tab>- -'
5211 exe 'sil! menu '.g:NetrwMenuPriority.'.7 '.g:NetrwTopLvlMenu.'Apply\ Special\ Viewer<tab>x x'
5212 exe 'sil! menu '.g:NetrwMenuPriority.'.8.1 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Current\ Directory<tab>mb mb'
5213 exe 'sil! menu '.g:NetrwMenuPriority.'.8.4 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Prev\ Dir\ (History)<tab>u u'
5214 exe 'sil! menu '.g:NetrwMenuPriority.'.8.5 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Next\ Dir\ (History)<tab>U U'
5215 exe 'sil! menu '.g:NetrwMenuPriority.'.8.6 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.List<tab>qb qb'
5216 exe 'sil! menu '.g:NetrwMenuPriority.'.9.1 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ File\ Hiding\ List<tab><ctrl-h>'." \<c-h>'"
5217 exe 'sil! menu '.g:NetrwMenuPriority.'.9.2 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ Sorting\ Sequence<tab>S S'
5218 exe 'sil! menu '.g:NetrwMenuPriority.'.9.3 '.g:NetrwTopLvlMenu.'Browsing\ Control.Quick\ Hide/Unhide\ Dot\ Files<tab>'."gh gh"
5219 exe 'sil! menu '.g:NetrwMenuPriority.'.9.4 '.g:NetrwTopLvlMenu.'Browsing\ Control.Refresh\ Listing<tab>'."<ctrl-l> \<c-l>"
5220 exe 'sil! menu '.g:NetrwMenuPriority.'.9.5 '.g:NetrwTopLvlMenu.'Browsing\ Control.Settings/Options<tab>:NetrwSettings '.":NetrwSettings\<cr>"
5221 exe 'sil! menu '.g:NetrwMenuPriority.'.10 '.g:NetrwTopLvlMenu.'Delete\ File/Directory<tab>D D'
5222 exe 'sil! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Current\ Window<tab><cr> '."\<cr>"
5223 exe 'sil! menu '.g:NetrwMenuPriority.'.11.2 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Preview\ File/Directory<tab>p p'
5224 exe 'sil! menu '.g:NetrwMenuPriority.'.11.3 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Previous\ Window<tab>P P'
5225 exe 'sil! menu '.g:NetrwMenuPriority.'.11.4 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Window<tab>o o'
5226 exe 'sil! menu '.g:NetrwMenuPriority.'.11.5 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Vertical\ Window<tab>v v'
5227 exe 'sil! menu '.g:NetrwMenuPriority.'.12.1 '.g:NetrwTopLvlMenu.'Explore.Directory\ Name :Explore '
5228 exe 'sil! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (curdir\ only)<tab>:Explore\ */ :Explore */'
5229 exe 'sil! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (+subdirs)<tab>:Explore\ **/ :Explore **/'
5230 exe 'sil! menu '.g:NetrwMenuPriority.'.12.3 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ String\ Pattern\ (curdir\ only)<tab>:Explore\ *// :Explore *//'
5231 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ String\ Pattern\ (+subdirs)<tab>:Explore\ **// :Explore **//'
5232 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Next\ Match<tab>:Nexplore :Nexplore<cr>'
5233 exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Prev\ Match<tab>:Pexplore :Pexplore<cr>'
5234 exe 'sil! menu '.g:NetrwMenuPriority.'.13 '.g:NetrwTopLvlMenu.'Make\ Subdirectory<tab>d d'
5235 exe 'sil! menu '.g:NetrwMenuPriority.'.14.1 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ File<tab>mf mf'
5236 exe 'sil! menu '.g:NetrwMenuPriority.'.14.2 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ Files\ by\ Regexp<tab>mr mr'
5237 exe 'sil! menu '.g:NetrwMenuPriority.'.14.3 '.g:NetrwTopLvlMenu.'Marked\ Files.Hide-Show-List\ Control<tab>a a'
5238 exe 'sil! menu '.g:NetrwMenuPriority.'.14.4 '.g:NetrwTopLvlMenu.'Marked\ Files.Copy\ To\ Target<tab>mc mc'
5239 exe 'sil! menu '.g:NetrwMenuPriority.'.14.5 '.g:NetrwTopLvlMenu.'Marked\ Files.Delete<tab>D D'
5240 exe 'sil! menu '.g:NetrwMenuPriority.'.14.6 '.g:NetrwTopLvlMenu.'Marked\ Files.Diff<tab>md md'
5241 exe 'sil! menu '.g:NetrwMenuPriority.'.14.7 '.g:NetrwTopLvlMenu.'Marked\ Files.Edit<tab>me me'
5242 exe 'sil! menu '.g:NetrwMenuPriority.'.14.8 '.g:NetrwTopLvlMenu.'Marked\ Files.Exe\ Cmd<tab>mx mx'
5243 exe 'sil! menu '.g:NetrwMenuPriority.'.14.9 '.g:NetrwTopLvlMenu.'Marked\ Files.Move\ To\ Target<tab>mm mm'
5244 exe 'sil! menu '.g:NetrwMenuPriority.'.14.10 '.g:NetrwTopLvlMenu.'Marked\ Files.Obtain<tab>O O'
5245 exe 'sil! menu '.g:NetrwMenuPriority.'.14.11 '.g:NetrwTopLvlMenu.'Marked\ Files.Print<tab>mp mp'
5246 exe 'sil! menu '.g:NetrwMenuPriority.'.14.12 '.g:NetrwTopLvlMenu.'Marked\ Files.Replace<tab>R R'
5247 exe 'sil! menu '.g:NetrwMenuPriority.'.14.13 '.g:NetrwTopLvlMenu.'Marked\ Files.Set\ Target<tab>mt mt'
5248 exe 'sil! menu '.g:NetrwMenuPriority.'.14.14 '.g:NetrwTopLvlMenu.'Marked\ Files.Tag<tab>mT mT'
5249 exe 'sil! menu '.g:NetrwMenuPriority.'.14.15 '.g:NetrwTopLvlMenu.'Marked\ Files.Zip/Unzip/Compress/Uncompress<tab>mz mz'
5250 exe 'sil! menu '.g:NetrwMenuPriority.'.15 '.g:NetrwTopLvlMenu.'Obtain\ File<tab>O O'
5251 exe 'sil! menu '.g:NetrwMenuPriority.'.16.1 '.g:NetrwTopLvlMenu.'Style.Listing\ Style\ (thin-long-wide-tree)<tab>i i'
5252 exe 'sil! menu '.g:NetrwMenuPriority.'.16.2 '.g:NetrwTopLvlMenu.'Style.Normal-Hide-Show<tab>a a'
5253 exe 'sil! menu '.g:NetrwMenuPriority.'.16.3 '.g:NetrwTopLvlMenu.'Style.Reverse\ Sorting\ Order<tab>'."r r"
5254 exe 'sil! menu '.g:NetrwMenuPriority.'.16.4 '.g:NetrwTopLvlMenu.'Style.Sorting\ Method\ (name-time-size)<tab>s s'
5255 exe 'sil! menu '.g:NetrwMenuPriority.'.17 '.g:NetrwTopLvlMenu.'Rename\ File/Directory<tab>R R'
5256 exe 'sil! menu '.g:NetrwMenuPriority.'.18 '.g:NetrwTopLvlMenu.'Set\ Current\ Directory<tab>c c'
Bram Moolenaar5c736222010-01-06 20:54:52 +01005257 call s:NetrwBookmarkMenu() " provide some history! uses priorities 2,3, reserves 4, 8.2.x
Bram Moolenaar446cb832008-06-24 21:56:24 +00005258 let s:netrw_menucnt= 28
5259
5260 elseif !a:domenu
5261 let s:netrwcnt = 0
5262 let curwin = winnr()
5263 windo if getline(2) =~ "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif
5264 exe curwin."wincmd w"
5265
5266 if s:netrwcnt <= 1
5267" call Decho("clear menus")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005268 exe 'sil! unmenu '.g:NetrwTopLvlMenu
Bram Moolenaar446cb832008-06-24 21:56:24 +00005269" call Decho('exe silent! unmenu '.g:NetrwTopLvlMenu.'*')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005270 sil! unlet s:netrw_menu_enabled
Bram Moolenaar446cb832008-06-24 21:56:24 +00005271 endif
5272 endif
5273" call Dret("NetrwMenu")
5274 endif
5275
5276endfun
5277
5278" ---------------------------------------------------------------------
5279" s:NetrwObtain: obtain file under cursor or from markfile list {{{2
5280" Used by the O maps (as <SID>NetrwObtain())
5281fun! s:NetrwObtain(islocal)
5282" call Dfunc("NetrwObtain(islocal=".a:islocal.")")
5283
5284 if exists("s:netrwmarkfilelist_{bufnr('%')}")
Bram Moolenaar5c736222010-01-06 20:54:52 +01005285 let islocal= s:netrwmarkfilelist_{bufnr('%')}[1] !~ '^\a\+://'
5286 call netrw#NetrwObtain(islocal,s:netrwmarkfilelist_{bufnr('%')})
Bram Moolenaar446cb832008-06-24 21:56:24 +00005287 call s:NetrwUnmarkList(bufnr('%'),b:netrw_curdir)
5288 else
5289 call netrw#NetrwObtain(a:islocal,expand("<cWORD>"))
5290 endif
5291
5292" call Dret("NetrwObtain")
5293endfun
5294
5295" ---------------------------------------------------------------------
5296" netrw#NetrwObtain: {{{2
5297" netrw#NetrwObtain(islocal,fname[,tgtdirectory])
5298" islocal=0 obtain from remote source
5299" =1 obtain from local source
5300" fname : a filename or a list of filenames
5301" tgtdir : optional place where files are to go (not present, uses getcwd())
5302fun! netrw#NetrwObtain(islocal,fname,...)
5303" call Dfunc("netrw#NetrwObtain(islocal=".a:islocal." fname<".((type(a:fname) == 1)? a:fname : string(a:fname)).">) a:0=".a:0)
5304 " NetrwStatusLine support - for obtaining support
5305
5306 if type(a:fname) == 1
5307 let fnamelist= [ a:fname ]
5308 elseif type(a:fname) == 3
5309 let fnamelist= a:fname
5310 else
5311 call netrw#ErrorMsg(s:ERROR,"attempting to use NetrwObtain on something not a filename or a list",62)
5312" call Dret("netrw#NetrwObtain")
5313 return
5314 endif
5315" call Decho("fnamelist<".string(fnamelist).">")
5316 if a:0 > 0
5317 let tgtdir= a:1
5318 else
5319 let tgtdir= getcwd()
5320 endif
5321" call Decho("tgtdir<".tgtdir.">")
5322
Bram Moolenaar5c736222010-01-06 20:54:52 +01005323 if exists("b:netrw_islocal") && b:netrw_islocal
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005324 " obtain a file from local b:netrw_curdir to (local) tgtdir
5325" call Decho("obtain a file from local ".b:netrw_curdir." to ".tgtdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005326 if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir
5327 let topath= s:ComposePath(tgtdir,"")
5328 if (has("win32") || has("win95") || has("win64") || has("win16"))
5329 " transfer files one at time
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005330" call Decho("transfer files one at a time")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005331 for fname in fnamelist
Bram Moolenaarc236c162008-07-13 17:41:49 +00005332" call Decho("system(".g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath).")")
5333 call system(g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005334 endfor
5335 else
5336 " transfer files with one command
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005337" call Decho("transfer files with one command")
5338 let filelist= join(map(deepcopy(fnamelist),"shellescape(v:val)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005339" call Decho("system(".g:netrw_localcopycmd." ".filelist." ".shellescape(topath).")")
5340 call system(g:netrw_localcopycmd." ".filelist." ".shellescape(topath))
5341 endif
5342 elseif !exists("b:netrw_curdir")
5343 call netrw#ErrorMsg(s:ERROR,"local browsing directory doesn't exist!",36)
5344 else
5345 call netrw#ErrorMsg(s:WARNING,"local browsing directory and current directory are identical",37)
5346 endif
5347
5348 else
Bram Moolenaared39e1d2008-08-09 17:55:22 +00005349 " obtain files from remote b:netrw_curdir to local tgtdir
5350" call Decho("obtain a file from remote ".b:netrw_curdir." to ".tgtdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005351 if type(a:fname) == 1
5352 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.a:fname)
5353 endif
5354 call s:NetrwMethod(b:netrw_curdir)
5355
5356 if b:netrw_method == 4
5357 " obtain file using scp
5358" call Decho("obtain via scp (method#4)")
5359 if exists("g:netrw_port") && g:netrw_port != ""
5360 let useport= " ".g:netrw_scpport." ".g:netrw_port
5361 else
5362 let useport= ""
5363 endif
5364 if b:netrw_fname =~ '/'
5365 let path= substitute(b:netrw_fname,'^\(.*/\).\{-}$','\1','')
5366 else
5367 let path= ""
5368 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005369 let filelist= join(map(deepcopy(fnamelist),'shellescape(g:netrw_machine.":".path.v:val,1)'))
Bram Moolenaarc236c162008-07-13 17:41:49 +00005370" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1))
5371 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005372
5373 elseif b:netrw_method == 2
5374 " obtain file using ftp + .netrc
5375" call Decho("obtain via ftp+.netrc (method #2)")
5376 call s:SaveBufVars()|silent keepjumps new|call s:RestoreBufVars()
5377 let tmpbufnr= bufnr("%")
5378 setlocal ff=unix
5379 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005380 keepj put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +00005381" call Decho("filter input: ".getline('$'))
5382 endif
5383
5384 if exists("b:netrw_fname") && b:netrw_fname != ""
5385 call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
5386" call Decho("filter input: ".getline('$'))
5387 endif
5388
5389 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005390 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00005391" call Decho("filter input: ".getline('$'))
5392 endif
5393 for fname in fnamelist
5394 call setline(line("$")+1,'get "'.fname.'"')
5395" call Decho("filter input: ".getline('$'))
5396 endfor
5397 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00005398" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
5399 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005400 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00005401" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
5402 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005403 endif
5404 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
5405 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
5406 let debugkeep= &debug
5407 setlocal debug=msg
5408 call netrw#ErrorMsg(s:ERROR,getline(1),4)
5409 let &debug= debugkeep
5410 endif
5411
5412 elseif b:netrw_method == 3
5413 " obtain with ftp + machine, id, passwd, and fname (ie. no .netrc)
5414" call Decho("obtain via ftp+mipf (method #3)")
5415 call s:SaveBufVars()|silent keepjumps new|call s:RestoreBufVars()
5416 let tmpbufnr= bufnr("%")
5417 setlocal ff=unix
5418
5419 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005420 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00005421" call Decho("filter input: ".getline('$'))
5422 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005423 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00005424" call Decho("filter input: ".getline('$'))
5425 endif
5426
5427 if exists("g:netrw_ftp") && g:netrw_ftp == 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005428 keepj put =g:netrw_uid
Bram Moolenaar446cb832008-06-24 21:56:24 +00005429" call Decho("filter input: ".getline('$'))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005430 keepj put ='\"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00005431" call Decho("filter input: ".getline('$'))
5432 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005433 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00005434" call Decho("filter input: ".getline('$'))
5435 endif
5436
5437 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005438 keepj put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +00005439" call Decho("filter input: ".getline('$'))
5440 endif
5441
5442 if exists("b:netrw_fname") && b:netrw_fname != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005443 keepj call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005444" call Decho("filter input: ".getline('$'))
5445 endif
5446
5447 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005448 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00005449" call Decho("filter input: ".getline('$'))
5450 endif
5451
5452 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005453 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00005454" call Decho("filter input: ".getline('$'))
5455 endif
5456 for fname in fnamelist
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005457 keepj call setline(line("$")+1,'get "'.fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005458 endfor
5459" call Decho("filter input: ".getline('$'))
5460
5461 " perform ftp:
5462 " -i : turns off interactive prompting from ftp
5463 " -n unix : DON'T use <.netrc>, even though it exists
5464 " -n win32: quit being obnoxious about password
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005465 keepj norm! 1Gdd
Bram Moolenaar446cb832008-06-24 21:56:24 +00005466" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
5467 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
5468 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
5469 if getline(1) !~ "^$"
5470" call Decho("error<".getline(1).">")
5471 if !exists("g:netrw_quiet")
5472 call netrw#ErrorMsg(s:ERROR,getline(1),5)
5473 endif
5474 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01005475 elseif !exists("b:netrw_method") || b:netrw_method < 0
5476" call Dfunc("netrw#NetrwObtain : unsupported method")
5477 return
5478 endif
5479
5480 " restore status line
5481 if type(a:fname) == 1 && exists("s:netrw_users_stl")
5482 call s:SetupNetrwStatusLine(s:netrw_users_stl)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005483 endif
5484
5485 endif
5486
5487 " cleanup
5488 if exists("tmpbufnr")
5489 if bufnr("%") != tmpbufnr
5490 exe tmpbufnr."bw!"
5491 else
5492 q!
5493 endif
5494 endif
5495
5496" call Dret("netrw#NetrwObtain")
5497endfun
5498
5499" ---------------------------------------------------------------------
5500" s:NetrwPrevWinOpen: open file/directory in previous window. {{{2
5501" If there's only one window, then the window will first be split.
5502" Returns:
5503" choice = 0 : didn't have to choose
5504" choice = 1 : saved modified file in window first
5505" choice = 2 : didn't save modified file, opened window
5506" choice = 3 : cancel open
5507fun! s:NetrwPrevWinOpen(islocal)
5508" call Dfunc("NetrwPrevWinOpen(islocal=".a:islocal.")")
5509
5510 " grab a copy of the b:netrw_curdir to pass it along to newly split windows
5511 let curdir = b:netrw_curdir
5512
5513 " get last window number and the word currently under the cursor
5514 let lastwinnr = winnr("$")
5515 let curword = s:NetrwGetWord()
5516 let choice = 0
5517" call Decho("lastwinnr=".lastwinnr." curword<".curword.">")
5518
5519 let didsplit = 0
5520 if lastwinnr == 1
5521 " if only one window, open a new one first
5522" call Decho("only one window, so open a new one (g:netrw_alto=".g:netrw_alto.")")
5523 if g:netrw_preview
5524" call Decho("exe ".(g:netrw_alto? "top " : "bot ")."vert ".g:netrw_winsize."wincmd s")
5525 exe (g:netrw_alto? "top " : "bot ")."vert ".g:netrw_winsize."wincmd s"
5526 else
5527" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s")
5528 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
5529 endif
5530 let didsplit = 1
5531
5532 else
5533 call s:SaveBufVars()
5534" call Decho("wincmd p")
5535 wincmd p
5536 call s:RestoreBufVars()
5537 " if the previous window's buffer has been changed (is modified),
5538 " and it doesn't appear in any other extant window, then ask the
5539 " user if s/he wants to abandon modifications therein.
5540 let bnr = winbufnr(0)
5541 let bnrcnt = 0
5542 if &mod
5543" call Decho("detected: prev window's buffer has been modified: bnr=".bnr." winnr#".winnr())
5544 let eikeep= &ei
5545 set ei=all
5546 windo if winbufnr(0) == bnr | let bnrcnt=bnrcnt+1 | endif
5547 exe bnr."wincmd p"
5548 let &ei= eikeep
5549" call Decho("bnr=".bnr." bnrcnt=".bnrcnt." buftype=".&bt." winnr#".winnr())
5550 if bnrcnt == 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01005551 let bufname = bufname(winbufnr(winnr()))
5552 let choice = confirm("Save modified file<".bufname.">?","&Yes\n&No\n&Cancel")
Bram Moolenaar446cb832008-06-24 21:56:24 +00005553" call Decho("bufname<".bufname."> choice=".choice." winnr#".winnr())
5554
5555 if choice == 1
5556 " Yes -- write file & then browse
5557 let v:errmsg= ""
5558 silent w
5559 if v:errmsg != ""
5560 call netrw#ErrorMsg(s:ERROR,"unable to write <".bufname.">!",30)
5561 if didsplit
5562 q
5563 else
5564 wincmd p
5565 endif
5566" call Dret("NetrwPrevWinOpen ".choice." : unable to write <".bufname.">")
5567 return choice
5568 endif
5569
5570 elseif choice == 2
5571 " No -- don't worry about changed file, just browse anyway
5572 setlocal nomod
5573 call netrw#ErrorMsg(s:WARNING,bufname." changes to ".bufname." abandoned",31)
5574 wincmd p
5575
5576 else
5577 " Cancel -- don't do this
5578 if didsplit
5579 q
5580 else
5581 wincmd p
5582 endif
5583" call Dret("NetrwPrevWinOpen ".choice." : cancelled")
5584 return choice
5585 endif
5586 endif
5587 endif
5588 endif
5589
5590 " restore b:netrw_curdir (window split/enew may have lost it)
5591 let b:netrw_curdir= curdir
5592 if a:islocal < 2
5593 if a:islocal
5594 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(a:islocal,curword))
5595 else
5596 call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,curword))
5597 endif
5598 endif
5599" call Dret("NetrwPrevWinOpen ".choice)
5600 return choice
5601endfun
5602
5603" ---------------------------------------------------------------------
5604" s:NetrwUpload: load fname to tgt (used by NetrwMarkFileCopy()) {{{2
5605" Always assumed to be local -> remote
5606" call s:NetrwUpload(filename, target)
5607" call s:NetrwUpload(filename, target, fromdirectory)
5608fun! s:NetrwUpload(fname,tgt,...)
5609" call Dfunc("s:NetrwUpload(fname<".((type(a:fname) == 1)? a:fname : string(a:fname))."> tgt<".a:tgt.">) a:0=".a:0)
5610
5611 if a:tgt =~ '^\a\+://'
5612 let tgtdir= substitute(a:tgt,'^\a\+://[^/]\+/\(.\{-}\)$','\1','')
5613 else
5614 let tgtdir= substitute(a:tgt,'^\(.*\)/[^/]*$','\1','')
5615 endif
5616" call Decho("tgtdir<".tgtdir.">")
5617
5618 if a:0 > 0
5619 let fromdir= a:1
5620 else
5621 let fromdir= getcwd()
5622 endif
5623" call Decho("fromdir<".fromdir.">")
5624
5625 if type(a:fname) == 1
5626 " handle uploading a single file using NetWrite
5627" call Decho("handle uploading a single file via NetWrite")
5628 1split
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005629" call Decho("exe e ".fnameescape(a:fname))
5630 exe "e ".fnameescape(a:fname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005631" call Decho("now locally editing<".expand("%").">, has ".line("$")." lines")
5632 if a:tgt =~ '/$'
5633 let wfname= substitute(a:fname,'^.*/','','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00005634" call Decho("exe w! ".fnameescape(wfname))
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005635 exe "w! ".fnameescape(a:tgt.wfname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005636 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00005637" call Decho("writing local->remote: exe w ".fnameescape(a:tgt))
5638 exe "w ".fnameescape(a:tgt)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005639" call Decho("done writing local->remote")
5640 endif
5641 q!
5642
5643 elseif type(a:fname) == 3
5644 " handle uploading a list of files via scp
5645" call Decho("handle uploading a list of files via scp")
5646 let curdir= getcwd()
5647 if a:tgt =~ '^scp:'
5648 exe "keepjumps silent lcd ".fnameescape(fromdir)
Bram Moolenaare37d50a2008-08-06 17:06:04 +00005649 let filelist= deepcopy(s:netrwmarkfilelist_{bufnr('%')})
5650 let args = join(map(filelist,"shellescape(v:val, 1)"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00005651 if exists("g:netrw_port") && g:netrw_port != ""
5652 let useport= " ".g:netrw_scpport." ".g:netrw_port
5653 else
5654 let useport= ""
5655 endif
5656 let machine = substitute(a:tgt,'^scp://\([^/:]\+\).*$','\1','')
5657 let tgt = substitute(a:tgt,'^scp://[^/]\+/\(.*\)$','\1','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00005658" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1))
5659 exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005660 exe "keepjumps silent lcd ".fnameescape(curdir)
5661
5662 elseif a:tgt =~ '^ftp:'
5663 call s:NetrwMethod(a:tgt)
5664
5665 if b:netrw_method == 2
5666 " handle uploading a list of files via ftp+.netrc
5667 let netrw_fname = b:netrw_fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005668 sil keepj new
Bram Moolenaar446cb832008-06-24 21:56:24 +00005669" call Decho("filter input window#".winnr())
5670
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005671 keepj put =g:netrw_ftpmode
Bram Moolenaar446cb832008-06-24 21:56:24 +00005672" call Decho("filter input: ".getline('$'))
5673
5674 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005675 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00005676" call Decho("filter input: ".getline('$'))
5677 endif
5678
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005679 keepj call setline(line("$")+1,'lcd "'.fromdir.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005680" call Decho("filter input: ".getline('$'))
5681
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005682 keepj call setline(line("$")+1,'cd "'.tgtdir.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005683" call Decho("filter input: ".getline('$'))
5684
5685 for fname in a:fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005686 keepj call setline(line("$")+1,'put "'.fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005687" call Decho("filter input: ".getline('$'))
5688 endfor
5689
5690 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00005691" call Decho("executing: ".s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
5692 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005693 else
5694" call Decho("filter input window#".winnr())
Bram Moolenaarc236c162008-07-13 17:41:49 +00005695" call Decho("executing: ".s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
5696 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005697 endif
5698 " 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 +02005699 sil keepj g/Local directory now/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01005700 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005701 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
5702 call netrw#ErrorMsg(s:ERROR,getline(1),14)
5703 else
5704 bw!|q
5705 endif
5706
5707 elseif b:netrw_method == 3
5708 " upload with ftp + machine, id, passwd, and fname (ie. no .netrc)
5709 let netrw_fname= b:netrw_fname
5710 call s:SaveBufVars()|silent keepjumps new|call s:RestoreBufVars()
5711 let tmpbufnr= bufnr("%")
5712 setlocal ff=unix
5713
5714 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005715 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00005716" call Decho("filter input: ".getline('$'))
5717 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005718 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00005719" call Decho("filter input: ".getline('$'))
5720 endif
5721
5722 if exists("g:netrw_ftp") && g:netrw_ftp == 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005723 keepj put =g:netrw_uid
Bram Moolenaar446cb832008-06-24 21:56:24 +00005724" call Decho("filter input: ".getline('$'))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005725 keepj call setline(line("$")+1,'"'.s:netrw_passwd.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005726" call Decho("filter input: ".getline('$'))
5727 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005728 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00005729" call Decho("filter input: ".getline('$'))
5730 endif
5731
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005732 keepj call setline(line("$")+1,'lcd "'.fromdir.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005733" call Decho("filter input: ".getline('$'))
5734
5735 if exists("b:netrw_fname") && b:netrw_fname != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005736 keepj call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005737" call Decho("filter input: ".getline('$'))
5738 endif
5739
5740 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005741 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00005742" call Decho("filter input: ".getline('$'))
5743 endif
5744
5745 for fname in a:fname
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005746 keepj call setline(line("$")+1,'put "'.fname.'"')
Bram Moolenaar446cb832008-06-24 21:56:24 +00005747" call Decho("filter input: ".getline('$'))
5748 endfor
5749
5750 " perform ftp:
5751 " -i : turns off interactive prompting from ftp
5752 " -n unix : DON'T use <.netrc>, even though it exists
5753 " -n win32: quit being obnoxious about password
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005754 keepj norm! 1Gdd
Bram Moolenaar446cb832008-06-24 21:56:24 +00005755" call Decho("executing: ".s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n")
5756 exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
5757 " 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 +02005758 sil keepj g/Local directory now/d
Bram Moolenaar5c736222010-01-06 20:54:52 +01005759 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005760 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
5761 let debugkeep= &debug
5762 setlocal debug=msg
5763 call netrw#ErrorMsg(s:ERROR,getline(1),15)
5764 let &debug = debugkeep
5765 let mod = 1
5766 else
5767 bw!|q
5768 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01005769 elseif !exists("b:netrw_method") || b:netrw_method < 0
5770" call Dfunc("netrw#NetrwUpload : unsupported method")
5771 return
Bram Moolenaar446cb832008-06-24 21:56:24 +00005772 endif
5773 else
5774 call netrw#ErrorMsg(s:ERROR,"can't obtain files with protocol from<".a:tgt.">",63)
5775 endif
5776 endif
5777
5778" call Dret("s:NetrwUpload")
5779endfun
5780
5781" ---------------------------------------------------------------------
5782" s:NetrwPreview: {{{2
5783fun! s:NetrwPreview(path) range
5784" call Dfunc("NetrwPreview(path<".a:path.">)")
5785 call s:NetrwOptionSave("s:")
5786 call s:NetrwSafeOptions()
5787 if has("quickfix")
5788 if !isdirectory(a:path)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005789 if g:netrw_preview && !g:netrw_alto
5790 let pvhkeep= &pvh
5791 let &pvh = winwidth(0) - g:netrw_winsize
5792 endif
5793 exe (g:netrw_alto? "top " : "bot ").(g:netrw_preview? "vert " : "")."pedit ".fnameescape(a:path)
5794 if exists("pvhkeep")
5795 let &pvh= pvhkeep
5796 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005797 elseif !exists("g:netrw_quiet")
5798 call netrw#ErrorMsg(s:WARNING,"sorry, cannot preview a directory such as <".a:path.">",38)
5799 endif
5800 elseif !exists("g:netrw_quiet")
5801 call netrw#ErrorMsg(s:WARNING,"sorry, to preview your vim needs the quickfix feature compiled in",39)
5802 endif
5803 call s:NetrwOptionRestore("s:")
5804" call Dret("NetrwPreview")
5805endfun
5806
5807" ---------------------------------------------------------------------
5808" s:NetrwRefresh: {{{2
5809fun! s:NetrwRefresh(islocal,dirname)
5810" call Dfunc("NetrwRefresh(islocal<".a:islocal.">,dirname=".a:dirname.") hide=".g:netrw_hide." sortdir=".g:netrw_sort_direction)
5811 " at the current time (Mar 19, 2007) all calls to NetrwRefresh() call NetrwBrowseChgDir() first.
5812 " NetrwBrowseChgDir() may clear the display; hence a NetrwSavePosn() may not work if its placed here.
5813 " Also, NetrwBrowseChgDir() now does a NetrwSavePosn() itself.
5814 setlocal ma noro
5815" call Decho("setlocal ma noro")
5816" call Decho("clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005817 keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00005818 if a:islocal
5819 call netrw#LocalBrowseCheck(a:dirname)
5820 else
5821 call s:NetrwBrowse(a:islocal,a:dirname)
5822 endif
5823 call netrw#NetrwRestorePosn()
5824
5825 " restore file marks
5826 if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
5827" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
5828 exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
5829 else
5830" call Decho("2match none")
5831 2match none
5832 endif
5833
5834" redraw!
5835" call Dret("NetrwRefresh")
5836endfun
5837
5838" ---------------------------------------------------------------------
5839" s:NetrwRefreshDir: refreshes a directory by name {{{2
5840" Called by NetrwMarkFileCopy()
5841" Interfaces to s:NetrwRefresh() and s:LocalBrowseShellCmdRefresh()
5842fun! s:NetrwRefreshDir(islocal,dirname)
5843" call Dfunc("s:NetrwRefreshDir(islocal=".a:islocal." dirname<".a:dirname.">) fastbrowse=".g:netrw_fastbrowse)
5844 if g:netrw_fastbrowse == 0
5845 " slowest mode (keep buffers refreshed, local or remote)
5846" call Decho("slowest mode: keep buffers refreshed, local or remote")
5847 let tgtwin= bufwinnr(a:dirname)
5848" call Decho("tgtwin= bufwinnr(".a:dirname.")=".tgtwin)
5849
5850 if tgtwin > 0
5851 " tgtwin is being displayed, so refresh it
5852 let curwin= winnr()
5853" call Decho("refresh tgtwin#".tgtwin." (curwin#".curwin.")")
5854 exe tgtwin."wincmd w"
5855 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5856 exe curwin."wincmd w"
5857
5858 elseif bufnr(a:dirname) > 0
5859 let bn= bufnr(a:dirname)
5860" call Decho("bd bufnr(".a:dirname.")=".bn)
5861 exe "silent bd ".bn
5862 endif
5863
5864 elseif g:netrw_fastbrowse <= 1
5865" call Decho("medium-speed mode: refresh local buffers only")
5866 call s:LocalBrowseShellCmdRefresh()
5867 endif
5868" call Dret("s:NetrwRefreshDir")
5869endfun
5870
5871" ---------------------------------------------------------------------
5872" s:NetrwSetSort: sets up the sort based on the g:netrw_sort_sequence {{{2
5873" What this function does is to compute a priority for the patterns
5874" in the g:netrw_sort_sequence. It applies a substitute to any
5875" "files" that satisfy each pattern, putting the priority / in
5876" front. An "*" pattern handles the default priority.
5877fun! s:NetrwSetSort()
5878" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
5879 if w:netrw_liststyle == s:LONGLIST
5880 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
5881 else
5882 let seqlist = g:netrw_sort_sequence
5883 endif
5884 " sanity check -- insure that * appears somewhere
5885 if seqlist == ""
5886 let seqlist= '*'
5887 elseif seqlist !~ '\*'
5888 let seqlist= seqlist.',*'
5889 endif
5890 let priority = 1
5891 while seqlist != ""
5892 if seqlist =~ ','
5893 let seq = substitute(seqlist,',.*$','','e')
5894 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
5895 else
5896 let seq = seqlist
5897 let seqlist = ""
5898 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00005899 if priority < 10
Bram Moolenaar5c736222010-01-06 20:54:52 +01005900 let spriority= "00".priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00005901 elseif priority < 100
Bram Moolenaar5c736222010-01-06 20:54:52 +01005902 let spriority= "0".priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00005903 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01005904 let spriority= priority.g:netrw_sepchr
Bram Moolenaar446cb832008-06-24 21:56:24 +00005905 endif
5906" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
5907
5908 " sanity check
5909 if w:netrw_bannercnt > line("$")
5910 " apparently no files were left after a Hiding pattern was used
5911" call Dret("SetSort : no files left after hiding")
5912 return
5913 endif
5914 if seq == '*'
5915 let starpriority= spriority
5916 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005917 exe 'sil keepj '.w:netrw_bannercnt.',$g/'.seq.'/s/^/'.spriority.'/'
Bram Moolenaar5c736222010-01-06 20:54:52 +01005918 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005919 " sometimes multiple sorting patterns will match the same file or directory.
5920 " The following substitute is intended to remove the excess matches.
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005921 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 Moolenaar5c736222010-01-06 20:54:52 +01005922 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005923 endif
5924 let priority = priority + 1
5925 endwhile
5926 if exists("starpriority")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005927 exe 'sil keepj '.w:netrw_bannercnt.',$v/^\d\{3}'.g:netrw_sepchr.'/s/^/'.starpriority.'/'
Bram Moolenaar5c736222010-01-06 20:54:52 +01005928 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005929 endif
5930
5931 " Following line associated with priority -- items that satisfy a priority
5932 " pattern get prefixed by ###/ which permits easy sorting by priority.
5933 " Sometimes files can satisfy multiple priority patterns -- only the latest
5934 " priority pattern needs to be retained. So, at this point, these excess
5935 " priority prefixes need to be removed, but not directories that happen to
5936 " be just digits themselves.
Bram Moolenaar00a927d2010-05-14 23:24:24 +02005937 exe 'sil keepj '.w:netrw_bannercnt.',$s/^\(\d\{3}'.g:netrw_sepchr.'\)\%(\d\{3}'.g:netrw_sepchr.'\)\+\ze./\1/e'
Bram Moolenaar5c736222010-01-06 20:54:52 +01005938 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005939
5940" call Dret("SetSort")
5941endfun
5942
5943" =====================================================================
5944" s:NetrwSortStyle: change sorting style (name - time - size) and refresh display {{{2
5945fun! s:NetrwSortStyle(islocal)
5946" call Dfunc("s:NetrwSortStyle(islocal=".a:islocal.") netrw_sort_by<".g:netrw_sort_by.">")
5947 call s:NetrwSaveWordPosn()
5948 let svpos= netrw#NetrwSavePosn()
5949
5950 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 +02005951 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00005952 call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5953 call netrw#NetrwRestorePosn(svpos)
5954
5955" call Dret("s:NetrwSortStyle : netrw_sort_by<".g:netrw_sort_by.">")
5956endfun
5957
5958" ---------------------------------------------------------------------
5959" s:NetrwSplit: mode {{{2
5960" =0 : net and o
5961" =1 : net and t
5962" =2 : net and v
5963" =3 : local and o
5964" =4 : local and t
5965" =5 : local and v
5966fun! s:NetrwSplit(mode)
5967" call Dfunc("s:NetrwSplit(mode=".a:mode.") alto=".g:netrw_alto." altv=".g:netrw_altv)
5968
5969 call s:SaveWinVars()
5970
5971 if a:mode == 0
5972 " remote and o
5973" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s")
5974 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
5975 let s:didsplit= 1
5976 call s:RestoreWinVars()
5977 call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
5978 unlet s:didsplit
5979
5980 elseif a:mode == 1
5981 " remote and t
Bram Moolenaar5c736222010-01-06 20:54:52 +01005982 let newdir = s:NetrwBrowseChgDir(0,s:NetrwGetWord())
Bram Moolenaar446cb832008-06-24 21:56:24 +00005983" call Decho("tabnew")
5984 tabnew
5985 let s:didsplit= 1
5986 call s:RestoreWinVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +01005987 call s:NetrwBrowse(0,newdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00005988 unlet s:didsplit
5989
5990 elseif a:mode == 2
5991 " remote and v
5992" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v")
5993 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
5994 let s:didsplit= 1
5995 call s:RestoreWinVars()
5996 call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
5997 unlet s:didsplit
5998
5999 elseif a:mode == 3
6000 " local and o
6001" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s")
6002 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
6003 let s:didsplit= 1
6004 call s:RestoreWinVars()
6005 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
6006 unlet s:didsplit
6007
6008 elseif a:mode == 4
6009 " local and t
Bram Moolenaar446cb832008-06-24 21:56:24 +00006010 let cursorword = s:NetrwGetWord()
Bram Moolenaar5c736222010-01-06 20:54:52 +01006011 let netrw_curdir= s:NetrwTreeDir()
Bram Moolenaar446cb832008-06-24 21:56:24 +00006012" call Decho("tabnew")
6013 tabnew
6014 let b:netrw_curdir= netrw_curdir
6015 let s:didsplit= 1
6016 call s:RestoreWinVars()
6017 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,cursorword))
6018 unlet s:didsplit
6019
6020 elseif a:mode == 5
6021 " local and v
6022" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v")
6023 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
6024 let s:didsplit= 1
6025 call s:RestoreWinVars()
6026 call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
6027 unlet s:didsplit
6028
6029 else
6030 call netrw#ErrorMsg(s:ERROR,"(NetrwSplit) unsupported mode=".a:mode,45)
6031 endif
6032
6033" call Dret("s:NetrwSplit")
6034endfun
6035
6036" ---------------------------------------------------------------------
6037" NetrwStatusLine: {{{2
6038fun! NetrwStatusLine()
6039
6040" vvv NetrwStatusLine() debugging vvv
6041" let g:stlmsg=""
6042" if !exists("w:netrw_explore_bufnr")
6043" let g:stlmsg="!X<explore_bufnr>"
6044" elseif w:netrw_explore_bufnr != bufnr("%")
6045" let g:stlmsg="explore_bufnr!=".bufnr("%")
6046" endif
6047" if !exists("w:netrw_explore_line")
6048" let g:stlmsg=" !X<explore_line>"
6049" elseif w:netrw_explore_line != line(".")
6050" let g:stlmsg=" explore_line!={line(.)<".line(".").">"
6051" endif
6052" if !exists("w:netrw_explore_list")
6053" let g:stlmsg=" !X<explore_list>"
6054" endif
6055" ^^^ NetrwStatusLine() debugging ^^^
6056
6057 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")
6058 " restore user's status line
6059 let &stl = s:netrw_users_stl
6060 let &laststatus = s:netrw_users_ls
6061 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
6062 if exists("w:netrw_explore_line") |unlet w:netrw_explore_line |endif
6063 return ""
6064 else
6065 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
6066 endif
6067endfun
6068
6069" ---------------------------------------------------------------------
6070" s:NetrwTreeDir: determine tree directory given current cursor position {{{2
6071" (full path directory with trailing slash returned)
6072fun! s:NetrwTreeDir()
6073" call Dfunc("NetrwTreeDir() curline#".line(".")."<".getline('.')."> b:netrw_curdir<".b:netrw_curdir."> tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%").">")
6074
6075 let treedir= b:netrw_curdir
6076" call Decho("set initial treedir<".treedir.">")
6077 let s:treecurpos= netrw#NetrwSavePosn()
6078
6079 if w:netrw_liststyle == s:TREELIST
6080" call Decho("w:netrrw_liststyle is TREELIST:")
6081" call Decho("line#".line(".")." getline(.)<".getline('.')."> treecurpos<".string(s:treecurpos).">")
Bram Moolenaar5c736222010-01-06 20:54:52 +01006082
6083 " extract tree directory if on a line specifying a subdirectory (ie. ends with "/")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006084 if getline('.') =~ '/$'
6085 let treedir= substitute(getline('.'),'^\%(| \)*\([^|].\{-}\)$','\1','e')
6086 else
6087 let treedir= ""
6088 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006089" call Decho("treedir<".treedir.">")
6090
6091 " detect user attempting to close treeroot
6092 if getline('.') !~ '|' && getline('.') != '..'
6093" call Decho("user attempted to close treeroot")
6094 " now force a refresh
6095" call Decho("clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006096 keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00006097" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
6098 return b:netrw_curdir
6099 endif
6100
6101 " elide all non-depth information
6102 let depth = substitute(getline('.'),'^\(\%(| \)*\)[^|].\{-}$','\1','e')
Bram Moolenaar5c736222010-01-06 20:54:52 +01006103" call Decho("depth<".depth."> 1st subst (non-depth info removed)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006104
6105 " elide first depth
6106 let depth = substitute(depth,'^| ','','')
Bram Moolenaar5c736222010-01-06 20:54:52 +01006107" call Decho("depth<".depth."> 2nd subst (first depth removed)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006108
6109 " construct treedir by searching backwards at correct depth
6110" call Decho("constructing treedir<".treedir."> depth<".depth.">")
6111 while depth != "" && search('^'.depth.'[^|].\{-}/$','bW')
6112 let dirname= substitute(getline('.'),'^\(| \)*','','e')
6113 let treedir= dirname.treedir
6114 let depth = substitute(depth,'^| ','','')
6115" call Decho("constructing treedir<".treedir.">: dirname<".dirname."> while depth<".depth.">")
6116 endwhile
6117 if w:netrw_treetop =~ '/$'
6118 let treedir= w:netrw_treetop.treedir
6119 else
6120 let treedir= w:netrw_treetop.'/'.treedir
6121 endif
6122" call Decho("bufnr(.)=".bufnr("%")." line($)=".line("$")." line(.)=".line("."))
6123 endif
6124 let treedir= substitute(treedir,'//$','/','')
6125
Bram Moolenaar446cb832008-06-24 21:56:24 +00006126" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
6127 return treedir
6128endfun
6129
6130" ---------------------------------------------------------------------
6131" s:NetrwTreeDisplay: recursive tree display {{{2
6132fun! s:NetrwTreeDisplay(dir,depth)
6133" call Dfunc("NetrwTreeDisplay(dir<".a:dir."> depth<".a:depth.">)")
6134
6135 " insure that there are no folds
6136 setlocal nofen
6137
6138 " install ../ and shortdir
6139 if a:depth == ""
6140 call setline(line("$")+1,'../')
6141" call Decho("setline#".line("$")." ../ (depth is zero)")
6142 endif
6143 if a:dir =~ '^\a\+://'
6144 if a:dir == w:netrw_treetop
6145 let shortdir= a:dir
6146 else
6147 let shortdir= substitute(a:dir,'^.*/\([^/]\+\)/$','\1/','e')
6148 endif
6149 call setline(line("$")+1,a:depth.shortdir)
6150 else
6151 let shortdir= substitute(a:dir,'^.*/','','e')
6152 call setline(line("$")+1,a:depth.shortdir.'/')
6153 endif
6154" call Decho("setline#".line("$")." shortdir<".a:depth.shortdir.">")
6155
6156 " append a / to dir if its missing one
6157 let dir= a:dir
6158 if dir !~ '/$'
6159 let dir= dir.'/'
6160 endif
6161
6162 " display subtrees (if any)
6163 let depth= "| ".a:depth
6164
6165" call Decho("display subtrees with depth<".depth."> and current leaves")
6166 for entry in w:netrw_treedict[a:dir]
6167 let direntry= substitute(dir.entry,'/$','','e')
6168" call Decho("dir<".dir."> entry<".entry."> direntry<".direntry.">")
6169 if entry =~ '/$' && has_key(w:netrw_treedict,direntry)
6170" call Decho("<".direntry."> is a key in treedict - display subtree for it")
6171 call s:NetrwTreeDisplay(direntry,depth)
6172 elseif entry =~ '/$' && has_key(w:netrw_treedict,direntry.'/')
6173" call Decho("<".direntry."/> is a key in treedict - display subtree for it")
6174 call s:NetrwTreeDisplay(direntry.'/',depth)
6175 else
6176" call Decho("<".entry."> is not a key in treedict (no subtree)")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006177 keepj call setline(line("$")+1,depth.entry)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006178 endif
6179 endfor
6180" call Dret("NetrwTreeDisplay")
6181endfun
6182
6183" ---------------------------------------------------------------------
6184" s:NetrwTreeListing: displays tree listing from treetop on down, using NetrwTreeDisplay() {{{2
6185fun! s:NetrwTreeListing(dirname)
6186 if w:netrw_liststyle == s:TREELIST
6187" call Dfunc("NetrwTreeListing() bufname<".expand("%").">")
6188" call Decho("curdir<".a:dirname.">")
6189" 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"))
6190
6191 " update the treetop
6192" call Decho("update the treetop")
6193 if !exists("w:netrw_treetop")
6194 let w:netrw_treetop= a:dirname
6195" call Decho("w:netrw_treetop<".w:netrw_treetop."> (reusing)")
6196 elseif (w:netrw_treetop =~ ('^'.a:dirname) && s:Strlen(a:dirname) < s:Strlen(w:netrw_treetop)) || a:dirname !~ ('^'.w:netrw_treetop)
6197 let w:netrw_treetop= a:dirname
6198" call Decho("w:netrw_treetop<".w:netrw_treetop."> (went up)")
6199 endif
6200
6201 " insure that we have at least an empty treedict
6202 if !exists("w:netrw_treedict")
6203 let w:netrw_treedict= {}
6204 endif
6205
6206 " update the directory listing for the current directory
6207" call Decho("updating dictionary with ".a:dirname.":[..directory listing..]")
6208" call Decho("bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
6209 exe "silent! keepjumps ".w:netrw_bannercnt.',$g@^\.\.\=/$@d'
6210 let w:netrw_treedict[a:dirname]= getline(w:netrw_bannercnt,line("$"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006211" call Decho("w:treedict[".a:dirname."]= ".string(w:netrw_treedict[a:dirname]))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006212 exe "silent! keepjumps ".w:netrw_bannercnt.",$d"
6213
6214 " if past banner, record word
6215 if exists("w:netrw_bannercnt") && line(".") > w:netrw_bannercnt
6216 let fname= expand("<cword>")
6217 else
6218 let fname= ""
6219 endif
6220" call Decho("fname<".fname.">")
6221
6222 " display from treetop on down
6223 call s:NetrwTreeDisplay(w:netrw_treetop,"")
6224
6225" call Dret("NetrwTreeListing : bufname<".expand("%").">")
6226 endif
6227endfun
6228
6229" ---------------------------------------------------------------------
6230" s:NetrwWideListing: {{{2
6231fun! s:NetrwWideListing()
6232
6233 if w:netrw_liststyle == s:WIDELIST
6234" call Dfunc("NetrwWideListing() w:netrw_liststyle=".w:netrw_liststyle.' fo='.&fo.' l:fo='.&l:fo)
6235 " look for longest filename (cpf=characters per filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01006236 " cpf: characters per filename
6237 " fpl: filenames per line
6238 " fpc: filenames per column
Bram Moolenaar446cb832008-06-24 21:56:24 +00006239 setlocal ma noro
6240" call Decho("setlocal ma noro")
6241 let b:netrw_cpf= 0
6242 if line("$") >= w:netrw_bannercnt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006243 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 +01006244 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006245 else
6246" call Dret("NetrwWideListing")
6247 return
6248 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006249 let b:netrw_cpf= b:netrw_cpf + 2
6250" call Decho("b:netrw_cpf=max_filename_length+2=".b:netrw_cpf)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006251
6252 " determine qty files per line (fpl)
6253 let w:netrw_fpl= winwidth(0)/b:netrw_cpf
6254 if w:netrw_fpl <= 0
6255 let w:netrw_fpl= 1
6256 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006257" call Decho("fpl= [winwidth=".winwidth(0)."]/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006258
6259 " make wide display
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006260 exe 'sil keepj '.w:netrw_bannercnt.',$s/^.*$/\=escape(printf("%-'.b:netrw_cpf.'s",submatch(0)),"\\")/'
Bram Moolenaar5c736222010-01-06 20:54:52 +01006261 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006262 let fpc = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl
6263 let newcolstart = w:netrw_bannercnt + fpc
6264 let newcolend = newcolstart + fpc - 1
6265" call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]")
6266 silent! let keepregstar = @*
6267 while line("$") >= newcolstart
6268 if newcolend > line("$") | let newcolend= line("$") | endif
6269 let newcolqty= newcolend - newcolstart
6270 exe newcolstart
6271 if newcolqty == 0
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006272 exe "sil keepj norm! 0\<c-v>$hx".w:netrw_bannercnt."G$p"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006273 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006274 exe "sil keepj norm! 0\<c-v>".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006275 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006276 exe "sil keepj ".newcolstart.','.newcolend.'d'
6277 exe 'sil keepj '.w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006278 endwhile
6279 silent! let @*= keepregstar
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006280 exe "sil keepj ".w:netrw_bannercnt.',$s/\s\+$//e'
Bram Moolenaar5c736222010-01-06 20:54:52 +01006281 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006282 setlocal noma nomod ro
6283" call Dret("NetrwWideListing")
6284 endif
6285
6286endfun
6287
6288" ---------------------------------------------------------------------
6289" s:PerformListing: {{{2
6290fun! s:PerformListing(islocal)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006291" call Dfunc("s:PerformListing(islocal=".a:islocal.") bufnr(%)=".bufnr("%")."<".bufname("%").">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006292
6293 call s:NetrwSafeOptions()
6294 setlocal noro ma
6295" call Decho("setlocal noro ma")
6296
6297" if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 " Decho
6298" call Decho("(netrw) Processing your browsing request...")
6299" endif " Decho
6300
6301" call Decho('w:netrw_liststyle='.(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a'))
6302 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
6303 " force a refresh for tree listings
6304" call Decho("force refresh for treelisting: clear buffer<".expand("%")."> with :%d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006305 keepj %d
Bram Moolenaar446cb832008-06-24 21:56:24 +00006306 endif
6307
6308 " save current directory on directory history list
Bram Moolenaar5c736222010-01-06 20:54:52 +01006309 call s:NetrwBookHistHandler(3,b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006310
6311 " Set up the banner {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01006312 if g:netrw_banner
6313" call Decho("set up banner")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006314 keepj put ='\" ============================================================================'
6315 keepj put ='\" Netrw Directory Listing (netrw '.g:loaded_netrw.')'
6316 keepj put ='\" '.b:netrw_curdir
6317 keepj 1d
Bram Moolenaar5c736222010-01-06 20:54:52 +01006318 let w:netrw_bannercnt= 3
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006319 exe "keepj ".w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01006320 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006321 keepj 1
Bram Moolenaar5c736222010-01-06 20:54:52 +01006322 let w:netrw_bannercnt= 1
6323 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006324
6325 let sortby= g:netrw_sort_by
6326 if g:netrw_sort_direction =~ "^r"
6327 let sortby= sortby." reversed"
6328 endif
6329
6330 " Sorted by... {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01006331 if g:netrw_banner
6332" call Decho("handle specified sorting: g:netrw_sort_by<".g:netrw_sort_by.">")
6333 if g:netrw_sort_by =~ "^n"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006334" call Decho("directories will be sorted by name")
Bram Moolenaar5c736222010-01-06 20:54:52 +01006335 " sorted by name
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006336 keepj put ='\" Sorted by '.sortby
6337 keepj put ='\" Sort sequence: '.g:netrw_sort_sequence
Bram Moolenaar5c736222010-01-06 20:54:52 +01006338 let w:netrw_bannercnt= w:netrw_bannercnt + 2
6339 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00006340" call Decho("directories will be sorted by size or time")
Bram Moolenaar5c736222010-01-06 20:54:52 +01006341 " sorted by size or date
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006342 keepj put ='\" Sorted by '.sortby
Bram Moolenaar5c736222010-01-06 20:54:52 +01006343 let w:netrw_bannercnt= w:netrw_bannercnt + 1
6344 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006345 exe "keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006346 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006347
6348 " show copy/move target, if any
Bram Moolenaar5c736222010-01-06 20:54:52 +01006349 if g:netrw_banner
6350 if exists("s:netrwmftgt") && exists("s:netrwmftgt_islocal")
6351" call Decho("show copy/move target<".s:netrwmftgt.">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006352 keepj put =''
Bram Moolenaar5c736222010-01-06 20:54:52 +01006353 if s:netrwmftgt_islocal
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006354 keepj call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (local)')
Bram Moolenaar5c736222010-01-06 20:54:52 +01006355 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006356 keepj call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (remote)')
Bram Moolenaar5c736222010-01-06 20:54:52 +01006357 endif
6358 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00006359 else
Bram Moolenaar5c736222010-01-06 20:54:52 +01006360" call Decho("s:netrwmftgt does not exist, don't make Copy/Move Tgt")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006361 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006362 exe "keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006363 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006364
6365 " Hiding... -or- Showing... {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01006366 if g:netrw_banner
6367" call Decho("handle hiding/showing (g:netrw_hide=".g:netrw_list_hide." g:netrw_list_hide<".g:netrw_list_hide.">)")
6368 if g:netrw_list_hide != "" && g:netrw_hide
6369 if g:netrw_hide == 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006370 keepj put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaar5c736222010-01-06 20:54:52 +01006371 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006372 keepj put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaar5c736222010-01-06 20:54:52 +01006373 endif
6374 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar446cb832008-06-24 21:56:24 +00006375 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006376 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006377 keepj put ='\" Quick Help: <F1>:help -:go up dir D:delete R:rename s:sort-by x:exec'
6378 keepj put ='\" ============================================================================'
Bram Moolenaar5c736222010-01-06 20:54:52 +01006379 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar446cb832008-06-24 21:56:24 +00006380 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006381
6382 " bannercnt should index the line just after the banner
Bram Moolenaar5c736222010-01-06 20:54:52 +01006383 if g:netrw_banner
6384 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006385 exe "keepj ".w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01006386" call Decho("bannercnt=".w:netrw_bannercnt." (should index line just after banner) line($)=".line("$"))
6387 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006388
6389 " set up syntax highlighting {{{3
6390" call Decho("set up syntax highlighting")
6391 if has("syntax")
6392 setlocal ft=netrw
6393 if !exists("g:syntax_on") || !g:syntax_on
6394 setlocal ft=
6395 endif
6396 endif
6397
6398 " get list of files
6399" call Decho("Get list of files - islocal=".a:islocal)
6400 if a:islocal
6401 call s:LocalListing()
6402 else " remote
6403 call s:NetrwRemoteListing()
6404 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006405" call Decho("g:netrw_banner=".g:netrw_banner." w:netrw_bannercnt=".w:netrw_bannercnt." (banner complete)")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006406
6407 " manipulate the directory listing (hide, sort) {{{3
Bram Moolenaar5c736222010-01-06 20:54:52 +01006408 if !g:netrw_banner || line("$") >= w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006409" call Decho("manipulate directory listing (hide)")
6410" call Decho("g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">")
6411 if g:netrw_hide && g:netrw_list_hide != ""
6412 call s:NetrwListHide()
6413 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01006414 if !g:netrw_banner || line("$") >= w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006415" call Decho("manipulate directory listing (sort) : g:netrw_sort_by<".g:netrw_sort_by.">")
6416
6417 if g:netrw_sort_by =~ "^n"
6418 " sort by name
6419 call s:NetrwSetSort()
6420
Bram Moolenaar5c736222010-01-06 20:54:52 +01006421 if !g:netrw_banner || w:netrw_bannercnt < line("$")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006422" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction." (bannercnt=".w:netrw_bannercnt.")")
6423 if g:netrw_sort_direction =~ 'n'
6424 " normal direction sorting
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006425 exe 'sil keepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00006426 else
6427 " reverse direction sorting
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006428 exe 'sil keepj '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00006429 endif
6430 endif
6431 " remove priority pattern prefix
6432" call Decho("remove priority pattern prefix")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006433 exe 'sil keepj '.w:netrw_bannercnt.',$s/^\d\{3}'.g:netrw_sepchr.'//e'
Bram Moolenaar5c736222010-01-06 20:54:52 +01006434 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006435
6436 elseif a:islocal
Bram Moolenaar5c736222010-01-06 20:54:52 +01006437 if !g:netrw_banner || w:netrw_bannercnt < line("$")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006438" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction)
6439 if g:netrw_sort_direction =~ 'n'
6440" call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$sort')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006441 exe 'sil keepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00006442 else
6443" call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$sort!')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006444 exe 'sil keepj '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
Bram Moolenaar446cb832008-06-24 21:56:24 +00006445 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006446 exe 'sil keepj '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
Bram Moolenaar5c736222010-01-06 20:54:52 +01006447 call histdel("/",-1)
6448 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006449 endif
6450
6451 elseif g:netrw_sort_direction =~ 'r'
6452" call Decho('reverse the sorted listing')
Bram Moolenaar5c736222010-01-06 20:54:52 +01006453 if !g:netrw_banner || w:netrw_bannercnt < line('$')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006454 exe 'sil keepj '.w:netrw_bannercnt.',$g/^/m '.w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01006455 call histdel("/",-1)
6456 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006457 endif
6458 endif
6459
6460 " convert to wide/tree listing {{{3
6461" call Decho("modify display if wide/tree listing style")
6462 call s:NetrwWideListing()
6463 call s:NetrwTreeListing(b:netrw_curdir)
6464
Bram Moolenaar5c736222010-01-06 20:54:52 +01006465 if exists("w:netrw_bannercnt") && (line("$") > w:netrw_bannercnt || !g:netrw_banner)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006466 " place cursor on the top-left corner of the file listing
6467" call Decho("place cursor on top-left corner of file listing")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006468 exe 'sil keepj '.w:netrw_bannercnt
6469 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00006470 endif
6471
6472 " record previous current directory
6473 let w:netrw_prvdir= b:netrw_curdir
6474" call Decho("record netrw_prvdir<".w:netrw_prvdir.">")
6475
6476 " save certain window-oriented variables into buffer-oriented variables {{{3
6477 call s:SetBufWinVars()
6478 call s:NetrwOptionRestore("w:")
6479
6480 " set display to netrw display settings
6481" call Decho("set display to netrw display settings (noma nomod etc)")
6482 setlocal noma nomod nonu nobl nowrap ro
6483 if exists("s:treecurpos")
6484
6485 call netrw#NetrwRestorePosn(s:treecurpos)
6486 unlet s:treecurpos
6487 endif
6488
6489" call Dret("s:PerformListing : curpos<".string(getpos(".")).">")
6490endfun
6491
6492" ---------------------------------------------------------------------
6493" s:SetupNetrwStatusLine: {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00006494fun! s:SetupNetrwStatusLine(statline)
6495" call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)")
6496
6497 if !exists("s:netrw_setup_statline")
6498 let s:netrw_setup_statline= 1
6499" call Decho("do first-time status line setup")
6500
6501 if !exists("s:netrw_users_stl")
6502 let s:netrw_users_stl= &stl
6503 endif
6504 if !exists("s:netrw_users_ls")
6505 let s:netrw_users_ls= &laststatus
6506 endif
6507
6508 " set up User9 highlighting as needed
6509 let keepa= @a
6510 redir @a
6511 try
6512 hi User9
6513 catch /^Vim\%((\a\+)\)\=:E411/
6514 if &bg == "dark"
6515 hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue
6516 else
6517 hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue
6518 endif
6519 endtry
6520 redir END
6521 let @a= keepa
6522 endif
6523
6524 " set up status line (may use User9 highlighting)
6525 " insure that windows have a statusline
6526 " make sure statusline is displayed
6527 let &stl=a:statline
6528 setlocal laststatus=2
6529" call Decho("stl=".&stl)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006530 redraw
Bram Moolenaar9964e462007-05-05 17:54:07 +00006531
6532" call Dret("SetupNetrwStatusLine : stl=".&stl)
6533endfun
6534
6535" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00006536" Remote Directory Browsing Support: {{{1
6537" ===========================================
Bram Moolenaar9964e462007-05-05 17:54:07 +00006538
6539" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00006540" s:NetrwRemoteListing: {{{2
6541fun! s:NetrwRemoteListing()
6542" call Dfunc("s:NetrwRemoteListing() b:netrw_curdir<".b:netrw_curdir.">)")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00006543
Bram Moolenaar446cb832008-06-24 21:56:24 +00006544 call s:RemotePathAnalysis(b:netrw_curdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00006545
Bram Moolenaar446cb832008-06-24 21:56:24 +00006546 " sanity check:
6547 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
6548" call Decho("b:netrw_method=".b:netrw_method)
6549 if !executable("ftp")
6550 if !exists("g:netrw_quiet")
6551 call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ftp",18)
6552 endif
6553 call s:NetrwOptionRestore("w:")
6554" call Dret("s:NetrwRemoteListing")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00006555 return
6556 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00006557
6558 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
6559 if !exists("g:netrw_quiet")
6560 if g:netrw_list_cmd == ""
6561 call netrw#ErrorMsg(s:ERROR,g:netrw_ssh_cmd." is not executable on your system",47)
6562 else
6563 call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ".g:netrw_list_cmd,19)
6564 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00006565 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00006566
Bram Moolenaar446cb832008-06-24 21:56:24 +00006567 call s:NetrwOptionRestore("w:")
6568" call Dret("s:NetrwRemoteListing")
6569 return
6570 endif " (remote handling sanity check)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00006571
Bram Moolenaar446cb832008-06-24 21:56:24 +00006572 if exists("b:netrw_method")
6573" call Decho("setting w:netrw_method<".b:netrw_method.">")
6574 let w:netrw_method= b:netrw_method
6575 endif
6576
6577 if s:method == "ftp"
6578 " use ftp to get remote file listing
6579" call Decho("use ftp to get remote file listing")
6580 let s:method = "ftp"
6581 let listcmd = g:netrw_ftp_list_cmd
6582 if g:netrw_sort_by =~ '^t'
6583 let listcmd= g:netrw_ftp_timelist_cmd
6584 elseif g:netrw_sort_by =~ '^s'
6585 let listcmd= g:netrw_ftp_sizelist_cmd
6586 endif
6587" call Decho("listcmd<".listcmd."> (using g:netrw_ftp_list_cmd)")
6588 call s:NetrwRemoteFtpCmd(s:path,listcmd)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006589" exe "keepj ".w:netrw_bannercnt.',$g/^./call Decho("raw listing: ".getline("."))'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006590
6591 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
6592 " shorten the listing
6593" call Decho("generate short listing")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006594 exe "keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006595
6596 " cleanup
6597 if g:netrw_ftp_browse_reject != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006598 exe "sil! keepj g/".g:netrw_ftp_browse_reject."/keepj d"
Bram Moolenaar5c736222010-01-06 20:54:52 +01006599 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006600 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006601 sil! keepj %s/\r$//e
Bram Moolenaar5c736222010-01-06 20:54:52 +01006602 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006603
6604 " if there's no ../ listed, then put ./ and ../ in
6605 let line1= line(".")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006606 exe "keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006607 let line2= search('^\.\.\/\%(\s\|$\)','cnW')
6608 if line2 == 0
6609" call Decho("netrw is putting ./ and ../ into listing")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006610 keepj put='../'
6611 keepj put='./'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006612 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006613 exe "keepj ".line1
Bram Moolenaar446cb832008-06-24 21:56:24 +00006614 keepjumps norm! 0
6615
6616" call Decho("line1=".line1." line2=".line2." line(.)=".line("."))
6617 if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
6618" call Decho("M$ ftp cleanup")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006619 exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\d\{2}-\d\{2}-\d\{2}\s\+\d\+:\d\+[AaPp][Mm]\s\+\%(<DIR>\|\d\+\)\s\+//'
Bram Moolenaar5c736222010-01-06 20:54:52 +01006620 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006621 else " normal ftp cleanup
6622" call Decho("normal ftp cleanup")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006623 exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
6624 exe "sil! keepj ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
6625 exe "sil! keepj ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
Bram Moolenaar5c736222010-01-06 20:54:52 +01006626 call histdel("/",-1)
6627 call histdel("/",-1)
6628 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006629 endif
6630 endif
6631
6632 else
6633 " use ssh to get remote file listing {{{3
6634" call Decho("use ssh to get remote file listing: s:path<".s:path.">")
6635 let listcmd= s:MakeSshCmd(g:netrw_list_cmd)
6636" call Decho("listcmd<".listcmd."> (using g:netrw_list_cmd)")
6637 if g:netrw_scp_cmd =~ '^pscp'
Bram Moolenaare37d50a2008-08-06 17:06:04 +00006638" call Decho("1: exe silent r! ".shellescape(listcmd.s:path, 1))
6639 exe "silent r! ".listcmd.shellescape(s:path, 1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006640 " remove rubbish and adjust listing format of 'pscp' to 'ssh ls -FLa' like
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006641 keepj g/^Listing directory/keepj d
6642 keepj g/^d[-rwx][-rwx][-rwx]/keepj s+$+/+e
6643 sil keepj g/^l[-rwx][-rwx][-rwx]/keepj s+$+@+e
Bram Moolenaar5c736222010-01-06 20:54:52 +01006644 call histdel("/",-1)
6645 call histdel("/",-1)
6646 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006647 if g:netrw_liststyle != s:LONGLIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006648 keepj g/^[dlsp-][-rwx][-rwx][-rwx]/keepj s/^.*\s\(\S\+\)$/\1/e
Bram Moolenaar5c736222010-01-06 20:54:52 +01006649 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006650 endif
6651 else
6652 if s:path == ""
6653" call Decho("2: exe silent r! ".listcmd)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006654 exe "sil r! ".listcmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00006655 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00006656" call Decho("3: exe silent r! ".listcmd.' '.shellescape(s:path,1))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006657 exe "sil r! ".listcmd.' '.shellescape(s:path,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006658" call Decho("listcmd<".listcmd."> path<".s:path.">")
6659 endif
6660 endif
6661
6662 " cleanup
6663 if g:netrw_ftp_browse_reject != ""
6664" call Decho("(cleanup) exe silent! g/".g:netrw_ssh_browse_reject."/keepjumps d")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006665 exe "sil! g/".g:netrw_ssh_browse_reject."/keepjumps d"
Bram Moolenaar5c736222010-01-06 20:54:52 +01006666 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006667 endif
6668 endif
6669
6670 if w:netrw_liststyle == s:LONGLIST
6671 " do a long listing; these substitutions need to be done prior to sorting {{{3
6672" call Decho("fix long listing:")
6673
6674 if s:method == "ftp"
6675 " cleanup
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006676 exe "keepj ".w:netrw_bannercnt
Bram Moolenaar446cb832008-06-24 21:56:24 +00006677 while getline('.') =~ g:netrw_ftp_browse_reject
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006678 keepj d
Bram Moolenaar446cb832008-06-24 21:56:24 +00006679 endwhile
6680 " if there's no ../ listed, then put ./ and ../ in
6681 let line1= line(".")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006682 keepj 1
6683 sil keepj call search('^\.\.\/\%(\s\|$\)','W')
Bram Moolenaar446cb832008-06-24 21:56:24 +00006684 let line2= line(".")
6685 if line2 == 0
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006686 exe 'keepj '.w:netrw_bannercnt."put='./'"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006687 if b:netrw_curdir != '/'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006688 exe 'keepj '.w:netrw_bannercnt."put='../'"
Bram Moolenaar446cb832008-06-24 21:56:24 +00006689 endif
6690 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006691 exe "keepj ".line1
Bram Moolenaar446cb832008-06-24 21:56:24 +00006692 keepjumps norm! 0
6693 endif
6694
6695 if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
6696" call Decho("M$ ftp site listing cleanup")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006697 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 +00006698 elseif exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$")
6699" call Decho("normal ftp site listing cleanup: bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006700 exe 'sil keepj '.w:netrw_bannercnt.',$s/ -> .*$//e'
6701 exe 'sil keepj '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
6702 exe 'sil keepj '.w:netrw_bannercnt
Bram Moolenaar5c736222010-01-06 20:54:52 +01006703 call histdel("/",-1)
6704 call histdel("/",-1)
6705 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006706 endif
6707 endif
6708
6709" if exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$") " Decho
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006710" exe "keepj ".w:netrw_bannercnt.',$g/^./call Decho("listing: ".getline("."))'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006711" endif " Decho
6712" call Dret("s:NetrwRemoteListing")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00006713endfun
6714
Bram Moolenaar446cb832008-06-24 21:56:24 +00006715" ---------------------------------------------------------------------
6716" s:NetrwRemoteRm: remove/delete a remote file or directory {{{2
6717fun! s:NetrwRemoteRm(usrhost,path) range
6718" call Dfunc("s:NetrwRemoteRm(usrhost<".a:usrhost."> path<".a:path.">) virtcol=".virtcol("."))
6719" call Decho("firstline=".a:firstline." lastline=".a:lastline)
6720 let svpos= netrw#NetrwSavePosn()
6721
6722 let all= 0
6723 if exists("s:netrwmarkfilelist_{bufnr('%')}")
6724 " remove all marked files
Bram Moolenaar5c736222010-01-06 20:54:52 +01006725" call Decho("remove all marked files with bufnr#".bufnr("%"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006726 for fname in s:netrwmarkfilelist_{bufnr("%")}
6727 let ok= s:NetrwRemoteRmFile(a:path,fname,all)
6728 if ok =~ 'q\%[uit]'
6729 break
6730 elseif ok =~ 'a\%[ll]'
6731 let all= 1
6732 endif
6733 endfor
Bram Moolenaar5c736222010-01-06 20:54:52 +01006734 call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006735
6736 else
6737 " remove files specified by range
Bram Moolenaar5c736222010-01-06 20:54:52 +01006738" call Decho("remove files specified by range")
Bram Moolenaar446cb832008-06-24 21:56:24 +00006739
6740 " preparation for removing multiple files/directories
6741 let ctr= a:firstline
6742
6743 " remove multiple files and directories
6744 while ctr <= a:lastline
6745 exe ctr
6746 let ok= s:NetrwRemoteRmFile(a:path,s:NetrwGetWord(),all)
6747 if ok =~ 'q\%[uit]'
6748 break
6749 elseif ok =~ 'a\%[ll]'
6750 let all= 1
6751 endif
6752 let ctr= ctr + 1
6753 endwhile
6754 endif
6755
6756 " refresh the (remote) directory listing
6757" call Decho("refresh remote directory listing")
6758 call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
6759 call netrw#NetrwRestorePosn(svpos)
6760
6761" call Dret("s:NetrwRemoteRm")
6762endfun
6763
6764" ---------------------------------------------------------------------
6765" s:NetrwRemoteRmFile: {{{2
6766fun! s:NetrwRemoteRmFile(path,rmfile,all)
6767" call Dfunc("s:NetrwRemoteRmFile(path<".a:path."> rmfile<".a:rmfile.">) all=".a:all)
6768
6769 let all= a:all
6770 let ok = ""
6771
6772 if a:rmfile !~ '^"' && (a:rmfile =~ '@$' || a:rmfile !~ '[\/]$')
6773 " attempt to remove file
6774" call Decho("attempt to remove file (all=".all.")")
6775 if !all
6776 echohl Statement
6777" call Decho("case all=0:")
6778 call inputsave()
6779 let ok= input("Confirm deletion of file<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
6780 call inputrestore()
6781 echohl NONE
6782 if ok == ""
6783 let ok="no"
6784 endif
6785 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
6786 if ok =~ 'a\%[ll]'
6787 let all= 1
6788 endif
6789 endif
6790
6791 if all || ok =~ 'y\%[es]' || ok == ""
6792" call Decho("case all=".all." or ok<".ok.">".(exists("w:netrw_method")? ': netrw_method='.w:netrw_method : ""))
6793 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
6794" call Decho("case ftp:")
6795 let path= a:path
6796 if path =~ '^\a\+://'
6797 let path= substitute(path,'^\a\+://[^/]\+/','','')
6798 endif
6799 silent! keepjumps .,$d
6800 call s:NetrwRemoteFtpCmd(path,"delete ".'"'.a:rmfile.'"')
6801 else
6802" call Decho("case ssh: g:netrw_rm_cmd<".g:netrw_rm_cmd.">")
6803 let netrw_rm_cmd= s:MakeSshCmd(g:netrw_rm_cmd)
6804" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">")
6805 if !exists("b:netrw_curdir")
6806 call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
6807 let ok="q"
6808 else
6809 let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
6810" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">")
6811" call Decho("remotedir<".remotedir.">")
6812" call Decho("rmfile<".a:rmfile.">")
6813 if remotedir != ""
6814 let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(remotedir.a:rmfile))
6815 else
6816 let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(a:rmfile))
6817 endif
6818" call Decho("call system(".netrw_rm_cmd.")")
6819 let ret= system(netrw_rm_cmd)
6820 if ret != 0
6821 call netrw#ErrorMsg(s:WARNING,"cmd<".netrw_rm_cmd."> failed",60)
6822 endif
6823" call Decho("returned=".ret." errcode=".v:shell_error)
6824 endif
6825 endif
6826 elseif ok =~ 'q\%[uit]'
6827" call Decho("ok==".ok)
6828 break
6829 endif
6830
6831 else
6832 " attempt to remove directory
6833" call Decho("attempt to remove directory")
6834 if !all
6835 call inputsave()
6836 let ok= input("Confirm deletion of directory<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
6837 call inputrestore()
6838 if ok == ""
6839 let ok="no"
6840 endif
6841 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
6842 if ok =~ 'a\%[ll]'
6843 let all= 1
6844 endif
6845 endif
6846
6847 if all || ok =~ 'y\%[es]' || ok == ""
6848 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
6849 call s:NetrwRemoteFtpCmd(a:path,"rmdir ".a:rmfile)
6850 else
6851 let rmfile = substitute(a:path.a:rmfile,'/$','','')
Bram Moolenaar5c736222010-01-06 20:54:52 +01006852 let netrw_rmdir_cmd = s:MakeSshCmd(netrw#WinPath(g:netrw_rmdir_cmd)).' '.shellescape(netrw#WinPath(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00006853" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
Bram Moolenaarc236c162008-07-13 17:41:49 +00006854 let ret= system(netrw_rmdir_cmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006855" call Decho("returned=".ret." errcode=".v:shell_error)
6856
6857 if v:shell_error != 0
Bram Moolenaarc236c162008-07-13 17:41:49 +00006858" call Decho("v:shell_error not 0")
Bram Moolenaar5c736222010-01-06 20:54:52 +01006859 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 +00006860" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
6861 let ret= system(netrw_rmf_cmd)
6862" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006863
6864 if v:shell_error != 0 && !exists("g:netrw_quiet")
6865 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",22)
6866 endif
6867 endif
6868 endif
6869
6870 elseif ok =~ 'q\%[uit]'
6871 break
6872 endif
6873 endif
6874
6875" call Dret("s:NetrwRemoteRmFile ".ok)
6876 return ok
6877endfun
6878
6879" ---------------------------------------------------------------------
6880" s:NetrwRemoteFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
6881" This function assumes that a long listing will be received. Size, time,
6882" and reverse sorts will be requested of the server but not otherwise
6883" enforced here.
6884fun! s:NetrwRemoteFtpCmd(path,listcmd)
6885" call Dfunc("NetrwRemoteFtpCmd(path<".a:path."> listcmd<".a:listcmd.">) netrw_method=".w:netrw_method)
6886" call Decho("line($)=".line("$")." bannercnt=".w:netrw_bannercnt)
6887
6888 " because WinXX ftp uses unix style input
6889 let ffkeep= &ff
6890 setlocal ma ff=unix noro
6891" call Decho("setlocal ma ff=unix noro")
6892
6893 " clear off any older non-banner lines
6894 " note that w:netrw_bannercnt indexes the line after the banner
6895" call Decho('exe silent! keepjumps '.w:netrw_bannercnt.",$d (clear off old non-banner lines)")
6896 exe "silent! keepjumps ".w:netrw_bannercnt.",$d"
6897
6898 ".........................................
6899 if w:netrw_method == 2 || w:netrw_method == 5
6900 " ftp + <.netrc>: Method #2
6901 if a:path != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006902 keepj put ='cd \"'.a:path.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006903 endif
6904 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006905 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00006906" call Decho("filter input: ".getline('.'))
6907 endif
6908 call setline(line("$")+1,a:listcmd)
6909" exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
6910 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00006911" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
6912 exe s:netrw_silentxfer." keepjumps ".w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006913 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00006914" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
6915 exe s:netrw_silentxfer." keepjumps ".w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006916 endif
6917
6918 ".........................................
6919 elseif w:netrw_method == 3
6920 " ftp + machine,id,passwd,filename: Method #3
6921 setlocal ff=unix
6922 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006923 keepj put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar446cb832008-06-24 21:56:24 +00006924 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006925 keepj put ='open '.g:netrw_machine
Bram Moolenaar446cb832008-06-24 21:56:24 +00006926 endif
6927
6928 if exists("g:netrw_ftp") && g:netrw_ftp == 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006929 keepj put =g:netrw_uid
6930 keepj put ='\"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006931 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006932 keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006933 endif
6934
6935 if a:path != ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006936 keepj put ='cd \"'.a:path.'\"'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006937 endif
6938 if exists("g:netrw_ftpextracmd")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006939 keepj put =g:netrw_ftpextracmd
Bram Moolenaar446cb832008-06-24 21:56:24 +00006940" call Decho("filter input: ".getline('.'))
6941 endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006942 keepj call setline(line("$")+1,a:listcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006943
6944 " perform ftp:
6945 " -i : turns off interactive prompting from ftp
6946 " -n unix : DON'T use <.netrc>, even though it exists
6947 " -n win32: quit being obnoxious about password
6948" exe w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
6949" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i -n")
6950 exe s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i -n"
6951
6952 ".........................................
6953 else
6954 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",23)
6955 endif
6956
6957 " cleanup for Windows
6958 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006959 sil! keepj %s/\r$//e
Bram Moolenaar5c736222010-01-06 20:54:52 +01006960 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006961 endif
6962 if a:listcmd == "dir"
6963 " infer directory/link based on the file permission string
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006964 sil! keepj g/d\%([-r][-w][-x]\)\{3}/keepj s@$@/@
6965 sil! keepj g/l\%([-r][-w][-x]\)\{3}/keepj s/$/@/
Bram Moolenaar5c736222010-01-06 20:54:52 +01006966 call histdel("/",-1)
6967 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006968 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006969 exe "sil! keepj ".w:netrw_bannercnt.',$s/^\%(\S\+\s\+\)\{8}//e'
Bram Moolenaar5c736222010-01-06 20:54:52 +01006970 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00006971 endif
6972 endif
6973
6974 " ftp's listing doesn't seem to include ./ or ../
6975 if !search('^\.\/$\|\s\.\/$','wn')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006976 exe 'keepj '.w:netrw_bannercnt
6977 keepj put ='./'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006978 endif
6979 if !search('^\.\.\/$\|\s\.\.\/$','wn')
Bram Moolenaar00a927d2010-05-14 23:24:24 +02006980 exe 'keepj '.w:netrw_bannercnt
6981 keepj put ='../'
Bram Moolenaar446cb832008-06-24 21:56:24 +00006982 endif
6983
6984 " restore settings
6985 let &ff= ffkeep
6986" call Dret("NetrwRemoteFtpCmd")
6987endfun
6988
6989" ---------------------------------------------------------------------
6990" s:NetrwRemoteRename: rename a remote file or directory {{{2
6991fun! s:NetrwRemoteRename(usrhost,path) range
6992" call Dfunc("NetrwRemoteRename(usrhost<".a:usrhost."> path<".a:path.">)")
6993
6994 " preparation for removing multiple files/directories
6995 let svpos = netrw#NetrwSavePosn()
6996 let ctr = a:firstline
6997 let rename_cmd = s:MakeSshCmd(g:netrw_rename_cmd)
6998
6999 " rename files given by the markfilelist
7000 if exists("s:netrwmarkfilelist_{bufnr('%')}")
7001 for oldname in s:netrwmarkfilelist_{bufnr("%")}
7002" call Decho("oldname<".oldname.">")
7003 if exists("subfrom")
7004 let newname= substitute(oldname,subfrom,subto,'')
7005" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
7006 else
7007 call inputsave()
7008 let newname= input("Moving ".oldname." to : ",oldname)
7009 call inputrestore()
7010 if newname =~ '^s/'
7011 let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
7012 let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
7013 let newname = substitute(oldname,subfrom,subto,'')
7014" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
7015 endif
7016 endif
7017
7018 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
7019 call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
7020 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00007021 let oldname= shellescape(a:path.oldname)
7022 let newname= shellescape(a:path.newname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007023" call Decho("system(netrw#WinPath(".rename_cmd.") ".oldname.' '.newname.")")
7024 let ret = system(netrw#WinPath(rename_cmd).' '.oldname.' '.newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007025 endif
7026
7027 endfor
7028 call s:NetrwUnMarkFile(1)
7029
7030 else
7031
7032 " attempt to rename files/directories
7033 while ctr <= a:lastline
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007034 exe "keepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00007035
7036 let oldname= s:NetrwGetWord()
7037" call Decho("oldname<".oldname.">")
7038
7039 call inputsave()
7040 let newname= input("Moving ".oldname." to : ",oldname)
7041 call inputrestore()
7042
7043 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
7044 call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
7045 else
Bram Moolenaarc236c162008-07-13 17:41:49 +00007046 let oldname= shellescape(a:path.oldname)
7047 let newname= shellescape(a:path.newname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007048" call Decho("system(netrw#WinPath(".rename_cmd.") ".oldname.' '.newname.")")
7049 let ret = system(netrw#WinPath(rename_cmd).' '.oldname.' '.newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007050 endif
7051
7052 let ctr= ctr + 1
7053 endwhile
7054 endif
7055
7056 " refresh the directory
7057 call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
7058 call netrw#NetrwRestorePosn(svpos)
7059
7060" call Dret("NetrwRemoteRename")
7061endfun
7062
7063" ---------------------------------------------------------------------
7064" Local Directory Browsing Support: {{{1
7065" ==========================================
7066
7067" ---------------------------------------------------------------------
7068" netrw#LocalBrowseCheck: {{{2
7069fun! netrw#LocalBrowseCheck(dirname)
7070 " unfortunate interaction -- split window debugging can't be
7071 " used here, must use D-echoRemOn or D-echoTabOn -- the BufEnter
7072 " event triggers another call to LocalBrowseCheck() when attempts
7073 " to write to the DBG buffer are made.
7074 " The &ft == "netrw" test was installed because the BufEnter event
7075 " would hit when re-entering netrw windows, creating unexpected
7076 " refreshes (and would do so in the middle of NetrwSaveOptions(), too)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007077" call Decho("netrw#LocalBrowseCheck: isdir<".a:dirname.">=".isdirectory(a:dirname).((exists("s:treeforceredraw")? " treeforceredraw" : "")))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007078 if isdirectory(a:dirname)
7079" call Decho(" ft<".&ft."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : " doesn't exist")."> dirname<".a:dirname.">"." line($)=".line("$"))
7080 if &ft != "netrw" || (exists("b:netrw_curdir") && b:netrw_curdir != a:dirname)
7081 silent! call s:NetrwBrowse(1,a:dirname)
7082 elseif &ft == "netrw" && line("$") == 1
7083 silent! call s:NetrwBrowse(1,a:dirname)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007084 elseif exists("s:treeforceredraw")
7085 unlet s:treeforceredraw
7086 silent! call s:NetrwBrowse(1,a:dirname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007087 endif
7088 endif
7089 " not a directory, ignore it
7090endfun
7091
7092" ---------------------------------------------------------------------
7093" s:LocalListing: does the job of "ls" for local directories {{{2
7094fun! s:LocalListing()
7095" call Dfunc("s:LocalListing()")
7096" call Decho("&ma=".&ma)
7097" call Decho("&mod=".&mod)
7098" call Decho("&ro=".&ro)
7099" call Decho("bufname(%)<".bufname("%").">")
7100
7101" if exists("b:netrw_curdir") |call Decho('b:netrw_curdir<'.b:netrw_curdir.">") |else|call Decho("b:netrw_curdir doesn't exist") |endif
7102" 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
7103
7104 " get the list of files contained in the current directory
7105 let dirname = escape(b:netrw_curdir,g:netrw_glob_escape)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007106 let dirnamelen = s:Strlen(b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007107 let filelist = glob(s:ComposePath(dirname,"*"))
7108" call Decho("glob(dirname<".dirname."/*>)=".filelist)
7109 if filelist != ""
7110 let filelist= filelist."\n"
7111 endif
7112 let filelist= filelist.glob(s:ComposePath(dirname,".*"))
7113" call Decho("glob(dirname<".dirname."/.*>)=".filelist)
7114
7115 " Coding choice: either elide ./ if present
7116 " or include ./ if not present
7117 if filelist =~ '[\\/]\.[\\/]\=\(\n\|$\)'
7118 " elide /path/. from glob() entries if present
7119" call Decho("elide /path/. from glob entries if present")
7120 let filelist = substitute(filelist,'\n','\t','g')
7121 let filelist = substitute(filelist,'^[^\t]\+[/\\]\.\t','','')
7122 let filelist = substitute(filelist,'[^\t]\+[/\\]\.$','','')
7123 let filelist = substitute(filelist,'\t\zs[^\t]\+[/\\]\.\t','','')
7124 let filelist = substitute(filelist,'\t','\n','g')
7125 endif
7126" call Decho("filelist<".filelist.">")
7127 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
7128 " include ../ in the glob() entry if its missing
7129" call Decho("forcibly tacking on ..")
7130 let filelist= filelist."\n".s:ComposePath(b:netrw_curdir,"../")
7131" call Decho("filelist<".filelist.">")
7132 endif
7133 if b:netrw_curdir == '/'
7134 " remove .. from filelist when current directory is root directory
7135" call Decho("remove .. from filelist")
7136 let filelist= substitute(filelist,'/\.\.\n','','')
7137 endif
7138 " remove multiple contiguous newlines
7139 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
7140 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
7141 " change all \s to /s
7142" call Decho('change all \s to /s')
7143 let filelist= substitute(filelist,'\','/','g')
7144 else
7145 " escape all \s to \\
7146" call Decho('escape all \s to \\')
7147 let filelist= substitute(filelist,'\','\\','g')
7148 endif
7149
7150" call Decho("(before while) dirname<".dirname.">")
7151" call Decho("(before while) dirnamelen<".dirnamelen.">")
7152" call Decho("(before while) filelist<".filelist.">")
7153
7154 while filelist != ""
7155 if filelist =~ '\n'
7156 let filename = substitute(filelist,'\n.*$','','e')
7157 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
7158 else
7159 let filename = filelist
7160 let filelist = ""
7161 endif
7162" call Decho(" ")
7163" call Decho("(while) filelist<".filelist.">")
7164" call Decho("(while) filename<".filename.">")
7165
7166 if getftype(filename) == "link"
7167 " indicate a symbolic link
7168" call Decho("indicate <".filename."> is a symbolic link with trailing @")
7169 let pfile= filename."@"
7170
7171 elseif getftype(filename) == "socket"
7172 " indicate a socket
7173" call Decho("indicate <".filename."> is a socket with trailing =")
7174 let pfile= filename."="
7175
7176 elseif getftype(filename) == "fifo"
7177 " indicate a fifo
7178" call Decho("indicate <".filename."> is a fifo with trailing |")
7179 let pfile= filename."|"
7180
7181 elseif isdirectory(filename)
7182 " indicate a directory
7183" call Decho("indicate <".filename."> is a directory with trailing /")
7184 let pfile= filename."/"
7185
7186 elseif exists("b:netrw_curdir") && b:netrw_curdir !~ '^.*://' && !isdirectory(filename)
7187 if (has("win32") || has("win95") || has("win64") || has("win16"))
7188 if filename =~ '\.[eE][xX][eE]$' || filename =~ '\.[cC][oO][mM]$' || filename =~ '\.[bB][aA][tT]$'
7189 " indicate an executable
7190" call Decho("indicate <".filename."> is executable with trailing *")
7191 let pfile= filename."*"
7192 else
7193 " normal file
7194 let pfile= filename
7195 endif
7196 elseif executable(filename)
7197 " indicate an executable
7198" call Decho("indicate <".filename."> is executable with trailing *")
7199 let pfile= filename."*"
7200 else
7201 " normal file
7202 let pfile= filename
7203 endif
7204
7205 else
7206 " normal file
7207 let pfile= filename
7208 endif
7209" call Decho("pfile<".pfile."> (after *@/ appending)")
7210
7211 if pfile =~ '//$'
7212 let pfile= substitute(pfile,'//$','/','e')
7213" call Decho("change // to /: pfile<".pfile.">")
7214 endif
7215 let pfile= strpart(pfile,dirnamelen)
7216 let pfile= substitute(pfile,'^[/\\]','','e')
7217" call Decho("filename<".filename.">")
7218" call Decho("pfile <".pfile.">")
7219
7220 if w:netrw_liststyle == s:LONGLIST
7221 let sz = getfsize(filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007222 let fsz = strpart(" ",1,15-strlen(sz)).sz
Bram Moolenaar446cb832008-06-24 21:56:24 +00007223 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
7224" call Decho("sz=".sz." fsz=".fsz)
7225 endif
7226
7227 if g:netrw_sort_by =~ "^t"
7228 " sort by time (handles time up to 1 quintillion seconds, US)
7229" call Decho("getftime(".filename.")=".getftime(filename))
7230 let t = getftime(filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007231 let ft = strpart("000000000000000000",1,18-strlen(t)).t
Bram Moolenaar446cb832008-06-24 21:56:24 +00007232" call Decho("exe keepjumps put ='".ft.'/'.filename."'")
7233 let ftpfile= ft.'/'.pfile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007234 sil! keepj put=ftpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00007235
7236 elseif g:netrw_sort_by =~ "^s"
7237 " sort by size (handles file sizes up to 1 quintillion bytes, US)
7238" call Decho("getfsize(".filename.")=".getfsize(filename))
7239 let sz = getfsize(filename)
Bram Moolenaar5c736222010-01-06 20:54:52 +01007240 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
Bram Moolenaar446cb832008-06-24 21:56:24 +00007241" call Decho("exe keepjumps put ='".fsz.'/'.filename."'")
7242 let fszpfile= fsz.'/'.pfile
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007243 sil! keepj put =fszpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00007244
7245 else
7246 " sort by name
7247" call Decho("exe keepjumps put ='".pfile."'")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007248 sil! keepj put=pfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00007249 endif
7250 endwhile
7251
7252 " cleanup any windows mess at end-of-line
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007253 sil! keepj g/^$/d
7254 sil! keepj %s/\r$//e
Bram Moolenaar5c736222010-01-06 20:54:52 +01007255 call histdel("/",-1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007256 exe "setlocal ts=".g:netrw_maxfilenamelen
7257" call Decho("setlocal ts=".g:netrw_maxfilenamelen)
7258
7259" call Dret("s:LocalListing")
7260endfun
7261
7262" ---------------------------------------------------------------------
7263" s:LocalBrowseShellCmdRefresh: this function is called after a user has {{{2
7264" performed any shell command. The idea is to cause all local-browsing
7265" buffers to be refreshed after a user has executed some shell command,
7266" on the chance that s/he removed/created a file/directory with it.
7267fun! s:LocalBrowseShellCmdRefresh()
7268" call Dfunc("LocalBrowseShellCmdRefresh() browselist=".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "empty")." ".tabpagenr("$")." tabs")
7269 " determine which buffers currently reside in a tab
7270 if !exists("s:netrw_browselist")
7271" call Dret("LocalBrowseShellCmdRefresh : browselist is empty")
7272 return
7273 endif
7274 if !exists("w:netrw_bannercnt")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007275" call Dret("LocalBrowseShellCmdRefresh : don't refresh when focus not on netrw window")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007276 return
7277 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01007278 if exists("s:locbrowseshellcmd")
7279 if s:locbrowseshellcmd
7280 let s:locbrowseshellcmd= 0
7281" call Dret("LocalBrowseShellCmdRefresh : NetrwBrowse itself caused the refresh")
7282 return
7283 endif
7284 let s:locbrowseshellcmd= 0
7285 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007286 let itab = 1
7287 let buftablist = []
7288 while itab <= tabpagenr("$")
7289 let buftablist = buftablist + tabpagebuflist()
7290 let itab = itab + 1
7291 tabn
7292 endwhile
7293" call Decho("buftablist".string(buftablist))
7294" call Decho("s:netrw_browselist<".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "").">")
7295 " GO through all buffers on netrw_browselist (ie. just local-netrw buffers):
7296 " | refresh any netrw window
7297 " | wipe out any non-displaying netrw buffer
7298 let curwin = winnr()
7299 let ibl = 0
7300 for ibuf in s:netrw_browselist
7301" call Decho("bufwinnr(".ibuf.") index(buftablist,".ibuf.")=".index(buftablist,ibuf))
7302 if bufwinnr(ibuf) == -1 && index(buftablist,ibuf) == -1
7303 " wipe out any non-displaying netrw buffer
7304" call Decho("wiping buf#".ibuf,"<".bufname(ibuf).">")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007305 exe "sil! bd ".fnameescape(ibuf)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007306 call remove(s:netrw_browselist,ibl)
7307" call Decho("browselist=".string(s:netrw_browselist))
7308 continue
7309 elseif index(tabpagebuflist(),ibuf) != -1
7310 " refresh any netrw buffer
7311" call Decho("refresh buf#".ibuf.'-> win#'.bufwinnr(ibuf))
7312 exe bufwinnr(ibuf)."wincmd w"
7313 call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
7314 endif
7315 let ibl= ibl + 1
7316 endfor
7317 exe curwin."wincmd w"
7318
7319" call Dret("LocalBrowseShellCmdRefresh")
7320endfun
7321
7322" ---------------------------------------------------------------------
7323" s:NetrwLocalRm: {{{2
7324fun! s:NetrwLocalRm(path) range
7325" call Dfunc("s:NetrwLocalRm(path<".a:path.">)")
7326" call Decho("firstline=".a:firstline." lastline=".a:lastline)
7327
7328 " preparation for removing multiple files/directories
7329 let ret = 0
7330 let all = 0
7331 let svpos = netrw#NetrwSavePosn()
7332
7333 if exists("s:netrwmarkfilelist_{bufnr('%')}")
7334 " remove all marked files
7335" call Decho("remove all marked files")
7336 for fname in s:netrwmarkfilelist_{bufnr("%")}
7337 let ok= s:NetrwLocalRmFile(a:path,fname,all)
7338 if ok =~ 'q\%[uit]' || ok == "no"
7339 break
7340 elseif ok =~ 'a\%[ll]'
7341 let all= 1
7342 endif
7343 endfor
7344 call s:NetrwUnMarkFile(1)
7345
7346 else
7347 " remove (multiple) files and directories
7348" call Decho("remove files in range [".a:firstline.",".a:lastline."]")
7349
7350 let ctr = a:firstline
7351 while ctr <= a:lastline
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007352 exe "keepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00007353
7354 " sanity checks
7355 if line(".") < w:netrw_bannercnt
7356 let ctr= ctr + 1
7357 continue
7358 endif
7359 let curword= s:NetrwGetWord()
7360 if curword == "./" || curword == "../"
7361 let ctr= ctr + 1
7362 continue
7363 endif
7364 let ok= s:NetrwLocalRmFile(a:path,curword,all)
7365 if ok =~ 'q\%[uit]' || ok == "no"
7366 break
7367 elseif ok =~ 'a\%[ll]'
7368 let all= 1
7369 endif
7370 let ctr= ctr + 1
7371 endwhile
7372 endif
7373
7374 " refresh the directory
7375" call Decho("bufname<".bufname("%").">")
7376 if bufname("%") != "NetrwMessage"
7377 call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
7378 call netrw#NetrwRestorePosn(svpos)
7379 endif
7380
7381" call Dret("s:NetrwLocalRm")
7382endfun
7383
7384" ---------------------------------------------------------------------
7385" s:NetrwLocalRmFile: remove file fname given the path {{{2
7386" Give confirmation prompt unless all==1
7387fun! s:NetrwLocalRmFile(path,fname,all)
7388" call Dfunc("s:NetrwLocalRmFile(path<".a:path."> fname<".a:fname."> all=".a:all)
7389
7390 let all= a:all
7391 let ok = ""
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007392 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00007393 let rmfile= s:ComposePath(a:path,a:fname)
7394" call Decho("rmfile<".rmfile.">")
7395
7396 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
7397 " attempt to remove file
7398" call Decho("attempt to remove file<".rmfile.">")
7399 if !all
7400 echohl Statement
7401 call inputsave()
7402 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
7403 call inputrestore()
7404 echohl NONE
7405 if ok == ""
7406 let ok="no"
7407 endif
7408" call Decho("response: ok<".ok.">")
7409 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
7410" call Decho("response: ok<".ok."> (after sub)")
7411 if ok =~ 'a\%[ll]'
7412 let all= 1
7413 endif
7414 endif
7415
7416 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaarc236c162008-07-13 17:41:49 +00007417 let ret= s:NetrwDelete(rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007418" call Decho("errcode=".v:shell_error." ret=".ret)
7419 endif
7420
7421 else
7422 " attempt to remove directory
7423 if !all
7424 echohl Statement
7425 call inputsave()
7426 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
7427 call inputrestore()
7428 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
7429 if ok == ""
7430 let ok="no"
7431 endif
7432 if ok =~ 'a\%[ll]'
7433 let all= 1
7434 endif
7435 endif
7436 let rmfile= substitute(rmfile,'[\/]$','','e')
7437
7438 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar5c736222010-01-06 20:54:52 +01007439" call Decho("1st attempt: system(netrw#WinPath(".g:netrw_local_rmdir.') '.shellescape(rmfile).')')
7440 call system(netrw#WinPath(g:netrw_local_rmdir).' '.shellescape(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007441" call Decho("v:shell_error=".v:shell_error)
7442
7443 if v:shell_error != 0
7444" call Decho("2nd attempt to remove directory<".rmfile.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00007445 let errcode= s:NetrwDelete(rmfile)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007446" call Decho("errcode=".errcode)
7447
7448 if errcode != 0
7449 if has("unix")
7450" call Decho("3rd attempt to remove directory<".rmfile.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00007451 call system("rm ".shellescape(rmfile))
Bram Moolenaar446cb832008-06-24 21:56:24 +00007452 if v:shell_error != 0 && !exists("g:netrw_quiet")
7453 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",34)
7454 let ok="no"
7455 endif
7456 elseif !exists("g:netrw_quiet")
7457 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",35)
7458 let ok="no"
7459 endif
7460 endif
7461 endif
7462 endif
7463 endif
7464
7465" call Dret("s:NetrwLocalRmFile ".ok)
7466 return ok
7467endfun
7468
7469" ---------------------------------------------------------------------
7470" s:NetrwLocalRename: rename a remote file or directory {{{2
7471fun! s:NetrwLocalRename(path) range
7472" call Dfunc("NetrwLocalRename(path<".a:path.">)")
7473
7474 " preparation for removing multiple files/directories
7475 let ctr = a:firstline
7476 let svpos= netrw#NetrwSavePosn()
7477
7478 " rename files given by the markfilelist
7479 if exists("s:netrwmarkfilelist_{bufnr('%')}")
7480 for oldname in s:netrwmarkfilelist_{bufnr("%")}
7481" call Decho("oldname<".oldname.">")
7482 if exists("subfrom")
7483 let newname= substitute(oldname,subfrom,subto,'')
7484" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
7485 else
7486 call inputsave()
7487 let newname= input("Moving ".oldname." to : ",oldname)
7488 call inputrestore()
7489 if newname =~ '^s/'
7490 let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
7491 let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
7492" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
7493 let newname = substitute(oldname,subfrom,subto,'')
7494 endif
7495 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00007496 call rename(oldname,newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007497 endfor
Bram Moolenaar5c736222010-01-06 20:54:52 +01007498 call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007499
7500 else
7501
7502 " attempt to rename files/directories
7503 while ctr <= a:lastline
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007504 exe "keepj ".ctr
Bram Moolenaar446cb832008-06-24 21:56:24 +00007505
7506 " sanity checks
7507 if line(".") < w:netrw_bannercnt
7508 let ctr= ctr + 1
7509 continue
7510 endif
7511 let curword= s:NetrwGetWord()
7512 if curword == "./" || curword == "../"
7513 let ctr= ctr + 1
7514 continue
7515 endif
7516
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007517 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00007518 let oldname= s:ComposePath(a:path,curword)
7519" call Decho("oldname<".oldname.">")
7520
7521 call inputsave()
7522 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
7523 call inputrestore()
7524
Bram Moolenaare37d50a2008-08-06 17:06:04 +00007525 call rename(oldname,newname)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007526" call Decho("renaming <".oldname."> to <".newname.">")
7527
7528 let ctr= ctr + 1
7529 endwhile
7530 endif
7531
7532 " refresh the directory
7533" call Decho("refresh the directory listing")
7534 call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
7535 call netrw#NetrwRestorePosn(svpos)
7536
7537" call Dret("NetrwLocalRename")
7538endfun
7539
7540" ---------------------------------------------------------------------
7541" s:LocalFastBrowser: handles setting up/taking down fast browsing for the local browser {{{2
7542"
7543" g:netrw_ Directory Is
7544" fastbrowse Local Remote
7545" slow 0 D D D=Deleting a buffer implies it will not be re-used (slow)
7546" med 1 D H H=Hiding a buffer implies it may be re-used (fast)
7547" fast 2 H H
7548"
7549" Deleting a buffer means that it will be re-loaded when examined, hence "slow".
7550" Hiding a buffer means that it will be re-used when examined, hence "fast".
7551" (re-using a buffer may not be as accurate)
7552fun! s:LocalFastBrowser()
7553" call Dfunc("LocalFastBrowser() g:netrw_fastbrowse=".g:netrw_fastbrowse)
7554
7555 " initialize browselist, a list of buffer numbers that the local browser has used
7556 if !exists("s:netrw_browselist")
7557" call Decho("initialize s:netrw_browselist")
7558 let s:netrw_browselist= []
7559 endif
7560
7561 " append current buffer to fastbrowse list
7562 if empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1]
7563" call Decho("appendng current buffer to browselist")
7564 call add(s:netrw_browselist,bufnr("%"))
7565" call Decho("browselist=".string(s:netrw_browselist))
7566 endif
7567
7568 " enable autocmd events to handle refreshing/removing local browser buffers
7569 " If local browse buffer is currently showing: refresh it
7570 " If local browse buffer is currently hidden : wipe it
7571 if !exists("s:netrw_browser_shellcmd") && g:netrw_fastbrowse <= 1
7572" call Decho("setting up local-browser shell command refresh")
7573 let s:netrw_browser_shellcmd= 1
7574 augroup AuNetrwShellCmd
7575 au!
7576 if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01007577" call Decho("autocmd: ShellCmdPost * call s:LocalBrowseShellCmdRefresh()")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007578 au ShellCmdPost * call s:LocalBrowseShellCmdRefresh()
7579 else
7580 au ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()
Bram Moolenaar5c736222010-01-06 20:54:52 +01007581" call Decho("autocmd: ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007582 endif
7583 augroup END
7584 endif
7585
7586 " user must have changed fastbrowse to its fast setting, so remove
7587 " the associated autocmd events
7588 if g:netrw_fastbrowse > 1 && exists("s:netrw_browser_shellcmd")
7589" call Decho("remove AuNetrwShellCmd autcmd group")
7590 unlet s:netrw_browser_shellcmd
7591 augroup AuNetrwShellCmd
7592 au!
7593 augroup END
7594 augroup! AuNetrwShellCmd
7595 endif
7596
7597" call Dret("LocalFastBrowser : browselist<".string(s:netrw_browselist).">")
7598endfun
7599
7600" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00007601" Support Functions: {{{1
7602
Bram Moolenaar488c6512005-08-11 20:09:58 +00007603" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00007604" netrw#ErrorMsg: {{{2
7605" 0=note = s:NOTE
7606" 1=warning = s:WARNING
7607" 2=error = s:ERROR
Bram Moolenaar5c736222010-01-06 20:54:52 +01007608" Dec 03, 2009 : max errnum currently is 76
Bram Moolenaar9964e462007-05-05 17:54:07 +00007609fun! netrw#ErrorMsg(level,msg,errnum)
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007610" 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 +00007611
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007612 if a:level == 1
7613 let level= "**warning** (netrw) "
7614 elseif a:level == 2
7615 let level= "**error** (netrw) "
7616 else
7617 let level= "**note** (netrw) "
Bram Moolenaar9964e462007-05-05 17:54:07 +00007618 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007619" call Decho("level=".level)
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007620
7621 if g:netrw_use_errorwindow
7622 " (default) netrw creates a one-line window to show error/warning
7623 " messages (reliably displayed)
7624
Bram Moolenaar446cb832008-06-24 21:56:24 +00007625 " record current window number for NetrwRestorePosn()'s benefit
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007626 let s:winBeforeErr= winnr()
Bram Moolenaar446cb832008-06-24 21:56:24 +00007627" call Decho("s:winBeforeErr=".s:winBeforeErr)
7628
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007629 " getting messages out reliably is just plain difficult!
7630 " This attempt splits the current window, creating a one line window.
7631 if bufexists("NetrwMessage") && bufwinnr("NetrwMessage") > 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00007632" call Decho("write to NetrwMessage buffer")
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007633 exe bufwinnr("NetrwMessage")."wincmd w"
Bram Moolenaar446cb832008-06-24 21:56:24 +00007634" call Decho("setlocal ma noro")
7635 setlocal ma noro
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007636 call setline(line("$")+1,level.a:msg)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007637 keepj $
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007638 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00007639" call Decho("create a NetrwMessage buffer window")
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007640 bo 1split
Bram Moolenaar5c736222010-01-06 20:54:52 +01007641 call s:NetrwEnew()
7642 call s:NetrwSafeOptions()
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007643 setlocal bt=nofile
7644 file NetrwMessage
Bram Moolenaar446cb832008-06-24 21:56:24 +00007645" call Decho("setlocal ma noro")
7646 setlocal ma noro
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007647 call setline(line("$"),level.a:msg)
7648 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007649" call Decho("wrote msg<".level.a:msg."> to NetrwMessage win#".winnr())
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007650 if &fo !~ '[ta]'
7651 syn clear
7652 syn match netrwMesgNote "^\*\*note\*\*"
7653 syn match netrwMesgWarning "^\*\*warning\*\*"
7654 syn match netrwMesgError "^\*\*error\*\*"
7655 hi link netrwMesgWarning WarningMsg
7656 hi link netrwMesgError Error
7657 endif
7658 setlocal noma ro bh=wipe
7659
7660 else
7661 " (optional) netrw will show messages using echomsg. Even if the
7662 " message doesn't appear, at least it'll be recallable via :messages
Bram Moolenaar446cb832008-06-24 21:56:24 +00007663" redraw!
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007664 if a:level == s:WARNING
7665 echohl WarningMsg
7666 elseif a:level == s:ERROR
7667 echohl Error
7668 endif
7669 echomsg level.a:msg
7670" call Decho("echomsg ***netrw*** ".a:msg)
7671 echohl None
7672 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00007673
7674" call Dret("netrw#ErrorMsg")
7675endfun
7676
7677" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00007678" netrw#NetrwRestorePosn: restores the cursor and file position as saved by NetrwSavePosn() {{{2
7679fun! netrw#NetrwRestorePosn(...)
7680" 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))
7681 let eikeep= &ei
7682 set ei=all
7683 if expand("%") == "NetrwMessage"
7684 exe s:winBeforeErr."wincmd w"
7685 endif
7686
7687 if a:0 > 0
7688 exe a:1
7689 endif
7690
7691 " restore window
7692 if exists("w:netrw_winnr")
7693" call Decho("restore window: exe silent! ".w:netrw_winnr."wincmd w")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007694 exe "sil! ".w:netrw_winnr."wincmd w"
Bram Moolenaarc236c162008-07-13 17:41:49 +00007695 endif
7696 if v:shell_error == 0
7697 " as suggested by Bram M: redraw on no error
7698 " allows protocol error messages to remain visible
7699" redraw!
7700 endif
7701
7702 " restore top-of-screen line
7703 if exists("w:netrw_hline")
7704" call Decho("restore topofscreen: exe norm! ".w:netrw_hline."G0z")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007705 exe "keepj norm! ".w:netrw_hline."G0z\<CR>"
Bram Moolenaarc236c162008-07-13 17:41:49 +00007706 endif
7707
7708 " restore position
7709 if exists("w:netrw_line") && exists("w:netrw_col")
7710" call Decho("restore posn: exe norm! ".w:netrw_line."G0".w:netrw_col."|")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007711 exe "keepj norm! ".w:netrw_line."G0".w:netrw_col."\<bar>"
Bram Moolenaarc236c162008-07-13 17:41:49 +00007712 endif
7713
7714 let &ei= eikeep
7715" call Dret("netrw#NetrwRestorePosn")
7716endfun
7717
7718" ---------------------------------------------------------------------
7719" netrw#NetrwSavePosn: saves position of cursor on screen {{{2
7720fun! netrw#NetrwSavePosn()
7721" call Dfunc("netrw#NetrwSavePosn()")
7722 " Save current line and column
7723 let w:netrw_winnr= winnr()
7724 let w:netrw_line = line(".")
7725 let w:netrw_col = virtcol(".")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007726" call Decho("currently, win#".w:netrw_winnr." line#".w:netrw_line." col#".w:netrw_col)
Bram Moolenaarc236c162008-07-13 17:41:49 +00007727
7728 " Save top-of-screen line
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007729 keepj norm! H0
Bram Moolenaarc236c162008-07-13 17:41:49 +00007730 let w:netrw_hline= line(".")
7731
7732 " set up string holding position parameters
7733 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
7734
7735 call netrw#NetrwRestorePosn()
7736" call Dret("netrw#NetrwSavePosn : winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline)
7737 return ret
7738endfun
7739
7740" ------------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00007741" netrw#RFC2396: converts %xx into characters {{{2
7742fun! netrw#RFC2396(fname)
7743" call Dfunc("netrw#RFC2396(fname<".a:fname.">)")
7744 let fname = escape(substitute(a:fname,'%\(\x\x\)','\=nr2char("0x".submatch(1))','ge')," \t")
7745" call Dret("netrw#RFC2396 ".fname)
7746 return fname
7747endfun
7748
7749" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00007750" s:ComposePath: Appends a new part to a path taking different systems into consideration {{{2
7751fun! s:ComposePath(base,subdir)
7752" call Dfunc("s:ComposePath(base<".a:base."> subdir<".a:subdir.">)")
7753
7754 if(has("amiga"))
7755" call Decho("amiga")
Bram Moolenaar5c736222010-01-06 20:54:52 +01007756 let ec = a:base[s:Strlen(a:base)-1]
Bram Moolenaarc236c162008-07-13 17:41:49 +00007757 if ec != '/' && ec != ':'
7758 let ret = a:base . "/" . a:subdir
7759 else
7760 let ret = a:base . a:subdir
7761 endif
7762
7763 elseif a:subdir =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16"))
7764" call Decho("windows")
7765 let ret= a:subdir
7766
Bram Moolenaar5c736222010-01-06 20:54:52 +01007767 elseif a:base =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16"))
7768" call Decho("windows")
7769 if a:base =~ '[/\\]$'
7770 let ret= a:base.a:subdir
7771 else
7772 let ret= a:base."/".a:subdir
7773 endif
7774
Bram Moolenaarc236c162008-07-13 17:41:49 +00007775 elseif a:base =~ '^\a\+://'
7776" call Decho("remote linux/macos")
7777 let urlbase = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\1','')
7778 let curpath = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\2','')
7779 if a:subdir == '../'
7780 if curpath =~ '[^/]/[^/]\+/$'
7781 let curpath= substitute(curpath,'[^/]\+/$','','')
7782 else
7783 let curpath=""
7784 endif
7785 let ret= urlbase.curpath
7786 else
7787 let ret= urlbase.curpath.a:subdir
7788 endif
7789" call Decho("urlbase<".urlbase.">")
7790" call Decho("curpath<".curpath.">")
7791" call Decho("ret<".ret.">")
7792
7793 else
7794" call Decho("local linux/macos")
7795 let ret = substitute(a:base."/".a:subdir,"//","/","g")
7796 if a:base =~ '^//'
7797 " keeping initial '//' for the benefit of network share listing support
7798 let ret= '/'.ret
7799 endif
7800 let ret= simplify(ret)
7801 endif
7802
7803" call Dret("s:ComposePath ".ret)
7804 return ret
7805endfun
7806
7807" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00007808" s:FileReadable: o/s independent filereadable {{{2
7809fun! s:FileReadable(fname)
7810" call Dfunc("s:FileReadable(fname<".a:fname.">)")
7811
7812 if g:netrw_cygwin
7813 let ret= filereadable(substitute(a:fname,'/cygdrive/\(.\)','\1:/',''))
7814 else
7815 let ret= filereadable(a:fname)
7816 endif
7817
7818" call Dret("s:FileReadable ".ret)
7819 return ret
7820endfun
7821
7822" ---------------------------------------------------------------------
7823" s:GetTempfile: gets a tempname that'll work for various o/s's {{{2
7824" Places correct suffix on end of temporary filename,
7825" using the suffix provided with fname
7826fun! s:GetTempfile(fname)
7827" call Dfunc("s:GetTempfile(fname<".a:fname.">)")
7828
7829 if !exists("b:netrw_tmpfile")
7830 " get a brand new temporary filename
7831 let tmpfile= tempname()
7832" call Decho("tmpfile<".tmpfile."> : from tempname()")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007833
Bram Moolenaarc236c162008-07-13 17:41:49 +00007834 let tmpfile= substitute(tmpfile,'\','/','ge')
Bram Moolenaar9964e462007-05-05 17:54:07 +00007835" call Decho("tmpfile<".tmpfile."> : chgd any \\ -> /")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007836
Bram Moolenaar9964e462007-05-05 17:54:07 +00007837 " sanity check -- does the temporary file's directory exist?
7838 if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
Bram Moolenaarc236c162008-07-13 17:41:49 +00007839" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar9964e462007-05-05 17:54:07 +00007840 call netrw#ErrorMsg(s:ERROR,"your <".substitute(tmpfile,'[^/]\+$','','e')."> directory is missing!",2)
7841" call Dret("s:GetTempfile getcwd<".getcwd().">")
7842 return ""
7843 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007844
Bram Moolenaar9964e462007-05-05 17:54:07 +00007845 " let netrw#NetSource() know about the tmpfile
Bram Moolenaar5c736222010-01-06 20:54:52 +01007846 let s:netrw_tmpfile= tmpfile " used by netrw#NetSource() and netrw#NetrwBrowseX()
Bram Moolenaar9964e462007-05-05 17:54:07 +00007847" call Decho("tmpfile<".tmpfile."> s:netrw_tmpfile<".s:netrw_tmpfile.">")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007848
Bram Moolenaar9964e462007-05-05 17:54:07 +00007849 " o/s dependencies
Bram Moolenaar446cb832008-06-24 21:56:24 +00007850 if g:netrw_cygwin != 0
Bram Moolenaar9964e462007-05-05 17:54:07 +00007851 let tmpfile = substitute(tmpfile,'^\(\a\):','/cygdrive/\1','e')
7852 elseif has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar446cb832008-06-24 21:56:24 +00007853 if !exists("+shellslash") || !&ssl
7854 let tmpfile = substitute(tmpfile,'/','\','g')
7855 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00007856 else
Bram Moolenaar446cb832008-06-24 21:56:24 +00007857 let tmpfile = tmpfile
Bram Moolenaar9964e462007-05-05 17:54:07 +00007858 endif
7859 let b:netrw_tmpfile= tmpfile
7860" call Decho("o/s dependent fixed tempname<".tmpfile.">")
7861 else
7862 " re-use temporary filename
7863 let tmpfile= b:netrw_tmpfile
7864" call Decho("tmpfile<".tmpfile."> re-using")
7865 endif
7866
7867 " use fname's suffix for the temporary file
7868 if a:fname != ""
7869 if a:fname =~ '\.[^./]\+$'
7870" call Decho("using fname<".a:fname.">'s suffix")
7871 if a:fname =~ '.tar.gz' || a:fname =~ '.tar.bz2'
7872 let suffix = ".tar".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
7873 else
7874 let suffix = substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
7875 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00007876" call Decho("suffix<".suffix.">")
7877 let tmpfile= substitute(tmpfile,'\.tmp$','','e')
7878" call Decho("chgd tmpfile<".tmpfile."> (removed any .tmp suffix)")
7879 let tmpfile .= suffix
7880" call Decho("chgd tmpfile<".tmpfile."> (added ".suffix." suffix) netrw_fname<".b:netrw_fname.">")
7881 let s:netrw_tmpfile= tmpfile " supports netrw#NetSource()
7882 endif
7883 endif
7884
Bram Moolenaarc236c162008-07-13 17:41:49 +00007885" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
Bram Moolenaar9964e462007-05-05 17:54:07 +00007886" call Dret("s:GetTempfile <".tmpfile.">")
7887 return tmpfile
Bram Moolenaar446cb832008-06-24 21:56:24 +00007888endfun
Bram Moolenaar9964e462007-05-05 17:54:07 +00007889
7890" ---------------------------------------------------------------------
7891" s:MakeSshCmd: transforms input command using USEPORT HOSTNAME into {{{2
Bram Moolenaarc236c162008-07-13 17:41:49 +00007892" a correct command for use with a system() call
Bram Moolenaar9964e462007-05-05 17:54:07 +00007893fun! s:MakeSshCmd(sshcmd)
Bram Moolenaar446cb832008-06-24 21:56:24 +00007894" call Dfunc("s:MakeSshCmd(sshcmd<".a:sshcmd.">) user<".s:user."> machine<".s:machine.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00007895 let sshcmd = substitute(a:sshcmd,'\<HOSTNAME\>',s:user.s:machine,'')
7896 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007897 let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.g:netrw_port,'')
Bram Moolenaar9964e462007-05-05 17:54:07 +00007898 elseif exists("s:port") && s:port != ""
Bram Moolenaar7aa9f6a2007-05-10 18:00:30 +00007899 let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.s:port,'')
Bram Moolenaar9964e462007-05-05 17:54:07 +00007900 else
7901 let sshcmd= substitute(sshcmd,"USEPORT ",'','')
7902 endif
7903" call Dret("s:MakeSshCmd <".sshcmd.">")
7904 return sshcmd
7905endfun
7906
7907" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00007908" s:NetrwBMShow: {{{2
7909fun! s:NetrwBMShow()
7910" call Dfunc("s:NetrwBMShow()")
7911 redir => bmshowraw
7912 menu
7913 redir END
7914 let bmshowlist = split(bmshowraw,'\n')
7915 if bmshowlist != []
7916 let bmshowfuncs= filter(bmshowlist,'v:val =~ "<SNR>\\d\\+_BMShow()"')
7917 if bmshowfuncs != []
7918 let bmshowfunc = substitute(bmshowfuncs[0],'^.*:\(call.*BMShow()\).*$','\1','')
7919 if bmshowfunc =~ '^call.*BMShow()'
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007920 exe "sil! ".bmshowfunc
Bram Moolenaarc236c162008-07-13 17:41:49 +00007921 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007922 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00007923 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +00007924" call Dret("s:NetrwBMShow : bmshowfunc<".(exists("bmshowfunc")? bmshowfunc : 'n/a').">")
7925endfun
7926
7927" ---------------------------------------------------------------------
Bram Moolenaar00a927d2010-05-14 23:24:24 +02007928" s:NetrwCursorline: {{{2
7929fun! s:NetrwCursorline()
7930 if !exists("w:netrw_liststyle")
7931 let w:netrw_liststyle= g:netrw_liststyle
7932 endif
7933" call Dfunc("s:NetrwCursorline() liststyle=".w:netrw_liststyle." g:netrw_cursorline=".g:netrw_cursorline." s:netrw_usercuc=".s:netrw_usercuc." s:netrw_usercul=".s:netrw_usercul)
7934 "
7935 if w:netrw_liststyle != s:WIDELIST
7936 " thin-long-tree listings
7937 if g:netrw_cursorline == 2
7938 setlocal cursorline
7939 let &l:cursorcolumn= s:netrw_usercuc
7940" call Decho("setlocal cursorline (cursorcolumn is ".((s:netrw_usercuc)? "on" : "off").")")
7941 elseif g:netrw_cursorline
7942 setlocal cursorline
7943" call Decho("setlocal cursorline")
7944 endif
7945
7946 else
7947 " wide listings
7948 if g:netrw_cursorline == 2
7949 setlocal cursorline cursorcolumn
7950" call Decho("setlocal cursorline cursorcolumn")
7951 elseif g:netrw_cursorline
7952 let &l:cursorline= s:netrw_usercul
7953" call Decho("cursorline is ".((s:netrw_usercul)? "on" : "off").")")
7954 endif
7955 endif
7956" call Dret("s:NetrwCursorline : l:cursorline=".&l:cursorline." l:cursorcolumn=".&l:cursorcolumn)
7957endfun
7958
7959" ---------------------------------------------------------------------
7960" s:RestoreCursorline: restores cursorline/cursorcolumn to original user settings {{{2
7961fun! s:RestoreCursorline()
7962" call Dfunc("s:RestoreCursorline() currently, cul=".&l:cursorline." cuc=".&l:cursorcolumn." win#".winnr()." buf#".bufnr("%"))
7963 let &l:cursorline = s:netrw_usercul
7964 let &l:cursorcolumn = s:netrw_usercuc
7965" call Dret("s:RestoreCursorline : restored cul=".&l:cursorline." cuc=".&l:cursorcolumn)
7966endfun
7967
7968" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00007969" s:NetrwDelete: Deletes a file. {{{2
7970" Uses Steve Hall's idea to insure that Windows paths stay
7971" acceptable. No effect on Unix paths.
7972" Examples of use: let result= s:NetrwDelete(path)
7973fun! s:NetrwDelete(path)
7974" call Dfunc("s:NetrwDelete(path<".a:path.">)")
7975
Bram Moolenaar5c736222010-01-06 20:54:52 +01007976 let path = netrw#WinPath(a:path)
Bram Moolenaarc236c162008-07-13 17:41:49 +00007977 if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
7978 if exists("+shellslash")
7979 let sskeep= &shellslash
7980 setlocal noshellslash
7981 let result = delete(path)
7982 let &shellslash = sskeep
7983 else
7984" call Decho("exe let result= ".a:cmd."('".path."')")
7985 let result= delete(path)
7986 endif
7987 else
7988" call Decho("let result= delete(".path.")")
7989 let result= delete(path)
7990 endif
7991 if result < 0
Bram Moolenaar5c736222010-01-06 20:54:52 +01007992 call netrw#ErrorMsg(s:WARNING,"delete(".path.") failed!",71)
Bram Moolenaarc236c162008-07-13 17:41:49 +00007993 endif
7994
7995" call Dret("s:NetrwDelete ".result)
7996 return result
Bram Moolenaar446cb832008-06-24 21:56:24 +00007997endfun
7998
7999" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008000" s:NetrwEnew: opens a new buffer, passes netrw buffer variables through {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +01008001fun! s:NetrwEnew(...)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008002" call Dfunc("s:NetrwEnew() a:0=".a:0." bufnr($)=".bufnr("$"))
Bram Moolenaar5c736222010-01-06 20:54:52 +01008003" call Decho("curdir<".((a:0>0)? a:1 : "")."> buf#".bufnr("%")."<".bufname("%").">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008004
Bram Moolenaar446cb832008-06-24 21:56:24 +00008005 " grab a function-local-variable copy of buffer variables
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008006" call Decho("make function-local copy of netrw variables")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008007 if exists("b:netrw_bannercnt") |let netrw_bannercnt = b:netrw_bannercnt |endif
8008 if exists("b:netrw_browser_active") |let netrw_browser_active = b:netrw_browser_active |endif
8009 if exists("b:netrw_cpf") |let netrw_cpf = b:netrw_cpf |endif
8010 if exists("b:netrw_curdir") |let netrw_curdir = b:netrw_curdir |endif
8011 if exists("b:netrw_explore_bufnr") |let netrw_explore_bufnr = b:netrw_explore_bufnr |endif
8012 if exists("b:netrw_explore_indx") |let netrw_explore_indx = b:netrw_explore_indx |endif
8013 if exists("b:netrw_explore_line") |let netrw_explore_line = b:netrw_explore_line |endif
8014 if exists("b:netrw_explore_list") |let netrw_explore_list = b:netrw_explore_list |endif
8015 if exists("b:netrw_explore_listlen")|let netrw_explore_listlen = b:netrw_explore_listlen|endif
8016 if exists("b:netrw_explore_mtchcnt")|let netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
8017 if exists("b:netrw_fname") |let netrw_fname = b:netrw_fname |endif
8018 if exists("b:netrw_lastfile") |let netrw_lastfile = b:netrw_lastfile |endif
8019 if exists("b:netrw_liststyle") |let netrw_liststyle = b:netrw_liststyle |endif
8020 if exists("b:netrw_method") |let netrw_method = b:netrw_method |endif
8021 if exists("b:netrw_option") |let netrw_option = b:netrw_option |endif
8022 if exists("b:netrw_prvdir") |let netrw_prvdir = b:netrw_prvdir |endif
8023
Bram Moolenaar446cb832008-06-24 21:56:24 +00008024 call s:NetrwOptionRestore("w:")
8025" call Decho("generate a buffer with keepjumps keepalt enew!")
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008026 keepj keepalt enew!
8027" call Decho("bufnr($)=".bufnr("$"))
Bram Moolenaar446cb832008-06-24 21:56:24 +00008028 call s:NetrwOptionSave("w:")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008029
Bram Moolenaar446cb832008-06-24 21:56:24 +00008030 " copy function-local-variables to buffer variable equivalents
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008031" call Decho("copy function-local variables back to buffer netrw variables")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008032 if exists("netrw_bannercnt") |let b:netrw_bannercnt = netrw_bannercnt |endif
8033 if exists("netrw_browser_active") |let b:netrw_browser_active = netrw_browser_active |endif
8034 if exists("netrw_cpf") |let b:netrw_cpf = netrw_cpf |endif
8035 if exists("netrw_curdir") |let b:netrw_curdir = netrw_curdir |endif
8036 if exists("netrw_explore_bufnr") |let b:netrw_explore_bufnr = netrw_explore_bufnr |endif
8037 if exists("netrw_explore_indx") |let b:netrw_explore_indx = netrw_explore_indx |endif
8038 if exists("netrw_explore_line") |let b:netrw_explore_line = netrw_explore_line |endif
8039 if exists("netrw_explore_list") |let b:netrw_explore_list = netrw_explore_list |endif
8040 if exists("netrw_explore_listlen")|let b:netrw_explore_listlen = netrw_explore_listlen|endif
8041 if exists("netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = netrw_explore_mtchcnt|endif
8042 if exists("netrw_fname") |let b:netrw_fname = netrw_fname |endif
8043 if exists("netrw_lastfile") |let b:netrw_lastfile = netrw_lastfile |endif
8044 if exists("netrw_liststyle") |let b:netrw_liststyle = netrw_liststyle |endif
8045 if exists("netrw_method") |let b:netrw_method = netrw_method |endif
8046 if exists("netrw_option") |let b:netrw_option = netrw_option |endif
8047 if exists("netrw_prvdir") |let b:netrw_prvdir = netrw_prvdir |endif
8048
Bram Moolenaar5c736222010-01-06 20:54:52 +01008049 if a:0 > 0
8050 let b:netrw_curdir= a:1
8051 if b:netrw_curdir =~ '/$'
8052 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
8053 file NetrwTreeListing
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008054 set bt=nowrite noswf
Bram Moolenaar5c736222010-01-06 20:54:52 +01008055 nno <silent> <buffer> [ :silent call <SID>TreeListMove('[')<cr>
8056 nno <silent> <buffer> ] :silent call <SID>TreeListMove(']')<cr>
8057 else
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008058 exe "sil! keepalt file ".fnameescape(b:netrw_curdir)
Bram Moolenaar5c736222010-01-06 20:54:52 +01008059 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00008060 endif
8061 endif
8062
Bram Moolenaar446cb832008-06-24 21:56:24 +00008063" call Dret("s:NetrwEnew : buf#".bufnr("%")."<".bufname("%")."> expand(%)<".expand("%")."> expand(#)<".expand("#").">")
Bram Moolenaar9964e462007-05-05 17:54:07 +00008064endfun
8065
8066" ------------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008067" s:NetrwSaveWordPosn: used to keep cursor on same word after refresh, {{{2
8068" changed sorting, etc. Also see s:NetrwRestoreWordPosn().
8069fun! s:NetrwSaveWordPosn()
8070" call Dfunc("NetrwSaveWordPosn()")
8071 let s:netrw_saveword= '^'.fnameescape(getline('.')).'$'
8072" call Dret("NetrwSaveWordPosn : saveword<".s:netrw_saveword.">")
8073endfun
8074
8075" ---------------------------------------------------------------------
8076" s:NetrwRestoreWordPosn: used to keep cursor on same word after refresh, {{{2
8077" changed sorting, etc. Also see s:NetrwSaveWordPosn().
8078fun! s:NetrwRestoreWordPosn()
8079" call Dfunc("NetrwRestoreWordPosn()")
8080 silent! call search(s:netrw_saveword,'w')
8081" call Dret("NetrwRestoreWordPosn")
8082endfun
8083
8084" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008085" s:RestoreBufVars: {{{2
8086fun! s:RestoreBufVars()
8087" call Dfunc("s:RestoreBufVars()")
8088
8089 if exists("s:netrw_curdir") |let b:netrw_curdir = s:netrw_curdir |endif
8090 if exists("s:netrw_lastfile") |let b:netrw_lastfile = s:netrw_lastfile |endif
8091 if exists("s:netrw_method") |let b:netrw_method = s:netrw_method |endif
8092 if exists("s:netrw_fname") |let b:netrw_fname = s:netrw_fname |endif
8093 if exists("s:netrw_machine") |let b:netrw_machine = s:netrw_machine |endif
8094 if exists("s:netrw_browser_active")|let b:netrw_browser_active = s:netrw_browser_active|endif
8095
8096" call Dret("s:RestoreBufVars")
8097endfun
8098
8099" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008100" s:RemotePathAnalysis: {{{2
8101fun! s:RemotePathAnalysis(dirname)
8102" call Dfunc("s:RemotePathAnalysis()")
8103
8104 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/:#]\+\)\%([:#]\(\d\+\)\)\=/\(.*\)$'
8105 let s:method = substitute(a:dirname,dirpat,'\1','')
8106 let s:user = substitute(a:dirname,dirpat,'\2','')
8107 let s:machine = substitute(a:dirname,dirpat,'\3','')
8108 let s:port = substitute(a:dirname,dirpat,'\4','')
8109 let s:path = substitute(a:dirname,dirpat,'\5','')
8110 let s:fname = substitute(a:dirname,'^.*/\ze.','','')
8111
8112" call Decho("set up s:method <".s:method .">")
8113" call Decho("set up s:user <".s:user .">")
8114" call Decho("set up s:machine<".s:machine.">")
8115" call Decho("set up s:port <".s:port.">")
8116" call Decho("set up s:path <".s:path .">")
8117" call Decho("set up s:fname <".s:fname .">")
8118
8119" call Dret("s:RemotePathAnalysis")
8120endfun
8121
8122" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008123" s:RemoteSystem: runs a command on a remote host using ssh {{{2
8124" Returns status
8125" Runs system() on
8126" [cd REMOTEDIRPATH;] a:cmd
8127" Note that it doesn't do shellescape(a:cmd)!
8128fun! s:RemoteSystem(cmd)
8129" call Dfunc("s:RemoteSystem(cmd<".a:cmd.">)")
8130 if !executable(g:netrw_ssh_cmd)
8131 call netrw#ErrorMsg(s:ERROR,"g:netrw_ssh_cmd<".g:netrw_ssh_cmd."> is not executable!",52)
8132 elseif !exists("b:netrw_curdir")
8133 call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
8134 else
8135 let cmd = s:MakeSshCmd(g:netrw_ssh_cmd." USEPORT HOSTNAME")
8136 let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
8137 if remotedir != ""
8138 let cmd= cmd.' cd '.shellescape(remotedir).";"
8139 else
8140 let cmd= cmd.' '
8141 endif
8142 let cmd= cmd.a:cmd
8143" call Decho("call system(".cmd.")")
8144 let ret= system(cmd)
8145 endif
8146" call Dret("s:RemoteSystem ".ret)
8147 return ret
Bram Moolenaar9964e462007-05-05 17:54:07 +00008148endfun
8149
8150" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008151" s:RestoreWinVars: (used by Explore() and NetrwSplit()) {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00008152fun! s:RestoreWinVars()
8153" call Dfunc("s:RestoreWinVars()")
Bram Moolenaar488c6512005-08-11 20:09:58 +00008154 if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00008155 if exists("s:col") |let w:netrw_col = s:col |unlet s:col |endif
8156 if exists("s:curdir") |let w:netrw_curdir = s:curdir |unlet s:curdir |endif
8157 if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif
8158 if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif
8159 if exists("s:explore_line") |let w:netrw_explore_line = s:explore_line |unlet s:explore_line |endif
8160 if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
8161 if exists("s:explore_list") |let w:netrw_explore_list = s:explore_list |unlet s:explore_list |endif
8162 if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
8163 if exists("s:fpl") |let w:netrw_fpl = s:fpl |unlet s:fpl |endif
8164 if exists("s:hline") |let w:netrw_hline = s:hline |unlet s:hline |endif
8165 if exists("s:line") |let w:netrw_line = s:line |unlet s:line |endif
8166 if exists("s:liststyle") |let w:netrw_liststyle = s:liststyle |unlet s:liststyle |endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00008167 if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif
8168 if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00008169 if exists("s:treedict") |let w:netrw_treedict = s:treedict |unlet s:treedict |endif
8170 if exists("s:treetop") |let w:netrw_treetop = s:treetop |unlet s:treetop |endif
8171 if exists("s:winnr") |let w:netrw_winnr = s:winnr |unlet s:winnr |endif
8172" call Dret("s:RestoreWinVars")
Bram Moolenaar488c6512005-08-11 20:09:58 +00008173endfun
8174
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008175" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008176" s:Rexplore: implements returning from a buffer to a netrw directory {{{2
8177"
8178" s:SetRexDir() sets up <2-leftmouse> maps (if g:netrw_retmap
8179" is true) and a command, :Rexplore, which call this function.
8180"
8181" s:nbcd_curpos_{bufnr('%')} is set up by s:NetrwBrowseChgDir()
8182fun! s:NetrwRexplore(islocal,dirname)
8183" call Dfunc("s:NetrwRexplore(islocal=".a:islocal." dirname<".a:dirname.">)")
8184 if a:islocal
8185 call netrw#LocalBrowseCheck(a:dirname)
8186 else
8187 call s:NetrwBrowse(0,a:dirname)
8188 endif
8189 if exists("s:nbcd_curpos_{bufnr('%')}")
8190 call netrw#NetrwRestorePosn(s:nbcd_curpos_{bufnr('%')})
8191 unlet s:nbcd_curpos_{bufnr('%')}
8192 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01008193 if exists("s:explore_match")
8194 exe "2match netrwMarkFile /".s:explore_match."/"
8195 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +00008196" call Dret("s:NetrwRexplore")
8197endfun
8198
8199" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00008200" s:SaveBufVars: {{{2
8201fun! s:SaveBufVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +01008202" call Dfunc("s:SaveBufVars() buf#".bufnr("%"))
Bram Moolenaar9964e462007-05-05 17:54:07 +00008203
8204 if exists("b:netrw_curdir") |let s:netrw_curdir = b:netrw_curdir |endif
8205 if exists("b:netrw_lastfile") |let s:netrw_lastfile = b:netrw_lastfile |endif
8206 if exists("b:netrw_method") |let s:netrw_method = b:netrw_method |endif
8207 if exists("b:netrw_fname") |let s:netrw_fname = b:netrw_fname |endif
8208 if exists("b:netrw_machine") |let s:netrw_machine = b:netrw_machine |endif
8209 if exists("b:netrw_browser_active")|let s:netrw_browser_active = b:netrw_browser_active|endif
8210
8211" call Dret("s:SaveBufVars")
8212endfun
8213
8214" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008215" s:SaveWinVars: (used by Explore() and NetrwSplit()) {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +00008216fun! s:SaveWinVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +01008217" call Dfunc("s:SaveWinVars() win#".winnr())
Bram Moolenaar9964e462007-05-05 17:54:07 +00008218 if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif
8219 if exists("w:netrw_col") |let s:col = w:netrw_col |endif
8220 if exists("w:netrw_curdir") |let s:curdir = w:netrw_curdir |endif
8221 if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif
8222 if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif
8223 if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif
8224 if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
8225 if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif
8226 if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
8227 if exists("w:netrw_fpl") |let s:fpl = w:netrw_fpl |endif
8228 if exists("w:netrw_hline") |let s:hline = w:netrw_hline |endif
8229 if exists("w:netrw_line") |let s:line = w:netrw_line |endif
8230 if exists("w:netrw_liststyle") |let s:liststyle = w:netrw_liststyle |endif
8231 if exists("w:netrw_method") |let s:method = w:netrw_method |endif
8232 if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif
8233 if exists("w:netrw_treedict") |let s:treedict = w:netrw_treedict |endif
8234 if exists("w:netrw_treetop") |let s:treetop = w:netrw_treetop |endif
8235 if exists("w:netrw_winnr") |let s:winnr = w:netrw_winnr |endif
8236" call Dret("s:SaveWinVars")
8237endfun
8238
8239" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008240" s:SetBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck()) {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008241" To allow separate windows to have their own activities, such as
8242" Explore **/pattern, several variables have been made window-oriented.
8243" However, when the user splits a browser window (ex: ctrl-w s), these
Bram Moolenaar1afcace2005-11-25 19:54:28 +00008244" variables are not inherited by the new window. SetBufWinVars() and
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008245" UseBufWinVars() get around that.
Bram Moolenaar1afcace2005-11-25 19:54:28 +00008246fun! s:SetBufWinVars()
Bram Moolenaar5c736222010-01-06 20:54:52 +01008247" call Dfunc("s:SetBufWinVars() win#".winnr())
Bram Moolenaar9964e462007-05-05 17:54:07 +00008248 if exists("w:netrw_liststyle") |let b:netrw_liststyle = w:netrw_liststyle |endif
8249 if exists("w:netrw_bannercnt") |let b:netrw_bannercnt = w:netrw_bannercnt |endif
8250 if exists("w:netrw_method") |let b:netrw_method = w:netrw_method |endif
8251 if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif
8252 if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif
8253 if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen= w:netrw_explore_listlen|endif
8254 if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt= w:netrw_explore_mtchcnt|endif
8255 if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif
8256 if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif
8257 if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif
8258" call Dret("s:SetBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008259endfun
8260
8261" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008262" s:SetRexDir: set directory for :Rexplore {{{2
8263fun! s:SetRexDir(islocal,dirname)
8264" call Dfunc("s:SetRexDir(islocal=".a:islocal." dirname<".a:dirname.">)")
8265 " set up Rex and leftmouse-double-click
8266 if a:islocal
Bram Moolenaare37d50a2008-08-06 17:06:04 +00008267 exe 'com! Rexplore call s:NetrwRexplore(1,"'.escape(a:dirname,'"\').'")'
Bram Moolenaar446cb832008-06-24 21:56:24 +00008268 if g:netrw_retmap
Bram Moolenaar5c736222010-01-06 20:54:52 +01008269 if !hasmapto("<Plug>NetrwReturn") && maparg("<2-leftmouse>","n") == ""
Bram Moolenaar446cb832008-06-24 21:56:24 +00008270 nmap <unique> <silent> <2-leftmouse> <Plug>NetrwReturn
8271 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00008272 let dir = escape(a:dirname, s:netrw_map_escape)
8273 exe 'nnoremap <silent> <Plug>NetrwReturn :call <SID>NetrwRexplore(1,"'.dir.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00008274 endif
8275 else
Bram Moolenaare37d50a2008-08-06 17:06:04 +00008276 exe 'com! Rexplore call s:NetrwRexplore(0,"'.escape(a:dirname,'"\').'")'
Bram Moolenaar446cb832008-06-24 21:56:24 +00008277 if g:netrw_retmap
Bram Moolenaar5c736222010-01-06 20:54:52 +01008278 if !hasmapto("<Plug>NetrwReturn") && maparg("<2-leftmouse>","n") == ""
Bram Moolenaar446cb832008-06-24 21:56:24 +00008279 nmap <unique> <silent> <2-leftmouse> <Plug>NetrwReturn
8280 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +00008281 let dir = escape(a:dirname, s:netrw_map_escape)
8282 exe 'nnoremap <silent> <Plug>NetrwReturn :call <SID>NetrwRexplore(0,"'.dir.'")<cr>'
Bram Moolenaar446cb832008-06-24 21:56:24 +00008283 endif
8284 endif
8285" call Dret("s:SetRexDir")
8286endfun
8287
8288" ---------------------------------------------------------------------
8289" s:Strlen: this function returns the length of a string, even if its {{{2
8290" using two-byte etc characters.
Bram Moolenaar5c736222010-01-06 20:54:52 +01008291" Solution from Nicolai Weibull, vim docs (:help strlen()), Tony Mechelynck,
8292" and a bit from me.
8293" if g:netrw_xstrlen is zero (default), then the builtin strlen() function is used.
Bram Moolenaar446cb832008-06-24 21:56:24 +00008294fun! s:Strlen(x)
8295" call Dfunc("s:Strlen(x<".a:x.">")
8296 if g:netrw_xstrlen == 1
8297 " number of codepoints (Latin a + combining circumflex is two codepoints)
8298 " (comment from TM, solution from NW)
8299 let ret= strlen(substitute(a:x,'.','c','g'))
8300
8301 elseif g:netrw_xstrlen == 2
8302 " number of spacing codepoints (Latin a + combining circumflex is one spacing
8303 " codepoint; a hard tab is one; wide and narrow CJK are one each; etc.)
8304 " (comment from TM, solution from TM)
8305 let ret=strlen(substitute(a:x, '.\Z', 'x', 'g'))
8306
8307 elseif g:netrw_xstrlen == 3
8308 " virtual length (counting, for instance, tabs as anything between 1 and
8309 " 'tabstop', wide CJK as 2 rather than 1, Arabic alif as zero when immediately
8310 " preceded by lam, one otherwise, etc.)
8311 " (comment from TM, solution from me)
8312 let modkeep= &mod
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008313 exe "keepj norm! o\<esc>"
Bram Moolenaar446cb832008-06-24 21:56:24 +00008314 call setline(line("."),a:x)
8315 let ret= virtcol("$") - 1
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008316 keepj d
Bram Moolenaar446cb832008-06-24 21:56:24 +00008317 let &mod= modkeep
8318
8319 else
8320 " at least give a decent default
Bram Moolenaar5c736222010-01-06 20:54:52 +01008321 let ret= strlen(a:x)
Bram Moolenaar446cb832008-06-24 21:56:24 +00008322 endif
8323" call Dret("s:Strlen ".ret)
8324 return ret
8325endfun
8326
8327" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008328" s:TreeListMove: {{{2
8329fun! s:TreeListMove(dir)
8330" call Dfunc("s:TreeListMove(dir<".a:dir.">)")
8331 let curline = getline('.')
8332 let prvline = (line(".") > 1)? getline(line(".")-1) : ''
8333 let nxtline = (line(".") < line("$"))? getline(line(".")+1) : ''
8334 let curindent= substitute(curline,'^\([| ]*\).\{-}$','\1','')
8335 let indentm1 = substitute(curindent,'^| ','','')
8336" call Decho("prvline <".prvline."> #".line(".")-1)
8337" call Decho("curline <".curline."> #".line("."))
8338" call Decho("nxtline <".nxtline."> #".line(".")+1)
8339" call Decho("curindent<".curindent.">")
8340" call Decho("indentm1 <".indentm1.">")
8341
8342 if curline !~ '/$'
8343" call Decho('regfile')
8344 if a:dir == '[' && prvline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008345 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00008346 let nl = search('^'.indentm1.'[^|]','bWe') " search backwards from regular file
8347" call Decho("regfile srch back: ".nl)
8348 elseif a:dir == ']' && nxtline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008349 keepj norm! $
Bram Moolenaar446cb832008-06-24 21:56:24 +00008350 let nl = search('^'.indentm1.'[^|]','We') " search forwards from regular file
8351" call Decho("regfile srch fwd: ".nl)
8352 endif
8353
8354 elseif a:dir == '[' && prvline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008355 keepj norm! 0
Bram Moolenaar446cb832008-06-24 21:56:24 +00008356 let curline= line(".")
8357 let nl = search('^'.curindent.'[^|]','bWe') " search backwards From directory, same indentation
8358" call Decho("dir srch back ind: ".nl)
8359 if nl != 0
8360 if line(".") == curline-1
8361 let nl= search('^'.indentm1.'[^|]','bWe') " search backwards from directory, indentation - 1
8362" call Decho("dir srch back ind-1: ".nl)
8363 endif
8364 endif
8365
8366 elseif a:dir == ']' && nxtline != ''
Bram Moolenaar00a927d2010-05-14 23:24:24 +02008367 keepj norm! $
Bram Moolenaar446cb832008-06-24 21:56:24 +00008368 let curline = line(".")
8369 let nl = search('^'.curindent.'[^|]','We') " search forwards from directory, same indentation
8370" call Decho("dir srch fwd ind: ".nl)
8371 if nl != 0
8372 if line(".") == curline+1
8373 let nl= search('^'.indentm1.'[^|]','We') " search forwards from directory, indentation - 1
8374" call Decho("dir srch fwd ind-1: ".nl)
8375 endif
8376 endif
8377
8378 endif
8379
8380" call Dret("s:TreeListMove")
8381endfun
8382
8383" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +00008384" s:UpdateBuffersMenu: does emenu Buffers.Refresh (but due to locale, the menu item may not be called that) {{{2
8385" The Buffers.Refresh menu calls s:BMShow(); unfortunately, that means that that function
8386" can't be called except via emenu. But due to locale, that menu line may not be called
8387" Buffers.Refresh; hence, s:NetrwBMShow() utilizes a "cheat" to call that function anyway.
8388fun! s:UpdateBuffersMenu()
8389" call Dfunc("s:UpdateBuffersMenu()")
Bram Moolenaar5c736222010-01-06 20:54:52 +01008390 if has("gui") && has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu
Bram Moolenaarc236c162008-07-13 17:41:49 +00008391 try
8392 silent emenu Buffers.Refresh\ menu
8393 catch /^Vim\%((\a\+)\)\=:E/
8394 let v:errmsg= ""
8395 silent call s:NetrwBMShow()
8396 endtry
8397 endif
8398" call Dret("s:UpdateBuffersMenu")
8399endfun
8400
8401" ---------------------------------------------------------------------
Bram Moolenaar446cb832008-06-24 21:56:24 +00008402" s:UseBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck() {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008403" Matching function to BufferWinVars()
8404fun! s:UseBufWinVars()
Bram Moolenaar9964e462007-05-05 17:54:07 +00008405" call Dfunc("s:UseBufWinVars()")
8406 if exists("b:netrw_liststyle") && !exists("w:netrw_liststyle") |let w:netrw_liststyle = b:netrw_liststyle |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008407 if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif
8408 if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif
8409 if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif
8410 if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif
8411 if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
8412 if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
8413 if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif
8414 if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif
8415 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 +00008416" call Dret("s:UseBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00008417endfun
8418
Bram Moolenaar1afcace2005-11-25 19:54:28 +00008419" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +01008420" netrw#WinPath: tries to insure that the path is windows-acceptable, whether cygwin is used or not {{{2
8421fun! netrw#WinPath(path)
8422" call Dfunc("netrw#WinPath(path<".a:path.">)")
8423 if (!g:netrw_cygwin || &shell !~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$') && (has("win32") || has("win95") || has("win64") || has("win16"))
8424 " remove cygdrive prefix, if present
8425 let path = substitute(a:path,'/cygdrive/\(.\)','\1:','')
Bram Moolenaarc236c162008-07-13 17:41:49 +00008426 " remove trailing slash (Win95)
Bram Moolenaar5c736222010-01-06 20:54:52 +01008427 let path = substitute(path, '\(\\\|/\)$', '', 'g')
Bram Moolenaarc236c162008-07-13 17:41:49 +00008428 " remove escaped spaces
8429 let path = substitute(path, '\ ', ' ', 'g')
8430 " convert slashes to backslashes
8431 let path = substitute(path, '/', '\', 'g')
8432 else
8433 let path= a:path
8434 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +01008435" call Dret("netrw#WinPath <".path.">")
Bram Moolenaarc236c162008-07-13 17:41:49 +00008436 return path
8437endfun
8438
8439" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00008440" Settings Restoration: {{{2
Bram Moolenaar83bab712005-08-01 21:58:57 +00008441let &cpo= s:keepcpo
8442unlet s:keepcpo
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00008443
Bram Moolenaar071d4272004-06-13 20:20:40 +00008444" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00008445" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +00008446" vim:ts=8 fdm=marker