Skip to content

Commit f039d07

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

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,27 @@ 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:DefaultSet(option, value) abort
35+
if exists('&' . a:option)
36+
call add(s:default_opts, a:option)
37+
let s:default_vals[a:option] = a:value
38+
endif
39+
endfunction
40+
function! s:Default(option, value) abort
41+
call s:DefaultSet(a:option, ['set ', '=' . a:value])
3542
endfunction
3643

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

4851
set nrformats-=octal
4952

@@ -54,40 +57,37 @@ if !has('nvim') && &ttimeoutlen == -1
5457
set ttimeoutlen=100
5558
endif
5659

57-
if has('reltime') && s:MaySet('incsearch')
58-
set incsearch
60+
if has('reltime')
61+
call s:DefaultSet('incsearch', s:defaultval_yes)
5962
endif
6063
" Use CTRL-L to clear the highlighting of 'hlsearch' (off by default) and call
6164
" :diffupdate.
6265
if maparg('<C-L>', 'n') ==# ''
6366
nnoremap <silent> <C-L> :nohlsearch<C-R>=has('diff')?'<Bar>diffupdate':''<CR><CR><C-L>
6467
endif
6568

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
69+
call s:Default('laststatus', '2')
70+
call s:DefaultSet('ruler', s:defaultval_yes)
71+
call s:DefaultSet('wildmenu', s:defaultval_yes)
72+
73+
call s:Default('scrolloff', '1')
74+
75+
call s:DefaultSet('sidescroll', s:defaultval_checked)
76+
call s:DefaultSet('sidescrolloff', s:defaultval_checked)
77+
" call at the end
78+
function! s:DefaultSetScroll() abort
79+
if s:MaySet('sidescroll') && s:MaySet('sidescrolloff')
80+
set sidescroll=1
81+
set sidescrolloff=2
82+
endif
83+
endfunction
7584

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
8385
set display+=lastline
8486
if has('patch-7.4.2109')
8587
set display+=truncate
8688
endif
8789

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

9292
" Delete comment character when joining commented lines.
9393
if v:version > 703 || v:version == 703 && has("patch541")
@@ -100,16 +100,10 @@ if has('path_extra') && (',' . &g:tags . ',') =~# ',\./tags,'
100100
setglobal tags-=./tags tags-=./tags; tags^=./tags;
101101
endif
102102

103-
if s:MaySet('autoread')
104-
set autoread
105-
endif
103+
call s:DefaultSet('autoread', s:defaultval_yes)
106104

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

114108
" Persist g:UPPERCASE variables, used by some plugins, in .viminfo.
115109
if !empty(&viminfo)
@@ -131,10 +125,43 @@ if &shell =~# 'fish$' && (v:version < 704 || v:version == 704 && !has('patch276'
131125
endif
132126

133127
" Disable a legacy behavior that can break plugin maps.
134-
if has('langmap') && exists('+langremap') && &langremap && s:MaySet('langremap')
135-
set nolangremap
128+
if has('langmap') && exists('+langremap') && &langremap
129+
call s:DefaultSet('langremap', s:defaultval_no)
136130
endif
137131

132+
function! s:CheckDefaults() abort
133+
let check_str = join(map(copy(s:default_opts), 'v:val . "?"'), ' ')
134+
let s:global_settings = s:Execute('verbose setglobal all lines? ' . check_str)
135+
" 'lines=' delimits the start of the answer
136+
let s:global_settings = substitute(s:global_settings, '.*lines=[^\n]*', '', '') . "\n"
137+
" ^ begins and ends in newline
138+
endfunction
139+
140+
" Check if an option was set from a file in $HOME. This lets us avoid
141+
" overriding options in the user's vimrc, but still override options in the
142+
" system vimrc.
143+
let s:homerx = " \\(\\~[\\/][^\n]*\\|Lua\\)\n"
144+
function! s:MaySet(option) abort
145+
"return s:Execute('verbose setglobal all ' . a:option . '?') . "\n" !~# s:homerx " previous version
146+
return s:global_settings !~# ('\n\(\s\+\|no\)\?' . a:option . '\(=[^\n]*\n\|\n\)' . '[^\n]*' . s:homerx)
147+
endfunction
148+
149+
function! s:TranslateDefault(opt) abort
150+
if ! s:MaySet(a:opt)
151+
return ''
152+
endif
153+
let val = s:default_vals[a:opt]
154+
return val[0] . a:opt . val[1]
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)