180 lines · 4.5 KB · Text
RawDownload
" Vim indent file" Language:	Perl" Author:	Rafael Garcia-Suarez <rgarciasuarez@free.fr>" URL:		http://rgarciasuarez.free.fr/vim/indent/perl.vim" Last Change:	2005 Sep 07 " Suggestions and improvements by :"   Aaron J. Sherman (use syntax for hints)"   Artem Chuprina (play nice with folding) " TODO things that are not or not properly indented (yet) :" - Continued statements"     print "foo","	"bar";"     print "foo""	if bar();" - Multiline regular expressions (m//x)" (The following probably needs modifying the perl syntax file)" - qw() lists" - Heredocs with terminators that don't match \I\i* " Only load this indent file when no other was loaded.if exists("b:did_indent")  finishendiflet b:did_indent = 1 " Is syntax highlighting active ?let b:indent_use_syntax = has("syntax") setlocal indentexpr=GetPerlIndent()setlocal indentkeys+=0=,0),0=or,0=andif !b:indent_use_syntax  setlocal indentkeys+=0=EOendif " Only define the function once.if exists("*GetPerlIndent")  finishendif let s:cpo_save = &cposet cpo-=C function GetPerlIndent()   " Get the line to be indented  let cline = getline(v:lnum)   " Indent POD markers to column 0  if cline =~ '^\s*=\L\@!'    return 0  endif   " Don't reindent coments on first column  if cline =~ '^#.'    return 0  endif   " Get current syntax item at the line's first char  let csynid = ''  if b:indent_use_syntax    let csynid = synIDattr(synID(v:lnum,1,0),"name")  endif   " Don't reindent POD and heredocs  if csynid == "perlPOD" || csynid == "perlHereDoc" || csynid =~ "^pod"    return indent(v:lnum)  endif   " Indent end-of-heredocs markers to column 0  if b:indent_use_syntax    " Assumes that an end-of-heredoc marker matches \I\i* to avoid    " confusion with other types of strings    if csynid == "perlStringStartEnd" && cline =~ '^\I\i*$'      return 0    endif  else    " Without syntax hints, assume that end-of-heredocs markers begin with EO    if cline =~ '^\s*EO'      return 0    endif  endif   " Now get the indent of the previous perl line.   " Find a non-blank 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)  let ind = indent(lnum)  " Skip heredocs, POD, and comments on 1st column  if b:indent_use_syntax    let skippin = 2    while skippin      let synid = synIDattr(synID(lnum,1,0),"name")      if (synid == "perlStringStartEnd" && line =~ '^\I\i*$')	    \ || (skippin != 2 && synid == "perlPOD")	    \ || (skippin != 2 && synid == "perlHereDoc")	    \ || synid == "perlComment"	    \ || synid =~ "^pod"	let lnum = prevnonblank(lnum - 1)	if lnum == 0	  return 0	endif	let line = getline(lnum)	let ind = indent(lnum)	let skippin = 1      else	let skippin = 0      endif    endwhile  else    if line =~ "^EO"      let lnum = search("<<[\"']\\=EO", "bW")      let line = getline(lnum)      let ind = indent(lnum)    endif  endif   " Indent blocks enclosed by {} or ()  if b:indent_use_syntax    " Find a real opening brace    let bracepos = match(line, '[(){}]', matchend(line, '^\s*[)}]'))    while bracepos != -1      let synid = synIDattr(synID(lnum, bracepos + 1, 0), "name")      " If the brace is highlighted in one of those groups, indent it.      " 'perlHereDoc' is here only to handle the case '&foo(<<EOF)'.      if synid == ""	    \ || synid == "perlMatchStartEnd"	    \ || synid == "perlHereDoc"	    \ || synid =~ "^perlFiledescStatement"	    \ || synid =~ '^perl\(Sub\|BEGINEND\|If\)Fold'	let brace = strpart(line, bracepos, 1)	if brace == '(' || brace == '{'	  let ind = ind + &sw	else	  let ind = ind - &sw	endif      endif      let bracepos = match(line, '[(){}]', bracepos + 1)    endwhile    let bracepos = matchend(cline, '^\s*[)}]')    if bracepos != -1      let synid = synIDattr(synID(v:lnum, bracepos, 0), "name")      if synid == ""	    \ || synid == "perlMatchStartEnd"	    \ || synid =~ '^perl\(Sub\|BEGINEND\|If\)Fold'	let ind = ind - &sw      endif    endif  else    if line =~ '[{(]\s*\(#[^)}]*\)\=$'      let ind = ind + &sw    endif    if cline =~ '^\s*[)}]'      let ind = ind - &sw    endif  endif   " Indent lines that begin with 'or' or 'and'  if cline =~ '^\s*\(or\|and\)\>'    if line !~ '^\s*\(or\|and\)\>'      let ind = ind + &sw    endif  elseif line =~ '^\s*\(or\|and\)\>'    let ind = ind - &sw  endif   return ind endfunction let &cpo = s:cpo_saveunlet s:cpo_save " vim:ts=8:sts=2:sw=2