Added vim sleuth as a git submodule

This commit is contained in:
Andrew R. M 2017-04-06 07:35:27 -04:00
parent bb6b0a9641
commit a22b697c08
6 changed files with 5 additions and 238 deletions

5
.gitmodules vendored
View File

@ -1,6 +1,9 @@
[submodule "vim/.vim/bundle/slime"] [submodule "vim/.vim/bundle/slime"]
path = vim/.vim/bundle/slime path = vim/.vim/bundle/slime
url = http://github.com/jpalardy/vim-slime url = https://github.com/jpalardy/vim-slime
[submodule "vim/.vim/bundle/filetype-nix"] [submodule "vim/.vim/bundle/filetype-nix"]
path = vim/.vim/bundle/filetype-nix path = vim/.vim/bundle/filetype-nix
url = https://github.com/LnL7/vim-nix url = https://github.com/LnL7/vim-nix
[submodule "vim/.vim/bundle/sleuth"]
path = vim/.vim/bundle/sleuth
url = https://github.com/tpope/vim-sleuth

@ -0,0 +1 @@
Subproject commit 2826bc17ef1820f68dfe6e43574a567e3c67a56d

View File

@ -1 +0,0 @@
See the [contribution guidelines for pathogen.vim](https://github.com/tpope/vim-pathogen/blob/master/CONTRIBUTING.markdown).

View File

@ -1,48 +0,0 @@
# sleuth.vim
This plugin automatically adjusts `'shiftwidth'` and `'expandtab'`
heuristically based on the current file, or, in the case the current file is
new, blank, or otherwise insufficient, by looking at other files of the same
type in the current and parent directories. In lieu of adjusting
`'softtabstop'`, `'smarttab'` is enabled.
Compare to [DetectIndent][]. I wrote this because I wanted something fully
automatic. My goal is that by installing this plugin, you can remove all
indenting related configuration from your vimrc.
[DetectIndent]: http://www.vim.org/scripts/script.php?script_id=1171
## Installation
If you don't have a preferred installation method, I recommend
installing [pathogen.vim](https://github.com/tpope/vim-pathogen), and
then simply copy and paste:
cd ~/.vim/bundle
git clone git://github.com/tpope/vim-sleuth.git
## Notes
* Searching for other files of the same type continues up the directory
hierarchy until a match is found. This means, for example, the indent for
the first file in a brand new Ruby project might very well be derived from
your `.irbrc`. I consider this a feature.
* If your file is consistently indented with hard tabs, `'shiftwidth'` will be
set to your `'tabstop'`. Otherwise, a `'tabstop'` of 8 is enforced.
* The algorithm is rolled from scratch, fairly simplistic, and only lightly
battle tested. It's probably not (yet) as good as [DetectIndent][].
Let me know what it fails on for you.
## Self-Promotion
Like sleuth.vim? Follow the repository on
[GitHub](https://github.com/tpope/vim-sleuth) and vote for it on
[vim.org](http://www.vim.org/scripts/script.php?script_id=4375). And if
you're feeling especially charitable, follow [tpope](http://tpo.pe/) on
[Twitter](http://twitter.com/tpope) and
[GitHub](https://github.com/tpope).
## License
Copyright © Tim Pope. Distributed under the same terms as Vim itself.
See `:help license`.

View File

@ -1,17 +0,0 @@
*sleuth.txt* Heuristically set buffer options
Author: Tim Pope <http://tpo.pe/>
Repo: https://github.com/tpope/vim-sleuth
License: Same terms as Vim itself (see |license|)
This plugin is only available if 'compatible' is not set.
SUMMARY *sleuth*
This plugin automatically adjusts 'shiftwidth' and 'expandtab' heuristically
based on the current file, or, in the case the current file is new, blank, or
otherwise insufficient, by looking at other files of the same type in the
current and parent directories. In lieu of adjusting 'softtabstop',
'smarttab' is enabled.
vim:tw=78:et:ft=help:norl:

View File

@ -1,171 +0,0 @@
" sleuth.vim - Heuristically set buffer options
" Maintainer: Tim Pope <http://tpo.pe/>
" Version: 1.1
" GetLatestVimScripts: 4375 1 :AutoInstall: sleuth.vim
if exists("g:loaded_sleuth") || 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
for line in a:lines
if 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 line =~# '^[^`]*`[^`]*$'
let backtick = 1
endif
let softtab = repeat(' ', 8)
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 && 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
if heuristics.hard
let options.tabstop = 8
endif
endif
return options
endfunction
function! s:patterns_for(type) abort
if a:type ==# ''
return []
endif
if !exists('s:patterns')
redir => capture
silent autocmd BufRead
redir END
let patterns = {
\ 'c': ['*.c'],
\ 'html': ['*.html'],
\ 'sh': ['*.sh'],
\ }
let setfpattern = '\s\+\%(setf\%[iletype]\s\+\|set\%[local]\s\+\%(ft\|filetype\)=\|call SetFileTypeSH(["'']\%(ba\|k\)\=\%(sh\)\@=\)'
for line in split(capture, "\n")
let match = matchlist(line, '^\s*\(\S\+\)\='.setfpattern.'\(\w\+\)')
if !empty(match)
call extend(patterns, {match[2]: []}, 'keep')
call extend(patterns[match[2]], [match[1] ==# '' ? last : match[1]])
endif
let last = matchstr(line, '\S.*')
endfor
let s:patterns = patterns
endif
return copy(get(s:patterns, a:type, []))
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 &modifiable == 0
return
endif
let options = s:guess(getline(1, 1024))
if s:apply_if_ready(options)
return
endif
let patterns = s:patterns_for(&filetype)
call filter(patterns, 'v:val !~# "/"')
let dir = expand('%:p:h')
while isdirectory(dir) && dir !=# fnamemodify(dir, ':h')
for pattern in patterns
for neighbor in split(glob(dir.'/'.pattern), "\n")[0:7]
if neighbor !=# expand('%:p') && filereadable(neighbor)
call extend(options, s:guess(readfile(neighbor, '', 256)), 'keep')
endif
if s:apply_if_ready(options)
let b:sleuth_culprit = neighbor
return
endif
endfor
endfor
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 sleuth
autocmd!
autocmd FileType * call s:detect()
augroup END
" vim:set et sw=2: