*IndentAnything* For Vim version 7.0 The IndentAnything plugin is intended to make it easier to write new indentation scripts and/or supplement existing ones. It makes the assumption that all indentable languages have similar characteristics: - blocks of code over multiple lines - continuation lines - comments The rules of indentation are specified in a series of variables. ================================================================================ *b:defaultIndentExpr* b:defaultIndentExpr If defined, this value is executed to find the starting indent for a line. The default is to use the indentation of the previous code line. But IndentAnything can be used to suplement other, existing indentation scripts. For example: > let b:defaultIndentExpr = &indentexpr setlocal indentexpr=IndentAnything() < *b:indentTrios* b:indentTrios This is the core of indenting anything. The original version of this script was meant to be a simple "get indentation inside parenthesis". But a pair of paranthesis is just like any other pair of characters or keywords that specify a block of code that should be indented. This is a list of indent "trios" (start, middle, end). The values kept in this variable are the arguments that will be passed to |searchpair()|. The following example specifies that there should be a level of indentation inside parenthesis and braces. It also takes into account the case statements inside a switch block. > let b:indentTrios = [ \ [ '(', '', ')' ], \ [ '{', '\(default:\|case.*:\)', '}' ] \] < Note: There is logic that makes the distinction between matches at the beginning of lines or not. These patterns should not include '^' (beginning-of-line), or that logic will break. *b:lineContList* b:lineContList This is a list of dictionaries specifying the lines that are continued by the next line. For example, in shell scripts, a trailing '\' indicates that the next line is a continuation. The dictionaries contain the following keys: pattern : The regular expression matching a line that is continued. Used to determine if the current line is a continuation, and should therefore be indented another level. ignore : Pattern matching the CURRENT line if it should ignore a previous continued line. The following example handles if, else, for, and while statements that are NOT followed by a code block ('{') and lines ending in an operator whose RHS is on the next line: > let b:lineContList = [ \ { 'pattern' : '^\s*\(if\|for\|while\)\s*(.*)\s*\(\(//.*\)\|/\*.*\*/\s*\)\?\_$\(\_s*{\)\@!' }, \ { 'pattern' : '^\s*else' . '\s*\(\(//.*\)\|/\*.*\*/\s*\)\?\_$\(\_s*{\)\@!' }, \ { 'pattern' : '\(+\|=\|+=\|-=\)\s*\(\(//.*\)\|/\*.*\*/\s*\)\?$' } \] < *b:contTraversesLineComments* b:contTraversesLineComments If a continued line and its continuation can have line-comments between them, then the value of this variable should be non-zero. For example, > if (x) // comment here statement < *b:commentRE* *b:lineCommentRE* *b:blockCommentRE* b:commentRE b:lineCommentRE b:blockCommentRE These are regular expressions that match the syntax names for comments for the filetype being indented. Line comments (like '// ...') and block comments (like '/* ... */') are supported. Example: > let b:commentRE = 'javaScript\(Line\)\?Comment' let b:lineCommentRE = 'javaScriptLineComment' let b:blockCommentRE = 'javaScriptComment' < *b:stringRE* *b:singleQuoteStringRE* *b:doubleQuoteStringRE* b:stringRE b:singleQuoteStringRE b:doubleQuoteStringRE These are regular expressions that match the syntax names for strings for the filetype being indented. There are strings in single-quotes (''), double-quotes (""), and an expression for strings of any kind. This is used mostly for avoiding matching of pairs and continuation patterns inside strings. Example: > let b:stringRE = 'javaScriptString\(S\|D\)' let b:singleQuoteStringRE = 'javaScriptStringS' let b:doubleQuoteStringRE = 'javaScriptStringD' < *b:blockCommentStartRE* *b:blockCommentMiddleRE* *b:blockCommentEndRE* *b:blockCommentMiddleExtra* b:blockCommentStartRE b:blockCommentMiddleRE b:blockCommentEndRE b:blockCommentMiddleExtra This allows for special indentation for block comments. For example, to properly indent C-style comments, use the following: > let b:blockCommentStartRE = '/\*' let b:blockCommentMiddleRE = '\*' let b:blockCommentEndRE = '\*/' let b:blockCommentMiddleExtra = 1 < This will indent the following code like so: > statement; /* * comment */ statement; < The second statement indented one character less than the last line of the comment. The value of |b:blockCommentMiddleExtra| will cause the middle lines of the comment (those starting with '*') to be indented by that many more characters. This value can also be negative. The example here duplicates the behavior of cindent. However, this will work for any style block comment. For example, HTML comments could be indented like this: >
< This will be most effective if the 'comments' option is configured properly for the filetype. The above works best with the following: > setl comments=sr: let b:blockCommentStartRE = '' let b:blockCommentMiddleExtra = 3 < vim:noet:sw=8: vim:tw=78:ts=8:ft=help:norl: