2626 endfunction
2727endif
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
3537endfunction
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.
4343set complete -= i
44- if s: MaySet (' smarttab' )
45- set smarttab
46- endif
44+ call s: Default (' smarttab' , s: defaultval_yes )
4745
4846set nrformats -= octal
4947
@@ -54,40 +52,37 @@ if !has('nvim') && &ttimeoutlen == -1
5452 set ttimeoutlen = 100
5553endif
5654
57- if has (' reltime' ) && s: MaySet ( ' incsearch ' )
58- set incsearch
55+ if has (' reltime' )
56+ call s: Default ( ' incsearch' , s: defaultval_yes )
5957endif
6058" Use CTRL-L to clear the highlighting of 'hlsearch' (off by default) and call
6159" :diffupdate.
6260if maparg (' <C-L>' , ' n' ) == # ' '
6361 nnoremap <silent> <C-L> :nohlsearch<C-R> =has('diff')?'<Bar> diffupdate':''<CR><CR><C-L>
6462endif
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
8380set display += lastline
8481if has (' patch-7.4.2109' )
8582 set display += truncate
8683endif
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.
9388if 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 ;
10196endif
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.
115104if ! empty (&viminfo )
@@ -131,10 +120,48 @@ if &shell =~# 'fish$' && (v:version < 704 || v:version == 704 && !has('patch276'
131120endif
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 )
136125endif
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+
138165if ! (exists (' g:did_load_filetypes' ) && exists (' g:did_load_ftplugin' ) && exists (' g:did_indent_on' ))
139166 filetype plugin indent on
140167endif
@@ -169,3 +196,7 @@ endif
169196if exists (' :Man' ) != 2 && ! exists (' g:loaded_man' ) && &filetype !=? ' man' && ! has (' nvim' )
170197 runtime ftplugin/man.vim
171198endif
199+
200+ function ! s: GetComputedSettings () abort " DEBUG: call with <SNR> from :scriptnames
201+ return s: computed_settings
202+ endfun
0 commit comments