Add stdheader.vim

This commit is contained in:
cubernetes 2023-07-27 04:40:32 +02:00
parent 05880571a5
commit b233a7c02e
1 changed files with 149 additions and 0 deletions

149
.vim/plugin/stdheader.vim Normal file
View File

@ -0,0 +1,149 @@
let s:asciiart = [
\" ::: ::::::::",
\" :+: :+: :+:",
\" +:+ +:+ +:+ ",
\" +#+ +:+ +#+ ",
\"+#+#+#+#+#+ +#+ ",
\" #+# #+# ",
\" ### ########.fr "
\]
let s:start = '/*'
let s:end = '*/'
let s:fill = '*'
let s:length = 80
let s:margin = 5
let s:types = {
\'\.c$\|\.h$\|\.cc$\|\.hh$\|\.cpp$\|\.hpp$\|\.php':
\['/*', '*/', '*'],
\'\.htm$\|\.html$\|\.xml$':
\['<!--', '-->', '*'],
\'\.js$':
\['//', '//', '*'],
\'\.tex$':
\['%', '%', '*'],
\'\.ml$\|\.mli$\|\.mll$\|\.mly$':
\['(*', '*)', '*'],
\'\.vim$\|\vimrc$':
\['"', '"', '*'],
\'\.el$\|\emacs$':
\[';', ';', '*'],
\'\.f90$\|\.f95$\|\.f03$\|\.f$\|\.for$':
\['!', '!', '/']
\}
function! s:filetype()
let l:f = s:filename()
let s:start = '#'
let s:end = '#'
let s:fill = '*'
for type in keys(s:types)
if l:f =~ type
let s:start = s:types[type][0]
let s:end = s:types[type][1]
let s:fill = s:types[type][2]
endif
endfor
endfunction
function! s:ascii(n)
return s:asciiart[a:n - 3]
endfunction
function! s:textline(left, right)
let l:left = strpart(a:left, 0, s:length - s:margin * 2 - strlen(a:right))
return s:start . repeat(' ', s:margin - strlen(s:start)) . l:left . repeat(' ', s:length - s:margin * 2 - strlen(l:left) - strlen(a:right)) . a:right . repeat(' ', s:margin - strlen(s:end)) . s:end
endfunction
function! s:line(n)
if a:n == 1 || a:n == 11 " top and bottom line
return s:start . ' ' . repeat(s:fill, s:length - strlen(s:start) - strlen(s:end) - 2) . ' ' . s:end
elseif a:n == 2 || a:n == 10 " blank line
return s:textline('', '')
elseif a:n == 3 || a:n == 5 || a:n == 7 " empty with ascii
return s:textline('', s:ascii(a:n))
elseif a:n == 4 " filename
return s:textline(s:filename(), s:ascii(a:n))
elseif a:n == 6 " author
return s:textline("By: " . s:user() . " <" . s:mail() . ">", s:ascii(a:n))
elseif a:n == 8 " created
return s:textline("Created: " . s:date() . " by " . s:user(), s:ascii(a:n))
elseif a:n == 9 " updated
return s:textline("Updated: " . s:date() . " by " . s:user(), s:ascii(a:n))
endif
endfunction
function! s:user()
if exists('g:user42')
return g:user42
endif
let l:user = $USER
if strlen(l:user) == 0
let l:user = "marvin"
endif
return l:user
endfunction
function! s:mail()
if exists('g:mail42')
return g:mail42
endif
let l:mail = $MAIL
if strlen(l:mail) == 0
let l:mail = "marvin@42.fr"
endif
return l:mail
endfunction
function! s:filename()
let l:filename = expand("%:t")
if strlen(l:filename) == 0
let l:filename = "< new >"
endif
return l:filename
endfunction
function! s:date()
return strftime("%Y/%m/%d %H:%M:%S")
endfunction
function! s:insert()
let l:line = 11
" empty line after header
call append(0, "")
" loop over lines
while l:line > 0
call append(0, s:line(l:line))
let l:line = l:line - 1
endwhile
endfunction
function! s:update()
call s:filetype()
if getline(9) =~ s:start . repeat(' ', s:margin - strlen(s:start)) . "Updated: "
if &mod
call setline(9, s:line(9))
endif
call setline(4, s:line(4))
return 0
endif
return 1
endfunction
function! s:stdheader()
if s:update()
call s:insert()
endif
endfunction
" Bind command and shortcut
command! Stdheader call s:stdheader ()
map <F1> :Stdheader<CR>
autocmd BufWritePre * call s:update ()