diff options
| author | Adam Stankiewicz <sheerun@sher.pl> | 2020-10-19 11:00:16 +0200 | 
|---|---|---|
| committer | Adam Stankiewicz <sheerun@sher.pl> | 2020-10-19 11:00:16 +0200 | 
| commit | 903793ac04b9fbc06f3e0b6e63113a0dd4c87940 (patch) | |
| tree | 48384cafa70faa7fd94ccb81a63890109cee67dc | |
| parent | 71a21a1044370c58b3a8ac3cea7905cdd625220e (diff) | |
| download | vim-polyglot-903793ac04b9fbc06f3e0b6e63113a0dd4c87940.tar.gz vim-polyglot-903793ac04b9fbc06f3e0b6e63113a0dd4c87940.zip | |
Improve indent heuristics (count increments / decrements), fixes #592v4.15.0
Diffstat (limited to '')
| -rw-r--r-- | ftdetect/polyglot.vim | 79 | 
1 files changed, 55 insertions, 24 deletions
| diff --git a/ftdetect/polyglot.vim b/ftdetect/polyglot.vim index c4b0d720..69934c48 100644 --- a/ftdetect/polyglot.vim +++ b/ftdetect/polyglot.vim @@ -2634,7 +2634,19 @@ if !has_key(s:disabled_packages, 'autoindent')    " Code below re-implements sleuth for vim-polyglot    let g:loaded_sleuth = 1 -  function! s:guess(lines) abort +  func! s:get_shiftwidth(indents) abort +    let shiftwidth = 0 +    let max_count = 0 +    for [indent, indent_count] in items(a:indents) +      if indent_count > max_count +        let shiftwidth = indent +        let max_count = indent_count +      endif +    endfor +    return shiftwidth +  endfunc + +  func! s:guess(lines) abort      let options = {}      let ccomment = 0      let podcomment = 0 @@ -2644,12 +2656,15 @@ if !has_key(s:disabled_packages, 'autoindent')      let heredoc = ''      let minindent = 10      let spaces_minus_tabs = 0 -    let i = 0 +    let lineno = 0 +    let indents = { '2': 0, '3': 0, '4': 0, '6': 0, '8': 0 } +    let next_indent_lineno = 1 +    let prev_indent = 0      for line in a:lines -      let i += 1 +      let lineno += 1 -      if !len(line) || line =~# '^\S+$' +      if line =~# '^\s*$'          continue        endif @@ -2713,35 +2728,45 @@ if !has_key(s:disabled_packages, 'autoindent')          let heredoc = herematch[1] . '$'        endif -      let spaces_minus_tabs += line[0] == "\t" ? 1 : -1 -        if line[0] == "\t" -        setlocal noexpandtab -        let &l:shiftwidth=&tabstop -        let b:sleuth_culprit .= ':' . i -        return 1 -      elseif line[0] == " " +        let spaces_minus_tabs -= 1 +      else +        let spaces_minus_tabs += 1          let indent = len(matchstr(line, '^ *')) -        if indent < minindent && index([2, 3, 4, 6, 8], indent) >= 0 -          let minindent = indent +        let indent_inc = abs(indent - prev_indent) + +        if indent_inc > 0 && lineno == next_indent_lineno +          if has_key(indents, indent_inc) +            let indents[indent_inc] += 1 +          endif          endif + +        let next_indent_lineno = lineno + 1 +        let prev_indent = indent        endif      endfor -    if minindent < 10 +    if spaces_minus_tabs < 0 +      setlocal noexpandtab +      let &l:shiftwidth=&tabstop +      return 1 +    endif + +    let shiftwidth = s:get_shiftwidth(indents) + +    if shiftwidth > 0        setlocal expandtab -      let &l:shiftwidth=minindent +      let &l:shiftwidth=shiftwidth        if &tabstop == 8 -        let &l:tabstop=minindent +        let &l:tabstop=shiftwidth        endif -      let b:sleuth_culprit .= ':' . i        return 1      endif      return 0 -  endfunction +  endfunc -  function! s:detect_indent() abort +  func! s:detect_indent() abort      if &buftype ==# 'help'        return      endif @@ -2757,7 +2782,7 @@ if !has_key(s:disabled_packages, 'autoindent')      endif      let b:sleuth_culprit = expand("<afile>:p") -    if s:guess(getline(1, 32)) +    if s:guess(getline(1, 64))        return      endif      if s:guess(getline(1, 1024)) @@ -2794,12 +2819,18 @@ if !has_key(s:disabled_packages, 'autoindent')        let level -= 1      endwhile -    unlet b:sleuth_culprit -  endfunction +    setlocal expandtab +    let &l:shiftwidth = 2 +    if &tabstop == 8 +      let &l:tabstop = 2 +    endif + +    let b:sleuth_culprit = "default" +  endfunc    set smarttab -  function! SleuthIndicator() abort +  func! SleuthIndicator() abort      let sw = &shiftwidth ? &shiftwidth : &tabstop      if &expandtab        return 'sw='.sw @@ -2808,7 +2839,7 @@ if !has_key(s:disabled_packages, 'autoindent')      else        return 'sw='.sw.',ts='.&tabstop      endif -  endfunction +  endfunc    augroup polyglot-sleuth      au! | 
