Skip to content

Commit 5f31747

Browse files
committed
sensible.vim: accumulate :set's, perform at end
1 parent 71538f6 commit 5f31747

File tree

1 file changed

+75
-44
lines changed

1 file changed

+75
-44
lines changed

plugin/sensible.vim

Lines changed: 75 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -26,24 +26,22 @@ else
2626
endfunction
2727
endif
2828

29-
" Check if an option was set from a file in $HOME. This lets us avoid
30-
" overriding options in the user's vimrc, but still override options in the
31-
" system vimrc.
32-
function! s:MaySet(option) abort
33-
let out = s:Execute('verbose setglobal all ' . a:option . '?')
34-
return out !~# " \\(\\~[\\/][^\n]*\\|Lua\\)$"
29+
let s:defaultval_yes = ['set ', '']
30+
let s:defaultval_no = ['set no', '']
31+
let s:defaultval_checked = ['" ', ''] " translates to comment -> no :set
32+
let s:default_opts = []
33+
let s:default_vals = {}
34+
function! s:Default(option, value) abort
35+
call add(s:default_opts, a:option)
36+
let s:default_vals[a:option] = a:value
3537
endfunction
3638

37-
if s:MaySet('backspace')
38-
set backspace=indent,eol,start
39-
endif
39+
call s:Default('backspace', 'indent,eol,start')
4040
" Disable completing keywords in included files (e.g., #include in C). When
4141
" configured properly, this can result in the slow, recursive scanning of
4242
" hundreds of files of dubious relevance.
4343
set complete-=i
44-
if s:MaySet('smarttab')
45-
set smarttab
46-
endif
44+
call s:Default('smarttab', s:defaultval_yes)
4745

4846
set nrformats-=octal
4947

@@ -54,40 +52,37 @@ if !has('nvim') && &ttimeoutlen == -1
5452
set ttimeoutlen=100
5553
endif
5654

57-
if has('reltime') && s:MaySet('incsearch')
58-
set incsearch
55+
if has('reltime')
56+
call s:Default('incsearch', s:defaultval_yes)
5957
endif
6058
" Use CTRL-L to clear the highlighting of 'hlsearch' (off by default) and call
6159
" :diffupdate.
6260
if maparg('<C-L>', 'n') ==# ''
6361
nnoremap <silent> <C-L> :nohlsearch<C-R>=has('diff')?'<Bar>diffupdate':''<CR><CR><C-L>
6462
endif
6563

66-
if s:MaySet('laststatus')
67-
set laststatus=2
68-
endif
69-
if s:MaySet('ruler')
70-
set ruler
71-
endif
72-
if s:MaySet('wildmenu')
73-
set wildmenu
74-
endif
64+
call s:Default('laststatus', '2')
65+
call s:Default('ruler', s:defaultval_yes)
66+
call s:Default('wildmenu', s:defaultval_yes)
67+
68+
call s:Default('scrolloff', '1')
69+
70+
call s:Default('sidescroll', s:defaultval_checked)
71+
call s:Default('sidescrolloff', s:defaultval_checked)
72+
" call at the end
73+
function! s:DefaultSetScroll() abort
74+
if s:MaySet('sidescroll') && s:MaySet('sidescrolloff')
75+
set sidescroll=1
76+
set sidescrolloff=2
77+
endif
78+
endfunction
7579

76-
if s:MaySet('scrolloff')
77-
set scrolloff=1
78-
endif
79-
if s:MaySet('sidescroll') && s:MaySet('sidescrolloff')
80-
set sidescroll=1
81-
set sidescrolloff=2
82-
endif
8380
set display+=lastline
8481
if has('patch-7.4.2109')
8582
set display+=truncate
8683
endif
8784

88-
if s:MaySet('listchars')
89-
set listchars=tab:>\ ,trail:-,extends:>,precedes:<,nbsp:+
90-
endif
85+
call s:Default('listchars', 'tab:>\ ,trail:-,extends:>,precedes:<,nbsp:+')
9186

