" MetaPost indent file " Language: MetaPost " Maintainer: Eugene Minkovskii <emin@mccme.ru> " Last Change: 2012 May 18 " Version: 0.1 " ========================================================================== " Identation Rules: {{{1 " First of all, MetaPost language don't expect any identation rules. " This screept need for you only if you (not MetaPost) need to do " exactly code. If you don't need to use indentation, see " :help filetype-indent-off " " Note: Every rules of identation in MetaPost or TeX languages (and in some " other of course) is very subjective. I can release only my vision of this " promlem. " " .......................................................................... " Example of correct (by me) identation {{{2 " shiftwidth=4 " ========================================================================== " for i=0 upto 99: " z[i] = (0,1u) rotated (i*360/100); " endfor " draw z0 -- z10 -- z20 " withpen ... % <- 2sw because breaked line " withcolor ...; % <- same as previous " draw z0 for i=1 upto 99: " -- z[i] % <- 1sw from left end of 'for' satement " endfor withpen ... % <- 0sw from left end of 'for' satement " withcolor ...; % <- 2sw because breaked line " draw if One: % <- This is internal if (like 'for' above) " one " elsif Other: " other " fi withpen ...; " if one: % <- This is external if " draw one; " elseif other: " draw other; " fi " draw z0; draw z1; " }}} " }}} " Only load this indent file when no other was loaded. if exists("b:did_indent") finish endif let b:did_indent = 1 setlocal indentexpr=GetMetaPostIndent() setlocal indentkeys+=;,<:>,=if,=for,=def,=end,=else,=fi " Only define the function once. if exists("*GetMetaPostIndent") finish endif let s:keepcpo= &cpo set cpo&vim " Auxiliary Definitions: {{{1 function! MetaNextNonblankNoncomment(pos) " Like nextnonblank() but ignore comment lines let tmp = nextnonblank(a:pos) while tmp && getline(tmp) =~ '^\s*%' let tmp = nextnonblank(tmp+1) endwhile return tmp endfunction function! MetaPrevNonblankNoncomment(pos) " Like prevnonblank() but ignore comment lines let tmp = prevnonblank(a:pos) while tmp && getline(tmp) =~ '^\s*%' let tmp = prevnonblank(tmp-1) endwhile return tmp endfunction function! MetaSearchNoncomment(pattern, ...) " Like search() but ignore commented areas if a:0 let flags = a:1 elseif &wrapscan let flags = "w" else let flags = "W" endif let cl = line(".") let cc = col(".") let tmp = search(a:pattern, flags) while tmp && synIDattr(synID(line("."), col("."), 1), "name") =~ \ 'm[fp]\(Comment\|TeXinsert\|String\)' let tmp = search(a:pattern, flags) endwhile if !tmp call cursor(cl,cc) endif return tmp endfunction " }}} function! GetMetaPostIndent() " not indent in comment ??? if synIDattr(synID(line("."), col("."), 1), "name") =~ \ 'm[fp]\(Comment\|TeXinsert\|String\)' return -1 endif " Some RegExps: {{{1 " end_of_item: all of end by ';' " + all of end by :endfor, :enddef, :endfig, :endgroup, :fi " + all of start by :beginfig(num), :begingroup " + all of start by :for, :if, :else, :elseif and end by ':' " + all of start by :def, :vardef and end by '=' let end_of_item = '\(' . \ ';\|' . \ '\<\(end\(for\|def\|fig\|group\)\|fi\)\>\|' . \ '\<begin\(group\>\|fig\s*(\s*\d\+\s*)\)\|' . \ '\<\(for\|if\|else\(if\)\=\)\>.\+:\|' . \ '\<\(var\)\=def\>.\+=' . '\)' " }}} " Save: current position {{{1 let cl = line (".") let cc = col (".") let cs = getline(".") " if it is :beginfig or :endfig use zero indent if cs =~ '^\s*\(begin\|end\)fig\>' return 0 endif " }}} " Initialise: ind variable {{{1 " search previous item not in current line let p_semicol_l = MetaSearchNoncomment(end_of_item,"bW") while p_semicol_l == cl let p_semicol_l = MetaSearchNoncomment(end_of_item,"bW") endwhile " if this is first item in program use zero indent if !p_semicol_l return 0 endif " if this is multiline item, remember first indent if MetaNextNonblankNoncomment(p_semicol_l+1) < cl let ind = indent(MetaNextNonblankNoncomment(p_semicol_l+1)) " else --- search pre-previous item for search first line in previous item else " search pre-previous item not in current line let pp_semicol_l = MetaSearchNoncomment(end_of_item,"bW") while pp_semicol_l == p_semicol_l let pp_semicol_l = MetaSearchNoncomment(end_of_item,"bW") endwhile " if we find pre-previous item, remember indent of previous item " else --- remember zero if pp_semicol_l let ind = indent(MetaNextNonblankNoncomment(line(".")+1)) else let ind = 0 endif endif " }}} " Increase Indent: {{{1 " if it is an internal/external :for or :if statements {{{2 let pnn_s = getline(MetaPrevNonblankNoncomment(cl-1)) if pnn_s =~ '\<\(for\|if\)\>.\+:\s*\($\|%\)' let ind = match(pnn_s, '\<\(for\|if\)\>.\+:\s*\($\|%\)') + &sw " }}} " if it is a :def, :vardef, :beginfig, :begingroup, :else, :elseif {{{2 elseif pnn_s =~ '^\s*\(' . \ '\(var\)\=def\|' . \ 'begin\(group\|fig\s*(\s*\d\+\s*)\)\|' . \ 'else\(if\)\=' . '\)\>' let ind = ind + &sw " }}} " if it is a broken line {{{2 elseif pnn_s !~ end_of_item.'\s*\($\|%\)' let ind = ind + (2 * &sw) endif " }}} " }}} " Decrease Indent: {{{1 " if this is :endfor or :enddef statements {{{2 " this is correct because :def cannot be inside :for if cs =~ '\<end\(for\|def\)\=\>' call MetaSearchNoncomment('\<for\>.\+:\s*\($\|%\)' . '\|' . \ '^\s*\(var\)\=def\>',"bW") if col(".") > 1 let ind = col(".") - 1 else let ind = indent(".") endif " }}} " if this is :fi, :else, :elseif statements {{{2 elseif cs =~ '\<\(else\(if\)\=\|fi\)\>' call MetaSearchNoncomment('\<if\>.\+:\s*\($\|%\)',"bW") let ind = col(".") - 1 " }}} " if this is :endgroup statement {{{2 elseif cs =~ '^\s*endgroup\>' let ind = ind - &sw endif " }}} " }}} return ind endfunction " let &cpo = s:keepcpo unlet s:keepcpo " vim:sw=2:fdm=marker
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
README.txt | File | 1.6 KB | 0644 |
|
aap.vim | File | 265 B | 0644 |
|
ada.vim | File | 10.89 KB | 0644 |
|
ant.vim | File | 290 B | 0644 |
|
automake.vim | File | 231 B | 0644 |
|
awk.vim | File | 7.57 KB | 0644 |
|
bib.vim | File | 346 B | 0644 |
|
bst.vim | File | 1.87 KB | 0644 |
|
c.vim | File | 325 B | 0644 |
|
cdl.vim | File | 4.07 KB | 0644 |
|
ch.vim | File | 470 B | 0644 |
|
chaiscript.vim | File | 1.11 KB | 0644 |
|
changelog.vim | File | 264 B | 0644 |
|
clojure.vim | File | 11.85 KB | 0644 |
|
cmake.vim | File | 2.69 KB | 0644 |
|
cobol.vim | File | 8 KB | 0644 |
|
config.vim | File | 2.12 KB | 0644 |
|
cpp.vim | File | 329 B | 0644 |
|
cs.vim | File | 327 B | 0644 |
|
css.vim | File | 1.68 KB | 0644 |
|
cucumber.vim | File | 2.56 KB | 0644 |
|
cuda.vim | File | 305 B | 0644 |
|
d.vim | File | 510 B | 0644 |
|
dictconf.vim | File | 325 B | 0644 |
|
dictdconf.vim | File | 326 B | 0644 |
|
docbk.vim | File | 324 B | 0644 |
|
dtd.vim | File | 11.39 KB | 0644 |
|
dtrace.vim | File | 451 B | 0644 |
|
dylan.vim | File | 2.6 KB | 0644 |
|
eiffel.vim | File | 3.13 KB | 0644 |
|
erlang.vim | File | 45.15 KB | 0644 |
|
eruby.vim | File | 2.11 KB | 0644 |
|
eterm.vim | File | 638 B | 0644 |
|
falcon.vim | File | 13.65 KB | 0644 |
|
fortran.vim | File | 6.41 KB | 0644 |
|
framescript.vim | File | 786 B | 0644 |
|
gitconfig.vim | File | 817 B | 0644 |
|
gitolite.vim | File | 996 B | 0644 |
|
haml.vim | File | 2.14 KB | 0644 |
|
hamster.vim | File | 1.37 KB | 0644 |
|
html.vim | File | 14.46 KB | 0644 |
|
htmldjango.vim | File | 273 B | 0644 |
|
idlang.vim | File | 1.53 KB | 0644 |
|
ishd.vim | File | 1.8 KB | 0644 |
|
java.vim | File | 4.02 KB | 0644 |
|
javascript.vim | File | 336 B | 0644 |
|
jsp.vim | File | 462 B | 0644 |
|
ld.vim | File | 1.71 KB | 0644 |
|
lifelines.vim | File | 637 B | 0644 |
|
liquid.vim | File | 1.83 KB | 0644 |
|
lisp.vim | File | 353 B | 0644 |
|
logtalk.vim | File | 1.65 KB | 0644 |
|
lua.vim | File | 1.87 KB | 0644 |
|
mail.vim | File | 308 B | 0644 |
|
make.vim | File | 3.35 KB | 0644 |
|
matlab.vim | File | 1.88 KB | 0644 |
|
mma.vim | File | 2.17 KB | 0644 |
|
mp.vim | File | 6.37 KB | 0644 |
|
objc.vim | File | 1.61 KB | 0644 |
|
ocaml.vim | File | 8.9 KB | 0644 |
|
occam.vim | File | 4.53 KB | 0644 |
|
pascal.vim | File | 5.52 KB | 0644 |
|
perl.vim | File | 5.67 KB | 0644 |
|
perl6.vim | File | 3.42 KB | 0644 |
|
php.vim | File | 18.97 KB | 0644 |
|
postscr.vim | File | 1.58 KB | 0644 |
|
pov.vim | File | 2.58 KB | 0644 |
|
prolog.vim | File | 1.42 KB | 0644 |
|
pyrex.vim | File | 326 B | 0644 |
|
python.vim | File | 5.61 KB | 0644 |
|
r.vim | File | 14.44 KB | 0644 |
|
readline.vim | File | 681 B | 0644 |
|
rpl.vim | File | 1.79 KB | 0644 |
|
rst.vim | File | 1.35 KB | 0644 |
|
ruby.vim | File | 17.13 KB | 0644 |
|
sass.vim | File | 1018 B | 0644 |
|
scheme.vim | File | 241 B | 0644 |
|
scss.vim | File | 191 B | 0644 |
|
sdl.vim | File | 2.7 KB | 0644 |
|
sh.vim | File | 3.95 KB | 0644 |
|
sml.vim | File | 6.27 KB | 0644 |
|
sql.vim | File | 1.18 KB | 0644 |
|
sqlanywhere.vim | File | 12.77 KB | 0644 |
|
tcl.vim | File | 1.56 KB | 0644 |
|
tcsh.vim | File | 1.21 KB | 0644 |
|
tex.vim | File | 9.47 KB | 0644 |
|
tf.vim | File | 1.46 KB | 0644 |
|
tilde.vim | File | 994 B | 0644 |
|
treetop.vim | File | 677 B | 0644 |
|
vb.vim | File | 2 KB | 0644 |
|
verilog.vim | File | 7.44 KB | 0644 |
|
vhdl.vim | File | 13.48 KB | 0644 |
|
vim.vim | File | 2.76 KB | 0644 |
|
xf86conf.vim | File | 679 B | 0644 |
|
xhtml.vim | File | 269 B | 0644 |
|
xinetd.vim | File | 1.17 KB | 0644 |
|
xml.vim | File | 2.77 KB | 0644 |
|
xsd.vim | File | 253 B | 0644 |
|
xslt.vim | File | 297 B | 0644 |
|
yacc.vim | File | 769 B | 0644 |
|
yaml.vim | File | 4.02 KB | 0644 |
|
zimbu.vim | File | 3.8 KB | 0644 |
|
zsh.vim | File | 231 B | 0644 |
|