" 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