" Options: let php_noindent_switch=0 " set this to '1' to not try to indent switch/case statements "set sw=3 " default shiftwidth of 3 spaces if exists("b:did_indent") finish endif let b:did_indent = 1 setlocal indentexpr=GetPhpIndent() "setlocal indentkeys+=0=,0),=EO setlocal indentkeys+=0=,0),=EO,o,O,*,<>>,,{,} " Only define the function once. if exists("*GetPhpIndent") finish endif " Handle option(s) if exists("php_noindent_switch") let b:php_noindent_switch=1 endif if exists('g:html_indent_tags') unlet g:html_indent_tags endif function GetPhpIndent() " Find a non-empty line above the current line. let lnum = prevnonblank(v:lnum - 1) " Hit the start of the file, use zero indent. if lnum == 0 return 0 endif let line = getline(lnum) " last line let cline = getline(v:lnum) " current line let pline = getline(lnum - 1) " previous to last line let ind = indent(lnum) let restore_ic=&ic let &ic=1 " ignore case let ind = HtmlIndentSum(lnum, -1) let ind = ind + HtmlIndentSum(v:lnum, 0) let &ic=restore_ic let ind = indent(lnum) + (&sw * ind) " Indent after php open tags if line =~ '' let ind = ind + &sw endif if cline =~ '^\s*[?>]' " // Fix from Holger Dzeik Thanks! let ind = ind - &sw endif if exists("b:php_noindent_switch") " version 1 behavior, diy switch/case,etc " Indent blocks enclosed by {} or () if line =~ '[{(]\s*\(#[^)}]*\)\=$' let ind = ind + &sw endif if cline =~ '^\s*[)}]' let ind = ind - &sw endif return ind else " Try to indent switch/case statements as well " Indent blocks enclosed by {} or () or case statements, with some anal requirements if line =~ 'case.*:\|[{(]\s*\(#[^)}]*\)\=$' let ind = ind + &sw " return if the current line is not another case statement of the previous line is a bracket open if cline !~ '.*case.*:\|default:' || line =~ '[{(]\s*\(#[^)}]*\)\=$' return ind endif endif if cline =~ '^\s*case.*:\|^\s*default:\|^\s*[)}]' let ind = ind - &sw " if the last line is a break or return, or the current line is a close bracket, " or if the previous line is a default statement, subtract another if line =~ '^\s*break;\|^\s*return\|' && cline =~ '^\s*[)}]' && pline =~ 'default:' let ind = ind - &sw endif endif if line =~ 'default:' let ind = ind + &sw endif return ind endif endfunction " [-- local settings (must come before aborting the script) --] "setlocal indentexpr=HtmlIndentGet(v:lnum) "setlocal indentkeys=o,O,*,<>>,,{,} " [-- helper function to assemble tag list --] fun! HtmlIndentPush(tag) if exists('g:html_indent_tags') let g:html_indent_tags = g:html_indent_tags.'\|'.a:tag else let g:html_indent_tags = a:tag endif endfun " [-- --] call HtmlIndentPush('a') call HtmlIndentPush('abbr') call HtmlIndentPush('acronym') call HtmlIndentPush('address') call HtmlIndentPush('b') call HtmlIndentPush('bdo') call HtmlIndentPush('big') call HtmlIndentPush('blockquote') call HtmlIndentPush('button') call HtmlIndentPush('caption') call HtmlIndentPush('center') call HtmlIndentPush('cite') call HtmlIndentPush('code') call HtmlIndentPush('colgroup') call HtmlIndentPush('del') call HtmlIndentPush('dfn') call HtmlIndentPush('dir') call HtmlIndentPush('div') call HtmlIndentPush('dl') call HtmlIndentPush('em') call HtmlIndentPush('fieldset') call HtmlIndentPush('font') call HtmlIndentPush('form') call HtmlIndentPush('frameset') call HtmlIndentPush('h1') call HtmlIndentPush('h2') call HtmlIndentPush('h3') call HtmlIndentPush('h4') call HtmlIndentPush('h5') call HtmlIndentPush('h6') call HtmlIndentPush('i') call HtmlIndentPush('iframe') call HtmlIndentPush('ins') call HtmlIndentPush('kbd') call HtmlIndentPush('label') call HtmlIndentPush('legend') call HtmlIndentPush('map') call HtmlIndentPush('menu') call HtmlIndentPush('noframes') call HtmlIndentPush('noscript') call HtmlIndentPush('object') call HtmlIndentPush('ol') call HtmlIndentPush('optgroup') call HtmlIndentPush('pre') call HtmlIndentPush('q') call HtmlIndentPush('s') call HtmlIndentPush('samp') call HtmlIndentPush('script') call HtmlIndentPush('select') call HtmlIndentPush('small') call HtmlIndentPush('span') call HtmlIndentPush('strong') call HtmlIndentPush('style') call HtmlIndentPush('sub') call HtmlIndentPush('sup') call HtmlIndentPush('table') call HtmlIndentPush('textarea') call HtmlIndentPush('title') call HtmlIndentPush('tt') call HtmlIndentPush('u') call HtmlIndentPush('ul') call HtmlIndentPush('var') " [-- --] if !exists('g:html_indent_strict') call HtmlIndentPush('body') call HtmlIndentPush('head') call HtmlIndentPush('html') call HtmlIndentPush('tbody') endif " [-- --] if !exists('g:html_indent_strict_table') call HtmlIndentPush('th') call HtmlIndentPush('td') call HtmlIndentPush('tr') call HtmlIndentPush('tfoot') call HtmlIndentPush('thead') endif delfun HtmlIndentPush set cpo-=C " [-- count indent-increasing tags of line a:lnum --] fun! HtmlIndentOpen(lnum) let s = substitute('x'.getline(a:lnum), \ '.\{-}\(\(<\)\('.g:html_indent_tags.'\)\>\)', "\1", 'g') let s = substitute(s, "[^\1].*$", '', '') return strlen(s) endfun " [-- count indent-decreasing tags of line a:lnum --] fun! HtmlIndentClose(lnum) let s = substitute('x'.getline(a:lnum), \ '.\{-}\(\(<\)/\('.g:html_indent_tags.'\)\>>\)', "\1", 'g') let s = substitute(s, "[^\1].*$", '', '') return strlen(s) endfun " [-- count indent-increasing '{' of (java|css) line a:lnum --] fun! HtmlIndentOpenAlt(lnum) return strlen(substitute(getline(a:lnum), '[^{]\+', '', 'g')) endfun " [-- count indent-decreasing '}' of (java|css) line a:lnum --] fun! HtmlIndentCloseAlt(lnum) return strlen(substitute(getline(a:lnum), '[^}]\+', '', 'g')) endfun " [-- return the sum of indents respecting the syntax of a:lnum --] fun! HtmlIndentSum(lnum, style) if a:style == match(getline(a:lnum), '^\s*') let open = HtmlIndentOpen(a:lnum) let close = HtmlIndentClose(a:lnum) if 0 != open || 0 != close return open - close endif endif endif if '' != &syntax && \ synIDattr(synID(a:lnum, 1, 1), 'name') =~ '\(css\|java\).*' && \ synIDattr(synID(a:lnum, strlen(getline(a:lnum)) - 1, 1), 'name') \ =~ '\(css\|java\).*' if a:style == match(getline(a:lnum), '^\s*}') return HtmlIndentOpenAlt(a:lnum) - HtmlIndentCloseAlt(a:lnum) endif endif return 0 endfun " vim: set ts=3 sw=3: