diff options
Diffstat (limited to 'indent/sh.vim')
-rw-r--r-- | indent/sh.vim | 203 |
1 files changed, 0 insertions, 203 deletions
diff --git a/indent/sh.vim b/indent/sh.vim deleted file mode 100644 index 23a2d2ce..00000000 --- a/indent/sh.vim +++ /dev/null @@ -1,203 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Shell Script -" Maintainer: Christian Brabandt <cb@256bit.org> -" Previous Maintainer: Peter Aronoff <telemachus@arpinum.org> -" Original Author: Nikolai Weibull <now@bitwi.se> -" Latest Revision: 2017-08-08 -" License: Vim (see :h license) -" Repository: https://github.com/chrisbra/vim-sh-indent -" Changelog: -" 20170808: - better indent of line continuation -" 20170502: - get rid of buffer-shiftwidth function -" 20160912: - preserve indentation of here-doc blocks -" 20160627: - detect heredocs correctly -" 20160213: - detect function definition correctly -" 20160202: - use shiftwidth() function -" 20151215: - set b:undo_indent variable -" 20150728: - add foreach detection for zsh - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentexpr=GetShIndent() -setlocal indentkeys+=0=then,0=do,0=else,0=elif,0=fi,0=esac,0=done,0=end,),0=;;,0=;& -setlocal indentkeys+=0=fin,0=fil,0=fip,0=fir,0=fix -setlocal indentkeys-=:,0# -setlocal nosmartindent - -let b:undo_indent = 'setlocal indentexpr< indentkeys< smartindent<' - -if exists("*GetShIndent") - finish -endif - -let s:cpo_save = &cpo -set cpo&vim - -let s:sh_indent_defaults = { - \ 'default': function('shiftwidth'), - \ 'continuation-line': function('shiftwidth'), - \ 'case-labels': function('shiftwidth'), - \ 'case-statements': function('shiftwidth'), - \ 'case-breaks': 0 } - -function! s:indent_value(option) - let Value = exists('b:sh_indent_options') - \ && has_key(b:sh_indent_options, a:option) ? - \ b:sh_indent_options[a:option] : - \ s:sh_indent_defaults[a:option] - if type(Value) == type(function('type')) - return Value() - endif - return Value -endfunction - -function! GetShIndent() - let lnum = prevnonblank(v:lnum - 1) - if lnum == 0 - return 0 - endif - - let pnum = prevnonblank(lnum - 1) - - let ind = indent(lnum) - let line = getline(lnum) - if line =~ '^\s*\%(if\|then\|do\|else\|elif\|case\|while\|until\|for\|select\|foreach\)\>' - if line !~ '\<\%(fi\|esac\|done\|end\)\>\s*\%(#.*\)\=$' - let ind += s:indent_value('default') - endif - elseif s:is_case_label(line, pnum) - if !s:is_case_ended(line) - let ind += s:indent_value('case-statements') - endif - elseif line =~ '^\s*\<\k\+\>\s*()\s*{' || line =~ '^\s*{' || line =~ '^\s*function\s*\w\S\+\s*\%(()\)\?\s*{' - if line !~ '}\s*\%(#.*\)\=$' - let ind += s:indent_value('default') - endif - elseif s:is_continuation_line(line) - if pnum == 0 || !s:is_continuation_line(getline(pnum)) - let ind += s:indent_value('continuation-line') - endif - elseif pnum != 0 && s:is_continuation_line(getline(pnum)) - let ind = indent(s:find_continued_lnum(pnum)) - endif - - let pine = line - let line = getline(v:lnum) - if line =~ '^\s*\%(then\|do\|else\|elif\|fi\|done\|end\)\>' || line =~ '^\s*}' - let ind -= s:indent_value('default') - elseif line =~ '^\s*esac\>' && s:is_case_empty(getline(v:lnum - 1)) - let ind -= s:indent_value('default') - elseif line =~ '^\s*esac\>' - let ind -= (s:is_case_label(pine, lnum) && s:is_case_ended(pine) ? - \ 0 : s:indent_value('case-statements')) + - \ s:indent_value('case-labels') - if s:is_case_break(pine) - let ind += s:indent_value('case-breaks') - endif - elseif s:is_case_label(line, lnum) - if s:is_case(pine) - let ind = indent(lnum) + s:indent_value('case-labels') - else - let ind -= (s:is_case_label(pine, lnum) && s:is_case_ended(pine) ? - \ 0 : s:indent_value('case-statements')) - - \ s:indent_value('case-breaks') - endif - elseif s:is_case_break(line) - let ind -= s:indent_value('case-breaks') - elseif s:is_here_doc(line) - let ind = 0 - " statements, executed within a here document. Keep the current indent - elseif match(map(synstack(v:lnum, 1), 'synIDattr(v:val, "name")'), '\c\mheredoc') > -1 - return indent(v:lnum) - endif - - return ind -endfunction - -function! s:is_continuation_line(line) - return a:line =~ '\%(\%(^\|[^\\]\)\\\|&&\|||\||\)' . - \ '\s*\({\s*\)\=\(#.*\)\=$' -endfunction - -function! s:find_continued_lnum(lnum) - let i = a:lnum - while i > 1 && s:is_continuation_line(getline(i - 1)) - let i -= 1 - endwhile - return i -endfunction - -function! s:is_case_label(line, pnum) - if a:line !~ '^\s*(\=.*)' - return 0 - endif - - if a:pnum > 0 - let pine = getline(a:pnum) - if !(s:is_case(pine) || s:is_case_ended(pine)) - return 0 - endif - endif - - let suffix = substitute(a:line, '^\s*(\=', "", "") - let nesting = 0 - let i = 0 - let n = strlen(suffix) - while i < n - let c = suffix[i] - let i += 1 - if c == '\\' - let i += 1 - elseif c == '(' - let nesting += 1 - elseif c == ')' - if nesting == 0 - return 1 - endif - let nesting -= 1 - endif - endwhile - return 0 -endfunction - -function! s:is_case(line) - return a:line =~ '^\s*case\>' -endfunction - -function! s:is_case_break(line) - return a:line =~ '^\s*;[;&]' -endfunction - -function! s:is_here_doc(line) - if a:line =~ '^\w\+$' - let here_pat = '<<-\?'. s:escape(a:line). '\$' - return search(here_pat, 'bnW') > 0 - endif - return 0 -endfunction - -function! s:is_case_ended(line) - return s:is_case_break(a:line) || a:line =~ ';[;&]\s*\%(#.*\)\=$' -endfunction - -function! s:is_case_empty(line) - if a:line =~ '^\s*$' || a:line =~ '^\s*#' - return s:is_case_empty(getline(v:lnum - 1)) - else - return a:line =~ '^\s*case\>' - endif -endfunction - -function! s:escape(pattern) - return '\V'. escape(a:pattern, '\\') -endfunction - -let &cpo = s:cpo_save -unlet s:cpo_save - -endif |