blob: 2b6f8f7a0f10b4f1fc19f386b1586d02f78404e4 [file] [log] [blame]
Bram Moolenaara5fac542005-10-12 20:58:49 +00001" netrwFileHandlers: contains various extension-based file handlers for
2" netrw's browsers' x command ("eXecute launcher")
Christian Brabandtf9ca1392024-02-19 20:37:11 +01003" Maintainer: This runtime file is looking for a new maintainer.
4" Original Author: Charles E. Campbell
Bram Moolenaar1d59aa12020-09-19 18:50:13 +02005" Date: Sep 18, 2020
6" Version: 11
Bram Moolenaarff034192013-04-24 18:51:19 +02007" Copyright: Copyright (C) 1999-2012 Charles E. Campbell {{{1
Bram Moolenaara5fac542005-10-12 20:58:49 +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,
11" netrwFileHandlers.vim is provided *as is* and comes with no
12" warranty of any kind, either expressed or implied. In no
13" event will the copyright holder be liable for any damages
14" resulting from the use of this software.
15"
16" Rom 6:23 (WEB) For the wages of sin is death, but the free gift of God {{{1
17" is eternal life in Christ Jesus our Lord.
18
19" ---------------------------------------------------------------------
20" Load Once: {{{1
21if exists("g:loaded_netrwFileHandlers") || &cp
22 finish
23endif
Bram Moolenaar1d59aa12020-09-19 18:50:13 +020024let g:loaded_netrwFileHandlers= "v11"
Bram Moolenaar5c736222010-01-06 20:54:52 +010025if v:version < 702
26 echohl WarningMsg
27 echo "***warning*** this version of netrwFileHandlers needs vim 7.2"
28 echohl Normal
29 finish
30endif
Bram Moolenaara5fac542005-10-12 20:58:49 +000031let s:keepcpo= &cpo
32set cpo&vim
Bram Moolenaara5fac542005-10-12 20:58:49 +000033
34" ---------------------------------------------------------------------
Bram Moolenaard68071d2006-05-02 22:08:30 +000035" netrwFileHandlers#Invoke: {{{1
Bram Moolenaar1056d982006-03-09 22:37:52 +000036fun! netrwFileHandlers#Invoke(exten,fname)
37" call Dfunc("netrwFileHandlers#Invoke(exten<".a:exten."> fname<".a:fname.">)")
Bram Moolenaare6ae6222013-05-21 21:01:10 +020038 let exten= a:exten
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000039 " list of supported special characters. Consider rcs,v --- that can be
40 " supported with a NFH_rcsCOMMAv() handler
Bram Moolenaare6ae6222013-05-21 21:01:10 +020041 if exten =~ '[@:,$!=\-+%?;~]'
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000042 let specials= {
43\ '@' : 'AT',
44\ ':' : 'COLON',
45\ ',' : 'COMMA',
46\ '$' : 'DOLLAR',
47\ '!' : 'EXCLAMATION',
48\ '=' : 'EQUAL',
49\ '-' : 'MINUS',
50\ '+' : 'PLUS',
51\ '%' : 'PERCENT',
52\ '?' : 'QUESTION',
53\ ';' : 'SEMICOLON',
54\ '~' : 'TILDE'}
Bram Moolenaare6ae6222013-05-21 21:01:10 +020055 let exten= substitute(a:exten,'[@:,$!=\-+%?;~]','\=specials[submatch(0)]','ge')
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000056" call Decho('fname<'.fname.'> done with dictionary')
57 endif
Bram Moolenaar1056d982006-03-09 22:37:52 +000058
Bram Moolenaare6ae6222013-05-21 21:01:10 +020059 if a:exten != "" && exists("*NFH_".exten)
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000060 " support user NFH_*() functions
61" call Decho("let ret= netrwFileHandlers#NFH_".a:exten.'("'.fname.'")')
Bram Moolenaare6ae6222013-05-21 21:01:10 +020062 exe "let ret= NFH_".exten.'("'.a:fname.'")'
63 elseif a:exten != "" && exists("*s:NFH_".exten)
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000064 " use builtin-NFH_*() functions
65" call Decho("let ret= netrwFileHandlers#NFH_".a:exten.'("'.fname.'")')
Bram Moolenaare6ae6222013-05-21 21:01:10 +020066 exe "let ret= s:NFH_".a:exten.'("'.a:fname.'")'
Bram Moolenaar1056d982006-03-09 22:37:52 +000067 endif
Bram Moolenaar5b435d62012-04-05 17:33:26 +020068
Bram Moolenaar1056d982006-03-09 22:37:52 +000069" call Dret("netrwFileHandlers#Invoke 0 : ret=".ret)
70 return 0
Bram Moolenaara5fac542005-10-12 20:58:49 +000071endfun
72
73" ---------------------------------------------------------------------
Bram Moolenaar1056d982006-03-09 22:37:52 +000074" s:NFH_html: handles html when the user hits "x" when the {{{1
Bram Moolenaara5fac542005-10-12 20:58:49 +000075" cursor is atop a *.html file
Bram Moolenaar1056d982006-03-09 22:37:52 +000076fun! s:NFH_html(pagefile)
77" call Dfunc("s:NFH_html(".a:pagefile.")")
Bram Moolenaara5fac542005-10-12 20:58:49 +000078
79 let page= substitute(a:pagefile,'^','file://','')
80
81 if executable("mozilla")
82" call Decho("executing !mozilla ".page)
Bram Moolenaar5c736222010-01-06 20:54:52 +010083 exe "!mozilla ".shellescape(page,1)
Bram Moolenaara5fac542005-10-12 20:58:49 +000084 elseif executable("netscape")
85" call Decho("executing !netscape ".page)
Bram Moolenaar5c736222010-01-06 20:54:52 +010086 exe "!netscape ".shellescape(page,1)
Bram Moolenaara5fac542005-10-12 20:58:49 +000087 else
Bram Moolenaar1056d982006-03-09 22:37:52 +000088" call Dret("s:NFH_html 0")
Bram Moolenaara5fac542005-10-12 20:58:49 +000089 return 0
90 endif
91
Bram Moolenaar1056d982006-03-09 22:37:52 +000092" call Dret("s:NFH_html 1")
Bram Moolenaara5fac542005-10-12 20:58:49 +000093 return 1
94endfun
95
96" ---------------------------------------------------------------------
Bram Moolenaar1056d982006-03-09 22:37:52 +000097" s:NFH_htm: handles html when the user hits "x" when the {{{1
Bram Moolenaara5fac542005-10-12 20:58:49 +000098" cursor is atop a *.htm file
Bram Moolenaar1056d982006-03-09 22:37:52 +000099fun! s:NFH_htm(pagefile)
100" call Dfunc("s:NFH_htm(".a:pagefile.")")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000101
102 let page= substitute(a:pagefile,'^','file://','')
103
104 if executable("mozilla")
105" call Decho("executing !mozilla ".page)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100106 exe "!mozilla ".shellescape(page,1)
Bram Moolenaara5fac542005-10-12 20:58:49 +0000107 elseif executable("netscape")
108" call Decho("executing !netscape ".page)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100109 exe "!netscape ".shellescape(page,1)
Bram Moolenaara5fac542005-10-12 20:58:49 +0000110 else
Bram Moolenaar1056d982006-03-09 22:37:52 +0000111" call Dret("s:NFH_htm 0")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000112 return 0
113 endif
114
Bram Moolenaar1056d982006-03-09 22:37:52 +0000115" call Dret("s:NFH_htm 1")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000116 return 1
117endfun
118
119" ---------------------------------------------------------------------
Bram Moolenaar1056d982006-03-09 22:37:52 +0000120" s:NFH_jpg: {{{1
121fun! s:NFH_jpg(jpgfile)
122" call Dfunc("s:NFH_jpg(jpgfile<".a:jpgfile.">)")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000123
124 if executable("gimp")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100125 exe "silent! !gimp -s ".shellescape(a:jpgfile,1)
Bram Moolenaara5fac542005-10-12 20:58:49 +0000126 elseif executable(expand("$SystemRoot")."/SYSTEM32/MSPAINT.EXE")
127" call Decho("silent! !".expand("$SystemRoot")."/SYSTEM32/MSPAINT ".escape(a:jpgfile," []|'"))
Bram Moolenaar5c736222010-01-06 20:54:52 +0100128 exe "!".expand("$SystemRoot")."/SYSTEM32/MSPAINT ".shellescape(a:jpgfile,1)
Bram Moolenaara5fac542005-10-12 20:58:49 +0000129 else
Bram Moolenaar1056d982006-03-09 22:37:52 +0000130" call Dret("s:NFH_jpg 0")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000131 return 0
132 endif
133
Bram Moolenaar1056d982006-03-09 22:37:52 +0000134" call Dret("s:NFH_jpg 1")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000135 return 1
136endfun
137
138" ---------------------------------------------------------------------
Bram Moolenaar1056d982006-03-09 22:37:52 +0000139" s:NFH_gif: {{{1
140fun! s:NFH_gif(giffile)
141" call Dfunc("s:NFH_gif(giffile<".a:giffile.">)")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000142
143 if executable("gimp")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100144 exe "silent! !gimp -s ".shellescape(a:giffile,1)
Bram Moolenaara5fac542005-10-12 20:58:49 +0000145 elseif executable(expand("$SystemRoot")."/SYSTEM32/MSPAINT.EXE")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100146 exe "silent! !".expand("$SystemRoot")."/SYSTEM32/MSPAINT ".shellescape(a:giffile,1)
Bram Moolenaara5fac542005-10-12 20:58:49 +0000147 else
Bram Moolenaar1056d982006-03-09 22:37:52 +0000148" call Dret("s:NFH_gif 0")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000149 return 0
150 endif
151
Bram Moolenaar1056d982006-03-09 22:37:52 +0000152" call Dret("s:NFH_gif 1")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000153 return 1
154endfun
155
156" ---------------------------------------------------------------------
Bram Moolenaar1056d982006-03-09 22:37:52 +0000157" s:NFH_png: {{{1
158fun! s:NFH_png(pngfile)
159" call Dfunc("s:NFH_png(pngfile<".a:pngfile.">)")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000160
161 if executable("gimp")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100162 exe "silent! !gimp -s ".shellescape(a:pngfile,1)
Bram Moolenaara5fac542005-10-12 20:58:49 +0000163 elseif executable(expand("$SystemRoot")."/SYSTEM32/MSPAINT.EXE")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100164 exe "silent! !".expand("$SystemRoot")."/SYSTEM32/MSPAINT ".shellescape(a:pngfile,1)
Bram Moolenaara5fac542005-10-12 20:58:49 +0000165 else
Bram Moolenaar1056d982006-03-09 22:37:52 +0000166" call Dret("s:NFH_png 0")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000167 return 0
168 endif
169
Bram Moolenaar1056d982006-03-09 22:37:52 +0000170" call Dret("s:NFH_png 1")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000171 return 1
172endfun
173
174" ---------------------------------------------------------------------
Bram Moolenaar1056d982006-03-09 22:37:52 +0000175" s:NFH_pnm: {{{1
176fun! s:NFH_pnm(pnmfile)
177" call Dfunc("s:NFH_pnm(pnmfile<".a:pnmfile.">)")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000178
179 if executable("gimp")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100180 exe "silent! !gimp -s ".shellescape(a:pnmfile,1)
Bram Moolenaara5fac542005-10-12 20:58:49 +0000181 elseif executable(expand("$SystemRoot")."/SYSTEM32/MSPAINT.EXE")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100182 exe "silent! !".expand("$SystemRoot")."/SYSTEM32/MSPAINT ".shellescape(a:pnmfile,1)
Bram Moolenaara5fac542005-10-12 20:58:49 +0000183 else
Bram Moolenaar1056d982006-03-09 22:37:52 +0000184" call Dret("s:NFH_pnm 0")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000185 return 0
186 endif
187
Bram Moolenaar1056d982006-03-09 22:37:52 +0000188" call Dret("s:NFH_pnm 1")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000189 return 1
190endfun
191
192" ---------------------------------------------------------------------
Bram Moolenaar1056d982006-03-09 22:37:52 +0000193" s:NFH_bmp: visualize bmp files {{{1
194fun! s:NFH_bmp(bmpfile)
195" call Dfunc("s:NFH_bmp(bmpfile<".a:bmpfile.">)")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000196
197 if executable("gimp")
198 exe "silent! !gimp -s ".a:bmpfile
199 elseif executable(expand("$SystemRoot")."/SYSTEM32/MSPAINT.EXE")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100200 exe "silent! !".expand("$SystemRoot")."/SYSTEM32/MSPAINT ".shellescape(a:bmpfile,1)
Bram Moolenaara5fac542005-10-12 20:58:49 +0000201 else
Bram Moolenaar1056d982006-03-09 22:37:52 +0000202" call Dret("s:NFH_bmp 0")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000203 return 0
204 endif
205
Bram Moolenaar1056d982006-03-09 22:37:52 +0000206" call Dret("s:NFH_bmp 1")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000207 return 1
208endfun
209
210" ---------------------------------------------------------------------
Bram Moolenaar1056d982006-03-09 22:37:52 +0000211" s:NFH_pdf: visualize pdf files {{{1
212fun! s:NFH_pdf(pdf)
213" call Dfunc("s:NFH_pdf(pdf<".a:pdf.">)")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000214 if executable("gs")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100215 exe 'silent! !gs '.shellescape(a:pdf,1)
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000216 elseif executable("pdftotext")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100217 exe 'silent! pdftotext -nopgbrk '.shellescape(a:pdf,1)
Bram Moolenaara5fac542005-10-12 20:58:49 +0000218 else
Bram Moolenaar1056d982006-03-09 22:37:52 +0000219" call Dret("s:NFH_pdf 0")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000220 return 0
221 endif
222
Bram Moolenaar1056d982006-03-09 22:37:52 +0000223" call Dret("s:NFH_pdf 1")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000224 return 1
225endfun
226
227" ---------------------------------------------------------------------
Bram Moolenaar1056d982006-03-09 22:37:52 +0000228" s:NFH_doc: visualize doc files {{{1
229fun! s:NFH_doc(doc)
230" call Dfunc("s:NFH_doc(doc<".a:doc.">)")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000231
232 if executable("oowriter")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100233 exe 'silent! !oowriter '.shellescape(a:doc,1)
Bram Moolenaara5fac542005-10-12 20:58:49 +0000234 redraw!
235 else
Bram Moolenaar1056d982006-03-09 22:37:52 +0000236" call Dret("s:NFH_doc 0")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000237 return 0
238 endif
239
Bram Moolenaar1056d982006-03-09 22:37:52 +0000240" call Dret("s:NFH_doc 1")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000241 return 1
242endfun
243
244" ---------------------------------------------------------------------
Bram Moolenaar1056d982006-03-09 22:37:52 +0000245" s:NFH_sxw: visualize sxw files {{{1
246fun! s:NFH_sxw(sxw)
247" call Dfunc("s:NFH_sxw(sxw<".a:sxw.">)")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000248
249 if executable("oowriter")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100250 exe 'silent! !oowriter '.shellescape(a:sxw,1)
Bram Moolenaara5fac542005-10-12 20:58:49 +0000251 redraw!
252 else
Bram Moolenaar1056d982006-03-09 22:37:52 +0000253" call Dret("s:NFH_sxw 0")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000254 return 0
255 endif
256
Bram Moolenaar1056d982006-03-09 22:37:52 +0000257" call Dret("s:NFH_sxw 1")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000258 return 1
259endfun
260
261" ---------------------------------------------------------------------
Bram Moolenaar1056d982006-03-09 22:37:52 +0000262" s:NFH_xls: visualize xls files {{{1
263fun! s:NFH_xls(xls)
264" call Dfunc("s:NFH_xls(xls<".a:xls.">)")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000265
266 if executable("oocalc")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100267 exe 'silent! !oocalc '.shellescape(a:xls,1)
Bram Moolenaara5fac542005-10-12 20:58:49 +0000268 redraw!
269 else
Bram Moolenaar1056d982006-03-09 22:37:52 +0000270" call Dret("s:NFH_xls 0")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000271 return 0
272 endif
273
Bram Moolenaar1056d982006-03-09 22:37:52 +0000274" call Dret("s:NFH_xls 1")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000275 return 1
276endfun
277
278" ---------------------------------------------------------------------
Bram Moolenaar1056d982006-03-09 22:37:52 +0000279" s:NFH_ps: handles PostScript files {{{1
280fun! s:NFH_ps(ps)
281" call Dfunc("s:NFH_ps(ps<".a:ps.">)")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000282 if executable("gs")
Bram Moolenaar1056d982006-03-09 22:37:52 +0000283" call Decho("exe silent! !gs ".a:ps)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100284 exe "silent! !gs ".shellescape(a:ps,1)
Bram Moolenaara5fac542005-10-12 20:58:49 +0000285 redraw!
286 elseif executable("ghostscript")
Bram Moolenaar1056d982006-03-09 22:37:52 +0000287" call Decho("exe silent! !ghostscript ".a:ps)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100288 exe "silent! !ghostscript ".shellescape(a:ps,1)
Bram Moolenaara5fac542005-10-12 20:58:49 +0000289 redraw!
290 elseif executable("gswin32")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100291" call Decho("exe silent! !gswin32 ".shellescape(a:ps,1))
292 exe "silent! !gswin32 ".shellescape(a:ps,1)
Bram Moolenaara5fac542005-10-12 20:58:49 +0000293 redraw!
294 else
Bram Moolenaar1056d982006-03-09 22:37:52 +0000295" call Dret("s:NFH_ps 0")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000296 return 0
297 endif
298
Bram Moolenaar1056d982006-03-09 22:37:52 +0000299" call Dret("s:NFH_ps 1")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000300 return 1
301endfun
302
303" ---------------------------------------------------------------------
Bram Moolenaar1056d982006-03-09 22:37:52 +0000304" s:NFH_eps: handles encapsulated PostScript files {{{1
305fun! s:NFH_eps(eps)
306" call Dfunc("s:NFH_eps()")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000307 if executable("gs")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100308 exe "silent! !gs ".shellescape(a:eps,1)
Bram Moolenaara5fac542005-10-12 20:58:49 +0000309 redraw!
310 elseif executable("ghostscript")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100311 exe "silent! !ghostscript ".shellescape(a:eps,1)
Bram Moolenaara5fac542005-10-12 20:58:49 +0000312 redraw!
313 elseif executable("ghostscript")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100314 exe "silent! !ghostscript ".shellescape(a:eps,1)
Bram Moolenaara5fac542005-10-12 20:58:49 +0000315 redraw!
316 elseif executable("gswin32")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100317 exe "silent! !gswin32 ".shellescape(a:eps,1)
Bram Moolenaara5fac542005-10-12 20:58:49 +0000318 redraw!
319 else
Bram Moolenaar1056d982006-03-09 22:37:52 +0000320" call Dret("s:NFH_eps 0")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000321 return 0
322 endif
Bram Moolenaar1056d982006-03-09 22:37:52 +0000323" call Dret("s:NFH_eps 0")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000324 return 1
325endfun
326
327" ---------------------------------------------------------------------
Bram Moolenaar1056d982006-03-09 22:37:52 +0000328" s:NFH_fig: handles xfig files {{{1
329fun! s:NFH_fig(fig)
330" call Dfunc("s:NFH_fig()")
331 if executable("xfig")
332 exe "silent! !xfig ".a:fig
333 redraw!
334 else
335" call Dret("s:NFH_fig 0")
336 return 0
337 endif
338
339" call Dret("s:NFH_fig 1")
340 return 1
341endfun
342
343" ---------------------------------------------------------------------
344" s:NFH_obj: handles tgif's obj files {{{1
345fun! s:NFH_obj(obj)
346" call Dfunc("s:NFH_obj()")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000347 if has("unix") && executable("tgif")
348 exe "silent! !tgif ".a:obj
349 redraw!
350 else
Bram Moolenaar1056d982006-03-09 22:37:52 +0000351" call Dret("s:NFH_obj 0")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000352 return 0
353 endif
354
Bram Moolenaar1056d982006-03-09 22:37:52 +0000355" call Dret("s:NFH_obj 1")
Bram Moolenaara5fac542005-10-12 20:58:49 +0000356 return 1
357endfun
358
359let &cpo= s:keepcpo
Bram Moolenaar5b435d62012-04-05 17:33:26 +0200360unlet s:keepcpo
Bram Moolenaara5fac542005-10-12 20:58:49 +0000361" ---------------------------------------------------------------------
362" Modelines: {{{1
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000363" vim: fdm=marker