" Vim filetype plugin
" Language: spec file
" Maintainer: Guillaume Rousse <rousse@ccr.jussieu.fr>
" URL: http://lis.snv.jussieu.fr/~rousse/linux/spec.vim
" Version: $Id: spec.vim,v 1.2 2005/02/10 16:45:35 karsten Exp $
if exists("b:did_ftplugin")
finish
endif
let b:did_ftplugin = 1
" Add mappings, unless user doesn't want
if !exists("no_plugin_maps") && !exists("no_spec_maps")
if !hasmapto("<Plug>AddChangelogBlock")
map <buffer> <LocalLeader>ch <Plug>AddChangelogBlock
endif
if !hasmapto("<Plug>AddChangelogEntry")
map <buffer> <LocalLeader>CH <Plug>AddChangelogEntry
endif
noremap <buffer> <unique> <script> <Plug>AddChangelogBlock :call <SID>AddChangelogBlock()<CR>
noremap <buffer> <unique> <script> <Plug>AddChangelogEntry :call <SID>AddChangelogEntry()<CR>
endif
" compilation option
setlocal makeprg=rpm\ -ba\ %
setlocal errorformat=error:\ line\ %l:\ %m
" navigation through sections
let b:match_ignorecase = 0
let b:match_words =
\ '^Name:^%description:^%clean:^%setup:^%build:^%install:^%files:' .
\ '^%package:^%preun:^%postun:^%changelog'
if !exists("*s:AddChangelogBlock")
" Adds a changelog block
function s:AddChangelogBlock()
" look for changelog section
let line = <SID>GetFirstLocation(0, '^%changelog')
call <SID>InsertChangelogHeader(line)
call <SID>InsertChangelogEntry(line + 1)
endfunction
endif
if !exists("*s:AddChangelogEntry")
" Adds a changelog entry
function s:AddChangelogEntry()
" look for changelog section
let line = <SID>GetFirstLocation(0, '^%changelog')
" look for last entry
let line = <SID>GetLastLocation(line + 1, '^- ')
call <SID>InsertChangelogEntry(line)
endfunction
endif
if !exists("*s:InsertChangelogHeader")
" Insert a changelog header just after the given line
function s:InsertChangelogHeader(line)
" ensure english locale
language time C
" insert blank line first
call append(a:line, "")
" insert changelog header
call append(a:line,
\ "* " . strftime("%a %b %d %Y") .
\ " " . <SID>GetTagValue("Packager") .
\ " " . <SID>GetTagValue("Version") .
\ "-" . <SID>GetTagValue("Release")
\)
endfunction
endif
if !exists("*s:InsertChangelogEntry")
" Insert a changelog entry just after the given line
function s:InsertChangelogEntry(line)
" insert changelog entry
call append(a:line, "-")
" position cursor here
execute a:line +1
" enter insert mode
startinsert!
endfunction
endif
if !exists("*s:GetTagValue")
" Return value of a rpm tag
function s:GetTagValue(tag)
let pattern = '^' . a:tag . ':\s*'
let line = <SID>GetFirstLine(0, pattern)
let value = substitute(line, pattern, "", "")
" resolve macros
while (value =~ '%{\?\w\{3,}}\?')
let macro = matchstr(value, '%{\?\w\{3,}}\?')
let macro_name = substitute(macro, '%{\?\(\w\{3,}\)}\?', '\1', "")
let macro_value = <SID>GetMacroValue(macro_name)
let value = substitute(value, '%{\?' . macro_name . '}\?', macro_value, "")
endwhile
" try to read externaly defined values
if (value == "")
let value = <SID>GetExternalMacroValue(a:tag)
endif
return value
endfunction
endif
if !exists("*s:GetMacroValue")
" Return value of a rpm macro
function s:GetMacroValue(macro)
let pattern = '^%define\s*' . a:macro . '\s*'
let line = <SID>GetFirstLine(0, pattern)
return substitute(line, pattern, "", "")
endfunction
endif
if !exists("*s:GetExternalMacroValue")
" Return value of an external rpm macro defined in $HOME/.rpmmacros
function s:GetExternalMacroValue(macro)
if filereadable($HOME . "/.rpmmacros")
let pattern = '^%' . tolower(a:macro) . '\s*'
let line = system("grep '" . pattern . "' $HOME/.rpmmacros")
" get rid of this !#&* trailing <NL>
let line = strpart(line, 0, strlen(line) - 1)
return substitute(line, pattern, "", "")
endif
endfunction
endif
if !exists("*s:GetFirstLocation")
" Return location of first line matching the given pattern after the given line
" Return -1 if not found at the end of the file
function s:GetFirstLocation(from, pattern)
let linenb = a:from
while (linenb <= line("$"))
let linenb = linenb + 1
let linestr = getline(linenb)
if (linestr =~ a:pattern)
return linenb
endif
endwhile
return -1
endfunction
endif
if !exists("*s:GetLastLocation")
" Return location of last line matching the given pattern after the given line
" Return -1 if still found at the end of the file
function s:GetLastLocation(from, pattern)
let linenb = a:from
while (linenb <= line("$"))
let linenb = linenb + 1
let linestr = getline(linenb)
if (linestr !~ a:pattern)
return linenb - 1
endif
endwhile
return -1
endfunction
endif
if !exists("*s:GetFirstLine")
" Return first line matching the given pattern after the given line
" Return "" if not found at the end of the file
function s:GetFirstLine(from, pattern)
let linenb = a:from
while (linenb <= line("$"))
let linenb = linenb + 1
let linestr = getline(linenb)
if (linestr =~ a:pattern)
return linestr
endif
endwhile
return ""
endfunction
endif