created 2001 · complexity basic · author Salman Halim · version 6.0
This is a simple function I wrote to get the value of a variable from three different places (in that order): the current buffer, the global setting or from the script itself.
This allows me to set a default value for a configuration variable inside my script and the user to change it on a global level by setting the same variable with a g:
prepended. then, they can further set it on a per-buffer level by the b:
mechanism. One of the examples for this might be my comments script (not uploaded). I have a variable in there that determines whether comment characters (// for java, for example) are placed the beginning of the line or just before the first-non-blanks in the text. I set up a default in my script:
let g:comments_hug_start_of_line=0 " comments should hug the text
that's fine as a default, but if I want to overwrite it for Vim scripts, I just put the following in my ftplugin/vim.vim:
let b:comments_hug_start_of_line=1 " Vim comments should hug the first column, always " Tries to return the buffer-specific value of a variable; if not " found, tries to return the global value -- if that's not found " either, returns an optional default value or -1 if not specified. function! GetVar(...) let varName=a:1 if (exists("a:2")) let retVal=a:2 else let retVal=-1 endif if (exists ("b:" . varName)) exe "let retVal=b:" . varName elseif (exists ("g:" . varName)) exe "let retVal=g:" . varName endif return retVal endfunction
So, to specify the default scope for java bean properties (used inside javabean.vim
, though I chose not to put this mechanism in there to avoid the dependency on this function), I just use:
let current_javabean_scope = GetVar("javabean_scope", "protected")
If there is a buffer or global variable set, it uses that; otherwise, it defaults to protected scope.
Comments[]
I have a similar function in a library-plugin (implemented as an autoload plugin) for Vim 7. The difference is that I always force the script author to specify the default value as we can never know (as a library writer) if the option is a string or a number -- thus the best way to have an unique access point in script functions is to define an accessor:
let s:defaultMyFooOption = "bar" function s:MyFooOption() return lh#option#Get("myFooOption", s:defaultMyFooOption) endfunction
This way, it is possible to specify the default value as a script variable, and still define the generic function in a VimL library.
BTW, the function I use is the following:
" {rtp}/autoload/lh/option.vim " " Function: lh#option#Get(name, default [, scope]) {{{2 " @return b:{name} if it exists, of g:{name} if it exists, or {default} " otherwise " The order of the variables checked can be specified through the optional " argument {scope} function! lh#option#Get(name,default,...) let scope = (a:0 == 1) ? a:1 : 'bg' let name = a:name let i = 0 while i != strlen(scope) if exists(scope[i].':'.name) && (0 != strlen({scope[i]}:{name})) return {scope[i]}:{name} endif let i += 1 endwhile return a:default endfunction
NB: it can also support window-variables (w:
), tab-variables (t:
), arguments (a:
), ... See :help internal-variables
--Luc Hermitte 13:09, 30 July 2007 (UTC)