diff options
Diffstat (limited to 'runtime/indent/sh.vim')
-rw-r--r-- | runtime/indent/sh.vim | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/runtime/indent/sh.vim b/runtime/indent/sh.vim new file mode 100644 index 000000000..880ad12ce --- /dev/null +++ b/runtime/indent/sh.vim @@ -0,0 +1,58 @@ +" Vim indent file +" Language: Shell Script +" Maintainer: Nikolai Weibull <source@pcppopper.org> +" URL: http://www.pcppopper.org/vim/indent/pcp/sh/ +" Latest Revision: 2004-04-25 +" arch-tag: 431c7fc1-12a6-4d71-9636-1498ef56b038 + +" Only load this indent file when no other was loaded. +if exists("b:did_indent") + finish +endif + +let b:did_indent = 1 + +setlocal indentexpr=GetShIndent() +setlocal indentkeys+==then,=do,=else,=elif,=esac,=fi,=fin,=fil,=done +setlocal indentkeys-=:,0# + +" Only define the function once. +if exists("*GetShIndent") + finish +endif + +set cpoptions-=C + +function GetShIndent() + " 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 + + " Add a 'shiftwidth' after if, while, else, case, until, for, function() + " Skip if the line also contains the closure for the above + let ind = indent(lnum) + let line = getline(lnum) + if line =~ '^\s*\(if\|then\|do\|else\|elif\|case\|while\|until\|for\)\>' + \ || line =~ '^\s*\<\h\w*\>\s*()\s*{' + \ || line =~ '^\s*{' + if line !~ '\(esac\|fi\|done\)\>\s*$' && line !~ '}\s*$' + let ind = ind + &sw + endif + endif + + " Subtract a 'shiftwidth' on a then, do, else, esac, fi, done + " Retain the indentation level if line matches fin (for find) + let line = getline(v:lnum) + if (line =~ '^\s*\(then\|do\|else\|elif\|esac\|fi\|done\)\>' || line =~ '^\s*}') + \ && line !~ '^\s*fi[ln]\>' + let ind = ind - &sw + endif + + return ind +endfunction + +" vim: set sts=2 sw=2: |