History
Article Edit this page Discussion

Cache user-preferred option values for later reset

From Vim Tips Wiki

Jump to: navigation, search

Tip 1456 Previous Next Created: January 5, 2007 Complexity: basic Author: Thomas Version: n/a


Some plugins inadvertently set global options. I have the following code at the top of my vimrc, and set all options to my preferred values using the SetOption command. Whenever I want to reset options I do :ResetOptions which resets all user-defined options previously set by SetOption.

let s:option_preferences = []
function! ResetOption(options)
  if empty(a:options)
    let options = s:option_preferences
  else
    let options = a:options
  endif
  for name in options
    let name0 = 'g:'. name .'_default'
    if exists(name0)
      exec 'let &'. name .' = '. name0
    endif
  endfor
endfunction

command! -nargs=* ResetOption :call ResetOption([<f-args>])
command! -nargs=+ SetOption let s:tmlargs=[<f-args>]
 \ | for arg in s:tmlargs[1:-1]
 \ |   if arg =~ '^[+-]\?='
 \ |     exec 'set '.s:tmlargs[0] . arg
 \ |   else
 \ |     exec 'let &'.s:tmlargs[0] .'='. arg
 \ |   endif
 \ | endfor
 \ | call add(s:option_preferences, s:tmlargs[0])
 \ | exec 'let g:'. s:tmlargs[0] .'_default = &'. s:tmlargs[0]
 \ | unlet s:tmlargs

[edit] Examples

Add and remove specific options

:SetOption cpo +=my -=M

Set the value

:SetOption ts 4
:SetOption ts =4

Just cache the predefined value so that it can be restored later
In this example a later reset would be the same as :set tw&

:SetOption tw

Reset specific options

:ResetOption ts tw

Reset all user-set options

:ResetOption

In order to monitor the options setting, I display changed values in &statusline.

set statusline=%1*[%{winnr()}:%02n]%*\ %2t\ %(%M%R%H%W%k%)\ %=%{TmlStatusline()}\ %3*<%l,%c%V,%p%%>%*

function! TmlStatusline()
  let opt = "<". &syntax ."/". &fileformat .">"
  if !&backup | let opt=opt." no-bak" |endif
  if !&et | let opt=opt." no-et" |endif
  if &list | let opt=opt." list" |endif
  if &paste | let opt=opt." paste" | endif
  if !&expandtab | let opt=opt." tab" | endif
  if &ts != g:ts_default | let opt=opt.' ts='.&ts | endif
  if &sw != g:sw_default | let opt=opt.' sw='.&sw | endif
  if &tw != g:tw_default | let opt=opt.' tw='.&tw | endif
  if &wm != g:wm_default | let opt=opt.' wm='.&wm | endif
  if &enc != g:enc_default | let opt=opt.' enc='.&enc | endif
  if &ve != g:ve_default | let opt=opt.' ve='. &ve | endif
  if &fo != g:fo_default | let opt=opt.' fo='. &fo | endif
  if &cpo != g:cpo_default | let opt=opt.' cpo='. &cpo | endif
  if &bin | let opt=opt.' [bin]' | endif
  if &foldlevel != s:foldlevel | let opt=opt.' F'.&foldlevel | endif
  let opt=opt." | ".strftime("%d-%b-%Y %H:%M")
  return opt
endfunction

[edit] Comments

Here is a slightly modified version:

let s:options = {}
function! ResetOption(options)
  if empty(a:options)
    let options = keys(s:options)
  else
    let options = a:options
  endif
  for name in options
    exec 'let &'. name .' = s:options[name]'
  endfor
endfunction

command! -nargs=* ResetOption :call ResetOption([<f-args>])
command! -nargs=+ SetOption let s:tmlargs=[<f-args>]
 \ | for arg in s:tmlargs[1:-1]
 \ |   if arg =~ '^[+-]\?='
 \ |     exec 'set '.s:tmlargs[0] . arg
 \ |   else
 \ |     exec 'let &'.s:tmlargs[0] .'='. arg
 \ |   endif
 \ | endfor
 \ | exec 'let s:options[s:tmlargs[0]] = &'. s:tmlargs[0]
 \ | unlet s:tmlargs

let s:option_labels = {'fdl': 'F'}
function! TmlStatusline()
  let opt = "<". &syntax ."/". &fileformat .">"
  if !&backup | let opt=opt." no-bak" |endif
  if !&et | let opt=opt." no-et" |endif
  if &list | let opt=opt." list" |endif
  if &paste | let opt=opt." paste" | endif
  if !&expandtab | let opt=opt." tab" | endif
  for [o, v] in items(s:options)
    exec 'let oo = &'.o
    if oo != v
      let opt .= ' '. (has_key(s:option_labels, o) ? s:option_labels[o] : o.'=') . oo
    endif
  endfor
  if &bin | let opt=opt.' [bin]' | endif
  if exists('b:compressed') | let opt=opt.' ['.b:compressed.']' | endif
  let opt=opt." | ".strftime("%d-%b-%Y %H:%M")
  return opt
endfunction

Rate this article:

Share this article:

Hubs Highlights International Sites Wikia messages
Entertainment
Gaming
Cartoons & Comics
Science Fiction
Hobbies
Sports
See all...
Grand Theft Auto Wiki
Doctor Who
Legend of Zelda Wiki
Terminator Wiki
Everquest II Wiki
Mystery Science Theater 3000
German
Spanish
Chinese
Japanese
More...
Wikia is hiring for several open positions
Send this article to a friend
"Cache user-preferred option values for later reset"
 
 
Hi!

I thought you'd like this page from Wikia!

http://vim.wikia.com

Come check it out!
Send confirmation