On Mon, Sep 25, 2006 at 12:58:51PM +0000, Yakov Lerner wrote: > On 9/25/06, Marius Roets <[EMAIL PROTECTED]> wrote: > >I have a in my plsql.vim filetype plugin a lot of abbreviations to the > >effect of : > >iabbrev <buffer> then THEN > >iabbrev <buffer> else ELSE > >... So I was wondering if there was a > >way where I could turn a set of abbreviations on and off, on the fly, > >without reloading the buffer. > > How about this: > > function! MyAbbrevs() > iabbrev <buffer> then THEN > iabbrev <buffer> else ELSE > let g:myabbrev_set=1 > endfunc > > function! UnsetMyAbbrev() > iunabbrev <buffer>then > iunabbrev <buffer>else > let g:myabbrev_set=0 > endfunc > > function! ToggleMyAbbrev() > if exists("g:myabbrev_set") && g:myabbrev_set > call UnsetMyAbbrev() > else > call MyAbbrevs() > endif > endfunc > > call MyAbbrevs() " initial setting > nmap <F5> :call ToggleMyAbbrev()<cr> > > Yakov
You forgot to set g:myabbrev_set to 0 or 1 in the ToggleMyAbbrev() function. Easily fixed. Here is another way to do it, using the new Dictionary type introduced in vim 7.0. I have not tested this! I also use a single function, with an argument, instead of three, and I think it makes more sense to use a buffer-local variable to keep track of the state. This version has the advantage that if you add an abbreviation, you do not have to remember to add the unabbreviation in a different place. let s:abbs = {'then': 'THEN', 'else': 'ELSE'} " Set action to 's' for set, 'u' for unset, or 't' for toggle. fun! MyAbbrevs(action) if (s:action == 's') || \ (s:action == 't' && exists("b:myabbrev_set") && b:myabbrev_set) for [lhs, rhs] in items(s:abbs) execute 'iabbrev <buffer>' lhs rhs endfor let b:myabbrev_set = 1 return 0 elseif (s:action == 'u' || s:action == 't') for lhs in keys(s:abbs) execute 'iunabbrev <buffer>' lhs endfor let b:myabbrev_set = 0 return 0 else " unrecognized parameter return 1 endif endfun HTH --Benji Fisher