From 3ea769e79a308dc6ce73c110add748919fe6781d Mon Sep 17 00:00:00 2001 From: Tom Ryder Date: Sat, 30 May 2020 01:06:58 +1200 Subject: Split detect_indent.vim into autoload/plugin Add load guard etc --- vim/autoload/detect_indent.vim | 57 +++++++++++++++++++++++++++++++++ vim/plugin/detect_indent.vim | 72 ++++++++---------------------------------- 2 files changed, 70 insertions(+), 59 deletions(-) create mode 100644 vim/autoload/detect_indent.vim 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 diff --git a/vim/plugin/detect_indent.vim b/vim/plugin/detect_indent.vim index 8bffde42..fef4b65e 100644 --- a/vim/plugin/detect_indent.vim +++ b/vim/plugin/detect_indent.vim @@ -1,59 +1,13 @@ -function s:CompareNumeric(a, b) - return a:a > a:b ? 1 : -1 -endfunction - -function Count() 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 - -autocmd FileType * call Count() +if exists('loaded_detect_indent') || &compatible + finish +endif +let loaded_detect_indent = 1 + +command! -bar DetectIndent + \ call detect_indent#() + +augroup detect_indent + autocmd! + autocmd FileType * + \ DetectIndent +augroup END -- cgit v1.2.3