diff options
Diffstat (limited to 'plugin/sleuth.vim')
-rw-r--r-- | plugin/sleuth.vim | 166 |
1 files changed, 0 insertions, 166 deletions
diff --git a/plugin/sleuth.vim b/plugin/sleuth.vim deleted file mode 100644 index a0bba8c4..00000000 --- a/plugin/sleuth.vim +++ /dev/null @@ -1,166 +0,0 @@ -" Heuristically set buffer options -" -" Modified version of vim-sleuth: -" - softtab and tabstop reduced from 8 to 2 -" - number of considered lines reduced from 1024 to 64 -" - maximum 6 other files are checked instead of 20 -" - check maximum of files 2 per directory level instead of 8 -" - maximum of 3 directory levels are checked -" - globs are concatenated for performance -" - tabstop setting is not configured, it's up to user -if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'autoindent') != -1 - finish -endif - -if exists("g:loaded_sleuth") || exists("g:polyglot_disabled") || v:version < 700 || &cp - finish -endif - -let g:loaded_sleuth = 1 - -function! s:guess(lines) abort - let options = {} - let heuristics = {'spaces': 0, 'hard': 0, 'soft': 0} - let ccomment = 0 - let podcomment = 0 - let triplequote = 0 - let backtick = 0 - let xmlcomment = 0 - let softtab = repeat(' ', 2) - - for line in a:lines - if !len(line) || line =~# '^\s*$' - continue - endif - - if line =~# '^\s*/\*' - let ccomment = 1 - endif - if ccomment - if line =~# '\*/' - let ccomment = 0 - endif - continue - endif - - if line =~# '^=\w' - let podcomment = 1 - endif - if podcomment - if line =~# '^=\%(end\|cut\)\>' - let podcomment = 0 - endif - continue - endif - - if triplequote - if line =~# '^[^"]*"""[^"]*$' - let triplequote = 0 - endif - continue - elseif line =~# '^[^"]*"""[^"]*$' - let triplequote = 1 - endif - - if backtick - if line =~# '^[^`]*`[^`]*$' - let backtick = 0 - endif - continue - elseif &filetype ==# 'go' && line =~# '^[^`]*`[^`]*$' - let backtick = 1 - endif - - if line =~# '^\s*<\!--' - let xmlcomment = 1 - endif - if xmlcomment - if line =~# '-->' - let xmlcomment = 0 - endif - continue - endif - - if line =~# '^\t' - let heuristics.hard += 1 - elseif line =~# '^' . softtab - let heuristics.soft += 1 - endif - if line =~# '^ ' - let heuristics.spaces += 1 - endif - let indent = len(matchstr(substitute(line, '\t', softtab, 'g'), '^ *')) - if indent > 1 && (indent < 4 || indent % 2 == 0) && - \ get(options, 'shiftwidth', 99) > indent - let options.shiftwidth = indent - endif - endfor - - if heuristics.hard && !heuristics.spaces - return {'expandtab': 0, 'shiftwidth': &tabstop} - elseif heuristics.soft != heuristics.hard - let options.expandtab = heuristics.soft > heuristics.hard - endif - - return options -endfunction - -function! s:apply_if_ready(options) abort - if !has_key(a:options, 'expandtab') || !has_key(a:options, 'shiftwidth') - return 0 - else - for [option, value] in items(a:options) - call setbufvar('', '&'.option, value) - endfor - return 1 - endif -endfunction - -function! s:detect() abort - if &buftype ==# 'help' - return - endif - - let options = s:guess(getline(1, 64)) - if s:apply_if_ready(options) - return - endif - let c = 6 - let pattern = c > 0 ? sleuth#GlobForFiletype(&filetype) : '' - let dir = expand('%:p:h') - let level = 3 - while isdirectory(dir) && dir !=# fnamemodify(dir, ':h') && c > 0 && level > 0 - let level -= 1 - for neighbor in glob(dir.'/'.pattern,0,1)[0:1] - if neighbor !=# expand('%:p') && filereadable(neighbor) - call extend(options, s:guess(readfile(neighbor, '', 32)), 'keep') - let c -= 1 - endif - if s:apply_if_ready(options) - let b:sleuth_culprit = neighbor - return - endif - if c <= 0 - break - endif - endfor - if c <= 0 - break - endif - let dir = fnamemodify(dir, ':h') - endwhile - if has_key(options, 'shiftwidth') - return s:apply_if_ready(extend({'expandtab': 1}, options)) - endif -endfunction - -setglobal smarttab - -if !exists('g:did_indent_on') - filetype indent on -endif - -augroup polyglot - autocmd! - autocmd FileType * call s:detect() -augroup END |