Added vim sleuth as a git submodule
This commit is contained in:
parent
bb6b0a9641
commit
a22b697c08
5
.gitmodules
vendored
5
.gitmodules
vendored
@ -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
|
||||||
|
|||||||
1
vim/.vim/bundle/sleuth
Submodule
1
vim/.vim/bundle/sleuth
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 2826bc17ef1820f68dfe6e43574a567e3c67a56d
|
||||||
@ -1 +0,0 @@
|
|||||||
See the [contribution guidelines for pathogen.vim](https://github.com/tpope/vim-pathogen/blob/master/CONTRIBUTING.markdown).
|
|
||||||
@ -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`.
|
|
||||||
@ -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:
|
|
||||||
@ -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:
|
|
||||||
Loading…
x
Reference in New Issue
Block a user