9287
" Delete comment character when joining commented lines.
9388
if v:version > 703 || v:version == 703 && has("patch541")
@@ -100,16 +95,10 @@ if has('path_extra') && (',' . &g:tags . ',') =~# ',\./tags,'
10095
setglobal tags-=./tags tags-=./tags; tags^=./tags;
10196
endif
10297

103-
if s:MaySet('autoread')
104-
set autoread
105-
endif
98+
call s:Default('autoread', s:defaultval_yes)
10699

107-
if s:MaySet('history')
108-
set history=1000
109-
endif
110-
if s:MaySet('tabpagemax')
111-
set tabpagemax=50
112-
endif
100+
call s:Default('history', '1000')
101+
call s:Default('tabpagemax', '50')
113102

114103
" Persist g:UPPERCASE variables, used by some plugins, in .viminfo.
115104
if !empty(&viminfo)
@@ -131,10 +120,48 @@ if &shell =~# 'fish$' && (v:version < 704 || v:version == 704 && !has('patch276'
131120
endif
132121

133122
" Disable a legacy behavior that can break plugin maps.
134-
if has('langmap') && exists('+langremap') && &langremap && s:MaySet('langremap')
135-
set nolangremap
123+
if has('langmap') && exists('+langremap') && &langremap
124+
call s:Default('langremap', s:defaultval_no)
136125
endif
137126

127+
function! s:CheckDefaults() abort
128+
call filter(s:default_opts, 'exists("&" . v:val)')
129+
let check_str = join(map(copy(s:default_opts), 'v:val . "?"'), ' ')
130+
let s:global_settings = s:Execute('verbose setglobal all lines? ' . check_str)
131+
" 'lines=' delimits the start of the answer
132+
let s:global_settings = substitute(s:global_settings, '.*lines=[^\n]*', '', '') . "\n"
133+
" ^ begins and ends in newline
134+
endfunction
135+
136+
" Check if an option was set from a file in $HOME. This lets us avoid
137+
" overriding options in the user's vimrc, but still override options in the
138+
" system vimrc.
139+
let s:homerx = " \\(\\~[\\/][^\n]*\\|Lua\\)\n"
140+
function! s:MaySet(option) abort
141+
"return s:Execute('verbose setglobal all ' . a:option . '?') . "\n" !~# s:homerx " previous version
142+
return s:global_settings !~# ('\n\(\s\+\|no\)\?' . a:option . '\(=[^\n]*\n\|\n\)' . '[^\n]*' . s:homerx)
143+
endfunction
144+
145+
function! s:TranslateDefault(opt) abort
146+
if ! s:MaySet(a:opt)
147+
return ''
148+
endif
149+
let val = s:default_vals[a:opt]
150+
if type(val) == 1
151+
return 'set ' . a:opt . '=' . val
152+
else
153+
return val[0] . a:opt . val[1]
154+
endif
155+
endfunction
156+
function! s:ComputeSettings() abort
157+
return join(map(copy(s:default_opts), 's:TranslateDefault(v:val)'), "\n")
158+
endfunction
159+
160+
call s:CheckDefaults()
161+
let s:computed_settings = s:ComputeSettings()
162+
call s:Execute(s:computed_settings)
163+
call s:DefaultSetScroll()
164+
138165
if !(exists('g:did_load_filetypes') && exists('g:did_load_ftplugin') && exists('g:did_indent_on'))
139166
filetype plugin indent on
140167
endif
@@ -169,3 +196,7 @@ endif
169196
if exists(':Man') != 2 && !exists('g:loaded_man') && &filetype !=? 'man' && !has('nvim')
170197
runtime ftplugin/man.vim
171198
endif
199+
200+
function! s:GetComputedSettings() abort " DEBUG: call with <SNR> from :scriptnames
201+
return s:computed_settings
202+
endfun

0 commit comments

Comments
 (0)