blob: 6e80a6926a27fd668e1eb8c633b7c9d7f01981b5 [file] [log] [blame]
Bram Moolenaar9964e462007-05-05 17:54:07 +00001" netrw.vim: Handles file transfer and remote directory listing across
2" AUTOLOAD SECTION
3" Date: Mar 21, 2007
4" Version: 108
5" Maintainer: Charles E Campbell, Jr <NdrOchip@ScampbellPfamily.AbizM-NOSPAM>
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00006" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
Bram Moolenaar9964e462007-05-05 17:54:07 +00007" Copyright: Copyright (C) 1999-2007 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
12" *as is* and comes with no warranty of any kind, either
13" 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 Moolenaar5b8d8fd2005-08-16 23:01:50 +000016" of this software.
Bram Moolenaar9964e462007-05-05 17:54:07 +000017" COMBAK: worked with tmpfile s:GetTempname() in NetRead() NetWrite()
18" !!NEEDS DEBUGGING && TESTING!!!
19"redraw!|call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar071d4272004-06-13 20:20:40 +000020"
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +000021" But be doers of the Word, and not only hearers, deluding your own selves {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +000022" (James 1:22 RSV)
23" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Bram Moolenaar9964e462007-05-05 17:54:07 +000024" Load Once: {{{1
Bram Moolenaar1afcace2005-11-25 19:54:28 +000025if &cp || exists("g:loaded_netrw")
26 finish
27endif
Bram Moolenaar9964e462007-05-05 17:54:07 +000028if !exists("s:NOTE")
29 let s:NOTE = 0
30 let s:WARNING = 1
31 let s:ERROR = 2
32endif
33let g:loaded_netrw = "v108"
Bram Moolenaar578b49e2005-09-10 19:22:57 +000034if v:version < 700
Bram Moolenaar9964e462007-05-05 17:54:07 +000035 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 +000036 finish
37endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +000038let s:keepcpo= &cpo
Bram Moolenaar9964e462007-05-05 17:54:07 +000039setlocal cpo&vim
40"DechoTabOn
41"call Decho("doing autoload/netrw.vim version ".g:loaded_netrw)
Bram Moolenaar071d4272004-06-13 20:20:40 +000042
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +000043" ======================
44" Netrw Variables: {{{1
45" ======================
46
Bram Moolenaar071d4272004-06-13 20:20:40 +000047" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +000048" Netrw Constants: {{{2
49if !exists("g:NETRW_BOOKMARKMAX")
50 let g:NETRW_BOOKMARKMAX= 0
51endif
52if !exists("g:NETRW_DIRHIST_CNT")
53 let g:NETRW_DIRHIST_CNT= 0
54endif
55if !exists("s:LONGLIST")
56 let s:THINLIST = 0
57 let s:LONGLIST = 1
58 let s:WIDELIST = 2
59 let s:TREELIST = 3
60 let s:MAXLIST = 4
61endif
62
63" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +000064" Default values for netrw's global protocol variables {{{2
Bram Moolenaar1afcace2005-11-25 19:54:28 +000065if !exists("g:netrw_dav_cmd")
66 let g:netrw_dav_cmd = "cadaver"
Bram Moolenaar071d4272004-06-13 20:20:40 +000067endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +000068if !exists("g:netrw_fetch_cmd")
69 if executable("fetch")
70 let g:netrw_fetch_cmd = "fetch -o"
71 else
72 let g:netrw_fetch_cmd = ""
73 endif
74endif
75if !exists("g:netrw_ftp_cmd")
76 let g:netrw_ftp_cmd = "ftp"
77endif
78if !exists("g:netrw_http_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +000079 if executable("curl")
80 let g:netrw_http_cmd = "curl -o"
81 elseif executable("wget")
Bram Moolenaar1afcace2005-11-25 19:54:28 +000082 let g:netrw_http_cmd = "wget -q -O"
83 elseif executable("fetch")
84 let g:netrw_http_cmd = "fetch -o"
85 else
86 let g:netrw_http_cmd = ""
87 endif
88endif
89if !exists("g:netrw_rcp_cmd")
90 let g:netrw_rcp_cmd = "rcp"
91endif
92if !exists("g:netrw_rsync_cmd")
93 let g:netrw_rsync_cmd = "rsync"
94endif
95if !exists("g:netrw_scp_cmd")
96 let g:netrw_scp_cmd = "scp -q"
97endif
98if !exists("g:netrw_sftp_cmd")
99 let g:netrw_sftp_cmd = "sftp"
100endif
101if !exists("g:netrw_ssh_cmd")
102 let g:netrw_ssh_cmd= "ssh"
103endif
104
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000105if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000106 \ && exists("g:netrw_use_nt_rcp")
107 \ && g:netrw_use_nt_rcp
108 \ && executable( $SystemRoot .'/system32/rcp.exe')
109 let s:netrw_has_nt_rcp = 1
110 let s:netrw_rcpmode = '-b'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000111else
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000112 let s:netrw_has_nt_rcp = 0
113 let s:netrw_rcpmode = ''
114endif
115
116" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000117" Default values for netrw's global variables {{{2
118" Default values - a-c ---------- {{{3
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000119if !exists("g:netrw_alto")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000120 let g:netrw_alto= &sb
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000121endif
122if !exists("g:netrw_altv")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000123 let g:netrw_altv= &spr
Bram Moolenaar071d4272004-06-13 20:20:40 +0000124endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000125if !exists("g:netrw_browse_split")
126 let g:netrw_browse_split= 0
127endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000128if !exists("g:netrw_chgwin")
129 let g:netrw_chgwin = -1
130endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000131if !exists("g:netrw_cygwin")
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000132 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000133 if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000134 let g:netrw_cygwin= 1
135 else
136 let g:netrw_cygwin= 0
137 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000138 else
139 let g:netrw_cygwin= 0
140 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000141else
142 let g:netrw_cygwin= 0
Bram Moolenaar071d4272004-06-13 20:20:40 +0000143endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000144" Default values - d-f ---------- {{{3
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000145if !exists("g:NETRW_DIRHIST_CNT")
146 let g:NETRW_DIRHIST_CNT= 0
147endif
148if !exists("g:netrw_dirhistmax")
149 let g:netrw_dirhistmax= 10
150endif
151if !exists("g:netrw_ftp_browse_reject")
152 let 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 Moolenaar843ee412004-06-30 16:16:41 +0000153endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000154if !exists("g:netrw_ftp_list_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000155 if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)
156 let g:netrw_ftp_list_cmd = "ls -lF"
157 let g:netrw_ftp_timelist_cmd = "ls -tlF"
158 let g:netrw_ftp_sizelist_cmd = "ls -slF"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000159 else
Bram Moolenaar9964e462007-05-05 17:54:07 +0000160 let g:netrw_ftp_list_cmd = "dir"
161 let g:netrw_ftp_timelist_cmd = "dir"
162 let g:netrw_ftp_sizelist_cmd = "dir"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000163 endif
164endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000165if !exists("g:netrw_ftpmode")
166 let g:netrw_ftpmode= "binary"
Bram Moolenaar61036992005-10-12 20:54:52 +0000167endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000168" Default values - h-lh ---------- {{{3
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000169if !exists("g:netrw_hide")
170 let g:netrw_hide= 1
Bram Moolenaar61036992005-10-12 20:54:52 +0000171endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000172if !exists("g:netrw_ignorenetrc")
173 if &shell =~ '\c\<\%(cmd\|4nt\)\.exe$'
174 let g:netrw_ignorenetrc= 1
175 else
176 let g:netrw_ignorenetrc= 0
177 endif
178endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000179if !exists("g:netrw_keepdir")
180 let g:netrw_keepdir= 1
181endif
182if !exists("g:netrw_list_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000183 if g:netrw_scp_cmd =~ '^pscp' && executable("pscp")
184 " provide a 'pscp' listing command
185 if (has("win32") || has("win95") || has("win64") || has("win16")) && filereadable("c:\\private.ppk")
186 let g:netrw_scp_cmd ="pscp -i C:\\private.ppk"
187 endif
188 let g:netrw_list_cmd= g:netrw_scp_cmd." -ls USEPORT HOSTNAME:"
189 elseif executable(g:netrw_ssh_cmd)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000190 " provide a default listing command
Bram Moolenaar9964e462007-05-05 17:54:07 +0000191 let g:netrw_list_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME ls -FLa"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000192 else
Bram Moolenaar9964e462007-05-05 17:54:07 +0000193" call Decho(g:netrw_ssh_cmd." is not executable")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000194 let g:netrw_list_cmd= ""
195 endif
196endif
197if !exists("g:netrw_list_hide")
198 let g:netrw_list_hide= ""
199endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000200" Default values - lh-lz ---------- {{{3
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000201if !exists("g:netrw_local_mkdir")
202 let g:netrw_local_mkdir= "mkdir"
203endif
204if !exists("g:netrw_local_rmdir")
205 let g:netrw_local_rmdir= "rmdir"
206endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000207if !exists("g:netrw_liststyle")
208 let g:netrw_liststyle= s:THINLIST
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000209endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000210if g:netrw_liststyle < 0 || g:netrw_liststyle >= s:MAXLIST
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000211 " sanity check
Bram Moolenaar9964e462007-05-05 17:54:07 +0000212 let g:netrw_liststyle= s:THINLIST
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000213endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000214if g:netrw_liststyle == s:LONGLIST && g:netrw_scp_cmd !~ '^pscp'
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000215 let g:netrw_list_cmd= g:netrw_list_cmd." -l"
216endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000217" Default values - m-r ---------- {{{3
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000218if !exists("g:netrw_maxfilenamelen")
219 let g:netrw_maxfilenamelen= 32
220endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000221if !exists("g:netrw_menu")
222 let g:netrw_menu= 1
223endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000224if !exists("g:netrw_mkdir_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000225 let g:netrw_mkdir_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME mkdir"
Bram Moolenaara5792f52005-11-23 21:25:05 +0000226endif
227if !exists("g:netrw_rename_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000228 let g:netrw_rename_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME mv"
Bram Moolenaara5792f52005-11-23 21:25:05 +0000229endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000230if !exists("g:netrw_rm_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000231 let g:netrw_rm_cmd = g:netrw_ssh_cmd." USEPORT HOSTNAME rm"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000232endif
233if !exists("g:netrw_rmdir_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000234 let g:netrw_rmdir_cmd = g:netrw_ssh_cmd." USEPORT HOSTNAME rmdir"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000235endif
236if !exists("g:netrw_rmf_cmd")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000237 let g:netrw_rmf_cmd = g:netrw_ssh_cmd." USEPORT HOSTNAME rm -f"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000238endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000239" Default values - s ---------- {{{3
Bram Moolenaar843ee412004-06-30 16:16:41 +0000240if exists("g:netrw_silent") && g:netrw_silent != 0
241 let g:netrw_silentxfer= "silent "
242else
243 let g:netrw_silentxfer= ""
244endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000245if !exists("g:netrw_fastbrowse")
246 let g:netrw_fastbrowse= 1
247endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000248if !exists("g:netrw_shq")
249 if exists("&shq") && &shq != ""
250 let g:netrw_shq= &shq
251 elseif has("win32") || has("win95") || has("win64") || has("win16")
252 if g:netrw_cygwin
253 let g:netrw_shq= "'"
254 else
255 let g:netrw_shq= '"'
256 endif
257 else
258 let g:netrw_shq= "'"
259 endif
260" call Decho("g:netrw_shq<".g:netrw_shq.">")
261endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000262if !exists("g:netrw_sort_by")
263 " alternatives: date size
264 let g:netrw_sort_by= "name"
265endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000266if !exists("g:netrw_sort_direction")
267 " alternative: reverse (z y x ...)
268 let g:netrw_sort_direction= "normal"
269endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000270if !exists("g:netrw_sort_sequence")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000271 let g:netrw_sort_sequence= '[\/]$,\.h$,\.c$,\.cpp$,\.[a-np-z]$,*,\.info$,\.swp$,\.o$\.obj$,\.bak$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000272endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000273if !exists("g:netrw_ssh_browse_reject")
274 let g:netrw_ssh_browse_reject='^total\s\+\d\+$'
275endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000276if !has("patch192")
277 if !exists("g:netrw_use_noswf")
278 let g:netrw_use_noswf= 1
279 endif
280else
281 let g:netrw_use_noswf= 0
282endif
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000283" Default values - t-w ---------- {{{3
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000284if !exists("g:netrw_timefmt")
285 let g:netrw_timefmt= "%c"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000286endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000287if !exists("g:NetrwTopLvlMenu")
288 let g:NetrwTopLvlMenu= "Netrw."
289endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000290if !exists("g:netrw_win95ftp")
291 let g:netrw_win95ftp= 1
292endif
293if !exists("g:netrw_winsize")
294 let g:netrw_winsize= ""
295endif
296" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000297" Default values for netrw's script variables: {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000298if !exists("s:netrw_cd_escape")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000299 let s:netrw_cd_escape="[]#*$%'\" ?`!&();<>\\"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000300endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000301if !exists("g:netrw_fname_escape")
302 let g:netrw_fname_escape= ' ?&;'
303endif
304if !exists("g:netrw_tmpfile_escape")
305 let g:netrw_tmpfile_escape= ' ?&;'
306endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000307if !exists("s:netrw_glob_escape")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000308 let s:netrw_glob_escape= '[]*?`{~$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000309endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000310
311" BufEnter event ignored by decho when following variable is true
312" Has a side effect that doau BufReadPost doesn't work, so
313" files read by network transfer aren't appropriately highlighted.
314"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000315
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000316" ==============================
317" Netrw Utility Functions: {{{1
318" ==============================
319
Bram Moolenaar071d4272004-06-13 20:20:40 +0000320" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000321" NetSavePosn: saves position of cursor on screen {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000322fun! netrw#NetSavePosn()
Bram Moolenaar9964e462007-05-05 17:54:07 +0000323" call Dfunc("netrw#NetSavePosn()")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000324 " Save current line and column
Bram Moolenaar488c6512005-08-11 20:09:58 +0000325 let w:netrw_winnr= winnr()
326 let w:netrw_line = line(".")
327 let w:netrw_col = virtcol(".")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000328
329 " Save top-of-screen line
330 norm! H0
Bram Moolenaar488c6512005-08-11 20:09:58 +0000331 let w:netrw_hline= line(".")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000332
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000333 call netrw#NetRestorePosn()
Bram Moolenaar9964e462007-05-05 17:54:07 +0000334" call Dret("netrw#NetSavePosn : winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000335endfun
336
337" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000338" NetRestorePosn: restores the cursor and file position as saved by NetSavePosn() {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000339fun! netrw#NetRestorePosn()
Bram Moolenaar9964e462007-05-05 17:54:07 +0000340" call Dfunc("netrw#NetRestorePosn() 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))
Bram Moolenaar572cb562005-08-05 21:35:02 +0000341 let eikeep= &ei
342 set ei=all
Bram Moolenaar9964e462007-05-05 17:54:07 +0000343 if expand("%") == "NetrwMessage"
344 exe s:winBeforeErr."wincmd w"
345 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000346
Bram Moolenaar81695252004-12-29 20:58:21 +0000347 " restore window
Bram Moolenaar9964e462007-05-05 17:54:07 +0000348 if exists("w:netrw_winnr")
349" call Decho("restore window: exe silent! ".w:netrw_winnr."wincmd w")
350 exe "silent! ".w:netrw_winnr."wincmd w"
351 endif
352 if v:shell_error == 0
353 " as suggested by Bram M: redraw on no error
354 " allows protocol error messages to remain visible
355 redraw!
356 endif
Bram Moolenaar81695252004-12-29 20:58:21 +0000357
Bram Moolenaar071d4272004-06-13 20:20:40 +0000358 " restore top-of-screen line
Bram Moolenaar9964e462007-05-05 17:54:07 +0000359 if exists("w:netrw_hline")
360" call Decho("restore topofscreen: exe norm! ".w:netrw_hline."G0z")
361 exe "norm! ".w:netrw_hline."G0z\<CR>"
362 endif
Bram Moolenaar81695252004-12-29 20:58:21 +0000363
Bram Moolenaar071d4272004-06-13 20:20:40 +0000364 " restore position
Bram Moolenaar9964e462007-05-05 17:54:07 +0000365 if exists("w:netrw_line") && exists("w:netrw_col")
366" call Decho("restore posn: exe norm! ".w:netrw_line."G0".w:netrw_col."|")
367 exe "norm! ".w:netrw_line."G0".w:netrw_col."\<bar>"
368 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000369
Bram Moolenaar572cb562005-08-05 21:35:02 +0000370 let &ei= eikeep
Bram Moolenaar9964e462007-05-05 17:54:07 +0000371" call Dret("netrw#NetRestorePosn")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000372endfun
373
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000374" ===============================
Bram Moolenaar9964e462007-05-05 17:54:07 +0000375" NetOptionSave: save options and set to "standard" form {{{2
376fun! s:NetOptionSave()
377" call Dfunc("s:NetOptionSave()")
378 if !exists("w:netrw_optionsave")
379 let w:netrw_optionsave= 1
380 else
381" call Dret("s:NetOptionSave : netoptionsave=".w:netrw_optionsave)
382 return
383 endif
384
385 " Save current settings and current directory
386 let s:yykeep = @@
387 if exists("&l:acd")
388 let w:netrw_acdkeep = &l:acd
389 endif
390 let w:netrw_aikeep = &l:ai
391 let w:netrw_awkeep = &l:aw
392 let w:netrw_cikeep = &l:ci
393 let w:netrw_cinkeep = &l:cin
394 let w:netrw_cinokeep = &l:cino
395 let w:netrw_comkeep = &l:com
396 let w:netrw_cpokeep = &l:cpo
397 if g:netrw_keepdir
398 let w:netrw_dirkeep = getcwd()
399 endif
400 let w:netrw_fokeep = &l:fo " formatoptions
401 let w:netrw_gdkeep = &l:gd " gdefault
402 let w:netrw_hidkeep = &l:hidden
403 let w:netrw_magickeep = &l:magic
404 let w:netrw_repkeep = &l:report
405 let w:netrw_spellkeep = &l:spell
406 let w:netrw_twkeep = &l:tw " textwidth
407 let w:netrw_wigkeep = &l:wig " wildignore
408 if has("win32") && !has("win95")
409 let w:netrw_swfkeep= &l:swf " swapfile
410 endif
411 call s:NetrwSafeOptions()
412 if &go =~ 'a' | silent! let w:netrw_regstar = @* | endif
413 silent! let w:netrw_regslash= @/
414
415" call Dret("s:NetOptionSave")
416endfun
417
418" ------------------------------------------------------------------------
419" NetOptionRestore: restore options {{{2
420fun! s:NetOptionRestore()
421" call Dfunc("s:NetOptionRestore()")
422 if !exists("w:netrw_optionsave")
423" call Dret("s:NetOptionRestore : w:netrw_optionsave doesn't exist")
424 return
425 endif
426 unlet w:netrw_optionsave
427
428 if exists("&acd")
429 if exists("w:netrw_acdkeep") |let &l:acd = w:netrw_acdkeep |unlet w:netrw_acdkeep |endif
430 endif
431 if exists("w:netrw_aikeep") |let &l:ai = w:netrw_aikeep |unlet w:netrw_aikeep |endif
432 if exists("w:netrw_awkeep") |let &l:aw = w:netrw_awkeep |unlet w:netrw_awkeep |endif
433 if exists("w:netrw_cikeep") |let &l:ci = w:netrw_cikeep |unlet w:netrw_cikeep |endif
434 if exists("w:netrw_cinkeep") |let &l:cin = w:netrw_cinkeep |unlet w:netrw_cinkeep |endif
435 if exists("w:netrw_cinokeep") |let &l:cino = w:netrw_cinokeep |unlet w:netrw_cinokeep |endif
436 if exists("w:netrw_comkeep") |let &l:com = w:netrw_comkeep |unlet w:netrw_comkeep |endif
437 if exists("w:netrw_cpokeep") |let &l:cpo = w:netrw_cpokeep |unlet w:netrw_cpokeep |endif
438 if exists("w:netrw_dirkeep") |exe "lcd ".w:netrw_dirkeep |unlet w:netrw_dirkeep |endif
439 if exists("w:netrw_fokeep") |let &l:fo = w:netrw_fokeep |unlet w:netrw_fokeep |endif
440 if exists("w:netrw_gdkeep") |let &l:gd = w:netrw_gdkeep |unlet w:netrw_gdkeep |endif
441 if exists("w:netrw_hidkeep") |let &l:hidden = w:netrw_hidkeep |unlet w:netrw_hidkeep |endif
442 if exists("w:netrw_magic") |let &l:magic = w:netrw_magic |unlet w:netrw_magic |endif
443 if exists("w:netrw_repkeep") |let &l:report = w:netrw_repkeep |unlet w:netrw_repkeep |endif
444 if exists("w:netrw_spellkeep")|let &l:spell = w:netrw_spellkeep |unlet w:netrw_spellkeep|endif
445 if exists("w:netrw_twkeep") |let &l:tw = w:netrw_twkeep |unlet w:netrw_twkeep |endif
446 if exists("w:netrw_wigkeep") |let &l:wig = w:netrw_wigkeep |unlet w:netrw_wigkeep |endif
447 if exists("s:yykeep") |let @@ = s:yykeep |unlet s:yykeep |endif
448 if exists("w:netrw_swfkeep")
449 if &directory == ""
450 " user hasn't specified a swapfile directory;
451 " netrw will temporarily set the swapfile directory
452 " to the current directory as returned by getcwd().
453 let &l:directory = getcwd()
454 silent! let &l:swf = w:netrw_swfkeep
455 setlocal directory=
456 unlet w:netrw_swfkeep
457 elseif &l:swf != w:netrw_swfkeep
458 " following line causes a Press ENTER in windows -- can't seem to work around it!!! (COMBAK)
459 silent! let &l:swf= w:netrw_swfkeep
460 unlet w:netrw_swfkeep
461 endif
462 endif
463 if exists("w:netrw_regstar") |silent! let @*= w:netrw_regstar |unlet w:netrw_regstar |endif
464 if exists("w:netrw_regslash")|silent! let @/= w:netrw_regslash|unlet w:netrw_regslash|endif
465
466" call Dret("s:NetOptionRestore : restored user options")
467endfun
468
469" ---------------------------------------------------------------------
470" NetrwSafeOptions: sets options to help netrw do its job {{{2
471fun! s:NetrwSafeOptions()
472" call Dfunc("s:NetrwSafeOptions()")
473 setlocal cino=
474 setlocal com=
475 setlocal cpo-=aA
476 if exists("&acd")
477 setlocal noacd nocin noai noci magic nospell nohid wig= noaw
478 setlocal fo=nroql2
479 else
480 setlocal nocin noai noci magic nospell nohid wig= noaw
481 setlocal fo=nroql2
482 endif
483 setlocal tw=0
484 setlocal report=10000
485 if g:netrw_use_noswf && has("win32") && !has("win95")
486 setlocal noswf
487 endif
488" call Dret("s:NetrwSafeOptions")
489endfun
490
491" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000492" Netrw Transfer Functions: {{{1
493" ===============================
494
Bram Moolenaar071d4272004-06-13 20:20:40 +0000495" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000496" NetRead: responsible for reading a file over the net {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +0000497" mode: =0 read remote file and insert before current line
498" =1 read remote file and insert after current line
499" =2 replace with remote file
500" =3 obtain file, but leave in temporary format
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000501fun! netrw#NetRead(mode,...)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000502" call Dfunc("netrw#NetRead(mode=".a:mode.",...) a:0=".a:0." ".g:loaded_netrw)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000503
Bram Moolenaar9964e462007-05-05 17:54:07 +0000504 " save options {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000505 call s:NetOptionSave()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000506
Bram Moolenaar9964e462007-05-05 17:54:07 +0000507 " interpret mode into a readcmd {{{3
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000508 if a:mode == 0 " read remote file before current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000509 let readcmd = "0r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000510 elseif a:mode == 1 " read file after current line
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000511 let readcmd = "r"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000512 elseif a:mode == 2 " replace with remote file
513 let readcmd = "%r"
Bram Moolenaar9964e462007-05-05 17:54:07 +0000514 elseif a:mode == 3 " skip read of file (leave as temporary)
515 let readcmd = "t"
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000516 else
517 exe a:mode
518 let readcmd = "r"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000519 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000520 let ichoice = (a:0 == 0)? 0 : 1
521" call Decho("readcmd<".readcmd."> ichoice=".ichoice)
522
Bram Moolenaar9964e462007-05-05 17:54:07 +0000523 " Get Temporary Filename {{{3
524 let tmpfile= s:GetTempfile("")
525 if tmpfile == ""
526" call Dret("netrw#NetRead : unable to get a tempfile!")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000527 return
528 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000529
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000530 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000531
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000532 " attempt to repeat with previous host-file-etc
533 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000534" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000535 let choice = b:netrw_lastfile
536 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000537
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000538 else
539 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000540" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000541
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000542 if match(choice,"?") == 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000543 " give help
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000544 echomsg 'NetRead Usage:'
545 echomsg ':Nread machine:path uses rcp'
546 echomsg ':Nread "machine path" uses ftp with <.netrc>'
547 echomsg ':Nread "machine id password path" uses ftp'
548 echomsg ':Nread dav://machine[:port]/path uses cadaver'
549 echomsg ':Nread fetch://machine/path uses fetch'
550 echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
551 echomsg ':Nread http://[user@]machine/path uses http wget'
552 echomsg ':Nread rcp://[user@]machine/path uses rcp'
553 echomsg ':Nread rsync://machine[:port]/path uses rsync'
554 echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
555 echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000556 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000557 break
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000558
Bram Moolenaar9964e462007-05-05 17:54:07 +0000559 elseif match(choice,'^"') != -1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000560 " Reconstruct Choice if choice starts with '"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000561" call Decho("reconstructing choice")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000562 if match(choice,'"$') != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000563 " case "..."
564 let choice=strpart(choice,1,strlen(choice)-2)
565 else
566 " case "... ... ..."
567 let choice = strpart(choice,1,strlen(choice)-1)
568 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000569
Bram Moolenaar9964e462007-05-05 17:54:07 +0000570 while match(choice,'"$') == -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000571 let wholechoice = wholechoice . " " . choice
572 let ichoice = ichoice + 1
573 if ichoice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000574 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000575 call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",3)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000576 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000577" call Dret("netrw#NetRead :2 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000578 return
579 endif
580 let choice= a:{ichoice}
581 endwhile
582 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
583 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000584 endif
585 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000586
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000587" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000588 let ichoice= ichoice + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000589
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000590 " Determine method of read (ftp, rcp, etc) {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000591 call s:NetMethod(choice)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000592 let tmpfile= s:GetTempfile(b:netrw_fname) " apply correct suffix
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000593
Bram Moolenaar843ee412004-06-30 16:16:41 +0000594 " Check if NetBrowse() should be handling this request
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000595" call Decho("checking if NetBrowse() should handle choice<".choice."> with netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000596 if choice =~ "^.*[\/]$" && b:netrw_method != 5 && choice !~ '^http://'
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000597" call Decho("yes, choice matches '^.*[\/]$'")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000598 keepjumps call s:NetBrowse(0,choice)
599" call Dret("netrw#NetRead :3 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000600 return
Bram Moolenaar071d4272004-06-13 20:20:40 +0000601 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000602
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000603 " ============
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000604 " Perform Protocol-Based Read {{{3
605 " ===========================
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000606 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
607 echo "(netrw) Processing your read request..."
608 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000609
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000610 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000611 " rcp: NetRead Method #1 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000612 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000613" call Decho("read via rcp (method #1)")
Bram Moolenaard68071d2006-05-02 22:08:30 +0000614 " ER: nothing done with g:netrw_uid yet?
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000615 " ER: on Win2K" rcp machine[.user]:file tmpfile
616 " ER: if machine contains '.' adding .user is required (use $USERNAME)
617 " ER: the tmpfile is full path: rcp sees C:\... as host C
618 if s:netrw_has_nt_rcp == 1
619 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
620 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
621 else
622 " Any way needed it machine contains a '.'
623 let uid_machine = g:netrw_machine .'.'. $USERNAME
624 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000625 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000626 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
627 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
628 else
629 let uid_machine = g:netrw_machine
630 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000631 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000632" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&;')." ".tmpfile)
633 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&;')." ".tmpfile
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000634 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
635 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000636
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000637 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000638 " ftp + <.netrc>: NetRead Method #2 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000639 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000640" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaar8dff8182006-04-06 20:18:50 +0000641 let netrw_fname= b:netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000642 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000643 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000644 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000645" call Decho("filter input: ".getline("."))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000646 if exists("g:netrw_ftpextracmd")
647 exe "put ='".g:netrw_ftpextracmd."'"
648" call Decho("filter input: ".getline("."))
649 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000650 exe "put ='".'get \"'.netrw_fname.'\" '.tmpfile."'"
651" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000652 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000653" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000654 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
655 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000656" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000657 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
658 endif
659 " 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 +0000660 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000661 let debugkeep= &debug
Bram Moolenaar9964e462007-05-05 17:54:07 +0000662 setlocal debug=msg
663 call netrw#ErrorMsg(s:ERROR,getline(1),4)
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000664 let &debug= debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000665 endif
666 bd!
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000667 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000668 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000669
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000670 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000671 " ftp + machine,id,passwd,filename: NetRead Method #3 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000672 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
673 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000674" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000675 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000676 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000677 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000678 if exists("g:netrw_port") && g:netrw_port != ""
679 put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000680" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000681 else
682 put ='open '.g:netrw_machine
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000683" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000684 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000685
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000686 if exists("g:netrw_ftp") && g:netrw_ftp == 1
687 put =g:netrw_uid
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000688" call Decho("filter input: ".getline("."))
689 put ='\"'.g:netrw_passwd.'\"'
690" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000691 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000692 put ='user \"'.g:netrw_uid.'\" \"'.g:netrw_passwd.'\"'
693" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000694 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000695
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000696 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
697 put =g:netrw_ftpmode
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000698" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000699 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000700 if exists("g:netrw_ftpextracmd")
701 exe "put ='".g:netrw_ftpextracmd."'"
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000702" call Decho("filter input: ".getline("."))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000703 endif
704 put ='get \"'.netrw_fname.'\" '.tmpfile
705" call Decho("filter input: ".getline("."))
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000706
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000707 " perform ftp:
708 " -i : turns off interactive prompting from ftp
709 " -n unix : DON'T use <.netrc>, even though it exists
710 " -n win32: quit being obnoxious about password
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000711 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000712" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000713 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
714 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
715 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000716" call Decho("error<".getline(1).">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000717 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000718 call netrw#ErrorMsg(s:ERROR,getline(1),5)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000719 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000720 endif
721 bd!
Bram Moolenaar9964e462007-05-05 17:54:07 +0000722 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000723 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000724
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000725 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000726 " scp: NetRead Method #4 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000727 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000728" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000729 if exists("g:netrw_port") && g:netrw_port != ""
730 let useport= " -P ".g:netrw_port
731 else
732 let useport= ""
733 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000734" call Decho("executing: !".g:netrw_scp_cmd.useport." '".g:netrw_machine.":".escape(b:netrw_fname,g:netrw_fname_escape)."' ".tmpfile)
735 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_shq.g:netrw_machine.":".escape(b:netrw_fname,g:netrw_fname_escape).g:netrw_shq." ".tmpfile
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000736 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000737 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000738
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000739 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000740 " http: NetRead Method #5 (wget) {{{3
741 elseif b:netrw_method == 5
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000742" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000743 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000744 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000745 call netrw#ErrorMsg(s:ERROR,"neither the wget nor the fetch command is available",6)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000746 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000747" call Dret("netrw#NetRead :4 getcwd<".getcwd().">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000748 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000749 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000750
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000751 if match(b:netrw_fname,"#") == -1
752 " simple wget
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000753 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
754" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_fname)
755 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000756 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000757
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000758 else
759 " wget plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000760 let netrw_html= substitute(netrw_fname,"#.*$","","")
761 let netrw_tag = substitute(netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000762" call Decho("netrw_html<".netrw_html.">")
763" call Decho("netrw_tag <".netrw_tag.">")
764" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000765 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html
766 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000767" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000768 exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
769 endif
770 let b:netrw_lastfile = choice
Bram Moolenaar9964e462007-05-05 17:54:07 +0000771 setlocal ro
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000772
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000773 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000774 " cadaver: NetRead Method #6 {{{3
775 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000776" call Decho("read via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000777
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000778 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000779 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000780 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000781 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000782 if exists("g:netrw_port") && g:netrw_port != ""
783 put ='open '.g:netrw_machine.' '.g:netrw_port
784 else
785 put ='open '.g:netrw_machine
786 endif
787 put ='user '.g:netrw_uid.' '.g:netrw_passwd
Bram Moolenaar9964e462007-05-05 17:54:07 +0000788 put ='get '.netrw_fname.' '.tmpfile
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000789 put ='quit'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000790
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000791 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000792 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000793" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000794 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
795 bd!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000796 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000797 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000798
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000799 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000800 " rsync: NetRead Method #7 {{{3
801 elseif b:netrw_method == 7
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000802" call Decho("read via rsync (method #7)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000803 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000804" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".netrw_fname." ".tmpfile)
805 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".netrw_fname." ".tmpfile
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000806 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
807 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000808
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000809 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000810 " fetch: NetRead Method #8 {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000811 " fetch://[user@]host[:http]/path
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000812 elseif b:netrw_method == 8
Bram Moolenaar9964e462007-05-05 17:54:07 +0000813" call Decho("read via fetch (method #8)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000814 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000815 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000816 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000817 call netrw#ErrorMsg(s:ERROR,"fetch command not available",7)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000818 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000819" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000820 endif
821 if exists("g:netrw_option") && g:netrw_option == ":http"
822 let netrw_option= "http"
823 else
824 let netrw_option= "ftp"
825 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000826" call Decho("read via fetch for ".netrw_option)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000827
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000828 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("g:netrw_passwd") && g:netrw_passwd != ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000829" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".netrw_fname)
830 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000831 else
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000832" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".netrw_fname)
833 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000834 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000835
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000836 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
837 let b:netrw_lastfile = choice
Bram Moolenaar9964e462007-05-05 17:54:07 +0000838 setlocal ro
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000839
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000840 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000841 " sftp: NetRead Method #9 {{{3
842 elseif b:netrw_method == 9
Bram Moolenaar9964e462007-05-05 17:54:07 +0000843" call Decho("read via sftp (method #9)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000844 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000845" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".netrw_fname." ".tmpfile)
846 exe g:netrw_silentxfer."!".g:netrw_sftp_cmd." ".g:netrw_machine.":".netrw_fname." ".tmpfile
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000847 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
848 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000849
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000850 ".........................................
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000851 " Complain {{{3
852 else
Bram Moolenaar9964e462007-05-05 17:54:07 +0000853 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",8)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000854 endif
855 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000856
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000857 " cleanup {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000858 if exists("b:netrw_method")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000859" call Decho("cleanup b:netrw_method and b:netrw_fname")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000860 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000861 unlet b:netrw_fname
862 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000863 if s:FileReadable(tmpfile) && tmpfile !~ '.tar.bz2$' && tmpfile !~ '.tar.gz$' && tmpfile !~ '.zip' && tmpfile !~ '.tar' && readcmd != 't'
864" call Decho("cleanup by deleting tmpfile<".tmpfile.">")
865 call s:System("delete",tmpfile)
866 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000867 call s:NetOptionRestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +0000868
Bram Moolenaar9964e462007-05-05 17:54:07 +0000869" call Dret("netrw#NetRead :5 getcwd<".getcwd().">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000870endfun
871
872" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000873" NetWrite: responsible for writing a file over the net {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000874fun! netrw#NetWrite(...) range
Bram Moolenaar9964e462007-05-05 17:54:07 +0000875" call Dfunc("netrw#NetWrite(a:0=".a:0.") ".g:loaded_netrw)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000876
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000877 " option handling
878 let mod= 0
879 call s:NetOptionSave()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000880
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000881 " Get Temporary Filename {{{3
Bram Moolenaar9964e462007-05-05 17:54:07 +0000882 let tmpfile= s:GetTempfile("")
883 if tmpfile == ""
884" call Dret("netrw#NetWrite : unable to get a tempfile!")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000885 return
886 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000887
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000888 if a:0 == 0
889 let ichoice = 0
890 else
891 let ichoice = 1
892 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000893
Bram Moolenaar9964e462007-05-05 17:54:07 +0000894 let curbufname= expand("%")
895" call Decho("curbufname<".curbufname.">")
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000896 if &binary
Bram Moolenaar9964e462007-05-05 17:54:07 +0000897 " For binary writes, always write entire file.
898 " (line numbers don't really make sense for that).
899 " Also supports the writing of tar and zip files.
900" call Decho("(write entire file) silent exe w! ".v:cmdarg." ".tmpfile)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000901 silent exe "w! ".v:cmdarg." ".tmpfile
Bram Moolenaar9964e462007-05-05 17:54:07 +0000902 elseif g:netrw_cygwin
903 " write (selected portion of) file to temporary
904 let cygtmpfile= substitute(tmpfile,'/cygdrive/\(.\)','\1:','')
905" call Decho("(write selected portion) silent exe ".a:firstline."," . a:lastline . "w! ".v:cmdarg." ".cygtmpfile)
906 silent exe a:firstline."," . a:lastline . "w! ".v:cmdarg." ".cygtmpfile
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000907 else
908 " write (selected portion of) file to temporary
Bram Moolenaar9964e462007-05-05 17:54:07 +0000909" call Decho("(write selected portion) silent exe ".a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile)
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000910 silent exe a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile
911 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000912
Bram Moolenaar9964e462007-05-05 17:54:07 +0000913 if curbufname == ""
914 " if the file is [No Name], and one attempts to Nwrite it, the buffer takes
915 " on the temporary file's name. Deletion of the temporary file during
916 " cleanup then causes an error message.
917 0file!
918 endif
919
920 " While choice loop: {{{3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000921 while ichoice <= a:0
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000922
Bram Moolenaar9964e462007-05-05 17:54:07 +0000923 " Process arguments: {{{4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000924 " attempt to repeat with previous host-file-etc
925 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000926" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000927 let choice = b:netrw_lastfile
928 let ichoice= ichoice + 1
929 else
930 exe "let choice= a:" . ichoice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000931
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000932 " Reconstruct Choice if choice starts with '"'
933 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000934 echomsg 'NetWrite Usage:"'
935 echomsg ':Nwrite machine:path uses rcp'
936 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
937 echomsg ':Nwrite "machine id password path" uses ftp'
938 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
939 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
940 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
941 echomsg ':Nwrite rcp://machine/path uses rcp'
942 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
943 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
944 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000945 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000946 break
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000947
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000948 elseif match(choice,"^\"") != -1
949 if match(choice,"\"$") != -1
950 " case "..."
951 let choice=strpart(choice,1,strlen(choice)-2)
952 else
953 " case "... ... ..."
954 let choice = strpart(choice,1,strlen(choice)-1)
955 let wholechoice = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000956
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000957 while match(choice,"\"$") == -1
958 let wholechoice= wholechoice . " " . choice
959 let ichoice = ichoice + 1
960 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000961 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000962 call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",13)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000963 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000964" call Dret("netrw#NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000965 return
966 endif
967 let choice= a:{ichoice}
968 endwhile
969 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
970 endif
971 endif
972 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000973 let ichoice= ichoice + 1
Bram Moolenaar9964e462007-05-05 17:54:07 +0000974" call Decho("choice<" . choice . "> ichoice=".ichoice)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000975
Bram Moolenaar9964e462007-05-05 17:54:07 +0000976 " Determine method of write (ftp, rcp, etc) {{{4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000977 call s:NetMethod(choice)
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000978
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000979 " =============
Bram Moolenaar9964e462007-05-05 17:54:07 +0000980 " Perform Protocol-Based Write {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000981 " ============================
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000982 if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
983 echo "(netrw) Processing your write request..."
984 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000985
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000986 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +0000987 " rcp: NetWrite Method #1 {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +0000988 if b:netrw_method == 1
Bram Moolenaar1afcace2005-11-25 19:54:28 +0000989" call Decho("write via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000990 if s:netrw_has_nt_rcp == 1
991 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
992 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
993 else
994 let uid_machine = g:netrw_machine .'.'. $USERNAME
995 endif
996 else
997 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
998 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
999 else
1000 let uid_machine = g:netrw_machine
1001 endif
1002 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001003 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001004" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".g:netrw_shq.tmpfile.g:netrw_shq." ".uid_machine.":".netrw_fname)
1005 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".g:netrw_shq.tmpfile.g:netrw_shq." ".uid_machine.":".netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001006 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001007
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001008 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001009 " ftp + <.netrc>: NetWrite Method #2 {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001010 elseif b:netrw_method == 2
Bram Moolenaar9964e462007-05-05 17:54:07 +00001011" call Decho("write via ftp+.netrc (method #2)")
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +00001012 let netrw_fname= b:netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001013 new
Bram Moolenaar8299df92004-07-10 09:47:34 +00001014 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +00001015 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001016" call Decho(" filter input: ".getline("."))
Bram Moolenaar9964e462007-05-05 17:54:07 +00001017 if exists("g:netrw_ftpextracmd")
1018 exe "put ='".g:netrw_ftpextracmd."'"
1019" call Decho("filter input: ".getline("."))
1020 endif
1021 exe "put ='".'put \"'.tmpfile.'\" \"'.netrw_fname.'\"'."'"
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001022" call Decho(" filter input: ".getline("."))
Bram Moolenaar071d4272004-06-13 20:20:40 +00001023 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001024" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001025 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
Bram Moolenaar071d4272004-06-13 20:20:40 +00001026 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001027" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001028 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
Bram Moolenaar071d4272004-06-13 20:20:40 +00001029 endif
1030 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1031 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001032 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001033 call netrw#ErrorMsg(s:ERROR,getline(1),14)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001034 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001035 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +00001036 endif
1037 bd!
Bram Moolenaar071d4272004-06-13 20:20:40 +00001038 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001039
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001040 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001041 " ftp + machine, id, passwd, filename: NetWrite Method #3 {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001042 elseif b:netrw_method == 3
Bram Moolenaar9964e462007-05-05 17:54:07 +00001043 " Construct execution string (four lines) which will be passed through filter
1044" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +00001045 let netrw_fname= b:netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001046 new
Bram Moolenaar8299df92004-07-10 09:47:34 +00001047 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001048 if exists("g:netrw_port") && g:netrw_port != ""
1049 put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001050" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001051 else
1052 put ='open '.g:netrw_machine
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001053" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001054 endif
1055 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1056 put =g:netrw_uid
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001057" call Decho("filter input: ".getline("."))
1058 put ='\"'.g:netrw_passwd.'\"'
1059" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001060 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001061 put ='user \"'.g:netrw_uid.'\" \"'.g:netrw_passwd.'\"'
1062" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001063 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001064 put ='put \"'.tmpfile.'\" \"'.netrw_fname.'\"'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001065" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001066 " save choice/id/password for future use
1067 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001068
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001069 " perform ftp:
1070 " -i : turns off interactive prompting from ftp
1071 " -n unix : DON'T use <.netrc>, even though it exists
1072 " -n win32: quit being obnoxious about password
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001073 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001074" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001075 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
1076 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1077 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001078 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001079 call netrw#ErrorMsg(s:ERROR,getline(1),15)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001080 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001081 let mod=1
1082 endif
1083 bd!
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001084
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001085 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001086 " scp: NetWrite Method #4 {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001087 elseif b:netrw_method == 4
Bram Moolenaar9964e462007-05-05 17:54:07 +00001088" call Decho("write via scp (method #4)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001089 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001090 if exists("g:netrw_port") && g:netrw_port != ""
1091 let useport= " -P ".g:netrw_port
1092 else
1093 let useport= ""
1094 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00001095" call Decho("exe ".g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_shq.tmpfile.g:netrw_shq." ".g:netrw_shq.g:netrw_machine.":".netrw_fname.g:netrw_shq)
1096 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_shq.tmpfile.g:netrw_shq." ".g:netrw_shq.g:netrw_machine.":".netrw_fname.g:netrw_shq
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001097 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001098
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001099 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001100 " http: NetWrite Method #5 {{{4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001101 elseif b:netrw_method == 5
Bram Moolenaar9964e462007-05-05 17:54:07 +00001102" call Decho("write via http (method #5)")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001103 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001104 call netrw#ErrorMsg(s:ERROR,"currently <netrw.vim> does not support writing using http:",16)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001105 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001106
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001107 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001108 " dav: NetWrite Method #6 (cadaver) {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001109 elseif b:netrw_method == 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001110" call Decho("write via cadaver (method #6)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001111
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001112 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001113 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001114 new
Bram Moolenaar8299df92004-07-10 09:47:34 +00001115 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001116 if exists("g:netrw_port") && g:netrw_port != ""
1117 put ='open '.g:netrw_machine.' '.g:netrw_port
1118 else
1119 put ='open '.g:netrw_machine
1120 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00001121 put ='user '.g:netrw_uid.' '.g:netrw_passwd
Bram Moolenaar9964e462007-05-05 17:54:07 +00001122 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001123
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001124 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001125 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001126" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001127 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
1128 bd!
1129 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001130
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001131 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001132 " rsync: NetWrite Method #7 {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001133 elseif b:netrw_method == 7
Bram Moolenaar9964e462007-05-05 17:54:07 +00001134" call Decho("write via rsync (method #7)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001135 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar9964e462007-05-05 17:54:07 +00001136" call Decho("executing: !".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".netrw_fname)
1137 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001138 let b:netrw_lastfile = choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001139
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001140 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001141 " sftp: NetWrite Method #9 {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001142 elseif b:netrw_method == 9
Bram Moolenaar9964e462007-05-05 17:54:07 +00001143" call Decho("read via sftp (method #9)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001144 let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001145 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1146 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1147 else
1148 let uid_machine = g:netrw_machine
1149 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001150 new
Bram Moolenaar8299df92004-07-10 09:47:34 +00001151 setlocal ff=unix
Bram Moolenaar9964e462007-05-05 17:54:07 +00001152 put ='put \"'.escape(tmpfile,'\').'\" '.netrw_fname
1153" call Decho("filter input: ".getline("."))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001154 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001155" call Decho("executing: %!".g:netrw_sftp_cmd.' '.uid_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001156 exe g:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.uid_machine
1157 bd!
1158 let b:netrw_lastfile= choice
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001159
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001160 ".........................................
Bram Moolenaar9964e462007-05-05 17:54:07 +00001161 " Complain {{{4
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001162 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001163 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",17)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001164 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001165 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001166
Bram Moolenaar9964e462007-05-05 17:54:07 +00001167 " Cleanup: {{{3
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001168" call Decho("cleanup")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001169 if s:FileReadable(tmpfile)
1170" call Decho("tmpfile<".tmpfile."> readable, will now delete it")
1171 call s:System("delete",tmpfile)
1172 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001173 call s:NetOptionRestore()
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001174
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001175 if a:firstline == 1 && a:lastline == line("$")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001176 " restore modifiability; usually equivalent to set nomod
1177 let &mod= mod
Bram Moolenaar071d4272004-06-13 20:20:40 +00001178 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001179
Bram Moolenaar9964e462007-05-05 17:54:07 +00001180" call Dret("netrw#NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001181endfun
1182
1183" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00001184" NetSource: source a remotely hosted vim script {{{2
1185" uses NetRead to get a copy of the file into a temporarily file,
1186" then sources that file,
1187" then removes that file.
1188fun! netrw#NetSource(...)
1189" call Dfunc("netrw#NetSource() a:0=".a:0)
1190 if a:0 > 0 && a:1 == '?'
1191 " give help
1192 echomsg 'NetSource Usage:'
1193 echomsg ':Nsource dav://machine[:port]/path uses cadaver'
1194 echomsg ':Nsource fetch://machine/path uses fetch'
1195 echomsg ':Nsource ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
1196 echomsg ':Nsource http://[user@]machine/path uses http wget'
1197 echomsg ':Nsource rcp://[user@]machine/path uses rcp'
1198 echomsg ':Nsource rsync://machine[:port]/path uses rsync'
1199 echomsg ':Nsource scp://[user@]machine[[:#]port]/path uses scp'
1200 echomsg ':Nsource sftp://[user@]machine[[:#]port]/path uses sftp'
1201 sleep 4
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001202 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001203 let i= 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001204 while i <= a:0
Bram Moolenaar9964e462007-05-05 17:54:07 +00001205 call netrw#NetRead(3,a:{i})
1206" call Decho("s:netread_tmpfile<".s:netrw_tmpfile.">")
1207 if s:FileReadable(s:netrw_tmpfile)
1208" call Decho("exe so ".s:netrw_tmpfile)
1209 exe "so ".s:netrw_tmpfile
1210 call delete(s:netrw_tmpfile)
1211 unlet s:netrw_tmpfile
1212 else
1213 call netrw#ErrorMsg(s:ERROR,"unable to source <".a:{i}.">!",48)
1214 endif
1215 let i= i + 1
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001216 endwhile
Bram Moolenaar9964e462007-05-05 17:54:07 +00001217 endif
1218" call Dret("netrw#NetSource")
1219endfun
1220
1221" ===========================================
1222" NetGetFile: Function to read temporary file "tfile" with command "readcmd". {{{2
1223" readcmd == %r : replace buffer with newly read file
1224" == 0r : read file at top of buffer
1225" == r : read file after current line
1226" == t : leave file in temporary form (ie. don't read into buffer)
1227fun! s:NetGetFile(readcmd, tfile, method)
1228" call Dfunc("NetGetFile(readcmd<".a:readcmd.">,tfile<".a:tfile."> method<".a:method.">)")
1229
1230 " readcmd=='t': simply do nothing
1231 if a:readcmd == 't'
1232" call Dret("NetGetFile : skip read of <".a:tfile.">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001233 return
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001234 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001235
Bram Moolenaar9964e462007-05-05 17:54:07 +00001236 " get name of remote filename (ie. url and all)
1237 let rfile= bufname("%")
1238" call Decho("rfile<".rfile.">")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001239
Bram Moolenaar9964e462007-05-05 17:54:07 +00001240 if exists("*NetReadFixup")
1241 " for the use of NetReadFixup (not otherwise used internally)
1242 let line2= line("$")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001243 endif
1244
Bram Moolenaar9964e462007-05-05 17:54:07 +00001245 if a:readcmd[0] == '%'
1246 " get file into buffer
1247" call Decho("get file into buffer")
1248
1249 " rename the current buffer to the temp file (ie. tfile)
1250 if g:netrw_cygwin
1251 let tfile= substitute(a:tfile,'/cygdrive/\(.\)','\1:','')
1252 else
1253 let tfile= a:tfile
1254 endif
1255" call Decho("keepalt exe file ".tfile)
1256 keepalt exe "silent! keepalt file ".tfile
1257
1258 " edit temporary file (ie. read the temporary file in)
1259 if rfile =~ '\.zip$'
1260" call Decho("handling remote zip file with zip#Browse(tfile<".tfile.">)")
1261 call zip#Browse(tfile)
1262 elseif rfile =~ '\.tar$'
1263" call Decho("handling remote tar file with tar#Browse(tfile<".tfile.">)")
1264 call tar#Browse(tfile)
1265 elseif rfile =~ '\.tar\.gz'
1266" call Decho("handling remote gzip-compressed tar file")
1267 call tar#Browse(tfile)
1268 elseif rfile =~ '\.tar\.bz2'
1269" call Decho("handling remote bz2-compressed tar file")
1270 call tar#Browse(tfile)
1271 else
1272" call Decho("edit temporary file")
1273 e!
1274 endif
1275
1276 " rename buffer back to remote filename
1277 exe "silent! keepalt file ".escape(rfile,' ')
1278 filetype detect
1279" call Dredir("renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">","ls!")
1280 let line1 = 1
1281 let line2 = line("$")
1282
1283 elseif s:FileReadable(a:tfile)
1284 " read file after current line
1285" call Decho("read file<".a:tfile."> after current line")
1286 let curline = line(".")
1287 let lastline= line("$")
1288" call Decho("exe<".a:readcmd." ".v:cmdarg." ".a:tfile."> line#".curline)
1289 exe a:readcmd." ".v:cmdarg." ".a:tfile
1290 let line1= curline + 1
1291 let line2= line("$") - lastline + 1
1292
1293 else
1294 " not readable
1295" call Decho("tfile<".a:tfile."> not readable")
1296 call netrw#ErrorMsg(s:WARNING,"file <".a:tfile."> not readable",9)
1297" call Dret("NetGetFile : tfile<".a:tfile."> not readable")
1298 return
1299 endif
1300
1301 " User-provided (ie. optional) fix-it-up command
1302 if exists("*NetReadFixup")
1303" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
1304 call NetReadFixup(a:method, line1, line2)
1305" else " Decho
1306" call Decho("NetReadFixup() not called, doesn't exist (line1=".line1." line2=".line2.")")
1307 endif
1308
1309 " update the Buffers menu
1310 if has("gui") && has("gui_running")
1311 silent! emenu Buffers.Refresh\ menu
1312 endif
1313
1314" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> tfile<".a:tfile."> readable=".s:FileReadable(a:tfile))
1315
1316 " make sure file is being displayed
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001317 redraw!
Bram Moolenaar9964e462007-05-05 17:54:07 +00001318" call Dret("NetGetFile")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001319endfun
1320
Bram Moolenaar9964e462007-05-05 17:54:07 +00001321" ------------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001322" NetMethod: determine method of transfer {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +00001323" method == 1: rcp
1324" 2: ftp + <.netrc>
1325" 3: ftp + machine, id, password, and [path]filename
1326" 4: scp
1327" 5: http (wget)
1328" 6: cadaver
1329" 7: rsync
1330" 8: fetch
1331" 9: sftp
1332fun! s:NetMethod(choice) " globals: method machine id passwd fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001333" call Dfunc("NetMethod(a:choice<".a:choice.">)")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001334
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001335 " initialization
1336 let b:netrw_method = 0
1337 let g:netrw_machine = ""
1338 let b:netrw_fname = ""
1339 let g:netrw_port = ""
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001340 let g:netrw_choice = a:choice
1341
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001342 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001343 " mipf : a:machine a:id password filename Use ftp
1344 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001345 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001346 " rcpurm : rcp://[user@]host/filename Use rcp
1347 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001348 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001349 " httpurm : http://[user@]host/filename Use wget
1350 " davurm : [s]dav://host[:port]/path Use cadaver
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001351 " rsyncurm : rsync://host[:port]/path Use rsync
1352 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
1353 " sftpurm : sftp://[user@]host/filename Use scp
1354 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
1355 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
1356 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
Bram Moolenaar83bab712005-08-01 21:58:57 +00001357 let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001358 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001359 let scpurm = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001360 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001361 let davurm = '^s\=dav://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001362 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
1363 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
1364 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001365
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001366" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001367 " Determine Method
1368 " rcp://user@hostname/...path-to-file
1369 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001370" call Decho("rcp://...")
Bram Moolenaar83bab712005-08-01 21:58:57 +00001371 let b:netrw_method = 1
1372 let userid = substitute(a:choice,rcpurm,'\1',"")
1373 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
1374 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001375 if userid != ""
1376 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00001377 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001378
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001379 " scp://user@hostname/...path-to-file
1380 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001381" call Decho("scp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001382 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00001383 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
1384 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
1385 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001386
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001387 " http://user@hostname/...path-to-file
1388 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001389" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001390 let b:netrw_method = 5
1391 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
1392 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001393
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001394 " dav://hostname[:port]/..path-to-file..
1395 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001396" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001397 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001398 if a:choice =~ '^s'
1399 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
1400 else
1401 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
1402 endif
1403 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001404
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001405 " rsync://user@hostname/...path-to-file
1406 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001407" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001408 let b:netrw_method = 7
1409 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
1410 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001411
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001412 " ftp://[user@]hostname[[:#]port]/...path-to-file
1413 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001414" call Decho("ftp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001415 let userid = substitute(a:choice,ftpurm,'\2',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001416 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
1417 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
1418 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001419 if userid != ""
1420 let g:netrw_uid= userid
1421 endif
1422 if exists("g:netrw_uid") && exists("g:netrw_passwd")
1423 let b:netrw_method = 3
1424 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001425 if s:FileReadable(expand("$HOME/.netrc")) && !g:netrw_ignorenetrc
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001426 let b:netrw_method= 2
1427 else
1428 if !exists("g:netrw_uid") || g:netrw_uid == ""
1429 call NetUserPass()
1430 elseif !exists("g:netrw_passwd") || g:netrw_passwd == ""
1431 call NetUserPass(g:netrw_uid)
1432 " else just use current g:netrw_uid and g:netrw_passwd
1433 endif
1434 let b:netrw_method= 3
1435 endif
1436 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001437
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001438 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001439" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001440 let b:netrw_method = 8
1441 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
1442 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
1443 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
1444 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001445
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001446 " Issue an ftp : "machine id password [path/]filename"
1447 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001448" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001449 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001450 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
1451 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
1452 let g:netrw_passwd = substitute(a:choice,mipf,'\3',"")
1453 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001454
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001455 " Issue an ftp: "hostname [path/]filename"
1456 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001457" call Decho("(ftp) host file")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001458 if exists("g:netrw_uid") && exists("g:netrw_passwd")
1459 let b:netrw_method = 3
1460 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
1461 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001462
Bram Moolenaar9964e462007-05-05 17:54:07 +00001463 elseif s:FileReadable(expand("$HOME/.netrc"))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001464 let b:netrw_method = 2
1465 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
1466 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
1467 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001468
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001469 " sftp://user@hostname/...path-to-file
1470 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001471" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001472 let b:netrw_method = 9
1473 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
1474 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001475
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001476 " Issue an rcp: hostname:filename" (this one should be last)
1477 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001478" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001479 let b:netrw_method = 1
1480 let userid = substitute(a:choice,rcphf,'\2',"")
1481 let g:netrw_machine= substitute(a:choice,rcphf,'\3',"")
1482 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001483" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
1484" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
1485" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
1486" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001487 if userid != ""
1488 let g:netrw_uid= userid
1489 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001490
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001491 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001492 if !exists("g:netrw_quiet")
Bram Moolenaar9964e462007-05-05 17:54:07 +00001493 call netrw#ErrorMsg(s:WARNING,"cannot determine method",45)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001494 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001495 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00001496 endif
Bram Moolenaar81695252004-12-29 20:58:21 +00001497
1498 " remove any leading [:#] from port number
1499 if g:netrw_port != ""
1500 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
1501 endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001502
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001503" call Decho("a:choice <".a:choice.">")
1504" call Decho("b:netrw_method <".b:netrw_method.">")
1505" call Decho("g:netrw_machine<".g:netrw_machine.">")
1506" call Decho("g:netrw_port <".g:netrw_port.">")
1507" if exists("g:netrw_uid") "Decho
1508" call Decho("g:netrw_uid <".g:netrw_uid.">")
1509" endif "Decho
1510" if exists("g:netrw_passwd") "Decho
1511" call Decho("g:netrw_passwd <".g:netrw_passwd.">")
1512" endif "Decho
1513" call Decho("b:netrw_fname <".b:netrw_fname.">")
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001514" call Dret("NetMethod : b:netrw_method=".b:netrw_method)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001515endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001516
1517" ------------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00001518" NetReadFixup: this sort of function is typically written by the user {{{2
1519" to handle extra junk that their system's ftp dumps
1520" into the transfer. This function is provided as an
1521" example and as a fix for a Windows 95 problem: in my
1522" experience, win95's ftp always dumped four blank lines
1523" at the end of the transfer.
1524if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp
1525 fun! NetReadFixup(method, line1, line2)
1526" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
1527 if method == 3 " ftp (no <.netrc>)
1528 let fourblanklines= line2 - 3
1529 silent fourblanklines.",".line2."g/^\s*/d"
1530 endif
1531" call Dret("NetReadFixup")
1532 endfun
1533endif
1534
1535" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00001536" NetUserPass: set username and password for subsequent ftp transfer {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +00001537" Usage: :call NetUserPass() -- will prompt for userid and password
1538" :call NetUserPass("uid") -- will prompt for password
1539" :call NetUserPass("uid","password") -- sets global userid and password
1540fun! NetUserPass(...)
1541
1542 " get/set userid
1543 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001544" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001545 if !exists("g:netrw_uid") || g:netrw_uid == ""
1546 " via prompt
1547 let g:netrw_uid= input('Enter username: ')
1548 endif
1549 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001550" call Dfunc("NetUserPass(a:1<".a:1.">) {")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001551 let g:netrw_uid= a:1
1552 endif
1553
1554 " get password
1555 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001556" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001557 let g:netrw_passwd= inputsecret("Enter Password: ")
1558 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001559" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001560 let g:netrw_passwd=a:2
1561 endif
Bram Moolenaar1afcace2005-11-25 19:54:28 +00001562
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001563" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001564endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001565
Bram Moolenaar9964e462007-05-05 17:54:07 +00001566" ===========================================
1567" Shared Browsing Support: {{{1
1568" ===========================================
Bram Moolenaar071d4272004-06-13 20:20:40 +00001569
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001570" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00001571" s:BrowserMaps: {{{2
1572fun! s:BrowserMaps(islocal)
1573" call Dfunc("s:BrowserMaps(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
1574 if a:islocal
1575 nnoremap <buffer> <silent> <cr> :call netrw#LocalBrowseCheck(<SID>NetBrowseChgDir(1,<SID>NetGetWord()))<cr>
1576 nnoremap <buffer> <silent> <leftmouse> <leftmouse>:call netrw#LocalBrowseCheck(<SID>NetBrowseChgDir(1,<SID>NetGetWord()))<cr>
1577 nnoremap <buffer> <silent> <c-l> :call <SID>NetRefresh(1,<SID>NetBrowseChgDir(1,'./'))<cr>
1578 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call netrw#LocalBrowseCheck(<SID>NetBrowseChgDir(1,'../'))<cr>
1579 nnoremap <buffer> <silent> a :call <SID>NetHide(1)<cr>
1580 nnoremap <buffer> <silent> mb :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
1581 nnoremap <buffer> <silent> gb :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
1582 nnoremap <buffer> <silent> c :exe "cd ".b:netrw_curdir<cr>
1583 nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr>
1584 nnoremap <buffer> <silent> d :call <SID>NetMakeDir("")<cr>
1585 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(1)<cr>
1586 nnoremap <buffer> <silent> i :call <SID>NetListStyle(1)<cr>
1587 nnoremap <buffer> <silent> o :call <SID>NetSplit(3)<cr>
1588 nnoremap <buffer> <silent> O :call <SID>LocalObtain()<cr>
1589 nnoremap <buffer> <silent> p :call <SID>NetPreview(<SID>NetBrowseChgDir(1,<SID>NetGetWord(),1))<cr>
1590 nnoremap <buffer> <silent> P :call <SID>NetPrevWinOpen(1)<cr>
1591 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,b:netrw_curdir)<cr>
1592 nnoremap <buffer> <silent> r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetRefresh(1,<SID>NetBrowseChgDir(1,'./'))<cr>
1593 nnoremap <buffer> <silent> s :call <SID>NetSortStyle(1)<cr>
1594 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
1595 nnoremap <buffer> <silent> t :call <SID>NetSplit(4)<cr>
1596 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
1597 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
1598 nnoremap <buffer> <silent> v :call <SID>NetSplit(5)<cr>
1599 nnoremap <buffer> <silent> x :call netrw#NetBrowseX(<SID>NetBrowseChgDir(1,<SID>NetGetWord(),0),0)"<cr>
1600 if s:didstarstar || !mapcheck("<s-down>","n")
1601 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
1602 endif
1603 if s:didstarstar || !mapcheck("<s-up>","n")
1604 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
1605 endif
1606 exe 'nnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
1607 exe 'vnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
1608 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
1609 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
1610 exe 'nnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
1611 exe 'vnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
1612 exe 'nnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
1613 exe 'vnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
1614 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetMakeDir("")<cr>'
1615 nnoremap <buffer> <F1> :he netrw-dir<cr>
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001616
Bram Moolenaar9964e462007-05-05 17:54:07 +00001617 else " remote
1618 call s:RemotePathAnalysis(b:netrw_curdir)
1619 nnoremap <buffer> <silent> <cr> :call <SID>NetBrowse(0,<SID>NetBrowseChgDir(0,<SID>NetGetWord()))<cr>
1620 nnoremap <buffer> <silent> <leftmouse> <leftmouse>:call <SID>NetBrowse(0,<SID>NetBrowseChgDir(0,<SID>NetGetWord()))<cr>
1621 nnoremap <buffer> <silent> <c-l> :call <SID>NetRefresh(0,<SID>NetBrowseChgDir(0,'./'))<cr>
1622 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetBrowse(0,<SID>NetBrowseChgDir(0,'../'))<cr>
1623 nnoremap <buffer> <silent> a :call <SID>NetHide(0)<cr>
1624 nnoremap <buffer> <silent> mb :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
1625 nnoremap <buffer> <silent> gb :<c-u>call <SID>NetBookmarkDir(1,b:netrw_cur)<cr>
1626 nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr>
1627 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(0)<cr>
1628 nnoremap <buffer> <silent> i :call <SID>NetListStyle(0)<cr>
1629 nnoremap <buffer> <silent> o :call <SID>NetSplit(0)<cr>
1630 nnoremap <buffer> <silent> O :call netrw#NetObtain(0)<cr>
1631 vnoremap <buffer> <silent> O :call netrw#NetObtain(1)<cr>
1632 nnoremap <buffer> <silent> p :call <SID>NetPreview(<SID>NetBrowseChgDir(1,<SID>NetGetWord(),1))<cr>
1633 nnoremap <buffer> <silent> P :call <SID>NetPrevWinOpen(0)<cr>
1634 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,b:netrw_curdir)<cr>
1635 nnoremap <buffer> <silent> r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetBrowse(0,<SID>NetBrowseChgDir(0,'./'))<cr>
1636 nnoremap <buffer> <silent> s :call <SID>NetSortStyle(0)<cr>
1637 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
1638 nnoremap <buffer> <silent> t :call <SID>NetSplit(1)<cr>
1639 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,b:netrw_curdir)<cr>
1640 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,b:netrw_curdir)<cr>
1641 nnoremap <buffer> <silent> v :call <SID>NetSplit(2)<cr>
1642 nnoremap <buffer> <silent> x :call netrw#NetBrowseX(<SID>NetBrowseChgDir(0,<SID>NetGetWord()),1)<cr>
1643 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
1644 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
1645 exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetBrowseRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
1646 exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetBrowseRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
1647 exe 'nnoremap <buffer> <silent> d :call <SID>NetMakeDir("'.s:user.s:machine.'")<cr>'
1648 exe 'nnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
1649 exe 'vnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
1650 exe 'nnoremap <buffer> <silent> R :call <SID>NetBrowseRename("'.s:user.s:machine.'","'.s:path.'")<cr>'
1651 exe 'vnoremap <buffer> <silent> R :call <SID>NetBrowseRename("'.s:user.s:machine.'","'.s:path.'")<cr>'
1652 nnoremap <buffer> <F1> :he netrw-browse-cmds<cr>
1653 endif
1654" call Dret("s:BrowserMaps")
1655endfun
1656
1657" ---------------------------------------------------------------------
1658" s:NetBrowse: This function uses the command in g:netrw_list_cmd to get a list {{{2
1659" of the contents of a remote directory. It is assumed that the
1660" g:netrw_list_cmd has a string, USEPORT HOSTNAME, that needs to be substituted
1661" with the requested remote hostname first.
1662fun! s:NetBrowse(islocal,dirname)
1663 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
1664" call Dfunc("NetBrowse(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".w:netrw_liststyle." ".g:loaded_netrw." buf#".bufnr("%"))
1665" call Dredir("ls!")
1666
1667 if exists("s:netrw_skipbrowse")
1668 unlet s:netrw_skipbrowse
1669" call Dret("NetBrowse : s:netrw_skipbrowse=".s:netrw_skipbrowse)
1670 return
1671 endif
1672
1673 call s:NetOptionSave()
1674
1675 if a:islocal && exists("w:netrw_acdkeep") && w:netrw_acdkeep
1676" call Decho("handle w:netrw_acdkeep:")
1677" call Decho("cd ".escape(a:dirname,s:netrw_cd_escape)." (due to 'acd')")
1678 exe 'cd '.escape(a:dirname,s:netrw_cd_escape)
1679" call Decho("getcwd<".getcwd().">")
1680
1681 elseif !a:islocal && a:dirname !~ '[\/]$' && a:dirname !~ '^"'
1682 " looks like a regular file, attempt transfer
1683" call Decho("attempt transfer as regular file<".a:dirname.">")
1684
1685 " remove any filetype indicator from end of dirname, except for the {{{3
1686 " "this is a directory" indicator (/).
1687 " There shouldn't be one of those here, anyway.
1688 let path= substitute(a:dirname,'[*=@|]\r\=$','','e')
1689" call Decho("new path<".path.">")
1690 call s:RemotePathAnalysis(a:dirname)
1691
1692 " remote-read the requested file into current buffer {{{3
1693 mark '
1694 call s:NetrwEnew(a:dirname)
1695 let b:netrw_curdir= a:dirname
1696 call s:NetrwSafeOptions()
1697 setlocal ma noro
1698" call Decho("exe silent! keepalt file ".s:method."://".s:user.s:machine."/".escape(s:path,s:netrw_cd_escape)." (bt=".&bt.")")
1699 exe "silent! keepalt file ".s:method."://".s:user.s:machine."/".escape(s:path,s:netrw_cd_escape)
1700 exe "silent keepalt doau BufReadPre ".s:fname
1701 silent call netrw#NetRead(2,s:method."://".s:user.s:machine."/".s:path)
1702 exe "silent keepalt doau BufReadPost ".s:fname
1703
1704 " save certain window-oriented variables into buffer-oriented variables {{{3
1705 call s:SetBufWinVars()
1706 call s:NetOptionRestore()
1707 setlocal nomod nowrap
1708
1709" call Dret("NetBrowse : file<".s:fname.">")
1710 return
1711 endif
1712
1713 " use buffer-oriented WinVars if buffer ones exist but window ones don't {{{3
1714 call s:UseBufWinVars()
1715
1716 " set up some variables {{{3
1717 let b:netrw_browser_active = 1
1718 let dirname = a:dirname
1719 let s:last_sort_by = g:netrw_sort_by
1720
1721 call s:NetMenu(1) " set up menu {{{3
1722 if s:NetGetBuffer(a:islocal,dirname) " set up buffer {{{3
1723" call Dret("NetBrowse : re-using buffer")
1724 return
1725 endif
1726
1727 " set b:netrw_curdir to the new directory name {{{3
1728" call Decho("set b:netrw_curdir to the new directory name:")
1729 let b:netrw_curdir= dirname
1730 if b:netrw_curdir =~ '[/\\]$'
1731 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
1732 endif
1733 if b:netrw_curdir == ''
1734 if has("amiga")
1735 " On the Amiga, the empty string connotes the current directory
1736 let b:netrw_curdir= getcwd()
1737 else
1738 " under unix, when the root directory is encountered, the result
1739 " from the preceding substitute is an empty string.
1740 let b:netrw_curdir= '/'
1741 endif
1742 endif
1743 if !a:islocal && b:netrw_curdir !~ '/$'
1744 let b:netrw_curdir= b:netrw_curdir.'/'
1745 endif
1746" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
1747
1748 " ------------
1749 " (local only) {{{3
1750 " ------------
1751 if a:islocal
1752" call Decho("local only:")
1753
1754 " Set up ShellCmdPost handling. Append current buffer to browselist
1755 call s:LocalFastBrowser()
1756
1757 " handle g:netrw_keepdir: set vim's current directory to netrw's notion of the current directory {{{3
1758 if !g:netrw_keepdir
1759" call Decho("handle keepdir:")
1760" call Decho('exe cd '.escape(b:netrw_curdir,s:netrw_cd_escape))
1761 try
1762 exe 'cd '.escape(b:netrw_curdir,s:netrw_cd_escape)
1763 catch /^Vim\%((\a\+)\)\=:E472/
1764 call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".b:netrw_curdir."> (permissions?)",33)
1765 if exists("w:netrw_prvdir")
1766 let b:netrw_curdir= w:netrw_prvdir
Bram Moolenaar83bab712005-08-01 21:58:57 +00001767 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00001768 call s:NetOptionRestore()
1769 let b:netrw_curdir= dirname
1770" call Dret("NetBrowse : reusing buffer#".(exists("bufnum")? bufnum : 'N/A')."<".dirname."> getcwd<".getcwd().">")
1771 return
1772 endif
1773 endtry
1774 endif
1775
1776 " --------------------------------
1777 " remote handling: {{{3
1778 " --------------------------------
1779 else
1780" call Decho("remote only:")
1781
1782 " analyze a:dirname and g:netrw_list_cmd {{{4
1783" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist")."> a:dirname<".a:dirname.">")
1784 if a:dirname == "NetrwTreeListing"
1785 let dirname= b:netrw_curdir
1786" call Decho("(dirname was NetrwTreeListing) dirname<".dirname.">")
1787 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
1788 let dirname= substitute(b:netrw_curdir,'\\','/','g')
1789 if dirname !~ '/$'
1790 let dirname= dirname.'/'
1791 endif
1792 let b:netrw_curdir = dirname
1793" call Decho("(liststyle is TREELIST) dirname<".dirname.">")
1794 else
1795 let dirname = substitute(a:dirname,'\\','/','g')
1796" call Decho("(normal) dirname<".dirname.">")
1797 endif
1798
1799 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
1800 if dirname !~ dirpat
1801 if !exists("g:netrw_quiet")
1802 call netrw#ErrorMsg(s:ERROR,"netrw doesn't understand your dirname<".dirname.">",20)
1803 endif
1804 call s:NetOptionRestore()
1805" call Dret("NetBrowse : badly formatted dirname<".dirname.">")
1806 return
1807 endif
1808 let b:netrw_curdir= dirname
1809" call Decho("b:netrw_curdir<".b:netrw_curdir."> (remote)")
1810 endif " (additional remote handling)
1811
1812 " -----------------------
1813 " Directory Listing: {{{3
1814 " -----------------------
1815 setlocal noro ma
1816 call s:BrowserMaps(a:islocal)
1817 call s:PerformListing(a:islocal)
1818
1819" call Dret("NetBrowse")
1820 return
1821endfun
1822
1823" ---------------------------------------------------------------------
1824" s:NetGetBuffer: {{{2
1825" returns 0=cleared buffer
1826" 1=re-used buffer
1827fun! s:NetGetBuffer(islocal,dirname)
1828" call Dfunc("s:NetGetBuffer(islocal=".a:islocal." dirname<".a:dirname.">)")
1829
1830 " re-use buffer if possible {{{3
1831 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
1832 " find NetrwTreeList buffer if there is one
1833 let dirname= "NetrwTreeListing"
1834 let bufnum = bufnr('\<NetrwTreeListing\>')
1835 if bufnum != -1
1836" call Dret("s:NetGetBuffer : bufnum#".bufnum."<NetrwTreeListing>")
1837 return
1838 endif
1839
1840 else
1841 " find buffer number of buffer named precisely the same as dirname {{{3
1842 let dirname= a:dirname
1843" call Decho("find buffer<".dirname.">'s number ")
1844 let bufnum= bufnr(escape(dirname,'\'))
1845" call Decho("findbuf: bufnum=bufnr('".escape(dirname,'\')."')=".bufnum." (initial)")
1846 let ibuf= 1
1847 if bufnum > 0 && bufname(bufnum) != dirname
1848 let buflast = bufnr("$")
1849" call Decho("findbuf: buflast=".buflast)
1850 while ibuf <= buflast
1851 let bname= bufname(ibuf)
1852" call Decho("findbuf: ibuf=".ibuf. " bufname<".bufname(ibuf)."> dirname<".dirname.">")
1853 if bname != '' && bname !~ '/' && dirname =~ '/'.bname.'$' | break | endif
1854 if bname =~ '^'.dirname.'\=$' | break | endif
1855 let ibuf= ibuf + 1
1856 endwhile
1857 if ibuf > buflast
1858 let bufnum= -1
1859 else
1860 let bufnum= ibuf
1861 endif
1862" call Decho("findbuf: bufnum=".bufnum." (final)")
1863 endif
1864 endif
1865
1866 " get enew buffer and name it -or- re-use buffer {{{3
1867 mark '
1868 if bufnum < 0 || !bufexists(bufnum)
1869" call Decho("get enew buffer")
1870 call s:NetrwEnew(dirname)
1871 call s:NetrwSafeOptions()
1872 " name the buffer
1873 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
1874 silent! keepalt file NetrwTreeListing
1875 else
1876 exe 'silent! keepalt file '.escape(dirname,s:netrw_cd_escape)
1877 endif
1878" call Decho("named enew buffer<".expand("%").">")
1879
1880 else " Re-use the buffer
1881
1882" call Decho("re-use buffer:")
1883 let eikeep= &ei
1884 set ei=all
1885 if getline(2) =~ '^" Netrw Directory Listing'
1886" call Decho("re-use buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using: keepalt b ".bufnum)
1887 exe "keepalt b ".bufnum
1888 else
1889" call Decho("reusing buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using: b ".bufnum)
1890 exe "b ".bufnum
1891 endif
1892 let &ei= eikeep
1893 if line("$") <= 1
1894 call s:NetrwListSettings(a:islocal)
1895" call Dret("s:NetGetBuffer 0 : re-using buffer#".bufnr("%").", but its empty, so refresh it")
1896 return 0
1897 elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
1898" call Decho("clear buffer<".expand("%")."> with :%d")
1899 silent %d
1900 call s:NetrwListSettings(a:islocal)
1901" call Dret("s:NetGetBuffer 0 : re-using buffer#".bufnr("%").", but treelist mode always needs a refresh")
1902 return 0
1903 else
1904" call Dret("s:NetGetBuffer 1 : buf#".bufnr("%"))
1905 return 1
1906 endif
1907 endif
1908
1909 " do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc {{{3
1910 " fastbrowse Local Remote Hiding a buffer implies it may be re-used (fast)
1911 " slow 0 D D Deleting a buffer implies it will not be re-used (slow)
1912 " med 1 D H
1913 " fast 2 H H
1914 let fname= expand("%")
1915 call s:NetrwListSettings(a:islocal)
1916 exe "file ".escape(fname,' ')
1917
1918 " delete all lines from buffer {{{3
1919" call Decho("clear buffer<".expand("%")."> with :%d")
1920 keepalt silent! %d
1921
1922" call Dret("s:NetGetBuffer 0 : buf#".bufnr("%"))
1923 return 0
1924endfun
1925
1926" ---------------------------------------------------------------------
1927" s:NetrwListSettings: {{{2
1928fun! s:NetrwListSettings(islocal)
1929" call Dfunc("s:NetrwListSettings(islocal=".a:islocal.")")
1930 let fname= bufname("%")
1931 setlocal bt=nofile nobl ma nonu nowrap noro
1932 exe "file ".escape(fname,' ')
1933 if g:netrw_use_noswf
1934 setlocal noswf
1935 endif
1936"call Dredir("ls!")
1937" call Decho("exe setlocal ts=".g:netrw_maxfilenamelen)
1938 exe "setlocal ts=".g:netrw_maxfilenamelen
1939 if g:netrw_fastbrowse > a:islocal
1940 setlocal bh=hide
1941 else
1942 setlocal bh=delete
1943 endif
1944" call Dret("s:NetrwListSettings")
1945endfun
1946
1947" ---------------------------------------------------------------------
1948" s:PerformListing: {{{2
1949fun! s:PerformListing(islocal)
1950" call Dfunc("s:PerformListing(islocal=".a:islocal.")")
1951
1952" if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 " Decho
1953" call Decho("(netrw) Processing your browsing request...")
1954" endif " Decho
1955
1956" call Decho('w:netrw_liststyle='.(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a'))
1957 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
1958 " force a refresh for tree listings
1959" call Decho("clear buffer<".expand("%")."> with :%d")
1960 setlocal ma noro
1961 keepjumps %d
1962 endif
1963
1964 " save current directory on directory history list
1965 call s:NetBookmarkDir(3,b:netrw_curdir)
1966
1967 " Set up the banner {{{3
1968" call Decho("set up banner")
1969 keepjumps put ='\" ============================================================================'
1970 keepjumps put ='\" Netrw Directory Listing (netrw '.g:loaded_netrw.')'
1971 keepjumps put ='\" '.b:netrw_curdir
1972 keepjumps 1d
1973 let w:netrw_bannercnt= 3
1974 exe w:netrw_bannercnt
1975
1976 let sortby= g:netrw_sort_by
1977 if g:netrw_sort_direction =~ "^r"
1978 let sortby= sortby." reversed"
1979 endif
1980
1981 " Sorted by... {{{3
1982" call Decho("handle specified sorting: g:netrw_sort_by<".g:netrw_sort_by.">")
1983 if g:netrw_sort_by =~ "^n"
1984" call Decho("directories will be sorted by name")
1985 " sorted by name
1986 keepjumps put ='\" Sorted by '.sortby
1987 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
1988 let w:netrw_bannercnt= w:netrw_bannercnt + 2
1989 else
1990" call Decho("directories will be sorted by size or time")
1991 " sorted by size or date
1992 keepjumps put ='\" Sorted by '.sortby
1993 let w:netrw_bannercnt= w:netrw_bannercnt + 1
1994 endif
1995 exe w:netrw_bannercnt
1996
1997 " Hiding... -or- Showing... {{{3
1998" call Decho("handle hiding/showing (g:netrw_hide=".g:netrw_list_hide." g:netrw_list_hide<".g:netrw_list_hide.">)")
1999 if g:netrw_list_hide != "" && g:netrw_hide
2000 if g:netrw_hide == 1
2001 keepjumps put ='\" Hiding: '.g:netrw_list_hide
2002 else
2003 keepjumps put ='\" Showing: '.g:netrw_list_hide
2004 endif
2005 let w:netrw_bannercnt= w:netrw_bannercnt + 1
2006 endif
2007 exe w:netrw_bannercnt
2008 keepjumps put ='\" Quick Help: <F1>:help -:go up dir D:delete R:rename s:sort-by x:exec'
2009 keepjumps put ='\" ============================================================================'
2010 let w:netrw_bannercnt= w:netrw_bannercnt + 2
2011
2012 " bannercnt should index the line just after the banner
2013 let w:netrw_bannercnt= w:netrw_bannercnt + 1
2014 exe w:netrw_bannercnt
2015" call Decho("bannercnt=".w:netrw_bannercnt." (should index line just after banner) line($)=".line("$"))
2016
2017 " set up syntax highlighting {{{3
2018" call Decho("set up syntax highlighting")
2019 if has("syntax")
2020 setlocal ft=netrw
2021 if !exists("g:syntax_on") || !g:syntax_on
2022 setlocal ft=
2023 endif
2024 endif
2025
2026 " get list of files
2027 if a:islocal
2028 call s:LocalListing()
2029 else " remote
2030 call s:RemoteListing()
2031 endif
2032" call Decho("w:netrw_bannercnt=".w:netrw_bannercnt." (banner complete)")
2033
2034 " manipulate the directory listing (hide, sort) {{{3
2035 if line("$") >= w:netrw_bannercnt
2036" call Decho("manipulate directory listing (hide)")
2037" call Decho("g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">")
2038 if g:netrw_hide && g:netrw_list_hide != ""
2039 call s:NetListHide()
2040 endif
2041 if line("$") >= w:netrw_bannercnt
2042" call Decho("manipulate directory listing (sort) : g:netrw_sort_by<".g:netrw_sort_by.">")
2043
2044 if g:netrw_sort_by =~ "^n"
2045 " sort by name
2046 call s:SetSort()
2047
2048 if w:netrw_bannercnt < line("$")
2049" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction." (bannercnt=".w:netrw_bannercnt.")")
2050 if g:netrw_sort_direction =~ 'n'
2051 " normal direction sorting
2052 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002053 else
Bram Moolenaar9964e462007-05-05 17:54:07 +00002054 " reverse direction sorting
2055 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002056 endif
2057 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002058 " remove priority pattern prefix
2059" call Decho("remove priority pattern prefix")
2060 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{3}\///e'
2061
2062 elseif a:islocal
2063 if w:netrw_bannercnt < line("$")
2064" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction)
2065 if g:netrw_sort_direction =~ 'n'
2066" call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$sort')
2067 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
2068 else
2069" call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$sort!')
2070 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
2071 endif
2072 endif
2073 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002074 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00002075
2076 elseif g:netrw_sort_direction =~ 'r'
2077" call Decho('reverse the sorted listing')
2078 exe 'silent keepjumps '.w:netrw_bannercnt.'g/^/m '.w:netrw_bannercnt
2079 endif
2080 endif
2081
2082 " convert to wide/tree listing {{{3
2083" call Decho("modify display if wide/tree listing style")
2084 call s:NetWideListing()
2085 call s:NetTreeListing(b:netrw_curdir)
2086
2087 if exists("w:netrw_bannercnt") && line("$") > w:netrw_bannercnt
2088 " place cursor on the top-left corner of the file listing
2089" call Decho("place cursor on top-left corner of file listing")
2090 exe 'silent '.w:netrw_bannercnt
2091 norm! 0
2092 endif
2093
2094 " record previous current directory
2095 let w:netrw_prvdir= b:netrw_curdir
2096" call Decho("record netrw_prvdir<".w:netrw_prvdir.">")
2097
2098 " save certain window-oriented variables into buffer-oriented variables {{{3
2099 call s:SetBufWinVars()
2100 call s:NetOptionRestore()
2101
2102 " set display to netrw display settings
2103" call Decho("set display to netrw display settings (noma nomod etc)")
2104 setlocal noma nomod nonu nobl nowrap ro
2105 if exists("s:treecurpos")
2106 call setpos('.',s:treecurpos)
2107 unlet s:treecurpos
2108 endif
2109
2110" call Dret("s:PerformListing : curpos<".string(getpos(".")).">")
2111endfun
2112
2113" ---------------------------------------------------------------------
2114" s:NetBrowseChgDir: constructs a new directory based on the current {{{2
2115" directory and a new directory name
2116fun! s:NetBrowseChgDir(islocal,newdir,...)
2117" call Dfunc("s:NetBrowseChgDir(islocal=".a:islocal."> newdir<".a:newdir.">) a:0=".a:0." curpos<".string(getpos("."))."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "").">")
2118
2119 if !exists("b:netrw_curdir")
2120" call Decho("(NetBrowseChgDir) b:netrw_curdir doesn't exist!")
2121 echoerr "(NetBrowseChgDir) b:netrw_curdir doesn't exist!"
2122" call Dret("s:NetBrowseChgDir")
2123 return
2124 endif
2125
2126 call netrw#NetSavePosn()
2127 let nbcd_curpos = getpos('.')
2128 let dirname = substitute(b:netrw_curdir,'\\','/','ge')
2129 let newdir = a:newdir
2130
2131 " set up o/s-dependent directory recognition pattern
2132 if has("amiga")
2133 let dirpat= '[\/:]$'
2134 else
2135 let dirpat= '[\/]$'
2136 endif
2137" call Decho("dirname<".dirname."> dirpat<".dirpat.">")
2138
2139 if dirname !~ dirpat
2140 " apparently vim is "recognizing" that it is in a directory and
2141 " is removing the trailing "/". Bad idea, so I have to put it back.
2142 let dirname= dirname.'/'
2143" call Decho("adjusting dirname<".dirname.">")
2144 endif
2145
2146 if newdir !~ dirpat
2147 " handling a file
2148" call Decho('case "handling a file": newdir<'.newdir.'> !~ dirpat<'.dirpat.">")
2149 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") && newdir !~ '^\(/\|\a:\)'
2150 let dirname= s:NetTreeDir().newdir
2151" call Decho("tree listing")
2152 elseif newdir =~ '^\(/\|\a:\)'
2153 let dirname= newdir
2154 else
2155 let dirname= s:ComposePath(dirname,newdir)
2156 endif
2157" call Decho("handling a file: dirname<".dirname."> (a:0=".a:0.")")
2158 " this lets NetBrowseX avoid the edit
2159 if a:0 < 1
2160" call Decho("dirname<".dirname."> netrw_cd_escape<".s:netrw_cd_escape."> browse_split=".g:netrw_browse_split)
2161" call Decho("about to edit<".escape(dirname,s:netrw_cd_escape)."> didsplit=".(exists("s:didsplit")? s:didsplit : "doesn't exist"))
2162 if !exists("s:didsplit")
2163 if g:netrw_browse_split == 1
2164 new
2165 wincmd _
2166 elseif g:netrw_browse_split == 2
2167 rightb vert new
2168 wincmd |
2169 elseif g:netrw_browse_split == 3
2170 tabnew
2171 else
2172 " handling a file, didn't split, so remove menu
2173" call Decho("handling a file+didn't split, so remove menu")
2174 call s:NetMenu(0)
2175 " optional change to window
2176 if g:netrw_chgwin >= 1
2177 exe g:netrw_chgwin."wincmd w"
2178 endif
2179 endif
2180 endif
2181 " edit the file
2182 " its local only: LocalBrowseCheck() doesn't edit a file, but NetBrowse() will
2183 if a:islocal
2184" call Decho("edit file: exe e! ".escape(dirname,s:netrw_cd_escape))
2185 exe "e! ".escape(dirname,s:netrw_cd_escape)
2186 endif
2187 setlocal ma nomod noro
2188 endif
2189
2190 elseif newdir =~ '^/'
2191 " just go to the new directory spec
2192" call Decho('case "just go to new directory spec": newdir<'.newdir.'>')
2193 let dirname= newdir
2194
2195 elseif newdir == './'
2196 " refresh the directory list
2197" call Decho('case "refresh directory listing": newdir == "./"')
2198
2199 elseif newdir == '../'
2200 " go up one directory
2201" call Decho('case "go up one directory": newdir == "../"')
2202
2203 if w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
2204 " force a refresh
2205" call Decho("clear buffer<".expand("%")."> with :%d")
2206 setlocal noro ma
2207 keepjumps %d
2208 endif
2209
2210 if has("amiga")
2211 " amiga
2212" call Decho('case "go up one directory": newdir == "../" and amiga')
2213 if a:islocal
2214 let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+$\)','\1','')
2215 let dirname= substitute(dirname,'/$','','')
2216 else
2217 let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+/$\)','\1','')
2218 endif
2219" call Decho("amiga: dirname<".dirname."> (go up one dir)")
2220
2221 else
2222 " unix or cygwin
2223" call Decho('case "go up one directory": newdir == "../" and unix or cygwin')
2224 if a:islocal
2225 let dirname= substitute(dirname,'^\(.*\)/\([^/]\+\)/$','\1','')
2226 if dirname == ""
2227 let dirname= '/'
2228 endif
2229 else
2230 let dirname= substitute(dirname,'^\(\a\+://.\{-}/\{1,2}\)\(.\{-}\)\([^/]\+\)/$','\1\2','')
2231 endif
2232" call Decho("unix: dirname<".dirname."> (go up one dir)")
2233 endif
2234
2235 elseif w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
2236" call Decho('case liststyle is TREELIST and w:netrw_treedict exists')
2237 " force a refresh (for TREELIST, wait for NetTreeDir() to force the refresh)
2238 setlocal noro ma
2239 if !(exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir"))
2240" call Decho("clear buffer<".expand("%")."> with :%d")
2241 keepjumps %d
2242 endif
2243 let treedir = s:NetTreeDir()
2244 let s:treecurpos = nbcd_curpos
2245 let haskey= 0
2246" call Decho("w:netrw_treedict<".string(w:netrw_treedict).">")
2247
2248 " search treedict for tree dir as-is
2249 if has_key(w:netrw_treedict,treedir)
2250" call Decho('....searched for treedir<'.treedir.'> : found it!')
2251 let haskey= 1
2252 else
2253" call Decho('....searched for treedir<'.treedir.'> : not found')
2254 endif
2255
2256 " search treedict for treedir with a / appended
2257 if !haskey && treedir !~ '/$'
2258 if has_key(w:netrw_treedict,treedir."/")
2259 let treedir= treedir."/"
2260" call Decho('....searched.for treedir<'.treedir.'> found it!')
2261 let haskey = 1
2262 else
2263" call Decho('....searched for treedir<'.treedir.'/> : not found')
2264 endif
2265 endif
2266
2267 " search treedict for treedir with any trailing / elided
2268 if !haskey && treedir =~ '/$'
2269 let treedir= substitute(treedir,'/$','','')
2270 if has_key(w:netrw_treedict,treedir)
2271" call Decho('....searched.for treedir<'.treedir.'> found it!')
2272 let haskey = 1
2273 else
2274" call Decho('....searched for treedir<'.treedir.'> : not found')
2275 endif
2276 endif
2277
2278 if haskey
2279 " close tree listing for selected subdirectory
2280" call Decho("closing selected subdirectory<".dirname.">")
2281 call remove(w:netrw_treedict,treedir)
2282" call Decho("removed entry<".dirname."> from treedict")
2283" call Decho("yielding treedict<".string(w:netrw_treedict).">")
2284 let dirname= w:netrw_treetop
2285 else
2286 " go down one directory
2287 let dirname= substitute(treedir,'/*$','/','')
2288" call Decho("go down one dir: treedir<".treedir.">")
2289 endif
2290
2291 else
2292 " go down one directory
2293 let dirname= s:ComposePath(dirname,newdir)
2294" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
2295 endif
2296
2297" call Dret("s:NetBrowseChgDir <".dirname."> : curpos<".string(getpos(".")).">")
2298 return dirname
2299endfun
2300
2301" ---------------------------------------------------------------------
2302" s:NetHide: this function is invoked by the "a" map for browsing {{{2
2303" and switches the hiding mode
2304fun! s:NetHide(islocal)
2305" call Dfunc("NetHide(islocal=".a:islocal.")")
2306 let g:netrw_hide=(g:netrw_hide+1)%3
2307 exe "norm! 0"
2308 if g:netrw_hide && g:netrw_list_hide == ""
2309 call netrw#ErrorMsg(s:WARNING,"your hiding list is empty!",49)
2310" call Dret("NetHide")
2311 return
2312 endif
2313 call netrw#NetSavePosn()
2314 call s:NetRefresh(a:islocal,s:NetBrowseChgDir(a:islocal,'./'))
2315" call Dret("NetHide")
2316endfun
2317
2318" ---------------------------------------------------------------------
2319
2320" ===========================================
2321" s:NetPreview: {{{2
2322fun! s:NetPreview(path) range
2323" call Dfunc("NetPreview(path<".a:path.">)")
2324 if has("quickfix")
2325 if !isdirectory(a:path)
2326 exe "pedit ".escape(a:path,g:netrw_fname_escape)
2327 elseif !exists("g:netrw_quiet")
2328 call netrw#ErrorMsg(s:WARNING,"sorry, cannot preview a directory such as <".a:path.">",38)
2329 endif
2330 elseif !exists("g:netrw_quiet")
2331 call netrw#ErrorMsg(s:WARNING,"sorry, to preview your vim needs the quickfix feature compiled in",39)
2332 endif
2333" call Dret("NetPreview")
2334endfun
2335
2336" ---------------------------------------------------------------------
2337" s:NetSortStyle: change sorting style (name - time - size) and refresh display {{{2
2338fun! s:NetSortStyle(islocal)
2339" call Dfunc("s:NetSortStyle(islocal=".a:islocal.") netrw_sort_by<".g:netrw_sort_by.">")
2340 call s:NetSaveWordPosn()
2341
2342 let g:netrw_sort_by= (g:netrw_sort_by =~ 'n')? 'time' : (g:netrw_sort_by =~ 't')? 'size' : 'name'
2343 norm! 0
2344 call netrw#NetSavePosn()
2345 call s:NetRefresh(a:islocal,s:NetBrowseChgDir(a:islocal,'./'))
2346
2347" call Dret("s:NetSortStyle : netrw_sort_by<".g:netrw_sort_by.">")
2348endfun
2349
2350" ---------------------------------------------------------------------
2351" Remote Directory Browsing Support: {{{1
2352" ===========================================
2353
2354" ---------------------------------------------------------------------
2355" s:RemoteListing: {{{2
2356fun! s:RemoteListing()
2357" call Dfunc("s:RemoteListing() b:netrw_curdir<".b:netrw_curdir.">)")
2358
2359 call s:RemotePathAnalysis(b:netrw_curdir)
2360
2361 " sanity check:
2362 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
2363" call Decho("b:netrw_method=".b:netrw_method)
2364 if !executable("ftp")
2365 if !exists("g:netrw_quiet")
2366 call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ftp",18)
2367 endif
2368 call s:NetOptionRestore()
2369" call Dret("s:RemoteListing")
2370 return
2371 endif
2372
2373 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
2374 if !exists("g:netrw_quiet")
2375 if g:netrw_list_cmd == ""
2376 call netrw#ErrorMsg(s:ERROR,g:netrw_ssh_cmd." is not executable on your system",47)
2377 else
2378 call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ".g:netrw_list_cmd,19)
2379 endif
2380 endif
2381
2382 call s:NetOptionRestore()
2383" call Dret("s:RemoteListing")
2384 return
2385 endif " (remote handling sanity check)
2386
2387 if exists("b:netrw_method")
2388" call Decho("setting w:netrw_method<".b:netrw_method.">")
2389 let w:netrw_method= b:netrw_method
2390 endif
2391
2392 if s:method == "ftp"
2393 " use ftp to get remote file listing
2394" call Decho("use ftp to get remote file listing")
2395 let s:method = "ftp"
2396 let listcmd = g:netrw_ftp_list_cmd
2397 if g:netrw_sort_by =~ '^t'
2398 let listcmd= g:netrw_ftp_timelist_cmd
2399 elseif g:netrw_sort_by =~ '^s'
2400 let listcmd= g:netrw_ftp_sizelist_cmd
2401 endif
2402" call Decho("listcmd<".listcmd."> (using g:netrw_ftp_list_cmd)")
2403 call s:NetBrowseFtpCmd(s:path,listcmd)
2404" exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("raw listing: ".getline("."))'
2405
2406 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
2407 " shorten the listing
2408" call Decho("generate short listing")
2409 exe "keepjumps ".w:netrw_bannercnt
2410
2411 " cleanup
2412 if g:netrw_ftp_browse_reject != ""
2413 exe "silent! g/".g:netrw_ftp_browse_reject."/keepjumps d"
2414 endif
2415 silent! keepjumps %s/\r$//e
2416
2417 " if there's no ../ listed, then put ./ and ../ in
2418 let line1= line(".")
2419 exe "keepjumps ".w:netrw_bannercnt
2420 let line2= search('^\.\.\/\%(\s\|$\)','cnW')
2421 if line2 == 0
2422" call Decho("netrw is putting ./ and ../ into listing")
2423 keepjumps put='../'
2424 keepjumps put='./'
2425 endif
2426 exe "keepjumps ".line1
2427 keepjumps norm! 0
2428
2429" call Decho("line1=".line1." line2=".line2." line(.)=".line("."))
2430 if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
2431" call Decho("M$ ftp cleanup")
2432 exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\d\{2}-\d\{2}-\d\{2}\s\+\d\+:\d\+[AaPp][Mm]\s\+\%(<DIR>\|\d\+\)\s\+//'
2433 else " normal ftp cleanup
2434" call Decho("normal ftp cleanup")
2435 exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
2436 exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
2437 exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
2438 endif
2439 endif
2440
2441 else
2442 " use ssh to get remote file listing {{{3
2443" call Decho("use ssh to get remote file listing: s:netrw_shq<".g:netrw_shq."> s:path<".s:path."> s:netrw_cd_escape<".s:netrw_cd_escape.">")
2444 let listcmd= s:MakeSshCmd(g:netrw_list_cmd)
2445" call Decho("listcmd<".listcmd."> (using g:netrw_list_cmd)")
2446 if g:netrw_scp_cmd =~ '^pscp'
2447" call Decho("1: exe silent r! ".listcmd.g:netrw_shq.s:path.g:netrw_shq)
2448 exe "silent r! ".listcmd.g:netrw_shq.s:path.g:netrw_shq
2449 " remove rubbish and adjust listing format of 'pscp' to 'ssh ls -FLa' like
2450 g/^Listing directory/d
2451 g/^d[-rwx][-rwx][-rwx]/s+$+/+e
2452 silent g/^l[-rwx][-rwx][-rwx]/s+$+@+e
2453 if g:netrw_liststyle != s:LONGLIST
2454 g/^[dlsp-][-rwx][-rwx][-rwx]/s/^.*\s\(\S\+\)$/\1/e
2455 endif
2456 else
2457 if s:path == ""
2458" call Decho("2: exe silent r! ".listcmd)
2459 exe "silent r! ".listcmd
2460 else
2461" call Decho("3: exe silent r! ".listcmd." ".g:netrw_shq.s:path.g:netrw_shq)
2462 exe "silent r! ".listcmd." ".g:netrw_shq.s:path.g:netrw_shq
2463 endif
2464 endif
2465
2466 " cleanup
2467 if g:netrw_ftp_browse_reject != ""
2468" call Decho("(cleanup) exe silent! g/".g:netrw_ssh_browse_reject."/keepjumps d")
2469 exe "silent! g/".g:netrw_ssh_browse_reject."/keepjumps d"
2470 endif
2471 endif
2472
2473 if w:netrw_liststyle == s:LONGLIST
2474 " do a long listing; these substitutions need to be done prior to sorting {{{3
2475" call Decho("fix long listing:")
2476
2477 if s:method == "ftp"
2478 " cleanup
2479 exe "keepjumps ".w:netrw_bannercnt
2480 while getline(".") =~ g:netrw_ftp_browse_reject
2481 keepjumps d
2482 endwhile
2483 " if there's no ../ listed, then put ./ and ../ in
2484 let line1= line(".")
2485 keepjumps 1
2486 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
2487 let line2= line(".")
2488 if line2 == 0
2489 exe 'keepjumps '.w:netrw_bannercnt."put='./'"
2490 if b:netrw_curdir != '/'
2491 exe 'keepjumps '.w:netrw_bannercnt."put='../'"
2492 endif
2493 endif
2494 exe "keepjumps ".line1
2495 keepjumps norm! 0
2496 endif
2497
2498 if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
2499" call Decho("M$ ftp site listing cleanup")
2500 exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\(\d\{2}-\d\{2}-\d\{2}\s\+\d\+:\d\+[AaPp][Mm]\s\+\%(<DIR>\|\d\+\)\s\+\)\(\w.*\)$/\2\t\1/'
2501 elseif exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$")
2502" call Decho("normal ftp site listing cleanup: bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
2503 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/ -> .*$//e'
2504 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
2505 exe 'silent keepjumps '.w:netrw_bannercnt
2506 endif
2507 endif
2508
2509" if exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$") " Decho
2510" exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("listing: ".getline("."))'
2511" endif " Decho
2512" call Dret("s:RemoteListing")
2513endfun
2514
2515" ---------------------------------------------------------------------
2516" NetGetWord: it gets the directory named under the cursor {{{2
2517fun! s:NetGetWord()
2518" call Dfunc("NetGetWord() line#".line(".")." liststyle=".g:netrw_liststyle." virtcol=".virtcol("."))
2519 call s:UseBufWinVars()
2520
2521 " insure that w:netrw_liststyle is set up
2522 if !exists("w:netrw_liststyle")
2523 if exists("g:netrw_liststyle")
2524 let w:netrw_liststyle= g:netrw_liststyle
2525 else
2526 let w:netrw_liststyle= s:THINLIST
2527 endif
2528" call Decho("w:netrw_liststyle=".w:netrw_liststyle)
2529 endif
2530
2531 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
2532 " Active Banner support
2533" call Decho("active banner handling")
2534 norm! 0
2535 let dirname= "./"
2536 let curline= getline(".")
2537
2538 if curline =~ '"\s*Sorted by\s'
2539 norm s
2540 let s:netrw_skipbrowse= 1
2541 echo 'Pressing "s" also works'
2542
2543 elseif curline =~ '"\s*Sort sequence:'
2544 let s:netrw_skipbrowse= 1
2545 echo 'Press "S" to edit sorting sequence'
2546
2547 elseif curline =~ '"\s*Quick Help:'
2548 norm ?
2549 let s:netrw_skipbrowse= 1
2550 echo 'Pressing "?" also works'
2551
2552 elseif curline =~ '"\s*\%(Hiding\|Showing\):'
2553 norm a
2554 let s:netrw_skipbrowse= 1
2555 echo 'Pressing "a" also works'
2556
2557 elseif line("$") > w:netrw_bannercnt
2558 exe 'silent keepjumps '.w:netrw_bannercnt
2559 endif
2560
2561 elseif w:netrw_liststyle == s:THINLIST
2562" call Decho("thin column handling")
2563 norm! 0
2564 let dirname= getline(".")
2565
2566 elseif w:netrw_liststyle == s:LONGLIST
2567" call Decho("long column handling")
2568 norm! 0
2569 let dirname= substitute(getline("."),'^\(\%(\S\+ \)*\S\+\).\{-}$','\1','e')
2570
2571 elseif w:netrw_liststyle == s:TREELIST
2572" call Decho("treelist handling")
2573 let dirname= substitute(getline("."),'^\(| \)*','','e')
2574
2575 else
2576" call Decho("obtain word from wide listing")
2577 let dirname= getline(".")
2578
2579 if !exists("b:netrw_cpf")
2580 let b:netrw_cpf= 0
2581 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
2582" call Decho("computed cpf")
2583 endif
2584
2585" call Decho("buf#".bufnr("%")."<".bufname("%").">")
2586 let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf
2587" call Decho("filestart= ([virtcol=".virtcol(".")."]/[b:netrw_cpf=".b:netrw_cpf."])*b:netrw_cpf=".filestart." bannercnt=".w:netrw_bannercnt)
2588" call Decho("1: dirname<".dirname.">")
2589 if filestart > 0|let dirname= substitute(dirname,'^.\{'.filestart.'}','','')|endif
2590" call Decho("2: dirname<".dirname.">")
2591 let dirname = substitute(dirname,'^\(.\{'.b:netrw_cpf.'}\).*$','\1','e')
2592" call Decho("3: dirname<".dirname.">")
2593 let dirname = substitute(dirname,'\s\+$','','e')
2594" call Decho("4: dirname<".dirname.">")
2595 endif
2596
2597" call Dret("NetGetWord <".dirname.">")
2598 return dirname
2599endfun
2600
2601" ---------------------------------------------------------------------
2602" NetBrowseRm: remove/delete a remote file or directory {{{2
2603fun! s:NetBrowseRm(usrhost,path) range
2604" call Dfunc("NetBrowseRm(usrhost<".a:usrhost."> path<".a:path.">) virtcol=".virtcol("."))
2605" call Decho("firstline=".a:firstline." lastline=".a:lastline)
2606
2607 " preparation for removing multiple files/directories
2608 let ctr= a:firstline
2609 let all= 0
2610
2611 " remove multiple files and directories
2612 while ctr <= a:lastline
2613 exe ctr
2614
2615 let rmfile= s:NetGetWord()
2616" call Decho("rmfile<".rmfile.">")
2617
2618 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
2619 " attempt to remove file
2620" call Decho("attempt to remove file")
2621 if !all
2622 echohl Statement
2623 call inputsave()
2624 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2625 call inputrestore()
2626 echohl NONE
2627 if ok == ""
2628 let ok="no"
2629 endif
2630 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2631 if ok =~ 'a\%[ll]'
2632 let all= 1
2633 endif
2634 endif
2635
2636 if all || ok =~ 'y\%[es]' || ok == ""
2637 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
2638 silent! keepjumps .,$d
2639 call s:NetBrowseFtpCmd(a:path,"delete ".rmfile)
2640 else
2641 let netrw_rm_cmd= s:MakeSshCmd(g:netrw_rm_cmd)
2642" call Decho("attempt to remove file: system(".netrw_rm_cmd.")")
2643 let ret= s:System("system",netrw_rm_cmd)
2644" call Decho("returned=".ret." errcode=".v:shell_error)
2645 endif
2646 elseif ok =~ 'q\%[uit]'
2647 break
2648 endif
2649
2650 else
2651 " attempt to remove directory
2652" call Decho("attempt to remove directory")
2653 if !all
2654 call inputsave()
2655 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2656 call inputrestore()
2657 if ok == ""
2658 let ok="no"
2659 endif
2660 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2661 if ok =~ 'a\%[ll]'
2662 let all= 1
2663 endif
2664 endif
2665
2666 if all || ok =~ 'y\%[es]' || ok == ""
2667 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
2668 call s:NetBrowseFtpCmd(a:path,"rmdir ".rmfile)
2669 else
2670 let rmfile = substitute(a:path.rmfile,'/$','','')
2671 let netrw_rmdir_cmd = s:MakeSshCmd(g:netrw_rmdir_cmd).' '.rmfile
2672" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
2673 let ret= s:System("system",netrw_rmdir_cmd)
2674" call Decho("returned=".ret." errcode=".v:shell_error)
2675
2676 if v:shell_error != 0
2677" call Decho("v:shell_error not 0")
2678 let netrw_rmf_cmd= s:MakeSshCmd(g:netrw_rmf_cmd).' '.substitute(rmfile,'[\/]$','','e')
2679" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
2680 let ret= s:System("system",netrw_rmf_cmd)
2681" call Decho("returned=".ret." errcode=".v:shell_error)
2682
2683 if v:shell_error != 0 && !exists("g:netrw_quiet")
2684 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",22)
2685 endif
2686 endif
2687 endif
2688
2689 elseif ok =~ 'q\%[uit]'
2690 break
2691 endif
2692 endif
2693
2694 let ctr= ctr + 1
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002695 endwhile
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00002696
Bram Moolenaar9964e462007-05-05 17:54:07 +00002697 " refresh the (remote) directory listing
2698" call Decho("refresh remote directory listing")
2699 call netrw#NetSavePosn()
2700 call s:NetRefresh(0,s:NetBrowseChgDir(0,'./'))
2701
2702" call Dret("NetBrowseRm")
2703endfun
2704
2705" ---------------------------------------------------------------------
2706" NetBrowseRename: rename a remote file or directory {{{2
2707fun! s:NetBrowseRename(usrhost,path) range
2708" call Dfunc("NetBrowseRename(usrhost<".a:usrhost."> path<".a:path.">)")
2709
2710 " preparation for removing multiple files/directories
2711 let ctr = a:firstline
2712 let rename_cmd = s:MakeSshCmd(g:netrw_rename_cmd)
2713
2714 " attempt to rename files/directories
2715 while ctr <= a:lastline
2716 exe "keepjumps ".ctr
2717
2718 norm! 0
2719 let oldname= s:NetGetWord()
2720" call Decho("oldname<".oldname.">")
2721
2722 call inputsave()
2723 let newname= input("Moving ".oldname." to : ",oldname)
2724 call inputrestore()
2725
2726 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
2727 call s:NetBrowseFtpCmd(a:path,"rename ".oldname." ".newname)
2728 else
2729 let oldname= a:path.oldname
2730 let newname= a:path.newname
2731" call Decho("system(rename_cmd".' "'.escape(oldname," ").'" "'.escape(newname,s:netrw_cd_escape).'"')
2732 let ret= s:System("system",rename_cmd.' "'.escape(oldname,s:netrw_cd_escape).'" "'.escape(newname,s:netrw_cd_escape).'"')
2733 endif
2734
2735 let ctr= ctr + 1
2736 endwhile
2737
2738 " refresh the directory
2739 let curline= line(".")
2740 call s:NetBrowse(0,s:NetBrowseChgDir(0,'./'))
2741 exe "keepjumps ".curline
2742" call Dret("NetBrowseRename")
2743endfun
2744
2745" ---------------------------------------------------------------------
2746" NetRefresh: {{{2
2747fun! s:NetRefresh(islocal,dirname)
2748" call Dfunc("NetRefresh(islocal<".a:islocal.">,dirname=".a:dirname.") hide=".g:netrw_hide." sortdir=".g:netrw_sort_direction)
2749 " at the current time (Mar 19, 2007) all calls to NetRefresh() call NetBrowseChgDir() first.
2750 " NetBrowseChgDir() may clear the display; hence a NetSavePosn() may not work if its placed here.
2751 " Also, NetBrowseChgDir() now does a NetSavePosn() itself.
2752 setlocal ma noro
2753" call Decho("clear buffer<".expand("%")."> with :%d")
2754 %d
2755 if a:islocal
2756 call netrw#LocalBrowseCheck(a:dirname)
2757 else
2758 call s:NetBrowse(a:islocal,a:dirname)
2759 endif
2760 call netrw#NetRestorePosn()
2761 redraw!
2762" call Dret("NetRefresh")
2763endfun
2764
2765" ---------------------------------------------------------------------
2766" NetSplit: mode {{{2
2767" =0 : net and o
2768" =1 : net and t
2769" =2 : net and v
2770" =3 : local and o
2771" =4 : local and t
2772" =5 : local and v
2773fun! s:NetSplit(mode)
2774" call Dfunc("NetSplit(mode=".a:mode.") alto=".g:netrw_alto." altv=".g:netrw_altv)
2775
2776 call s:SaveWinVars()
2777
2778 if a:mode == 0
2779 " remote and o
2780 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
2781 let s:didsplit= 1
2782 call s:RestoreWinVars()
2783 call s:NetBrowse(0,s:NetBrowseChgDir(0,s:NetGetWord()))
2784 unlet s:didsplit
2785
2786 elseif a:mode == 1
2787 " remote and t
2788 let cursorword = s:NetGetWord()
2789 tabnew
2790 let s:didsplit= 1
2791 call s:RestoreWinVars()
2792 call s:NetBrowse(0,s:NetBrowseChgDir(0,cursorword))
2793 unlet s:didsplit
2794
2795 elseif a:mode == 2
2796 " remote and v
2797 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
2798 let s:didsplit= 1
2799 call s:RestoreWinVars()
2800 call s:NetBrowse(0,s:NetBrowseChgDir(0,s:NetGetWord()))
2801 unlet s:didsplit
2802
2803 elseif a:mode == 3
2804 " local and o
2805 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
2806 let s:didsplit= 1
2807 call s:RestoreWinVars()
2808 call netrw#LocalBrowseCheck(s:NetBrowseChgDir(1,s:NetGetWord()))
2809 unlet s:didsplit
2810
2811 elseif a:mode == 4
2812 " local and t
2813 let netrw_curdir= b:netrw_curdir
2814 let cursorword = s:NetGetWord()
2815 tabnew
2816 let b:netrw_curdir= netrw_curdir
2817 let s:didsplit= 1
2818 call s:RestoreWinVars()
2819 call netrw#LocalBrowseCheck(s:NetBrowseChgDir(1,cursorword))
2820 unlet s:didsplit
2821
2822 elseif a:mode == 5
2823 " local and v
2824 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
2825 let s:didsplit= 1
2826 call s:RestoreWinVars()
2827 call netrw#LocalBrowseCheck(s:NetBrowseChgDir(1,s:NetGetWord()))
2828 unlet s:didsplit
2829
2830 else
2831 call netrw#ErrorMsg(s:ERROR,"(NetSplit) unsupported mode=".a:mode,45)
2832 endif
2833
2834" call Dret("NetSplit")
2835endfun
2836
2837" ---------------------------------------------------------------------
2838" NetBrowseX: allows users to write custom functions to operate on {{{2
2839" files given their extension. Passes 0=local, 1=remote
2840fun! netrw#NetBrowseX(fname,remote)
2841" call Dfunc("NetBrowseX(fname<".a:fname."> remote=".a:remote.")")
2842
2843 " set up the filename
2844 " (lower case the extension, make a local copy of a remote file)
2845 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
2846 if has("win32") || has("win95") || has("win64") || has("win16")
2847 let exten= substitute(exten,'^.*$','\L&\E','')
2848 endif
2849 let fname= escape(a:fname,"%#")
2850" call Decho("fname<".fname."> after escape()")
2851
2852 " seems kde systems often have gnome-open due to dependencies, even though
2853 " gnome-open's subsidiary display tools are largely absent. Kde systems
2854 " usually have "kdeinit" running, though... (tnx Mikolaj Machowski)
2855 if !exists("s:haskdeinit")
2856 if has("unix")
2857 let s:haskdeinit= s:System("system",'ps -e') =~ 'kdeinit'
2858 if v:shell_error
2859 let s:haskdeinit = 0
2860 endif
2861 else
2862 let s:haskdeinit= 0
2863 endif
2864" call Decho("setting s:haskdeinit=".s:haskdeinit)
2865 endif
2866
2867 if a:remote == 1
2868 " create a local copy
2869 let fname= fnamemodify(tempname(),":t:r").".".exten
2870" call Decho("a:remote=".a:remote.": create a local copy of <".a:fname."> as <".fname.">")
2871 exe "silent keepjumps bot 1new ".a:fname
2872 setlocal bh=delete
2873" call Decho("exe w! ".fname)
2874 exe "w! ".fname
2875 q
2876 endif
2877" call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten))
2878
2879 " set up redirection
2880 if &srr =~ "%s"
2881 let redir= substitute(&srr,"%s","/dev/null","")
2882 else
2883 let redir= &srr . "/dev/null"
2884 endif
2885" call Decho("redir{".redir."} srr{".&srr."}")
2886
2887 " execute the file handler
2888 if exists("g:netrw_browsex_viewer") && g:netrw_browsex_viewer == '-'
2889" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
2890 let ret= netrwFileHandlers#Invoke(exten,fname)
2891
2892 elseif exists("g:netrw_browsex_viewer") && executable(g:netrw_browsex_viewer)
2893" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
2894" call Decho("exe silent !".g:netrw_browsex_viewer." '".escape(fname,'%#')."' ".redir)
2895 exe "silent !".g:netrw_browsex_viewer." '".escape(fname,'%#')."'".redir
2896 let ret= v:shell_error
2897
2898 elseif has("win32") || has("win64")
2899" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"')
2900 exe 'silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"'
2901 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2902 let ret= v:shell_error
2903
2904 elseif has("unix") && executable("gnome-open") && !s:haskdeinit
2905" call Decho("exe silent !gnome-open '".escape(fname,'%#')."' ".redir)
2906 exe "silent !gnome-open '".escape(fname,'%#')."'".redir
2907 let ret= v:shell_error
2908
2909 elseif has("unix") && executable("kfmclient") && s:haskdeinit
2910" call Decho("exe silent !kfmclient exec '".escape(fname,'%#')."' ".redir)
2911 exe "silent !kfmclient exec '".escape(fname,'%#')."' ".redir
2912 let ret= v:shell_error
2913
2914 else
2915 " netrwFileHandlers#Invoke() always returns 0
2916 let ret= netrwFileHandlers#Invoke(exten,fname)
2917 endif
2918
2919 " if unsuccessful, attempt netrwFileHandlers#Invoke()
2920 if ret
2921 let ret= netrwFileHandlers#Invoke(exten,fname)
2922 endif
2923
2924 redraw!
2925
2926 " cleanup: remove temporary file,
2927 " delete current buffer if success with handler,
2928 " return to prior buffer (directory listing)
2929 if a:remote == 1 && fname != a:fname
2930" call Decho("deleting temporary file<".fname.">")
2931 call s:System("delete",fname)
2932 endif
2933
2934 if a:remote == 1
2935 setlocal bh=delete bt=nofile
2936 if g:netrw_use_noswf
2937 setlocal noswf
2938 endif
2939 exe "norm! \<c-o>"
2940 redraw!
2941 endif
2942
2943" call Dret("NetBrowseX")
2944endfun
2945
2946" ---------------------------------------------------------------------
2947" NetBrowseFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
2948" This function assumes that a long listing will be received. Size, time,
2949" and reverse sorts will be requested of the server but not otherwise
2950" enforced here.
2951fun! s:NetBrowseFtpCmd(path,listcmd)
2952" call Dfunc("NetBrowseFtpCmd(path<".a:path."> listcmd<".a:listcmd.">) netrw_method=".w:netrw_method)
2953" call Decho("line($)=".line("$")." bannercnt=".w:netrw_bannercnt)
2954
2955 " because WinXX ftp uses unix style input
2956 let ffkeep= &ff
2957 setlocal ma ff=unix noro
2958
2959 " clear off any older non-banner lines
2960 " note that w:netrw_bannercnt indexes the line after the banner
2961" call Decho('exe silent! keepjumps '.w:netrw_bannercnt.",$d (clear off old non-banner lines)")
2962 exe "silent! keepjumps ".w:netrw_bannercnt.",$d"
2963
2964 ".........................................
2965 if w:netrw_method == 2 || w:netrw_method == 5
2966 " ftp + <.netrc>: Method #2
2967 if a:path != ""
2968 put ='cd \"'.a:path.'\"'
2969 endif
2970 if exists("g:netrw_ftpextracmd")
2971 exe "put ='".g:netrw_ftpextracmd."'"
2972" call Decho("filter input: ".getline("."))
2973 endif
2974 exe "put ='".a:listcmd."'"
2975" exe w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
2976 if exists("g:netrw_port") && g:netrw_port != ""
2977" call Decho("exe ".g:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
2978 exe g:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
2979 else
2980" call Decho("exe ".g:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
2981 exe g:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
2982 endif
2983
2984 ".........................................
2985 elseif w:netrw_method == 3
2986 " ftp + machine,id,passwd,filename: Method #3
2987 setlocal ff=unix
2988 if exists("g:netrw_port") && g:netrw_port != ""
2989 put ='open '.g:netrw_machine.' '.g:netrw_port
2990 else
2991 put ='open '.g:netrw_machine
2992 endif
2993
2994 if exists("g:netrw_ftp") && g:netrw_ftp == 1
2995 put =g:netrw_uid
2996 put ='\"'.g:netrw_passwd.'\"'
2997 else
2998 put ='user \"'.g:netrw_uid.'\" \"'.g:netrw_passwd.'\"'
2999 endif
3000
3001 if a:path != ""
3002 put ='cd \"'.a:path.'\"'
3003 endif
3004 if exists("g:netrw_ftpextracmd")
3005 exe "put ='".g:netrw_ftpextracmd."'"
3006" call Decho("filter input: ".getline("."))
3007 endif
3008 exe "put ='".a:listcmd."'"
3009
3010 " perform ftp:
3011 " -i : turns off interactive prompting from ftp
3012 " -n unix : DON'T use <.netrc>, even though it exists
3013 " -n win32: quit being obnoxious about password
3014" exe w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
3015" call Decho("exe ".g:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i -n")
3016 exe g:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i -n"
3017
3018 ".........................................
3019 else
3020 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",23)
3021 endif
3022
3023 " cleanup for Windows
3024 if has("win32") || has("win95") || has("win64") || has("win16")
3025 silent! keepjumps %s/\r$//e
3026 endif
3027 if a:listcmd == "dir"
3028 " infer directory/link based on the file permission string
3029 silent! keepjumps g/d\%([-r][-w][-x]\)\{3}/s@$@/@
3030 silent! keepjumps g/l\%([-r][-w][-x]\)\{3}/s/$/@/
3031 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
3032 exe "silent! keepjumps ".w:netrw_bannercnt.',$s/^\%(\S\+\s\+\)\{8}//e'
3033 endif
3034 endif
3035
3036 " ftp's listing doesn't seem to include ./ or ../
3037 if !search('^\.\/$\|\s\.\/$','wn')
3038 exe 'keepjumps '.w:netrw_bannercnt
3039 put ='./'
3040 endif
3041 if !search('^\.\.\/$\|\s\.\.\/$','wn')
3042 exe 'keepjumps '.w:netrw_bannercnt
3043 put ='../'
3044 endif
3045
3046 " restore settings
3047 let &ff= ffkeep
3048" call Dret("NetBrowseFtpCmd")
3049endfun
3050
3051" ---------------------------------------------------------------------
3052" NetListHide: uses [range]g~...~d to delete files that match comma {{{2
3053" separated patterns given in g:netrw_list_hide
3054fun! s:NetListHide()
3055" call Dfunc("NetListHide() hide=".g:netrw_hide." listhide<".g:netrw_list_hide.">")
3056
3057 " find a character not in the "hide" string to use as a separator for :g and :v commands
3058 " How-it-works: take the hiding command, convert it into a range. Duplicate
3059 " characters don't matter. Remove all such characters from the '/~...90'
3060 " string. Use the first character left as a separator character.
3061 let listhide= g:netrw_list_hide
3062 let sep = strpart(substitute('/~@#$%^&*{};:,<.>?|1234567890','['.escape(listhide,'-]^\').']','','ge'),1,1)
3063" call Decho("sep=".sep)
3064
3065 while listhide != ""
3066 if listhide =~ ','
3067 let hide = substitute(listhide,',.*$','','e')
3068 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
3069 else
3070 let hide = listhide
3071 let listhide= ""
3072 endif
3073
3074 " Prune the list by hiding any files which match
3075 if g:netrw_hide == 1
3076" call Decho("hiding<".hide."> listhide<".listhide.">")
3077 exe 'silent keepjumps '.w:netrw_bannercnt.',$g'.sep.hide.sep.'d'
3078 elseif g:netrw_hide == 2
3079" call Decho("showing<".hide."> listhide<".listhide.">")
3080 exe 'silent keepjumps '.w:netrw_bannercnt.',$g'.sep.hide.sep.'s@^@ /-KEEP-/ @'
3081 endif
3082 endwhile
3083 if g:netrw_hide == 2
3084 exe 'silent keepjumps '.w:netrw_bannercnt.',$v@^ /-KEEP-/ @d'
3085 exe 'silent keepjumps '.w:netrw_bannercnt.',$s@^\%( /-KEEP-/ \)\+@@e'
3086 endif
3087
3088" call Dret("NetListHide")
3089endfun
3090
3091" ---------------------------------------------------------------------
3092" NetHideEdit: allows user to edit the file/directory hiding list
3093fun! s:NetHideEdit(islocal)
3094" call Dfunc("NetHideEdit(islocal=".a:islocal.")")
3095
3096 " save current cursor position
3097 let s:nhe_curpos= getpos(".")
3098
3099 " get new hiding list from user
3100 call inputsave()
3101 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
3102 call inputrestore()
3103 let g:netrw_list_hide= newhide
3104" call Decho("new g:netrw_list_hide<".g:netrw_list_hide.">")
3105
3106 " refresh the listing
3107 silent call s:NetRefresh(a:islocal,s:NetBrowseChgDir(a:islocal,"./"))
3108
3109 " restore cursor position
3110 call setpos('.',s:nhe_curpos)
3111 unlet s:nhe_curpos
3112
3113" call Dret("NetHideEdit")
3114endfun
3115
3116" ---------------------------------------------------------------------
3117" NetSortSequence: allows user to edit the sorting sequence
3118fun! s:NetSortSequence(islocal)
3119" call Dfunc("NetSortSequence(islocal=".a:islocal.")")
3120
3121 call inputsave()
3122 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
3123 call inputrestore()
3124
3125 " refresh the listing
3126 let g:netrw_sort_sequence= newsortseq
3127 call netrw#NetSavePosn()
3128 call s:NetRefresh(a:islocal,s:NetBrowseChgDir(a:islocal,'./'))
3129
3130" call Dret("NetSortSequence")
3131endfun
3132
3133" ---------------------------------------------------------------------
3134" NetListStyle: {{{2
3135" islocal=0: remote browsing
3136" =1: local browsing
3137fun! s:NetListStyle(islocal)
3138" call Dfunc("NetListStyle(islocal=".a:islocal.") w:netrw_liststyle=".w:netrw_liststyle)
3139 let fname = s:NetGetWord()
3140 if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
3141 let w:netrw_liststyle = (w:netrw_liststyle + 1) % s:MAXLIST
3142" call Decho("fname<".fname.">")
3143" call Decho("chgd w:netrw_liststyle to ".w:netrw_liststyle)
3144" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist").">")
3145
3146 if w:netrw_liststyle == s:THINLIST
3147 " use one column listing
3148" call Decho("use one column list")
3149 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
3150
3151 elseif w:netrw_liststyle == s:LONGLIST
3152 " use long list
3153" call Decho("use long list")
3154 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
3155
3156 elseif w:netrw_liststyle == s:WIDELIST
3157 " give wide list
3158" call Decho("use wide list")
3159 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
3160
3161 elseif w:netrw_liststyle == s:TREELIST
3162" call Decho("use tree list")
3163 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
3164
3165 else
3166 call netrw#ErrorMsg(s:WARNING,"bad value for g:netrw_liststyle (=".w:netrw_liststyle.")",46)
3167 let g:netrw_liststyle = s:THINLIST
3168 let w:netrw_liststyle = g:netrw_liststyle
3169 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
3170 endif
3171 setlocal ma noro
3172
3173 " clear buffer - this will cause NetBrowse/LocalBrowseCheck to do a refresh
3174" call Decho("clear buffer<".expand("%")."> with :%d")
3175 %d
3176
3177 " refresh the listing
3178 call netrw#NetSavePosn()
3179 call s:NetRefresh(a:islocal,s:NetBrowseChgDir(a:islocal,'./'))
3180
3181 " keep cursor on the filename
3182 silent keepjumps $
3183 let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
3184" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'))
3185 if result <= 0 && exists("w:netrw_bannercnt")
3186 exe w:netrw_bannercnt
3187 endif
3188
3189" call Dret("NetListStyle".(exists("w:netrw_liststyle")? ' : w:netrw_liststyle='.w:netrw_liststyle : ""))
3190endfun
3191
3192" ---------------------------------------------------------------------
3193" NetWideListing: {{{2
3194fun! s:NetWideListing()
3195
3196 if w:netrw_liststyle == s:WIDELIST
3197" call Dfunc("NetWideListing() w:netrw_liststyle=".w:netrw_liststyle.' fo='.&fo.' l:fo='.&l:fo)
3198 " look for longest filename (cpf=characters per filename)
3199 " cpf: characters per file
3200 " fpl: files per line
3201 " fpc: files per column
3202 setlocal ma noro
3203 let b:netrw_cpf= 0
3204 if line("$") >= w:netrw_bannercnt
3205 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
3206 else
3207" call Dret("NetWideListing")
3208 return
3209 endif
3210" call Decho("max file strlen+1=".b:netrw_cpf)
3211 let b:netrw_cpf= b:netrw_cpf + 1
3212
3213 " determine qty files per line (fpl)
3214 let w:netrw_fpl= winwidth(0)/b:netrw_cpf
3215 if w:netrw_fpl <= 0
3216 let w:netrw_fpl= 1
3217 endif
3218" call Decho("fpl= ".winwidth(0)."/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl)
3219
3220 " make wide display
3221 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^.*$/\=escape(printf("%-'.b:netrw_cpf.'s",submatch(0)),"\\")/'
3222 let fpc = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl
3223 let newcolstart = w:netrw_bannercnt + fpc
3224 let newcolend = newcolstart + fpc - 1
3225" call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]")
3226 silent! let keepregstar = @*
3227 while line("$") >= newcolstart
3228 if newcolend > line("$") | let newcolend= line("$") | endif
3229 let newcolqty= newcolend - newcolstart
3230 exe newcolstart
3231 if newcolqty == 0
3232 exe "silent keepjumps norm! 0\<c-v>$hx".w:netrw_bannercnt."G$p"
3233 else
3234 exe "silent keepjumps norm! 0\<c-v>".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p'
3235 endif
3236 exe "silent keepjumps ".newcolstart.','.newcolend.'d'
3237 exe 'silent keepjumps '.w:netrw_bannercnt
3238 endwhile
3239 silent! let @*= keepregstar
3240 exe "silent keepjumps ".w:netrw_bannercnt.',$s/\s\+$//e'
3241 setlocal noma nomod ro
3242" call Dret("NetWideListing")
3243 endif
3244
3245endfun
3246
3247" ---------------------------------------------------------------------
3248" NetTreeDir: determine tree directory given current cursor position {{{2
3249" (full path directory with trailing slash returned)
3250fun! s:NetTreeDir()
3251" call Dfunc("NetTreeDir() curline#".line(".")."<".getline(".")."> b:netrw_curdir<".b:netrw_curdir."> tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%"))
3252
3253 let treedir= b:netrw_curdir
3254" call Decho("set initial treedir<".treedir.">")
3255 let s:treecurpos= getpos(".")
3256
3257 if w:netrw_liststyle == s:TREELIST
3258" call Decho("w:netrrw_liststyle is TREELIST:")
3259" call Decho("line#".line(".")." getline(.)<".getline('.')."> treecurpos<".string(s:treecurpos).">")
3260 if getline('.') =~ '/$'
3261 let treedir= substitute(getline('.'),'^\%(| \)*\([^|].\{-}\)$','\1','e')
3262 else
3263 let treedir= ""
3264 endif
3265
3266" call Decho("treedir<".treedir.">")
3267
3268 " detect user attempting to close treeroot
3269 if getline('.') !~ '|' && getline('.') != '..'
3270" call Decho("user attempted to close treeroot")
3271 " now force a refresh
3272" call Decho("clear buffer<".expand("%")."> with :%d")
3273 keepjumps %d
3274" call Dret("NetTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
3275 return b:netrw_curdir
3276 endif
3277
3278 " elide all non-depth information
3279 let depth = substitute(getline('.'),'^\(\%(| \)*\)[^|].\{-}$','\1','e')
3280" call Decho("depth<".depth."> 1st subst")
3281
3282 " elide first depth
3283 let depth = substitute(depth,'^| ','','')
3284" call Decho("depth<".depth."> 2nd subst")
3285
3286 " construct treedir by searching backwards at correct depth
3287" call Decho("constructing treedir<".treedir."> depth<".depth.">")
3288 while depth != "" && search('^'.depth.'[^|].\{-}/$','bW')
3289 let dirname= substitute(getline("."),'^\(| \)*','','e')
3290 let treedir= dirname.treedir
3291 let depth = substitute(depth,'^| ','','')
3292" call Decho("constructing treedir<".treedir.">: dirname<".dirname."> while depth<".depth.">")
3293 endwhile
3294 if w:netrw_treetop =~ '/$'
3295 let treedir= w:netrw_treetop.treedir
3296 else
3297 let treedir= w:netrw_treetop.'/'.treedir
3298 endif
3299" call Decho("bufnr(.)=".bufnr(".")." line($)=".line("$")." line(.)=".line("."))
3300 endif
3301 let treedir= substitute(treedir,'//$','/','')
3302
3303" " now force a refresh
3304" call Decho("clear buffer<".expand("%")."> with :%d")
3305" setlocal ma noro
3306" keepjumps %d
3307
3308" call Dret("NetTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
3309 return treedir
3310endfun
3311
3312" ---------------------------------------------------------------------
3313" NetTreeDisplay: recursive tree display {{{2
3314fun! s:NetTreeDisplay(dir,depth)
3315" call Dfunc("NetTreeDisplay(dir<".a:dir."> depth<".a:depth.">)")
3316
3317 " insure that there are no folds
3318 setlocal nofen
3319
3320 " install ../ and shortdir
3321 if a:depth == ""
3322 call setline(line("$")+1,'../')
3323" call Decho("setline#".line("$")." ../ (depth is zero)")
3324 endif
3325 if a:dir =~ '^\a\+://'
3326 if a:dir == w:netrw_treetop
3327 let shortdir= a:dir
3328 else
3329 let shortdir= substitute(a:dir,'^.*/\([^/]\+\)/$','\1/','e')
3330 endif
3331 call setline(line("$")+1,a:depth.shortdir)
3332 else
3333 let shortdir= substitute(a:dir,'^.*/','','e')
3334 call setline(line("$")+1,a:depth.shortdir.'/')
3335 endif
3336" call Decho("setline#".line("$")." shortdir<".a:depth.shortdir.">")
3337
3338 " append a / to dir if its missing one
3339 let dir= a:dir
3340 if dir !~ '/$'
3341 let dir= dir.'/'
3342 endif
3343
3344 " display subtrees (if any)
3345 let depth= "| ".a:depth
3346" call Decho("display subtrees with depth<".depth."> and current leaves")
3347 for entry in w:netrw_treedict[a:dir]
3348 let direntry= substitute(dir.entry,'/$','','e')
3349" call Decho("dir<".dir."> entry<".entry."> direntry<".direntry.">")
3350 if entry =~ '/$' && has_key(w:netrw_treedict,direntry)
3351" call Decho("<".direntry."> is a key in treedict - display subtree for it")
3352 call s:NetTreeDisplay(direntry,depth)
3353 elseif entry =~ '/$' && has_key(w:netrw_treedict,direntry.'/')
3354" call Decho("<".direntry."/> is a key in treedict - display subtree for it")
3355 call s:NetTreeDisplay(direntry.'/',depth)
3356 else
3357" call Decho("<".entry."> is not a key in treedict (no subtree)")
3358 call setline(line("$")+1,depth.entry)
3359 endif
3360 endfor
3361" call Dret("NetTreeDisplay")
3362endfun
3363
3364" ---------------------------------------------------------------------
3365" NetTreeListing: displays tree listing from treetop on down, using NetTreeDisplay() {{{2
3366fun! s:NetTreeListing(dirname)
3367 if w:netrw_liststyle == s:TREELIST
3368" call Dfunc("NetTreeListing() bufname<".expand("%").">")
3369" call Decho("curdir<".a:dirname.">")
3370
3371 " update the treetop
3372" call Decho("update the treetop")
3373 if !exists("w:netrw_treetop")
3374 let w:netrw_treetop= a:dirname
3375" call Decho("w:netrw_treetop<".w:netrw_treetop."> (reusing)")
3376 elseif (w:netrw_treetop =~ ('^'.a:dirname) && strlen(a:dirname) < strlen(w:netrw_treetop)) || a:dirname !~ ('^'.w:netrw_treetop)
3377 let w:netrw_treetop= a:dirname
3378" call Decho("w:netrw_treetop<".w:netrw_treetop."> (went up)")
3379 endif
3380
3381 " insure that we have at least an empty treedict
3382 if !exists("w:netrw_treedict")
3383 let w:netrw_treedict= {}
3384 endif
3385
3386 " update the directory listing for the current directory
3387" call Decho("updating dictionary with ".a:dirname.":[..directory listing..]")
3388" call Decho("bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
3389 exe "silent! keepjumps ".w:netrw_bannercnt.',$g@^\.\.\=/$@d'
3390 let w:netrw_treedict[a:dirname]= getline(w:netrw_bannercnt,line("$"))
3391" call Decho("treedict=".string(w:netrw_treedict))
3392 exe "silent! keepjumps ".w:netrw_bannercnt.",$d"
3393
3394 " if past banner, record word
3395 if exists("w:netrw_bannercnt") && line(".") > w:netrw_bannercnt
3396 let fname= expand("<cword>")
3397 else
3398 let fname= ""
3399 endif
3400
3401 " display from treetop on down
3402 call s:NetTreeDisplay(w:netrw_treetop,"")
3403
3404 " place cursor
3405 if !exists("s:nbcd_curpos")
3406 if fname != ""
3407" call Decho("(NetTreeListing) place cursor <".fname.">")
3408 call search('\<'.fname.'\>','cw')
3409 elseif exists("w:netrw_bannercnt")
3410 exe (w:netrw_bannercnt+1)
3411" call Decho("(NetTreeListing) place cursor line#".(w:netrw_bannercnt+1))
3412 endif
3413 endif
3414
3415" call Dret("NetTreeListing : bufname<".expand("%").">")
3416 endif
3417endfun
3418
3419" ---------------------------------------------------------------------
3420" NetSaveWordPosn: used by the "s" command in both remote and local {{{2
3421" browsing. Along with NetRestoreWordPosn(), it keeps the cursor on
3422" the same word even though the sorting has changed its order of appearance.
3423fun! s:NetSaveWordPosn()
3424" call Dfunc("NetSaveWordPosn()")
3425 let s:netrw_saveword= '^'.escape(getline("."),s:netrw_cd_escape).'$'
3426" call Dret("NetSaveWordPosn : saveword<".s:netrw_saveword.">")
3427endfun
3428
3429" ---------------------------------------------------------------------
3430" NetRestoreWordPosn: used by the "s" command; see NetSaveWordPosn() above {{{2
3431fun! s:NetRestoreWordPosn()
3432" call Dfunc("NetRestoreWordPosn()")
3433 silent! call search(s:netrw_saveword,'w')
3434" call Dret("NetRestoreWordPosn")
3435endfun
3436
3437" ---------------------------------------------------------------------
3438" NetMakeDir: this function makes a directory (both local and remote) {{{2
3439fun! s:NetMakeDir(usrhost)
3440" call Dfunc("NetMakeDir(usrhost<".a:usrhost.">)")
3441
3442 " get name of new directory from user. A bare <CR> will skip.
3443 " if its currently a directory, also request will be skipped, but with
3444 " a message.
3445 call inputsave()
3446 let newdirname= input("Please give directory name: ")
3447 call inputrestore()
3448" call Decho("newdirname<".newdirname.">")
3449
3450 if newdirname == ""
3451" call Dret("NetMakeDir : user aborted with bare <cr>")
3452 return
3453 endif
3454
3455 if a:usrhost == ""
3456
3457 " Local mkdir:
3458 " sanity checks
3459 let fullnewdir= b:netrw_curdir.'/'.newdirname
3460" call Decho("fullnewdir<".fullnewdir.">")
3461 if isdirectory(fullnewdir)
3462 if !exists("g:netrw_quiet")
3463 call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a directory!",24)
3464 endif
3465" call Dret("NetMakeDir : directory<".newdirname."> exists previously")
3466 return
3467 endif
3468 if s:FileReadable(fullnewdir)
3469 if !exists("g:netrw_quiet")
3470 call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a file!",25)
3471 endif
3472" call Dret("NetMakeDir : file<".newdirname."> exists previously")
3473 return
3474 endif
3475
3476 " requested new local directory is neither a pre-existing file or
3477 " directory, so make it!
3478 if exists("*mkdir")
3479 call mkdir(fullnewdir,"p")
3480 else
3481 let netrw_origdir= s:NetGetcwd(1)
3482 exe 'keepjumps cd '.b:netrw_curdir
3483" call Decho("netrw_origdir<".netrw_origdir.">: cd b:netrw_curdir<".b:netrw_curdir.">")
3484" call Decho("exe silent! !".g:netrw_local_mkdir.' '.g:netrw_shq.newdirname.g:netrw_shq)
3485 exe "silent! !".g:netrw_local_mkdir.' '.g:netrw_shq.newdirname.g:netrw_shq
3486 if !g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
3487 if !g:netrw_keepdir
3488 exe 'keepjumps cd '.netrw_origdir
3489" call Decho("netrw_keepdir=".g:netrw_keepdir.": cd ".netrw_origdir)
3490 endif
3491 endif
3492
3493 if v:shell_error == 0
3494 " refresh listing
3495" call Decho("refresh listing")
3496 call netrw#NetSavePosn()
3497 call s:NetRefresh(1,s:NetBrowseChgDir(1,'./'))
3498 elseif !exists("g:netrw_quiet")
3499 call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",26)
3500 endif
3501 redraw!
3502
3503 else
3504 " Remote mkdir:
3505 let mkdircmd = s:MakeSshCmd(g:netrw_mkdir_cmd)
3506 let newdirname= substitute(b:netrw_curdir,'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname
3507" call Decho("exe silent! !".mkdircmd." ".g:netrw_shq.newdirname.g:netrw_shq)
3508 exe "silent! !".mkdircmd." ".g:netrw_shq.newdirname.g:netrw_shq
3509 if v:shell_error == 0
3510 " refresh listing
3511 call netrw#NetSavePosn()
3512 call s:NetRefresh(0,s:NetBrowseChgDir(0,'./'))
3513 elseif !exists("g:netrw_quiet")
3514 call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",27)
3515 endif
3516 redraw!
3517 endif
3518
3519" call Dret("NetMakeDir")
3520endfun
3521
3522" ---------------------------------------------------------------------
3523" NetBookmarkDir: {{{2
3524" 0: (user: <b>) bookmark current directory
3525" 1: (user: <B>) change to the bookmarked directory
3526" 2: (user: <q>) list bookmarks
3527" 3: (browsing) record current directory history
3528" 4: (user: <u>) go up (previous) bookmark
3529" 5: (user: <U>) go down (next) bookmark
3530fun! s:NetBookmarkDir(chg,curdir)
3531" call Dfunc("NetBookmarkDir(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count." bookmarkcnt=".g:NETRW_BOOKMARKMAX." histcnt=".g:NETRW_DIRHIST_CNT." bookmax=".g:NETRW_BOOKMARKMAX." histmax=".g:netrw_dirhistmax)
3532
3533 if a:chg == 0
3534 " bookmark the current directory
3535" call Decho("(user: <b>) bookmark the current directory")
3536 if v:count > 0
3537 " handle bookmark# specified via the count
3538 let g:NETRW_BOOKMARKDIR_{v:count}= a:curdir
3539 if !exists("g:NETRW_BOOKMARKMAX")
3540 let g:NETRW_BOOKMARKMAX= v:count
3541 elseif v:count > g:NETRW_BOOKMARKMAX
3542 let g:NETRW_BOOKMARKMAX= v:count
3543 endif
3544 else
3545 " handle no count specified
3546 let g:NETRW_BOOKMARKMAX = g:NETRW_BOOKMARKMAX + 1
3547 let g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX} = a:curdir
3548 endif
3549 echo "bookmarked the current directory"
3550
3551 elseif a:chg == 1
3552 " change to the bookmarked directory
3553" call Decho("(user: <B>) change to the bookmarked directory")
3554 if exists("g:NETRW_BOOKMARKDIR_{v:count}")
3555 exe "e ".g:NETRW_BOOKMARKDIR_{v:count}
3556 else
3557 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
3558 endif
3559
3560 elseif a:chg == 2
3561 redraw!
3562 let didwork= 0
3563 " list user's bookmarks
3564" call Decho("(user: <q>) list user's bookmarks")
3565 if exists("g:NETRW_BOOKMARKMAX")
3566" call Decho("list bookmarks [0,".g:NETRW_BOOKMARKMAX."]")
3567 let cnt= 0
3568 while cnt <= g:NETRW_BOOKMARKMAX
3569 if exists("g:NETRW_BOOKMARKDIR_{cnt}")
3570" call Decho("Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt})
3571 echo "Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt}
3572 let didwork= 1
3573 endif
3574 let cnt= cnt + 1
3575 endwhile
3576 endif
3577
3578 " list directory history
3579 let cnt = g:NETRW_DIRHIST_CNT
3580 let first = 1
3581 let histcnt = 0
3582 while ( first || cnt != g:NETRW_DIRHIST_CNT )
3583" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:NETRW_DIRHIST_CNT)
3584 let histcnt= histcnt + 1
3585 if exists("g:NETRW_DIRHIST_{cnt}")
3586" call Decho("Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt})
3587 echo "Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt}
3588 let didwork= 1
3589 endif
3590 let first = 0
3591 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
3592 if cnt < 0
3593 let cnt= cnt + g:netrw_dirhistmax
3594 endif
3595 endwhile
3596 if didwork
3597 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3598 endif
3599
3600 elseif a:chg == 3
3601 " saves most recently visited directories (when they differ)
3602" call Decho("(browsing) record curdir history")
3603 if !exists("g:NETRW_DIRHIST_0") || g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT} != a:curdir
3604 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
3605" let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= substitute(a:curdir,'[/\\]$','','e')
3606 let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= a:curdir
3607" call Decho("save dirhist#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
3608 endif
3609
3610 elseif a:chg == 4
3611 " u: change to the previous directory stored on the history list
3612" call Decho("(user: <u>) chg to prev dir from history")
3613 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
3614 if g:NETRW_DIRHIST_CNT < 0
3615 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
3616 endif
3617 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
3618" call Decho("changedir u#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
3619 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
3620 setlocal ma noro
3621 %d
3622 setlocal nomod
3623 endif
3624" call Decho("exe e! ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT})
3625 exe "e! ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
3626 else
3627 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
3628 echo "Sorry, no predecessor directory exists yet"
3629 endif
3630
3631 elseif a:chg == 5
3632 " U: change to the subsequent directory stored on the history list
3633" call Decho("(user: <U>) chg to next dir from history")
3634 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
3635 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
3636" call Decho("changedir U#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
3637 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
3638 setlocal ma noro
3639 %d
3640 setlocal nomod
3641 endif
3642" call Decho("exe e! ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT})
3643 exe "e! ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
3644 else
3645 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
3646 if g:NETRW_DIRHIST_CNT < 0
3647 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
3648 endif
3649 echo "Sorry, no successor directory exists yet"
3650 endif
3651 endif
3652 call s:NetBookmarkMenu()
3653" call Dret("NetBookmarkDir")
3654endfun
3655
3656" ---------------------------------------------------------------------
3657" NetBookmarkMenu: {{{2
3658fun! s:NetBookmarkMenu()
3659 if !exists("s:netrw_menucnt")
3660 return
3661 endif
3662" call Dfunc("NetBookmarkMenu() bookmarkcnt=".g:NETRW_BOOKMARKMAX." histcnt=".g:NETRW_DIRHIST_CNT." menucnt=".s:netrw_menucnt)
3663 if has("menu") && has("gui_running") && &go =~ 'm'
3664 if exists("g:NetrwTopLvlMenu")
3665 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Bookmark'
3666 endif
3667
3668 " show bookmarked places
3669 let cnt = 0
3670 while cnt <= g:NETRW_BOOKMARKMAX
3671 if exists("g:NETRW_BOOKMARKDIR_{cnt}")
3672 let bmdir= escape(g:NETRW_BOOKMARKDIR_{cnt},'.')
3673" call Decho('silent! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmark.'.bmdir.' :e '.g:NETRW_BOOKMARKDIR_{cnt})
3674 exe 'silent! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks.'.bmdir.' :e '.g:NETRW_BOOKMARKDIR_{cnt}."\<cr>"
3675 endif
3676 let cnt= cnt + 1
3677 endwhile
3678
3679 " show directory browsing history
3680 let cnt = g:NETRW_DIRHIST_CNT
3681 let first = 1
3682 let histcnt = 0
3683 while ( first || cnt != g:NETRW_DIRHIST_CNT )
3684 let histcnt = histcnt + 1
3685 let priority = g:NETRW_DIRHIST_CNT + histcnt
3686 if exists("g:NETRW_DIRHIST_{cnt}")
3687 let bmdir= escape(g:NETRW_DIRHIST_{cnt},'.')
3688" call Decho('silent! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.bmdir.' :e '.g:NETRW_DIRHIST_{cnt})
3689 exe 'silent! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.bmdir.' :e '.g:NETRW_DIRHIST_{cnt}."\<cr>"
3690 endif
3691 let first = 0
3692 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
3693 if cnt < 0
3694 let cnt= cnt + g:netrw_dirhistmax
3695 endif
3696 endwhile
3697 endif
3698" call Dret("NetBookmarkMenu")
3699endfun
3700
3701" ---------------------------------------------------------------------
3702" NetObtain: obtain file under cursor (for remote browsing support) {{{2
3703fun! netrw#NetObtain(vismode,...) range
3704" call Dfunc("NetObtain(vismode=".a:vismode.") a:0=".a:0)
3705
3706 if a:vismode == 0
3707 " normal mode
3708 let fname= expand("<cWORD>")
3709" call Decho("no arguments, use <".fname.">")
3710 elseif a:vismode == 1
3711 " visual mode
3712 let keeprega = @a
3713 norm! gv"ay
3714 if g:netrw_liststyle == s:THINLIST
3715 " thin listing
3716 let filelist= split(@a,'\n')
3717 elseif g:netrw_liststyle == s:LONGLIST
3718 " long listing
3719 let filelist= split(substitute(@a,'\t.\{-}\n','\n','g'),'\n')
3720 else
3721 " wide listing
3722 let filelist = split(substitute(@a,'\s\{2,}','\n','g'),'\n')
3723 let filelist = map(filelist,'substitute(v:val,"^\\s\\+","","")')
3724 let filelist = map(filelist,'substitute(v:val,"\\s\\+$","","")')
3725 endif
3726" call Decho("filelist<".string(filelist).">")
3727 let @a= keeprega
3728 for f in filelist
3729 if f != ""
3730 call netrw#NetObtain(2,f)
3731 endif
3732 endfor
3733" call Dret("NetObtain : visual mode handler")
3734 return
3735 elseif a:vismode == 2
3736 " multiple file mode
3737 let fname= a:1
3738" call Decho("visual mode handling: <".fname.">")
3739 endif
3740
3741 " NetrwStatusLine support - for obtaining support
3742 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.fname)
3743
3744 if exists("w:netrw_method") && w:netrw_method =~ '[235]'
3745" call Decho("method=".w:netrw_method)
3746 if executable("ftp")
3747" call Decho("ftp is executable, method=".w:netrw_method)
3748 let curdir = b:netrw_curdir
3749 let path = substitute(curdir,'ftp://[^/]\+/','','e')
3750 let curline= line(".")
3751 let endline= line("$")+1
3752 setlocal ma noro
3753 keepjumps $
3754" call Decho("getcwd<".getcwd().">")
3755" call Decho("curdir<".curdir.">")
3756" call Decho("path<".path.">")
3757" call Decho("curline=".curline)
3758" call Decho("endline=".endline)
3759
3760 ".........................................
3761 if w:netrw_method == 2
3762 " ftp + <.netrc>: Method #2
3763 setlocal ff=unix
3764 if path != ""
3765 put ='cd '.path
3766" call Decho("ftp: cd ".path)
3767 endif
3768 put ='get '.fname
3769" call Decho("ftp: get ".fname)
3770 put ='quit'
3771" call Decho("ftp: quit")
3772 if exists("g:netrw_port") && g:netrw_port != ""
3773" call Decho("exe ".g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
3774 exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
3775 else
3776" call Decho("exe ".g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
3777 exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
3778 endif
3779
3780 ".........................................
3781 elseif w:netrw_method == 3
3782 " ftp + machine,id,passwd,filename: Method #3
3783 setlocal ff=unix
3784 if exists("g:netrw_port") && g:netrw_port != ""
3785 put ='open '.g:netrw_machine.' '.g:netrw_port
3786" call Decho('ftp: open '.g:netrw_machine.' '.g:netrw_port)
3787 else
3788 put ='open '.g:netrw_machine
3789" call Decho('ftp: open '.g:netrw_machine)
3790 endif
3791
3792 if exists("g:netrw_ftp") && g:netrw_ftp == 1
3793 put =g:netrw_uid
3794 put ='\"'.g:netrw_passwd.'\"'
3795" call Decho('ftp: g:netrw_uid')
3796" call Decho('ftp: g:netrw_passwd')
3797 else
3798 put ='user \"'.g:netrw_uid.'\" \"'.g:netrw_passwd.'\"'
3799" call Decho('user '.g:netrw_uid.' '.g:netrw_passwd)
3800 endif
3801
3802 if path != ""
3803 put ='cd '.path
3804" call Decho('cd '.a:path)
3805 endif
3806 put ='get '.fname
3807" call Decho("ftp: get ".fname)
3808 put ='quit'
3809" call Decho("ftp: quit")
3810
3811 " perform ftp:
3812 " -i : turns off interactive prompting from ftp
3813 " -n unix : DON'T use <.netrc>, even though it exists
3814 " -n win32: quit being obnoxious about password
3815" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n")
3816 exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i -n"
3817
3818 ".........................................
3819 else
3820 call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",28)
3821 endif
3822 " restore
3823 exe "silent! ".endline.",$d"
3824 exe "keepjumps ".curline
3825 setlocal noma nomod ro
3826 else
3827" call Decho("ftp not executable")
3828 if !exists("g:netrw_quiet")
3829 call netrw#ErrorMsg(s:ERROR,"this system doesn't support ftp",29)
3830 endif
3831 " restore status line
3832 let &stl = s:netrw_users_stl
3833 let &laststatus = s:netrw_users_ls
3834 " restore NetMethod
3835 if exists("keep_netrw_method")
3836 call s:NetMethod(keep_netrw_choice)
3837 let w:netrw_method = keep_netrw_wmethod
3838 endif
3839" call Dret("NetObtain")
3840 return
3841 endif
3842
3843 ".........................................
3844 else
3845 " scp: Method#4
3846" call Decho("using scp")
3847 let curdir = b:netrw_curdir
3848 let path = substitute(curdir,'scp://[^/]\+/','','e')
3849" call Decho("path<".path.">")
3850 if exists("g:netrw_port") && g:netrw_port != ""
3851 let useport= " -P ".g:netrw_port
3852 else
3853 let useport= ""
3854 endif
3855" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".path.escape(fname,' ?&')." .")
3856 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".path.escape(fname,' ?&')." ."
3857 endif
3858 endif
3859
3860 " restore status line
3861 let &stl = s:netrw_users_stl
3862 let &laststatus = s:netrw_users_ls
3863 redraw!
3864
3865 " restore NetMethod
3866 if exists("keep_netrw_method")
3867 call s:NetMethod(keep_netrw_choice)
3868 let w:netrw_method = keep_netrw_wmethod
3869 endif
3870
3871" call Dret("NetObtain")
3872endfun
3873
3874" ---------------------------------------------------------------------
3875" NetPrevWinOpen: open file/directory in previous window. {{{2
3876" If there's only one window, then the window will first be split.
3877fun! s:NetPrevWinOpen(islocal)
3878" call Dfunc("NetPrevWinOpen(islocal=".a:islocal.")")
3879
3880 " get last window number and the word currently under the cursor
3881 let lastwinnr = winnr("$")
3882 let curword = s:NetGetWord()
3883" call Decho("lastwinnr=".lastwinnr." curword<".curword.">")
3884
3885 let didsplit = 0
3886 if lastwinnr == 1
3887 " if only one window, open a new one first
3888" call Decho("only one window, so open a new one (g:netrw_alto=".g:netrw_alto.")")
3889 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
3890 let didsplit = 1
3891
3892 else
3893 wincmd p
3894 " if the previous window's buffer has been changed (is modified),
3895 " and it doesn't appear in any other extant window, then ask the
3896 " user if s/he wants to abandon modifications therein.
3897 let bnr = winbufnr(0)
3898 let bnrcnt = 0
3899 if &mod
3900 windo if winbufnr(0) == bnr | let bnrcnt=bnrcnt+1 | endif
3901" call Decho("bnr=".bnr." bnrcnt=".bnrcnt)
3902 if bnrcnt == 1
3903 let bufname= bufname(winbufnr(winnr()))
3904 let choice= confirm("Save modified file<".bufname.">?","&Yes\n&No\n&Cancel")
3905
3906 if choice == 1
3907 " Yes -- write file & then browse
3908 let v:errmsg= ""
3909 silent w
3910 if v:errmsg != ""
3911 call netrw#ErrorMsg(s:ERROR,"unable to write <".bufname.">!",30)
3912 if didsplit
3913 q
3914 else
3915 wincmd p
3916 endif
3917" call Dret("NetPrevWinOpen : unable to write <".bufname.">")
3918 return
3919 endif
3920
3921 elseif choice == 2
3922 " No -- don't worry about changed file, just browse anyway
3923 setlocal nomod
3924 call netrw#ErrorMsg(s:WARNING,bufname." changes abandoned",31)
3925
3926 else
3927 " Cancel -- don't do this
3928 if didsplit
3929 q
3930 else
3931 wincmd p
3932 endif
3933" call Dret("NetPrevWinOpen : cancelled")
3934 return
3935 endif
3936 endif
3937 endif
3938 endif
3939
3940 if a:islocal
3941 call netrw#LocalBrowseCheck(s:NetBrowseChgDir(a:islocal,curword))
3942 else
3943 call s:NetBrowse(a:islocal,s:NetBrowseChgDir(a:islocal,curword))
3944 endif
3945" call Dret("NetPrevWinOpen")
3946endfun
3947
3948" ---------------------------------------------------------------------
3949" NetMenu: generates the menu for gvim and netrw {{{2
3950fun! s:NetMenu(domenu)
3951
3952 if !exists("g:NetrwMenuPriority")
3953 let g:NetrwMenuPriority= 80
3954 endif
3955
3956 if has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu
3957" call Dfunc("NetMenu(domenu=".a:domenu.")")
3958
3959 if !exists("s:netrw_menu_enabled") && a:domenu
3960" call Decho("initialize menu")
3961 let s:netrw_menu_enabled= 1
3962 exe 'silent! menu '.g:NetrwMenuPriority.'.1 '.g:NetrwTopLvlMenu.'Help<tab><F1> <F1>'
3963 call s:NetBookmarkMenu() " provide some history!
3964 exe 'silent! menu '.g:NetrwMenuPriority.'.4 '.g:NetrwTopLvlMenu.'Go\ Up\ Directory<tab>- -'
3965 exe 'silent! menu '.g:NetrwMenuPriority.'.5 '.g:NetrwTopLvlMenu.'Apply\ Special\ Viewer<tab>x x'
3966 exe 'silent! menu '.g:NetrwMenuPriority.'.6 '.g:NetrwTopLvlMenu.'Bookmark\ Current\ Directory<tab>mb mb'
3967 exe 'silent! menu '.g:NetrwMenuPriority.'.7 '.g:NetrwTopLvlMenu.'Goto\ Bookmarked\ Directory<tab>gb gb'
3968 exe 'silent! menu '.g:NetrwMenuPriority.'.8 '.g:NetrwTopLvlMenu.'Change\ To\ Recently\ Used\ Directory<tab>u u'
3969 exe 'silent! menu '.g:NetrwMenuPriority.'.9 '.g:NetrwTopLvlMenu.'Change\ To\ Subsequently\ Used\ Directory<tab>U U'
3970 exe 'silent! menu '.g:NetrwMenuPriority.'.10 '.g:NetrwTopLvlMenu.'Delete\ File/Directory<tab>D D'
3971 exe 'silent! menu '.g:NetrwMenuPriority.'.11 '.g:NetrwTopLvlMenu.'Edit\ File\ Hiding\ List<tab>'."<ctrl-h> \<c-h>"
3972 exe 'silent! menu '.g:NetrwMenuPriority.'.12 '.g:NetrwTopLvlMenu.'Edit\ File/Directory<tab><cr> '."\<cr>"
3973 exe 'silent! menu '.g:NetrwMenuPriority.'.13 '.g:NetrwTopLvlMenu.'Edit\ File/Directory,\ New\ Window<tab>o o'
3974 exe 'silent! menu '.g:NetrwMenuPriority.'.14 '.g:NetrwTopLvlMenu.'Edit\ File/Directory,\ New\ Vertical\ Window<tab>v v'
3975 exe 'silent! menu '.g:NetrwMenuPriority.'.15 '.g:NetrwTopLvlMenu.'List\ Bookmarks\ and\ History<tab>q q'
3976 exe 'silent! menu '.g:NetrwMenuPriority.'.16 '.g:NetrwTopLvlMenu.'Listing\ Style\ (thin-long-wide)<tab>i i'
3977 exe 'silent! menu '.g:NetrwMenuPriority.'.17 '.g:NetrwTopLvlMenu.'Make\ Subdirectory<tab>d d'
3978 exe 'silent! menu '.g:NetrwMenuPriority.'.18 '.g:NetrwTopLvlMenu.'Normal-Hide-Show<tab>a a'
3979 exe 'silent! menu '.g:NetrwMenuPriority.'.19 '.g:NetrwTopLvlMenu.'Obtain\ File<tab>O O'
3980 exe 'silent! menu '.g:NetrwMenuPriority.'.20 '.g:NetrwTopLvlMenu.'Preview\ File/Directory<tab>p p'
3981 exe 'silent! menu '.g:NetrwMenuPriority.'.21 '.g:NetrwTopLvlMenu.'Previous\ Window\ Browser<tab>P P'
3982 exe 'silent! menu '.g:NetrwMenuPriority.'.22 '.g:NetrwTopLvlMenu.'Refresh\ Listing<tab>'."<ctrl-l> \<c-l>"
3983 exe 'silent! menu '.g:NetrwMenuPriority.'.23 '.g:NetrwTopLvlMenu.'Rename\ File/Directory<tab>R R'
3984 exe 'silent! menu '.g:NetrwMenuPriority.'.24 '.g:NetrwTopLvlMenu.'Reverse\ Sorting\ Order<tab>'."r r"
3985 exe 'silent! menu '.g:NetrwMenuPriority.'.25 '.g:NetrwTopLvlMenu.'Select\ Sorting\ Style<tab>s s'
3986 exe 'silent! menu '.g:NetrwMenuPriority.'.26 '.g:NetrwTopLvlMenu.'Sorting\ Sequence\ Edit<tab>S S'
3987 exe 'silent! menu '.g:NetrwMenuPriority.'.27 '.g:NetrwTopLvlMenu.'Set\ Current\ Directory<tab>c c'
3988 exe 'silent! menu '.g:NetrwMenuPriority.'.28 '.g:NetrwTopLvlMenu.'Settings/Options<tab>:NetrwSettings '.":NetrwSettings\<cr>"
3989 let s:netrw_menucnt= 28
3990
3991 elseif !a:domenu
3992 let s:netrwcnt = 0
3993 let curwin = winnr()
3994 windo if getline(2) =~ "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif
3995 exe curwin."wincmd w"
3996
3997 if s:netrwcnt <= 1
3998" call Decho("clear menus")
3999 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Help'
4000 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Apply\ Special\ Viewer'
4001 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Bookmark\ Current\ Directory'
4002 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Go\ Up\ Directory'
4003 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Goto\ Bookmarked\ Directory'
4004 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Change\ To\ Recently\ Used\ Directory'
4005 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Change\ To\ Subsequently\ Used\ Directory'
4006 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Delete\ File/Directory'
4007 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Edit\ File/Directory'
4008 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Edit\ File/Directory,\ New\ Window'
4009 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Edit\ File/Directory,\ New\ Vertical\ Window'
4010 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Edit\ File\ Hiding\ List'
4011 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Edit\ File'
4012 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Enter\ File/Directory'
4013 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Enter\ File/Directory\ (vertical\ split)'
4014 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'List\ Bookmarks\ and\ History'
4015 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Listing\ Style\ (thin-long-wide)'
4016 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Make\ Subdirectory'
4017 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Normal-Hide-Show'
4018 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Obtain\ File'
4019 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Preview\ File/Directory'
4020 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Previous\ Window\ Browser'
4021 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Refresh\ Listing'
4022 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Rename\ File/Directory'
4023 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Reverse\ Sorting\ Order'
4024 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Select\ Sorting\ Style'
4025 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Sorting\ Sequence\ Edit'
4026 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Set\ Current\ Directory'
4027 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Settings/Options'
4028 exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Bookmarks'
4029 silent! unlet s:netrw_menu_enabled
4030 endif
4031 endif
4032" call Dret("NetMenu")
4033 endif
4034
4035endfun
4036
4037" ==========================================
4038" Local Directory Browsing Support: {{{1
4039" ==========================================
4040
4041" ---------------------------------------------------------------------
4042" LocalBrowseCheck: {{{2
4043fun! netrw#LocalBrowseCheck(dirname)
4044 " unfortunate interaction -- split window debugging can't be
4045" " used here, must use DechoRemOn or DechoTabOn -- the BufEnter
4046 " event triggers another call to LocalBrowseCheck() when attempts
4047 " to write to the DBG buffer are made.
4048" call Dfunc("LocalBrowseCheck(dirname<".a:dirname.">")
4049 if isdirectory(a:dirname)
4050 silent! call s:NetBrowse(1,a:dirname)
4051 endif
4052" call Dret("LocalBrowseCheck")
4053 " not a directory, ignore it
4054endfun
4055
4056" ---------------------------------------------------------------------
4057" LocalListing: does the job of "ls" for local directories {{{2
4058fun! s:LocalListing()
4059" call Dfunc("LocalListing() &ma=".&ma." &mod=".&mod." &ro=".&ro)
4060" if exists("b:netrw_curdir") |call Decho('b:netrw_curdir<'.b:netrw_curdir.">") |else|call Decho("b:netrw_curdir doesn't exist") |endif
4061" 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
4062
4063 " get the list of files contained in the current directory
4064 let dirname = escape(b:netrw_curdir,s:netrw_glob_escape)
4065 let dirnamelen = strlen(b:netrw_curdir)
4066 let filelist = glob(s:ComposePath(dirname,"*"))
4067" call Decho("glob(dirname<".dirname."/*>)=".filelist)
4068 if filelist != ""
4069 let filelist= filelist."\n"
4070 endif
4071 let filelist= filelist.glob(s:ComposePath(dirname,".*"))
4072" call Decho("glob(dirname<".dirname."/.*>)=".glob(dirname.".*"))
4073
4074 " if the directory name includes a "$", and possibly other characters,
4075 " the glob() doesn't include "." and ".." entries.
4076 if filelist !~ '[\\/]\.[\\/]\=\(\n\|$\)'
4077" call Decho("forcibly tacking on .")
4078 if filelist == ""
4079 let filelist= s:ComposePath(dirname,"./")
4080 else
4081 let filelist= filelist."\n".s:ComposePath(b:netrw_curdir,"./")
4082 endif
4083" call Decho("filelist<".filelist.">")
4084 endif
4085 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
4086" call Decho("forcibly tacking on ..")
4087 let filelist= filelist."\n".s:ComposePath(b:netrw_curdir,"../")
4088" call Decho("filelist<".filelist.">")
4089 endif
4090 if b:netrw_curdir == '/'
4091 " remove .. from filelist when current directory is root directory
4092 let filelist= substitute(filelist,'/\.\.\n','','')
4093" call Decho("remove .. from filelist")
4094 endif
4095 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
4096 if (has("win32") || has("win95") || has("win64") || has("win16"))
4097 let filelist= substitute(filelist,'\','/','ge')
4098 else
4099 let filelist= substitute(filelist,'\','\\','ge')
4100 endif
4101
4102" call Decho("dirname<".dirname.">")
4103" call Decho("dirnamelen<".dirnamelen.">")
4104" call Decho("filelist<".filelist.">")
4105
4106 while filelist != ""
4107 if filelist =~ '\n'
4108 let filename = substitute(filelist,'\n.*$','','e')
4109 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
4110 else
4111 let filename = filelist
4112 let filelist = ""
4113 endif
4114 let pfile= filename
4115 if isdirectory(filename)
4116 let pfile= filename."/"
4117 endif
4118 if pfile =~ '//$'
4119 let pfile= substitute(pfile,'//$','/','e')
4120 endif
4121 let pfile= strpart(pfile,dirnamelen)
4122 let pfile= substitute(pfile,'^[/\\]','','e')
4123" call Decho(" ")
4124" call Decho("filename<".filename.">")
4125" call Decho("pfile <".pfile.">")
4126
4127 if w:netrw_liststyle == s:LONGLIST
4128 let sz = getfsize(filename)
4129 let fsz = strpart(" ",1,15-strlen(sz)).sz
4130 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
4131" call Decho("sz=".sz." fsz=".fsz)
4132 endif
4133
4134 if g:netrw_sort_by =~ "^t"
4135 " sort by time (handles time up to 1 quintillion seconds, US)
4136" call Decho("getftime(".filename.")=".getftime(filename))
4137 let t = getftime(filename)
4138 let ft = strpart("000000000000000000",1,18-strlen(t)).t
4139" call Decho("exe keepjumps put ='".ft.'/'.filename."'")
4140 let ftpfile= ft.'/'.pfile
4141 keepjumps silent! put=ftpfile
4142
4143 elseif g:netrw_sort_by =~ "^s"
4144 " sort by size (handles file sizes up to 1 quintillion bytes, US)
4145" call Decho("getfsize(".filename.")=".getfsize(filename))
4146 let sz = getfsize(filename)
4147 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
4148" call Decho("exe keepjumps put ='".fsz.'/'.filename."'")
4149 let fszpfile= fsz.'/'.pfile
4150 keepjumps silent! put =fszpfile
4151
4152 else
4153 " sort by name
4154" call Decho("exe keepjumps put ='".pfile."'")
4155 keepjumps silent! put=pfile
4156 endif
4157 endwhile
4158
4159 " cleanup any windows mess at end-of-line
4160 silent! keepjumps %s/\r$//e
4161 setlocal ts=32
4162" call Decho("setlocal ts=32")
4163
4164" call Dret("LocalListing")
4165endfun
4166
4167" ---------------------------------------------------------------------
4168" LocalBrowseShellCmdRefresh: this function is called after a user has {{{2
4169" performed any shell command. The idea is to cause all local-browsing
4170" buffers to be refreshed after a user has executed some shell command,
4171" on the chance that s/he removed/created a file/directory with it.
4172fun! s:LocalBrowseShellCmdRefresh()
4173" call Dfunc("LocalBrowseShellCmdRefresh() browselist=".string(s:netrw_browselist))
4174 " determine which buffers currently reside in a tab
4175 let itab = 1
4176 let buftablist = []
4177 while itab <= tabpagenr("$")
4178 let buftablist= buftablist + tabpagebuflist()
4179 let itab= itab + 1
4180 tabn
4181 endwhile
4182" call Decho("buftablist".string(buftablist))
4183 " GO through all buffers on netrw_browselist (ie. just local-netrw buffers):
4184 " | refresh any netrw window
4185 " | wipe out any non-displaying netrw buffer
4186 let curwin = winnr()
4187 let ibl = 0
4188 for ibuf in s:netrw_browselist
4189" call Decho("bufwinnr(".ibuf.") index(buftablist,".ibuf.")=".index(buftablist,ibuf))
4190 if bufwinnr(ibuf) == -1 && index(buftablist,ibuf) == -1
4191" call Decho("wiping buf#".ibuf,"<".bufname(ibuf).">")
4192 exe "silent! bw ".ibuf
4193 call remove(s:netrw_browselist,ibl)
4194" call Decho("browselist=".string(s:netrw_browselist))
4195 continue
4196 elseif index(tabpagebuflist(),ibuf) != -1
4197" call Decho("refresh buf#".ibuf.'-> win#'.bufwinnr(ibuf))
4198 exe bufwinnr(ibuf)."wincmd w"
4199 call s:NetRefresh(1,s:NetBrowseChgDir(1,'./'))
4200 endif
4201 let ibl= ibl + 1
4202 endfor
4203 exe curwin."wincmd w"
4204
4205" call Dret("LocalBrowseShellCmdRefresh")
4206endfun
4207
4208" ---------------------------------------------------------------------
4209" LocalBrowseRm: {{{2
4210fun! s:LocalBrowseRm(path) range
4211" call Dfunc("LocalBrowseRm(path<".a:path.">)")
4212" call Decho("firstline=".a:firstline." lastline=".a:lastline)
4213
4214 " preparation for removing multiple files/directories
4215 let ctr = a:firstline
4216 let ret = 0
4217 let all= 0
4218
4219 " remove multiple files and directories
4220 while ctr <= a:lastline
4221 exe "keepjumps ".ctr
4222
4223 " sanity checks
4224 if line(".") < w:netrw_bannercnt
4225 let ctr= ctr + 1
4226 continue
4227 endif
4228 let curword= s:NetGetWord()
4229 if curword == "./" || curword == "../"
4230 let ctr= ctr + 1
4231 continue
4232 endif
4233
4234 norm! 0
4235 let rmfile= s:ComposePath(a:path,curword)
4236" call Decho("rmfile<".rmfile.">")
4237
4238 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
4239 " attempt to remove file
4240 if !all
4241 echohl Statement
4242 call inputsave()
4243 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
4244 call inputrestore()
4245 echohl NONE
4246 if ok == ""
4247 let ok="no"
4248 endif
4249" call Decho("response: ok<".ok.">")
4250 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
4251" call Decho("response: ok<".ok."> (after sub)")
4252 if ok =~ 'a\%[ll]'
4253 let all= 1
4254 endif
4255 endif
4256
4257 if all || ok =~ 'y\%[es]' || ok == ""
4258 let ret= s:System("delete",rmfile)
4259" call Decho("errcode=".v:shell_error." ret=".ret)
4260 elseif ok =~ 'q\%[uit]'
4261 break
4262 endif
4263
4264 else
4265 " attempt to remove directory
4266 if !all
4267 echohl Statement
4268 call inputsave()
4269 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
4270 call inputrestore()
4271 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
4272 if ok == ""
4273 let ok="no"
4274 endif
4275 if ok =~ 'a\%[ll]'
4276 let all= 1
4277 endif
4278 endif
4279 let rmfile= substitute(rmfile,'[\/]$','','e')
4280
4281 if all || ok =~ 'y\%[es]' || ok == ""
4282" call Decho("1st attempt: system(".g:netrw_local_rmdir.' "'.rmfile.'")')
4283 call s:System("system",g:netrw_local_rmdir.' "'.rmfile.'"')
4284" call Decho("v:shell_error=".v:shell_error)
4285
4286 if v:shell_error != 0
4287" call Decho("2nd attempt to remove directory<".rmfile.">")
4288 let errcode= s:System("delete",rmfile)
4289" call Decho("errcode=".errcode)
4290
4291 if errcode != 0
4292 if has("unix")
4293" call Decho("3rd attempt to remove directory<".rmfile.">")
4294 call s:System("system","rm ".rmfile)
4295 if v:shell_error != 0 && !exists("g:netrw_quiet")
4296 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",34)
Bram Moolenaar83bab712005-08-01 21:58:57 +00004297endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00004298 elseif !exists("g:netrw_quiet")
4299 call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",35)
4300 endif
4301 endif
4302 endif
4303
4304 elseif ok =~ 'q\%[uit]'
4305 break
4306 endif
4307 endif
4308
4309 let ctr= ctr + 1
4310 endwhile
4311
4312 " refresh the directory
4313 let curline= line(".")
4314" call Decho("refresh the directory")
4315 call s:NetRefresh(1,s:NetBrowseChgDir(1,'./'))
4316 exe curline
4317
4318" call Dret("LocalBrowseRm")
4319endfun
4320
4321" ---------------------------------------------------------------------
4322" LocalBrowseRename: rename a remote file or directory {{{2
4323fun! s:LocalBrowseRename(path) range
4324" call Dfunc("LocalBrowseRename(path<".a:path.">)")
4325
4326 " preparation for removing multiple files/directories
4327 let ctr= a:firstline
4328
4329 " attempt to rename files/directories
4330 while ctr <= a:lastline
4331 exe "keepjumps ".ctr
4332
4333 " sanity checks
4334 if line(".") < w:netrw_bannercnt
4335 let ctr= ctr + 1
4336 continue
4337 endif
4338 let curword= s:NetGetWord()
4339 if curword == "./" || curword == "../"
4340 let ctr= ctr + 1
4341 continue
4342 endif
4343
4344 norm! 0
4345 let oldname= s:ComposePath(a:path,curword)
4346" call Decho("oldname<".oldname.">")
4347
4348 call inputsave()
4349 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
4350 call inputrestore()
4351
4352 let ret= rename(oldname,newname)
4353" call Decho("renaming <".oldname."> to <".newname.">")
4354
4355 let ctr= ctr + 1
4356 endwhile
4357
4358 " refresh the directory
4359" call Decho("refresh the directory listing")
4360 call netrw#NetSavePosn()
4361 call s:NetRefresh(1,s:NetBrowseChgDir(1,'./'))
4362" call Dret("LocalBrowseRename")
4363endfun
4364
4365" ---------------------------------------------------------------------
4366" LocalFastBrowser: handles setting up/taking down fast browsing for the {{{2
4367" local browser
4368" fastbrowse Local Remote Hiding a buffer implies it may be re-used (fast)
4369" slow 0 D D Deleting a buffer implies it will not be re-used (slow)
4370" med 1 D H
4371" fast 2 H H
4372fun! s:LocalFastBrowser()
4373" call Dfunc("LocalFastBrowser() g:netrw_fastbrowse=".g:netrw_fastbrowse)
4374
4375 " initialize browselist, a list of buffer numbers that the local browser has used
4376 if !exists("s:netrw_browselist")
4377" call Decho("initialize s:netrw_browselist")
4378 let s:netrw_browselist= []
4379 endif
4380
4381 " append current buffer to fastbrowse list
4382 if g:netrw_fastbrowse <= 1 && (empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1])
4383" call Decho("appendng current buffer to browselist")
4384 call add(s:netrw_browselist,bufnr("%"))
4385" call Decho("browselist=".string(s:netrw_browselist))
4386 endif
4387
4388 " enable autocmd events to handle refreshing/removing local browser buffers
4389 " If local browse buffer is currently showing: refresh it
4390 " If local browse buffer is currently hidden : wipe it
4391 if !exists("s:netrw_browser_shellcmd") && g:netrw_fastbrowse <= 1
4392" call Decho("setting up local-browser shell command refresh")
4393 let s:netrw_browser_shellcmd= 1
4394 augroup AuNetrwShellCmd
4395 au!
4396 if (has("win32") || has("win95") || has("win64") || has("win16"))
4397 au ShellCmdPost * call s:LocalBrowseShellCmdRefresh()
4398 else
4399 au ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()
4400 endif
4401 augroup END
4402 endif
4403
4404 " user must have changed fastbrowse to its fast setting, so remove
4405 " the associated autocmd events
4406 if g:netrw_fastbrowse > 1 && exists("s:netrw_browser_shellcmd")
4407" call Decho("remove AuNetrwShellCmd autcmd group")
4408 unlet s:netrw_browser_shellcmd
4409 augroup AuNetrwShellCmd
4410 au!
4411 augroup END
4412 augroup! AuNetrwShellCmd
4413 endif
4414
4415" call Dret("LocalFastBrowser")
4416endfun
4417
4418" ---------------------------------------------------------------------
4419" LocalObtain: copy selected file to current working directory {{{2
4420fun! s:LocalObtain()
4421" call Dfunc("LocalObtain()")
4422 if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir
4423 let fname= expand("<cWORD>")
4424 let fcopy= readfile(b:netrw_curdir."/".fname,"b")
4425 call writefile(fcopy,getcwd()."/".fname,"b")
4426 elseif !exists("b:netrw_curdir")
4427 call netrw#ErrorMsg(s:ERROR,"local browsing directory doesn't exist!",36)
4428 else
4429 call netrw#ErrorMsg(s:ERROR,"local browsing directory and current directory are identical",37)
4430 endif
4431" call Dret("LocalObtain")
4432endfun
4433
4434" ---------------------------------------------------------------------
4435" netrw#Explore: launch the local browser in the directory of the current file {{{2
4436" dosplit==0: the window will be split iff the current file has
4437" been modified
4438" dosplit==1: the window will be split before running the local
4439" browser
4440fun! netrw#Explore(indx,dosplit,style,...)
4441" call Dfunc("netrw#Explore(indx=".a:indx." dosplit=".a:dosplit." style=".a:style.",a:1<".a:1.">) &modified=".&modified)
4442 if !exists("b:netrw_curdir")
4443 let b:netrw_curdir= getcwd()
4444 endif
4445 let curfile = b:netrw_curdir
4446" call Decho("curfile<".curfile.">")
4447
4448 " save registers
4449 silent! let keepregstar = @*
4450 silent! let keepregplus = @+
4451 silent! let keepregslash= @/
4452
4453 " if dosplit or file has been modified
4454 if a:dosplit || &modified || a:style == 6
4455" call Decho("case: dosplit=".a:dosplit." modified=".&modified." a:style=".a:style)
4456 call s:SaveWinVars()
4457
4458 if a:style == 0 " Explore, Sexplore
4459" call Decho("style=0: Explore or Sexplore")
4460 exe g:netrw_winsize."wincmd s"
4461
4462 elseif a:style == 1 "Explore!, Sexplore!
4463" call Decho("style=1: Explore! or Sexplore!")
4464 exe g:netrw_winsize."wincmd v"
4465
4466 elseif a:style == 2 " Hexplore
4467" call Decho("style=2: Hexplore")
4468 exe "bel ".g:netrw_winsize."wincmd s"
4469
4470 elseif a:style == 3 " Hexplore!
4471" call Decho("style=3: Hexplore!")
4472 exe "abo ".g:netrw_winsize."wincmd s"
4473
4474 elseif a:style == 4 " Vexplore
4475" call Decho("style=4: Vexplore")
4476 exe "lefta ".g:netrw_winsize."wincmd v"
4477
4478 elseif a:style == 5 " Vexplore!
4479" call Decho("style=5: Vexplore!")
4480 exe "rightb ".g:netrw_winsize."wincmd v"
4481
4482 elseif a:style == 6 " Texplore
4483 call s:SaveBufVars()
4484" call Decho("style = 6: Texplore")
4485 tabnew
4486 call s:RestoreBufVars()
4487 endif
4488 call s:RestoreWinVars()
4489 endif
4490 norm! 0
4491
4492" call Decho("a:1<".a:1.">")
4493 if a:1 =~ '^\~' && (has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin))
4494 let dirname= substitute(a:1,'\~',expand("$HOME"),'')
4495" call Decho("using dirname<".dirname."> (case: ~ && unix||cygwin)")
4496 elseif a:1 == '.'
4497 let dirname= exists("b:netrw_curdir")? b:netrw_curdir : getcwd()
4498 if dirname !~ '/$'
4499 let dirname= dirname."/"
4500 endif
4501" call Decho("using dirname<".dirname."> (case: ".(exists("b:netrw_curdir")? "b:netrw_curdir" : "getcwd()").")")
4502 else
4503 let dirname= a:1
4504" call Decho("using dirname<".dirname.">")
4505 endif
4506
4507 if dirname =~ '^\*/'
4508 " Explore */pattern
4509" call Decho("case Explore */pattern")
4510 let pattern= substitute(dirname,'^\*/\(.*\)$','\1','')
4511" call Decho("Explore */pat: dirname<".dirname."> -> pattern<".pattern.">")
4512 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
4513 elseif dirname =~ '^\*\*//'
4514 " Explore **//pattern
4515" call Decho("case Explore **//pattern")
4516 let pattern = substitute(dirname,'^\*\*//','','')
4517 let starstarpat = 1
4518" call Decho("Explore **//pat: dirname<".dirname."> -> pattern<".pattern.">")
4519 endif
4520
4521 if dirname == "" && a:indx >= 0
4522 " Explore Hexplore Vexplore Sexplore
4523" call Decho("case Explore Hexplore Vexplore Sexplore")
4524 let newdir= substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
4525 if newdir =~ '^scp:' || newdir =~ '^ftp:'
4526" call Decho("calling NetBrowse(0,newdir<".newdir.">)")
4527 call s:NetBrowse(0,newdir)
4528 else
4529 if newdir == ""|let newdir= getcwd()|endif
4530" call Decho("calling LocalBrowseCheck(newdir<".newdir.">)")
4531 call netrw#LocalBrowseCheck(newdir)
4532 endif
4533 call search('\<'.substitute(curfile,'^.*/','','e').'\>','cW')
4534
4535 elseif dirname =~ '^\*\*/' || a:indx < 0 || dirname =~ '^\*/'
4536 " Nexplore, Pexplore, Explore **/... , or Explore */pattern
4537" call Decho("case Nexplore, Pexplore, <s-down>, <s-up>, Explore dirname<".dirname.">")
4538 if !mapcheck("<s-up>","n") && !mapcheck("<s-down>","n") && exists("b:netrw_curdir")
4539" call Decho("set up <s-up> and <s-down> maps")
4540 let s:didstarstar= 1
4541 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
4542 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
4543 endif
4544
4545 if has("path_extra")
4546" call Decho("has path_extra")
4547 if !exists("w:netrw_explore_indx")
4548 let w:netrw_explore_indx= 0
4549 endif
4550 let indx = a:indx
4551" call Decho("set indx= [a:indx=".indx."]")
4552"
4553 if indx == -1
4554 "Nexplore
4555" call Decho("case Nexplore: (indx=".indx.")")
4556 if !exists("w:netrw_explore_list") " sanity check
4557 call netrw#ErrorMsg(s:WARNING,"using Nexplore or <s-down> improperly; see help for netrw-starstar",40)
4558 silent! let @* = keepregstar
4559 silent! let @+ = keepregstar
4560 silent! let @/ = keepregslash
4561" call Dret("netrw#Explore")
4562 return
4563 endif
4564 let indx= w:netrw_explore_indx
4565 if indx < 0 | let indx= 0 | endif
4566 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
4567 let curfile= w:netrw_explore_list[indx]
4568" call Decho("indx=".indx." curfile<".curfile.">")
4569 while indx < w:netrw_explore_listlen && curfile == w:netrw_explore_list[indx]
4570 let indx= indx + 1
4571" call Decho("indx=".indx." (Nexplore while loop)")
4572 endwhile
4573 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
4574" call Decho("Nexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
4575
4576 elseif indx == -2
4577 "Pexplore
4578" call Decho("case Pexplore: (indx=".indx.")")
4579 if !exists("w:netrw_explore_list") " sanity check
4580 call netrw#ErrorMsg(s:WARNING,"using Pexplore or <s-up> improperly; see help for netrw-starstar",41)
4581 silent! let @* = keepregstar
4582 silent! let @+ = keepregstar
4583 silent! let @/ = keepregslash
4584" call Dret("netrw#Explore")
4585 return
4586 endif
4587 let indx= w:netrw_explore_indx
4588 if indx < 0 | let indx= 0 | endif
4589 if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
4590 let curfile= w:netrw_explore_list[indx]
4591" call Decho("indx=".indx." curfile<".curfile.">")
4592 while indx >= 0 && curfile == w:netrw_explore_list[indx]
4593 let indx= indx - 1
4594" call Decho("indx=".indx." (Pexplore while loop)")
4595 endwhile
4596 if indx < 0 | let indx= 0 | endif
4597" call Decho("Pexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
4598
4599 else
4600 " Explore -- initialize
4601 " build list of files to Explore with Nexplore/Pexplore
4602" call Decho("case Explore: initialize (indx=".indx.")")
4603 let w:netrw_explore_indx= 0
4604 if !exists("b:netrw_curdir")
4605 let b:netrw_curdir= getcwd()
4606 endif
4607" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
4608
4609 if exists("pattern")
4610" call Decho("pattern exists: building list pattern<".pattern."> cwd<".getcwd().">")
4611 if exists("starstarpat")
4612" call Decho("starstarpat<".starstarpat.">")
4613 try
4614 exe "silent vimgrep /".pattern."/gj "."**/*"
4615 catch /^Vim\%((\a\+)\)\=:E480/
4616 call netrw#ErrorMsg(s:WARNING,'no files matched pattern<'.pattern.'>',45)
4617 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
4618 silent! let @* = keepregstar
4619 silent! let @+ = keepregstar
4620 silent! let @/ = keepregslash
4621" call Dret("netrw#Explore : no files matched pattern")
4622 return
4623 endtry
4624 let s:netrw_curdir = b:netrw_curdir
4625 let w:netrw_explore_list = getqflist()
4626 let w:netrw_explore_list = map(w:netrw_explore_list,'s:netrw_curdir."/".bufname(v:val.bufnr)')
4627 else
4628" call Decho("no starstarpat")
4629 exe "vimgrep /".pattern."/gj ".b:netrw_curdir."/*"
4630 let w:netrw_explore_list = map(getqflist(),'bufname(v:val.bufnr)')
4631 if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
4632 endif
4633 else
4634" call Decho("no pattern: building list based on ".b:netrw_curdir."/".dirname)
4635 let w:netrw_explore_list= split(expand(b:netrw_curdir."/".dirname),'\n')
4636 if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif
4637 endif
4638
4639 let w:netrw_explore_listlen = len(w:netrw_explore_list)
4640" call Decho("w:netrw_explore_list<".string(w:netrw_explore_list)."> listlen=".w:netrw_explore_listlen)
4641
4642 if w:netrw_explore_listlen == 0 || (w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/')
4643 call netrw#ErrorMsg(s:WARNING,"no files matched",42)
4644 silent! let @* = keepregstar
4645 silent! let @+ = keepregstar
4646 silent! let @/ = keepregslash
4647" call Dret("netrw#Explore : no files matched")
4648 return
4649 endif
4650 endif
4651
4652 " NetrwStatusLine support - for exploring support
4653 let w:netrw_explore_indx= indx
4654" call Decho("explorelist<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
4655
4656 " wrap the indx around, but issue a note
4657 if indx >= w:netrw_explore_listlen || indx < 0
4658" call Decho("wrap indx (indx=".indx." listlen=".w:netrw_explore_listlen.")")
4659 let indx = (indx < 0)? ( w:netrw_explore_listlen - 1 ) : 0
4660 let w:netrw_explore_indx= indx
4661 call netrw#ErrorMsg(s:NOTE,"no more files match Explore pattern",43)
4662 sleep 1
4663 endif
4664
4665 exe "let dirfile= w:netrw_explore_list[".indx."]"
4666" call Decho("dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">")
4667 let newdir= substitute(dirfile,'/[^/]*$','','e')
4668" call Decho("newdir<".newdir.">")
4669
4670" call Decho("calling LocalBrowseCheck(newdir<".newdir.">)")
4671 call netrw#LocalBrowseCheck(newdir)
4672 if !exists("w:netrw_liststyle")
4673 let w:netrw_liststyle= g:netrw_liststyle
4674 endif
4675 if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:LONGLIST
4676 call search('^'.substitute(dirfile,"^.*/","","").'\>',"W")
4677 else
4678 call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w")
4679 endif
4680 let w:netrw_explore_mtchcnt = indx + 1
4681 let w:netrw_explore_bufnr = bufnr("%")
4682 let w:netrw_explore_line = line(".")
4683 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}')
4684" call Decho("explore: mtchcnt=".w:netrw_explore_mtchcnt." bufnr=".w:netrw_explore_bufnr." line#".w:netrw_explore_line)
4685
4686 else
4687" call Decho("vim does not have path_extra")
4688 if !exists("g:netrw_quiet")
4689 call netrw#ErrorMsg(s:WARNING,"your vim needs the +path_extra feature for Exploring with **!",44)
4690 endif
4691 silent! let @* = keepregstar
4692 silent! let @+ = keepregstar
4693 silent! let @/ = keepregslash
4694" call Dret("netrw#Explore : missing +path_extra")
4695 return
4696 endif
4697
4698 else
4699" call Decho("case Explore newdir<".dirname.">")
4700 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && dirname =~ '/'
4701 silent! unlet w:netrw_treedict
4702 silent! unlet w:netrw_treetop
4703 endif
4704 let newdir= dirname
4705 if !exists("b:netrw_curdir")
4706 call netrw#LocalBrowseCheck(getcwd())
4707 else
4708 call netrw#LocalBrowseCheck(s:NetBrowseChgDir(1,newdir))
4709 endif
4710 endif
4711
4712 silent! let @* = keepregstar
4713 silent! let @+ = keepregstar
4714 silent! let @/ = keepregslash
4715" call Dret("netrw#Explore : @/<".@/.">")
4716endfun
4717
4718" ---------------------------------------------------------------------
4719" s:ExplorePatHls: converts an Explore pattern into a regular expression search pattern {{{2
4720fun! s:ExplorePatHls(pattern)
4721" call Dfunc("s:ExplorePatHls(pattern<".a:pattern.">)")
4722 let repat= substitute(a:pattern,'^**/\{1,2}','','')
4723" call Decho("repat<".repat.">")
4724 let repat= escape(repat,'][.\')
4725" call Decho("repat<".repat.">")
4726 let repat= '\<'.substitute(repat,'\*','\\(\\S\\+ \\)*\\S\\+','g').'\>'
4727" call Dret("s:ExplorePatHls repat<".repat.">")
4728 return repat
4729endfun
4730
4731" ---------------------------------------------------------------------
4732" SetupNetrwStatusLine: {{{2
4733fun! s:SetupNetrwStatusLine(statline)
4734" call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)")
4735
4736 if !exists("s:netrw_setup_statline")
4737 let s:netrw_setup_statline= 1
4738" call Decho("do first-time status line setup")
4739
4740 if !exists("s:netrw_users_stl")
4741 let s:netrw_users_stl= &stl
4742 endif
4743 if !exists("s:netrw_users_ls")
4744 let s:netrw_users_ls= &laststatus
4745 endif
4746
4747 " set up User9 highlighting as needed
4748 let keepa= @a
4749 redir @a
4750 try
4751 hi User9
4752 catch /^Vim\%((\a\+)\)\=:E411/
4753 if &bg == "dark"
4754 hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue
4755 else
4756 hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue
4757 endif
4758 endtry
4759 redir END
4760 let @a= keepa
4761 endif
4762
4763 " set up status line (may use User9 highlighting)
4764 " insure that windows have a statusline
4765 " make sure statusline is displayed
4766 let &stl=a:statline
4767 setlocal laststatus=2
4768" call Decho("stl=".&stl)
4769 redraw!
4770
4771" call Dret("SetupNetrwStatusLine : stl=".&stl)
4772endfun
4773
4774" ---------------------------------------------------------------------
4775" NetrwStatusLine: {{{2
4776fun! NetrwStatusLine()
4777
4778" vvv NetrwStatusLine() debugging vvv
4779" let g:stlmsg=""
4780" if !exists("w:netrw_explore_bufnr")
4781" let g:stlmsg="!X<explore_bufnr>"
4782" elseif w:netrw_explore_bufnr != bufnr("%")
4783" let g:stlmsg="explore_bufnr!=".bufnr("%")
4784" endif
4785" if !exists("w:netrw_explore_line")
4786" let g:stlmsg=" !X<explore_line>"
4787" elseif w:netrw_explore_line != line(".")
4788" let g:stlmsg=" explore_line!={line(.)<".line(".").">"
4789" endif
4790" if !exists("w:netrw_explore_list")
4791" let g:stlmsg=" !X<explore_list>"
4792" endif
4793" ^^^ NetrwStatusLine() debugging ^^^
4794
4795 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")
4796 " restore user's status line
4797 let &stl = s:netrw_users_stl
4798 let &laststatus = s:netrw_users_ls
4799 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
4800 if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif
4801 return ""
4802 else
4803 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
4804 endif
4805endfun
4806
4807" ---------------------------------------------------------------------
4808" NetGetcwd: get the current directory. {{{2
4809" Change backslashes to forward slashes, if any.
4810" If doesc is true, escape certain troublesome characters
4811fun! s:NetGetcwd(doesc)
4812" call Dfunc("NetGetcwd(doesc=".a:doesc.")")
4813 let curdir= substitute(getcwd(),'\\','/','ge')
4814 if curdir !~ '[\/]$'
4815 let curdir= curdir.'/'
4816 endif
4817 if a:doesc
4818 let curdir= escape(curdir,s:netrw_cd_escape)
4819 endif
4820" call Dret("NetGetcwd <".curdir.">")
4821 return curdir
4822endfun
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00004823
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004824" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00004825" SetSort: sets up the sort based on the g:netrw_sort_sequence {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00004826" What this function does is to compute a priority for the patterns
4827" in the g:netrw_sort_sequence. It applies a substitute to any
4828" "files" that satisfy each pattern, putting the priority / in
4829" front. An "*" pattern handles the default priority.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00004830fun! s:SetSort()
Bram Moolenaar488c6512005-08-11 20:09:58 +00004831" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
Bram Moolenaar9964e462007-05-05 17:54:07 +00004832 if w:netrw_liststyle == s:LONGLIST
Bram Moolenaar8299df92004-07-10 09:47:34 +00004833 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
4834 else
4835 let seqlist = g:netrw_sort_sequence
4836 endif
4837 " sanity check -- insure that * appears somewhere
4838 if seqlist == ""
4839 let seqlist= '*'
4840 elseif seqlist !~ '\*'
4841 let seqlist= seqlist.',*'
4842 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004843 let priority = 1
4844 while seqlist != ""
4845 if seqlist =~ ','
4846 let seq = substitute(seqlist,',.*$','','e')
4847 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
4848 else
4849 let seq = seqlist
4850 let seqlist = ""
4851 endif
4852 let eseq= escape(seq,'/')
4853 if priority < 10
4854 let spriority= "00".priority.'\/'
4855 elseif priority < 100
4856 let spriority= "0".priority.'\/'
4857 else
4858 let spriority= priority.'\/'
4859 endif
4860" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
4861
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00004862 " sanity check
Bram Moolenaar488c6512005-08-11 20:09:58 +00004863 if w:netrw_bannercnt > line("$")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00004864 " apparently no files were left after a Hiding pattern was used
4865" call Dret("SetSort : no files left after hiding")
4866 return
4867 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004868 if seq == '*'
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004869 exe 'silent keepjumps '.w:netrw_bannercnt.',$v/^\d\{3}\//s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004870 else
Bram Moolenaar1afcace2005-11-25 19:54:28 +00004871 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/'.eseq.'/s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004872 endif
4873 let priority = priority + 1
4874 endwhile
4875
Bram Moolenaar7fc904b2006-04-13 20:37:35 +00004876 " Following line associated with priority -- items that satisfy a priority
4877 " pattern get prefixed by ###/ which permits easy sorting by priority.
4878 " Sometimes files can satisfy multiple priority patterns -- only the latest
4879 " priority pattern needs to be retained. So, at this point, these excess
4880 " priority prefixes need to be removed, but not directories that happen to
4881 " be just digits themselves.
Bram Moolenaar8dff8182006-04-06 20:18:50 +00004882 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\d\{3}\/\)\%(\d\{3}\/\)\+\ze./\1/e'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004883
4884" call Dret("SetSort")
4885endfun
4886
Bram Moolenaar9964e462007-05-05 17:54:07 +00004887" =====================================================================
4888" Support Functions: {{{1
4889
Bram Moolenaar488c6512005-08-11 20:09:58 +00004890" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00004891" ComposePath: Appends a new part to a path taking different systems into consideration {{{2
4892fun! s:ComposePath(base,subdir)
4893" call Dfunc("s:ComposePath(base<".a:base."> subdir<".a:subdir.">)")
4894 if(has("amiga"))
4895 let ec = a:base[strlen(a:base)-1]
4896 if ec != '/' && ec != ':'
4897 let ret = a:base . "/" . a:subdir
4898 else
4899 let ret = a:base . a:subdir
4900 endif
4901 elseif a:base =~ '^\a\+://'
4902 let urlbase = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\1','')
4903 let curpath = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\2','')
4904 let ret = urlbase.curpath.a:subdir
4905" call Decho("urlbase<".urlbase.">")
4906" call Decho("curpath<".curpath.">")
4907" call Decho("ret<".ret.">")
4908 else
4909 let ret = substitute(a:base."/".a:subdir,"//","/","g")
4910 endif
4911" call Dret("s:ComposePath ".ret)
4912 return ret
Bram Moolenaar488c6512005-08-11 20:09:58 +00004913endfun
4914
4915" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00004916" netrw#ErrorMsg: {{{2
4917" 0=note = s:NOTE
4918" 1=warning = s:WARNING
4919" 2=error = s:ERROR
4920" Mar 19, 2007 : max errnum currently is 49
4921fun! netrw#ErrorMsg(level,msg,errnum)
4922" call Dfunc("netrw#ErrorMsg(level=".a:level." msg<".a:msg."> errnum=".a:errnum.")")
4923
4924 " record current window number for NetRestorePosn()'s benefit
4925 let s:winBeforeErr= winnr()
4926
4927 " getting messages out reliably is just plain difficult!
4928 " This attempt splits the current window, creating a one line window.
4929 let errbufnum= bufnr("NetrwMessage")
4930
4931 bo 1split
4932 enew
4933 setlocal bt=nofile
4934 file NetrwMessage
4935
4936 put ='***netrw*** '.a:msg
4937 if &fo !~ '[ta]'
4938 syn clear
4939 syn match netrwMesg "^\*\*\*netrw\*\*\*"
4940 if a:level == s:WARNING
4941 hi link netrwMesg WarningMsg
4942 elseif a:level == s:ERROR
4943 hi link netrwMesg Error
4944 endif
4945 endif
4946 1d
4947 setlocal noma ro bh=wipe
4948
4949" call Dret("netrw#ErrorMsg")
4950endfun
4951
4952" ---------------------------------------------------------------------
4953" netrw#RFC2396: converts %xx into characters {{{2
4954fun! netrw#RFC2396(fname)
4955" call Dfunc("netrw#RFC2396(fname<".a:fname.">)")
4956 let fname = escape(substitute(a:fname,'%\(\x\x\)','\=nr2char("0x".submatch(1))','ge')," \t")
4957" call Dret("netrw#RFC2396 ".fname)
4958 return fname
4959endfun
4960
4961" ---------------------------------------------------------------------
4962" s:FileReadable: o/s independent filereadable {{{2
4963fun! s:FileReadable(fname)
4964" call Dfunc("s:FileReadable(fname<".a:fname.">)")
4965
4966 if g:netrw_cygwin
4967 let ret= filereadable(substitute(a:fname,'/cygdrive/\(.\)','\1:/',''))
4968 else
4969 let ret= filereadable(a:fname)
4970 endif
4971
4972" call Dret("s:FileReadable ".ret)
4973 return ret
4974endfun
4975
4976" ---------------------------------------------------------------------
4977" s:GetTempfile: gets a tempname that'll work for various o/s's {{{2
4978" Places correct suffix on end of temporary filename,
4979" using the suffix provided with fname
4980fun! s:GetTempfile(fname)
4981" call Dfunc("s:GetTempfile(fname<".a:fname.">)")
4982
4983 if !exists("b:netrw_tmpfile")
4984 " get a brand new temporary filename
4985 let tmpfile= tempname()
4986" call Decho("tmpfile<".tmpfile."> : from tempname()")
4987
4988 let tmpfile= escape(substitute(tmpfile,'\','/','ge'),g:netrw_tmpfile_escape)
4989" call Decho("tmpfile<".tmpfile."> : chgd any \\ -> /")
4990
4991 " sanity check -- does the temporary file's directory exist?
4992 if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
4993 call netrw#ErrorMsg(s:ERROR,"your <".substitute(tmpfile,'[^/]\+$','','e')."> directory is missing!",2)
4994" call Dret("s:GetTempfile getcwd<".getcwd().">")
4995 return ""
4996 endif
4997
4998 " let netrw#NetSource() know about the tmpfile
4999 let s:netrw_tmpfile= tmpfile " used by netrw#NetSource()
5000" call Decho("tmpfile<".tmpfile."> s:netrw_tmpfile<".s:netrw_tmpfile.">")
5001
5002 " o/s dependencies
5003 if g:netrw_cygwin == 1
5004 let tmpfile = substitute(tmpfile,'^\(\a\):','/cygdrive/\1','e')
5005 elseif has("win32") || has("win95") || has("win64") || has("win16")
5006 let tmpfile = substitute(tmpfile,'/','\\','g')
5007 else
5008 let tmpfile = tmpfile
5009 endif
5010 let b:netrw_tmpfile= tmpfile
5011" call Decho("o/s dependent fixed tempname<".tmpfile.">")
5012 else
5013 " re-use temporary filename
5014 let tmpfile= b:netrw_tmpfile
5015" call Decho("tmpfile<".tmpfile."> re-using")
5016 endif
5017
5018 " use fname's suffix for the temporary file
5019 if a:fname != ""
5020 if a:fname =~ '\.[^./]\+$'
5021" call Decho("using fname<".a:fname.">'s suffix")
5022 if a:fname =~ '.tar.gz' || a:fname =~ '.tar.bz2'
5023 let suffix = ".tar".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
5024 else
5025 let suffix = substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
5026 endif
5027 let suffix = escape(suffix,g:netrw_tmpfile_escape)
5028" call Decho("suffix<".suffix.">")
5029 let tmpfile= substitute(tmpfile,'\.tmp$','','e')
5030" call Decho("chgd tmpfile<".tmpfile."> (removed any .tmp suffix)")
5031 let tmpfile .= suffix
5032" call Decho("chgd tmpfile<".tmpfile."> (added ".suffix." suffix) netrw_fname<".b:netrw_fname.">")
5033 let s:netrw_tmpfile= tmpfile " supports netrw#NetSource()
5034 endif
5035 endif
5036
5037" call Dret("s:GetTempfile <".tmpfile.">")
5038 return tmpfile
5039endfun
5040
5041" ---------------------------------------------------------------------
5042" s:MakeSshCmd: transforms input command using USEPORT HOSTNAME into {{{2
5043" a correct command
5044fun! s:MakeSshCmd(sshcmd)
5045" call Dfunc("s:MakeSshCmd(sshcmd<".a:sshcmd.">)")
5046 let sshcmd = substitute(a:sshcmd,'\<HOSTNAME\>',s:user.s:machine,'')
5047 if exists("g:netrw_port") && g:netrw_port != ""
5048 let sshcmd= substitute(sshcmd,"USEPORT",'-P '.g:netrw_port,'')
5049 elseif exists("s:port") && s:port != ""
5050 let sshcmd= substitute(sshcmd,"USEPORT",'-P '.s:port,'')
5051 else
5052 let sshcmd= substitute(sshcmd,"USEPORT ",'','')
5053 endif
5054" call Dret("s:MakeSshCmd <".sshcmd.">")
5055 return sshcmd
5056endfun
5057
5058" ---------------------------------------------------------------------
5059" s:NetrwEnew: opens a new buffer, passes netrw buffer variables through {{{2
5060fun! s:NetrwEnew(curdir)
5061" call Dfunc("s:NetrwEnew(curdir<".a:curdir.">) expand(%)<".expand("%").">")
5062
5063 " grab a function-local copy of buffer variables
5064 if exists("b:netrw_bannercnt") |let netrw_bannercnt = b:netrw_bannercnt |endif
5065 if exists("b:netrw_browser_active") |let netrw_browser_active = b:netrw_browser_active |endif
5066 if exists("b:netrw_cpf") |let netrw_cpf = b:netrw_cpf |endif
5067 if exists("b:netrw_curdir") |let netrw_curdir = b:netrw_curdir |endif
5068 if exists("b:netrw_explore_bufnr") |let netrw_explore_bufnr = b:netrw_explore_bufnr |endif
5069 if exists("b:netrw_explore_indx") |let netrw_explore_indx = b:netrw_explore_indx |endif
5070 if exists("b:netrw_explore_line") |let netrw_explore_line = b:netrw_explore_line |endif
5071 if exists("b:netrw_explore_list") |let netrw_explore_list = b:netrw_explore_list |endif
5072 if exists("b:netrw_explore_listlen")|let netrw_explore_listlen = b:netrw_explore_listlen|endif
5073 if exists("b:netrw_explore_mtchcnt")|let netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
5074 if exists("b:netrw_fname") |let netrw_fname = b:netrw_fname |endif
5075 if exists("b:netrw_lastfile") |let netrw_lastfile = b:netrw_lastfile |endif
5076 if exists("b:netrw_liststyle") |let netrw_liststyle = b:netrw_liststyle |endif
5077 if exists("b:netrw_method") |let netrw_method = b:netrw_method |endif
5078 if exists("b:netrw_option") |let netrw_option = b:netrw_option |endif
5079 if exists("b:netrw_prvdir") |let netrw_prvdir = b:netrw_prvdir |endif
5080
5081 if getline(2) =~ '^" Netrw Directory Listing'
5082" call Decho("generate a buffer with keepjumps keepalt enew! (1)")
5083 keepjumps keepalt enew!
5084 else
5085" call Decho("generate a buffer with keepjumps enew! (2)")
5086 keepjumps enew!
5087 endif
5088
5089 " copy function-local variables to buffer variable equivalents
5090 if exists("netrw_bannercnt") |let b:netrw_bannercnt = netrw_bannercnt |endif
5091 if exists("netrw_browser_active") |let b:netrw_browser_active = netrw_browser_active |endif
5092 if exists("netrw_cpf") |let b:netrw_cpf = netrw_cpf |endif
5093 if exists("netrw_curdir") |let b:netrw_curdir = netrw_curdir |endif
5094 if exists("netrw_explore_bufnr") |let b:netrw_explore_bufnr = netrw_explore_bufnr |endif
5095 if exists("netrw_explore_indx") |let b:netrw_explore_indx = netrw_explore_indx |endif
5096 if exists("netrw_explore_line") |let b:netrw_explore_line = netrw_explore_line |endif
5097 if exists("netrw_explore_list") |let b:netrw_explore_list = netrw_explore_list |endif
5098 if exists("netrw_explore_listlen")|let b:netrw_explore_listlen = netrw_explore_listlen|endif
5099 if exists("netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = netrw_explore_mtchcnt|endif
5100 if exists("netrw_fname") |let b:netrw_fname = netrw_fname |endif
5101 if exists("netrw_lastfile") |let b:netrw_lastfile = netrw_lastfile |endif
5102 if exists("netrw_liststyle") |let b:netrw_liststyle = netrw_liststyle |endif
5103 if exists("netrw_method") |let b:netrw_method = netrw_method |endif
5104 if exists("netrw_option") |let b:netrw_option = netrw_option |endif
5105 if exists("netrw_prvdir") |let b:netrw_prvdir = netrw_prvdir |endif
5106
5107 let b:netrw_curdir= a:curdir
5108 if b:netrw_curdir =~ '/$'
5109 if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
5110 file NetrwTreeListing
5111 else
5112 exe "silent! file ".b:netrw_curdir
5113 endif
5114 endif
5115
5116" call Dret("s:NetrwEnew : buf#".bufnr("%"))
5117endfun
5118
5119" ------------------------------------------------------------------------
5120" s:RemotePathAnalysis: {{{2
5121fun! s:RemotePathAnalysis(dirname)
5122" call Dfunc("s:RemotePathAnalysis()")
5123
5124 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/:#]\+\)\%([:#]\(\d\+\)\)\=/\(.*\)$'
5125 let s:method = substitute(a:dirname,dirpat,'\1','')
5126 let s:user = substitute(a:dirname,dirpat,'\2','')
5127 let s:machine = substitute(a:dirname,dirpat,'\3','')
5128 let s:port = substitute(a:dirname,dirpat,'\4','')
5129 let s:path = substitute(a:dirname,dirpat,'\5','')
5130 let s:fname = substitute(a:dirname,'^.*/\ze.','','')
5131
5132" call Decho("set up s:method <".s:method .">")
5133" call Decho("set up s:user <".s:user .">")
5134" call Decho("set up s:machine<".s:machine.">")
5135" call Decho("set up s:port <".s:port.">")
5136" call Decho("set up s:path <".s:path .">")
5137" call Decho("set up s:fname <".s:fname .">")
5138
5139" call Dret("s:RemotePathAnalysis")
5140endfun
5141
5142" ---------------------------------------------------------------------
5143" s:RestoreBufVars: {{{2
5144fun! s:RestoreBufVars()
5145" call Dfunc("s:RestoreBufVars()")
5146
5147 if exists("s:netrw_curdir") |let b:netrw_curdir = s:netrw_curdir |endif
5148 if exists("s:netrw_lastfile") |let b:netrw_lastfile = s:netrw_lastfile |endif
5149 if exists("s:netrw_method") |let b:netrw_method = s:netrw_method |endif
5150 if exists("s:netrw_fname") |let b:netrw_fname = s:netrw_fname |endif
5151 if exists("s:netrw_machine") |let b:netrw_machine = s:netrw_machine |endif
5152 if exists("s:netrw_browser_active")|let b:netrw_browser_active = s:netrw_browser_active|endif
5153
5154" call Dret("s:RestoreBufVars")
5155endfun
5156
5157" ---------------------------------------------------------------------
5158" s:RestoreWinVars: (used by Explore() and NetSplit()) {{{2
5159fun! s:RestoreWinVars()
5160" call Dfunc("s:RestoreWinVars()")
Bram Moolenaar488c6512005-08-11 20:09:58 +00005161 if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00005162 if exists("s:col") |let w:netrw_col = s:col |unlet s:col |endif
5163 if exists("s:curdir") |let w:netrw_curdir = s:curdir |unlet s:curdir |endif
5164 if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif
5165 if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif
5166 if exists("s:explore_line") |let w:netrw_explore_line = s:explore_line |unlet s:explore_line |endif
5167 if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
5168 if exists("s:explore_list") |let w:netrw_explore_list = s:explore_list |unlet s:explore_list |endif
5169 if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
5170 if exists("s:fpl") |let w:netrw_fpl = s:fpl |unlet s:fpl |endif
5171 if exists("s:hline") |let w:netrw_hline = s:hline |unlet s:hline |endif
5172 if exists("s:line") |let w:netrw_line = s:line |unlet s:line |endif
5173 if exists("s:liststyle") |let w:netrw_liststyle = s:liststyle |unlet s:liststyle |endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00005174 if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif
5175 if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif
Bram Moolenaar9964e462007-05-05 17:54:07 +00005176 if exists("s:treedict") |let w:netrw_treedict = s:treedict |unlet s:treedict |endif
5177 if exists("s:treetop") |let w:netrw_treetop = s:treetop |unlet s:treetop |endif
5178 if exists("s:winnr") |let w:netrw_winnr = s:winnr |unlet s:winnr |endif
5179" call Dret("s:RestoreWinVars")
Bram Moolenaar488c6512005-08-11 20:09:58 +00005180endfun
5181
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00005182" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00005183" s:SaveBufVars: {{{2
5184fun! s:SaveBufVars()
5185" call Dfunc("s:SaveBufVars()")
5186
5187 if exists("b:netrw_curdir") |let s:netrw_curdir = b:netrw_curdir |endif
5188 if exists("b:netrw_lastfile") |let s:netrw_lastfile = b:netrw_lastfile |endif
5189 if exists("b:netrw_method") |let s:netrw_method = b:netrw_method |endif
5190 if exists("b:netrw_fname") |let s:netrw_fname = b:netrw_fname |endif
5191 if exists("b:netrw_machine") |let s:netrw_machine = b:netrw_machine |endif
5192 if exists("b:netrw_browser_active")|let s:netrw_browser_active = b:netrw_browser_active|endif
5193
5194" call Dret("s:SaveBufVars")
5195endfun
5196
5197" ---------------------------------------------------------------------
5198" s:SaveWinVars: (used by Explore() and NetSplit()) {{{2
5199fun! s:SaveWinVars()
5200" call Dfunc("s:SaveWinVars()")
5201 if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif
5202 if exists("w:netrw_col") |let s:col = w:netrw_col |endif
5203 if exists("w:netrw_curdir") |let s:curdir = w:netrw_curdir |endif
5204 if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif
5205 if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif
5206 if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif
5207 if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
5208 if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif
5209 if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
5210 if exists("w:netrw_fpl") |let s:fpl = w:netrw_fpl |endif
5211 if exists("w:netrw_hline") |let s:hline = w:netrw_hline |endif
5212 if exists("w:netrw_line") |let s:line = w:netrw_line |endif
5213 if exists("w:netrw_liststyle") |let s:liststyle = w:netrw_liststyle |endif
5214 if exists("w:netrw_method") |let s:method = w:netrw_method |endif
5215 if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif
5216 if exists("w:netrw_treedict") |let s:treedict = w:netrw_treedict |endif
5217 if exists("w:netrw_treetop") |let s:treetop = w:netrw_treetop |endif
5218 if exists("w:netrw_winnr") |let s:winnr = w:netrw_winnr |endif
5219" call Dret("s:SaveWinVars")
5220endfun
5221
5222" ---------------------------------------------------------------------
5223" s:SetBufWinVars: (used by NetBrowse() and LocalBrowseCheck()) {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00005224" To allow separate windows to have their own activities, such as
5225" Explore **/pattern, several variables have been made window-oriented.
5226" However, when the user splits a browser window (ex: ctrl-w s), these
Bram Moolenaar1afcace2005-11-25 19:54:28 +00005227" variables are not inherited by the new window. SetBufWinVars() and
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00005228" UseBufWinVars() get around that.
Bram Moolenaar1afcace2005-11-25 19:54:28 +00005229fun! s:SetBufWinVars()
Bram Moolenaar9964e462007-05-05 17:54:07 +00005230" call Dfunc("s:SetBufWinVars()")
5231 if exists("w:netrw_liststyle") |let b:netrw_liststyle = w:netrw_liststyle |endif
5232 if exists("w:netrw_bannercnt") |let b:netrw_bannercnt = w:netrw_bannercnt |endif
5233 if exists("w:netrw_method") |let b:netrw_method = w:netrw_method |endif
5234 if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif
5235 if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif
5236 if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen= w:netrw_explore_listlen|endif
5237 if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt= w:netrw_explore_mtchcnt|endif
5238 if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif
5239 if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif
5240 if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif
5241" call Dret("s:SetBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00005242endfun
5243
5244" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +00005245" s:System: using Steve Hall's idea to insure that Windows paths stay {{{2
5246" acceptable. No effect on Unix paths.
5247" Examples of use: let result= s:System("system",path)
5248" let result= s:System("delete",path)
5249fun! s:System(cmd,path)
5250" call Dfunc("s:System(cmd<".a:cmd."> path<".a:path.">)")
5251
5252 let path = a:path
5253 if (has("win32") || has("win95") || has("win64") || has("win16"))
5254 " system call prep
5255 " remove trailing slash (Win95)
5256 let path = substitute(path, '\(\\\|/\)$', '', 'g')
5257 " remove escaped spaces
5258 let path = substitute(path, '\ ', ' ', 'g')
5259 " convert slashes to backslashes
5260 let path = substitute(path, '/', '\', 'g')
5261 if exists("+shellslash")
5262 let sskeep= &shellslash
5263 setlocal noshellslash
5264 exe "let result= ".a:cmd."('".path."')"
5265 let &shellslash = sskeep
5266 else
5267 exe "let result= ".a:cmd."(".g:netrw_shq.path.g:netrw_shq.")"
5268 endif
5269 else
5270 exe "let result= ".a:cmd."('".path."')"
5271 endif
5272
5273" call Decho("result<".result.">")
5274" call Dret("s:System")
5275 return result
5276endfun
5277
5278" ---------------------------------------------------------------------
5279" s:UseBufWinVars: (used by NetBrowse() and LocalBrowseCheck() {{{2
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00005280" Matching function to BufferWinVars()
5281fun! s:UseBufWinVars()
Bram Moolenaar9964e462007-05-05 17:54:07 +00005282" call Dfunc("s:UseBufWinVars()")
5283 if exists("b:netrw_liststyle") && !exists("w:netrw_liststyle") |let w:netrw_liststyle = b:netrw_liststyle |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00005284 if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif
5285 if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif
5286 if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif
5287 if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif
5288 if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
5289 if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
5290 if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif
5291 if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif
5292 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 +00005293" call Dret("s:UseBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00005294endfun
5295
Bram Moolenaar1afcace2005-11-25 19:54:28 +00005296" ---------------------------------------------------------------------
Bram Moolenaarafeb4fa2006-02-01 21:51:12 +00005297" Settings Restoration: {{{2
Bram Moolenaar83bab712005-08-01 21:58:57 +00005298let &cpo= s:keepcpo
5299unlet s:keepcpo
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00005300
Bram Moolenaar071d4272004-06-13 20:20:40 +00005301" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00005302" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +00005303" vim:ts=8 fdm=marker