let option_val = &option
スクリプトを使用して設定の値にアクセスできます。私が見たのは、dictを使用して、変更するオプションを格納することです。dictを繰り返し処理して古い値を格納し、新しい値を設定します。
例
これはより直接的なアプローチです。事前に設定がわかっている場合は、これを使用します。
function! s:do_something() abort
" Options needed by the plugin
let plugin_options = {
\ 'list': 0,
\ 'winfixwidth': 1,
\ 'autoindent': 0,
\ 'filetype': 'ini',
\ }
echo 'desired:' plugin_options
for option in keys(plugin_options)
execute 'let old_val = &'.option
execute 'let &'.option.' = plugin_options[option]'
let plugin_options[option] = old_val
endfor
echo 'changed:' plugin_options
for option in keys(plugin_options)
execute 'let &'.option.' = plugin_options[option]'
endfor
endfunction
call s:do_something()
plugin_options
変数は、関数にスコープされているので、古いオプション値を保存するために再利用することができます。
高度な例
以下のスクリプトを使用すると、呼び出すまで元の設定を維持しながら、スクリプト内の任意の場所で設定を変更できます s:restore_settings()
function! s:set(option, value) abort
if !exists('b:_saved_settings')
let b:_saved_settings = {}
endif
" Only save the original values
if !has_key(b:_saved_settings, a:option)
execute 'let b:_saved_settings[a:option] = &'.a:option
endif
execute 'let &'.a:option.' = a:value'
endfunction
function! s:restore_settings(...) abort
if !exists('b:_saved_settings')
return
endif
if a:0
for option in a:000
if has_key(b:_saved_settings, option)
execute 'let &'.option.' = b:_saved_settings[option]'
call remove(b:_saved_settings, option)
endif
endfor
else
for option in keys(b:_saved_settings)
execute 'let &'.option.' = b:_saved_settings[option]'
endfor
unlet! b:_saved_settings
endif
endfunction
" Options needed by the plugin
call s:set('list', 0)
call s:set('winfixwidth', 1)
call s:set('autoindent', 0)
call s:set('filetype', 'ini')
echo 'original:' b:_saved_settings
call s:restore_settings('list', 'filetype')
echo 'partial restore:' b:_saved_settings
call s:restore_settings()
s:set()
と似ていset
ます。まだ保存されていない場合は、元の設定の値を保存し、設定の値を使用します。
s:restore_settings()
引数なしで呼び出すと、変更が完全に復元されます。引数を指定すると、部分的に復元されます。これを使用する場合、スクリプトが復元前にエラーに陥った場合に備えて、s:restore_settings()
最初に呼び出す前に呼び出すことをお勧めしますs:set()
。