parent
05d3b44335
commit
3b0885689e
1 changed files with 272 additions and 0 deletions
@ -0,0 +1,272 @@ |
||||
" Vim indent file |
||||
" Language: Php |
||||
" Authors: Miles Lott <milos@groupwhere.org>, Johannes Zellner <johannes@zellner.org>, Pim Snel <pim@lingewoud.nl> |
||||
" URL: http://lingewoud.nl/downloads.php |
||||
" Last Change: 23 feb 2004 |
||||
" Version: 0.3 |
||||
" Notes: This is a combination of the PHP indent file of Miles Lott with |
||||
" the HTML indent file of Johannes Zellner. Usefull for editing |
||||
" php-files with html parts in it. |
||||
" |
||||
" Changelog: |
||||
" 0.3 - 25 mar 2004 |
||||
" - fixed wrong indention when a php-tag is opened and closed on |
||||
" one single line. |
||||
" 0.2 - 23 feb 2004 |
||||
" - applied patch from Holger Dzeik <dzeik@nentec.de> |
||||
" - added changelog |
||||
" - added default indention of 3 spaces after the <?php for better |
||||
" reading |
||||
" - replaced URL |
||||
" - reformatted the options section |
||||
" 0.1 - 27 mar 2003 |
||||
" - initial creation of html-enhanced php indent-file |
||||
|
||||
" 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,*<Return>,<>>,<bs>,{,} |
||||
|
||||
" 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 = <SID>HtmlIndentSum(lnum, -1) |
||||
let ind = ind + <SID>HtmlIndentSum(v:lnum, 0) |
||||
|
||||
let &ic=restore_ic |
||||
|
||||
let ind = indent(lnum) + (&sw * ind) |
||||
|
||||
" Indent after php open tags |
||||
if line =~ '<?php' && line !~ '?>' |
||||
let ind = ind + &sw |
||||
endif |
||||
if cline =~ '^\s*[?>]' " // Fix from Holger Dzeik <dzeik@nentec.de> 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,*<Return>,<>>,<bs>,{,} |
||||
|
||||
|
||||
|
||||
" [-- helper function to assemble tag list --] |
||||
fun! <SID>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 |
||||
|
||||
|
||||
" [-- <ELEMENT ? - - ...> --] |
||||
call <SID>HtmlIndentPush('a') |
||||
call <SID>HtmlIndentPush('abbr') |
||||
call <SID>HtmlIndentPush('acronym') |
||||
call <SID>HtmlIndentPush('address') |
||||
call <SID>HtmlIndentPush('b') |
||||
call <SID>HtmlIndentPush('bdo') |
||||
call <SID>HtmlIndentPush('big') |
||||
call <SID>HtmlIndentPush('blockquote') |
||||
call <SID>HtmlIndentPush('button') |
||||
call <SID>HtmlIndentPush('caption') |
||||
call <SID>HtmlIndentPush('center') |
||||
call <SID>HtmlIndentPush('cite') |
||||
call <SID>HtmlIndentPush('code') |
||||
call <SID>HtmlIndentPush('colgroup') |
||||
call <SID>HtmlIndentPush('del') |
||||
call <SID>HtmlIndentPush('dfn') |
||||
call <SID>HtmlIndentPush('dir') |
||||
call <SID>HtmlIndentPush('div') |
||||
call <SID>HtmlIndentPush('dl') |
||||
call <SID>HtmlIndentPush('em') |
||||
call <SID>HtmlIndentPush('fieldset') |
||||
call <SID>HtmlIndentPush('font') |
||||
call <SID>HtmlIndentPush('form') |
||||
call <SID>HtmlIndentPush('frameset') |
||||
call <SID>HtmlIndentPush('h1') |
||||
call <SID>HtmlIndentPush('h2') |
||||
call <SID>HtmlIndentPush('h3') |
||||
call <SID>HtmlIndentPush('h4') |
||||
call <SID>HtmlIndentPush('h5') |
||||
call <SID>HtmlIndentPush('h6') |
||||
call <SID>HtmlIndentPush('i') |
||||
call <SID>HtmlIndentPush('iframe') |
||||
call <SID>HtmlIndentPush('ins') |
||||
call <SID>HtmlIndentPush('kbd') |
||||
call <SID>HtmlIndentPush('label') |
||||
call <SID>HtmlIndentPush('legend') |
||||
call <SID>HtmlIndentPush('map') |
||||
call <SID>HtmlIndentPush('menu') |
||||
call <SID>HtmlIndentPush('noframes') |
||||
call <SID>HtmlIndentPush('noscript') |
||||
call <SID>HtmlIndentPush('object') |
||||
call <SID>HtmlIndentPush('ol') |
||||
call <SID>HtmlIndentPush('optgroup') |
||||
call <SID>HtmlIndentPush('pre') |
||||
call <SID>HtmlIndentPush('q') |
||||
call <SID>HtmlIndentPush('s') |
||||
call <SID>HtmlIndentPush('samp') |
||||
call <SID>HtmlIndentPush('script') |
||||
call <SID>HtmlIndentPush('select') |
||||
call <SID>HtmlIndentPush('small') |
||||
call <SID>HtmlIndentPush('span') |
||||
call <SID>HtmlIndentPush('strong') |
||||
call <SID>HtmlIndentPush('style') |
||||
call <SID>HtmlIndentPush('sub') |
||||
call <SID>HtmlIndentPush('sup') |
||||
call <SID>HtmlIndentPush('table') |
||||
call <SID>HtmlIndentPush('textarea') |
||||
call <SID>HtmlIndentPush('title') |
||||
call <SID>HtmlIndentPush('tt') |
||||
call <SID>HtmlIndentPush('u') |
||||
call <SID>HtmlIndentPush('ul') |
||||
call <SID>HtmlIndentPush('var') |
||||
|
||||
|
||||
" [-- <ELEMENT ? O O ...> --] |
||||
if !exists('g:html_indent_strict') |
||||
call <SID>HtmlIndentPush('body') |
||||
call <SID>HtmlIndentPush('head') |
||||
call <SID>HtmlIndentPush('html') |
||||
call <SID>HtmlIndentPush('tbody') |
||||
endif |
||||
|
||||
|
||||
" [-- <ELEMENT ? O - ...> --] |
||||
if !exists('g:html_indent_strict_table') |
||||
call <SID>HtmlIndentPush('th') |
||||
call <SID>HtmlIndentPush('td') |
||||
call <SID>HtmlIndentPush('tr') |
||||
call <SID>HtmlIndentPush('tfoot') |
||||
call <SID>HtmlIndentPush('thead') |
||||
endif |
||||
|
||||
delfun <SID>HtmlIndentPush |
||||
|
||||
set cpo-=C |
||||
|
||||
" [-- count indent-increasing tags of line a:lnum --] |
||||
fun! <SID>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! <SID>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! <SID>HtmlIndentOpenAlt(lnum) |
||||
return strlen(substitute(getline(a:lnum), '[^{]\+', '', 'g')) |
||||
endfun |
||||
|
||||
" [-- count indent-decreasing '}' of (java|css) line a:lnum --] |
||||
fun! <SID>HtmlIndentCloseAlt(lnum) |
||||
return strlen(substitute(getline(a:lnum), '[^}]\+', '', 'g')) |
||||
endfun |
||||
|
||||
" [-- return the sum of indents respecting the syntax of a:lnum --] |
||||
fun! <SID>HtmlIndentSum(lnum, style) |
||||
if a:style == match(getline(a:lnum), '^\s*</') |
||||
if a:style == match(getline(a:lnum), '^\s*</\<\('.g:html_indent_tags.'\)\>') |
||||
let open = <SID>HtmlIndentOpen(a:lnum) |
||||
let close = <SID>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 <SID>HtmlIndentOpenAlt(a:lnum) - <SID>HtmlIndentCloseAlt(a:lnum) |
||||
endif |
||||
endif |
||||
return 0 |
||||
endfun |
||||
|
||||
" vim: set ts=3 sw=3: |
Loading…
Reference in new issue