" Vim script for checking .po files. " " Go through the file and verify that all %...s items in "msgid" are identical " to the ones in "msgstr". if 1 " Only execute this if the eval feature is available. " Function to get a split line at the cursor. " Used for both msgid and msgstr lines. " Removes all text except % items and returns the result. func! GetMline() let idline = substitute(getline('.'), '"\(.*\)"$', '\1', '') while line('.') < line('$') + let line = getline('.') if line[0] != '"' break endif let idline .= substitute(line, '"\(.*\)"$', '\1', '') endwhile " remove '%', not used for formatting. let idline = substitute(idline, "'%'", '', 'g') " remove everything but % items. return substitute(idline, '[^%]*\(%[-+ #''.0-9*]*l\=[dsuxXpoc%]\)\=', '\1', 'g') endfunc " Start at the first "msgid" line. 1 /^msgid let startline = line('.') let error = 0 while 1 if getline(line('.') - 1) !~ "no-c-format" let fromline = GetMline() if getline('.') !~ '^msgstr' echo 'Missing "msgstr" in line ' . line('.') let error = 1 endif let toline = GetMline() if fromline != toline echo 'Mismatching % in line ' . (line('.') - 1) echo 'msgid: ' . fromline echo 'msgstr: ' . toline let error = 1 endif endif " Find next msgid. " Wrap around at the end of the file, quit when back at the first one. /^msgid if line('.') == startline break endif endwhile if error == 0 echo "OK" endif endif