sponsor Vim development Vim logo Vim Book Ad

basic Tip #1456: A set of two commands and one function to provide user-preferred options setting

 tip karma   Rating 1/1, Viewed by 842 

Read and edit this tip on the Vim tip wiki. The wiki may have a more recent version of this tip.

created:   January 5, 2007 5:42      complexity:   basic
author:   Cache user-preferred option values for later reset      as of Vim:  

Some plugins inadvertently(?) set global options. I have the following code at the top of my vimrc file 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 = []

fun! 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
endf

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
                \ | call add(s:option_preferences, s:tmlargs[0])
            \ | endfor
            \ | exec 'let g:'. s:tmlargs[0] .'_default = &'. s:tmlargs[0]
            \ | unlet s:tmlargs


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 on (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.; (The following code is based on some tip by somebody else or a vimrc I found years ago on the web. Don't know who originally came up with this.)

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

fu! 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
endf

It could have been this one by Thomas Bader:
http://www.trash.net/~thomasb/files/vim/dotvimrc.html

 rate this tip  Life Changing Helpful Unfulfilling 

<< Jumps to a local/global definition by same key | motion on steroids >>

Additional Notes

Anonymous, January 5, 2007 5:43
Okay, the author's name is Thomas and the tip's title is: Cache user-preferred option values for later reset.
Anonymous, January 5, 2007 5:49
The line reading "call add(s:option_preferences, s:tmlargs[0])" has to be below the "endfor" of course.
Anonymous, January 5, 2007 6:39
Here a slightly modified version:

let s:options = {}

fun! 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
endf

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'}
fun! 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
endf
If you have questions or remarks about this site, visit the vimonline development pages. Please use this site responsibly.
Questions about Vim should go to the maillist. Help Bram help Uganda.
   
Sponsored by Web Concept Group Inc. SourceForge.net Logo