diff options
Diffstat (limited to 'vim/autoload/detect_indent.vim')
-rw-r--r-- | vim/autoload/detect_indent.vim | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/vim/autoload/detect_indent.vim b/vim/autoload/detect_indent.vim new file mode 100644 index 00000000..91952032 --- /dev/null +++ b/vim/autoload/detect_indent.vim @@ -0,0 +1,57 @@ +function s:CompareNumeric(a, b) + return a:a > a:b ? 1 : -1 +endfunction + +function detect_indent#() abort + + let spaces = { + \ 'hist': {}, + \ 'total': 0, + \} + let tabs = 0 + let total = max([line('$'), 1024]) + + for lnum in range(1, total) + let line = getline(lnum) + let tabs += matchstr(line, '^\t*') != '' + let indent = strlen(matchstr(line, '^ *')) + if indent == 0 + continue + endif + if !has_key(spaces['hist'], indent) + let spaces['hist'][indent] = 0 + endif + let spaces['hist'][indent] += 1 + let spaces['total'] += 1 + endfor + + if &expandtab == (spaces['total'] > tabs) + return + endif + + if &expandtab + setlocal noexpandtab softtabstop=0 + let &l:shiftwidth = &tabstop + else + setlocal expandtab + let shiftwidth = 0 + let indents = keys(spaces['hist']) + call map(indents, 'str2nr(v:val)') + call sort(indents, 's:CompareNumeric') + for shiftwidth in indents + if spaces['hist'][shiftwidth] * 100 / spaces['total'] >= 5 + break + endif + endfor + let &l:shiftwidth = shiftwidth + let &l:softtabstop = shiftwidth + endif + + let undo_indent = 'setlocal expandtab? shiftwidth? softtabstop?' + if exists('b:undo_indent') + let b:undo_indent .= '|'.undo_indent + else + let b:undo_indent = undo_indent + endif + +endfunction |