diff options
author | Tom Ryder <tom@sanctum.geek.nz> | 2019-05-25 18:01:46 +1200 |
---|---|---|
committer | Tom Ryder <tom@sanctum.geek.nz> | 2019-05-25 18:01:46 +1200 |
commit | e1dca20336cca8ec48a0d128595698caf71b5bda (patch) | |
tree | 6d60e5d28e67d4f8430a2a932bc7be01059cc774 | |
parent | Merge branch 'release/v1.1.0' (diff) | |
parent | Bump VERSION (diff) | |
download | vim-toggle-flags-e1dca20336cca8ec48a0d128595698caf71b5bda.tar.gz vim-toggle-flags-e1dca20336cca8ec48a0d128595698caf71b5bda.zip |
Merge branch 'release/v2.0.0'v2.0.0
* release/v2.0.0:
Add abort attribute to functions
Move functions into autoload
-rw-r--r-- | VERSION | 2 | ||||
-rw-r--r-- | autoload/toggle_flags.vim | 80 | ||||
-rw-r--r-- | doc/toggle_flags.txt | 2 | ||||
-rw-r--r-- | plugin/toggle_flags.vim | 91 |
4 files changed, 87 insertions, 88 deletions
@@ -1 +1 @@ -1.1.0 +2.0.0 diff --git a/autoload/toggle_flags.vim b/autoload/toggle_flags.vim new file mode 100644 index 0000000..eba30c2 --- /dev/null +++ b/autoload/toggle_flags.vim @@ -0,0 +1,80 @@ +" Show an error-highlighted message and beep, but without a real :echoerr +function! s:Error(message) abort + execute "normal! \<Esc>" + echohl ErrorMsg + echomsg a:message + echohl None +endfunction + +" Test whether an option currently has a flag as part of its value +function! s:Has(option, flag) abort + + " Horrible :execute to get the option's current setting into a variable + let current = '' + execute 'let current = &' . a:option + + " If the flag we're toggling is longer than one character, this must by + " necessity be a delimited option. I think all of those in VimL are + " comma-separated. Extend the flag and value so that they'll still match at + " the start and end. Otherwise, use them as-is. + if strlen(a:flag) > 1 + let search_flag = ',' . a:flag . ',' + let search_value = ',' . current . ',' + else + let search_flag = a:flag + let search_value = current + endif + + " Return whether the flag appears in the value + return stridx(search_value, search_flag) > -1 + +endfunction + +" Internal function to do the toggling +function! toggle_flags#Toggle(option, flag, local) abort + + " Check for spurious option strings, we don't want to :execute anything funny + if a:option =~# '\L' + call s:Error('Illegal option name') + return 0 + endif + + " Check the option actually exists + if !exists('&' . a:option) + call s:Error('No such option: ' . a:option) + return 0 + endif + + " Choose which set command to use + let set = a:local + \ ? 'setlocal' + \ : 'set' + + " Find whether the flag is set before the change + let before = s:Has(a:option, a:flag) + + " Assign -= or += as the operation to run based on whether the flag already + " appears in the option value or not + let operation = before + \ ? '-=' + \ : '+=' + + " Try to set the option; suppress errors, we'll check our work + silent! execute set + \ . ' ' + \ . a:option . operation . escape(a:flag, '\ ') + + " Find whether the flag is set after the change + let after = s:Has(a:option, a:flag) + + " If we made a difference, report the new value; if we didn't, admit it + if before != after + execute set . ' ' . a:option . '?' + else + call s:Error('Unable to toggle '.a:option.' flag '.a:flag) + endif + + " Return whether we made a change + return before != after + +endfunction diff --git a/doc/toggle_flags.txt b/doc/toggle_flags.txt index 74d91f6..b858e1b 100644 --- a/doc/toggle_flags.txt +++ b/doc/toggle_flags.txt @@ -1,4 +1,4 @@ -*toggle_flags.txt* For Vim version 6.0 Last change: 2018 July 19 +*toggle_flags.txt* For Vim version 7.0 Last change: 2019 May 25 DESCRIPTION *toggle_flags* diff --git a/plugin/toggle_flags.vim b/plugin/toggle_flags.vim index be0cde4..f300666 100644 --- a/plugin/toggle_flags.vim +++ b/plugin/toggle_flags.vim @@ -1,6 +1,6 @@ " -" toggle_flags.vim: Provide commands to toggle flags in grouped options -" like 'formatoptions', 'shortmess', 'complete', 'switchbuf', etc. +" toggle_flags.vim: Provide commands to toggle flags in grouped options like +" 'formatoptions', 'shortmess', 'complete', 'switchbuf', etc. " " Author: Tom Ryder <tom@sanctum.geek.nz> " License: Same as Vim itself @@ -8,96 +8,15 @@ if exists('loaded_toggle_flags') || &compatible finish endif -if !has('user_commands') || v:version < 600 +if v:version < 700 finish endif let loaded_toggle_flags = 1 -" Show an error-highlighted message and beep, but without a real :echoerr -function! s:Error(message) - execute "normal! \<Esc>" - echohl ErrorMsg - echomsg a:message - echohl None -endfunction - -" Test whether an option currently has a flag as part of its value -function! s:Has(option, flag) - - " Horrible :execute to get the option's current setting into a variable - let current = '' - execute 'let current = &' . a:option - - " If the flag we're toggling is longer than one character, this must by - " necessity be a delimited option. I think all of those in VimL are - " comma-separated. Extend the flag and value so that they'll still match at - " the start and end. Otherwise, use them as-is. - if strlen(a:flag) > 1 - let search_flag = ',' . a:flag . ',' - let search_value = ',' . current . ',' - else - let search_flag = a:flag - let search_value = current - endif - - " Return whether the flag appears in the value - return stridx(search_value, search_flag) > -1 - -endfunction - -" Internal function to do the toggling -function! s:Toggle(option, flag, local) - - " Check for spurious option strings, we don't want to :execute anything funny - if a:option =~# '\L' - call s:Error('Illegal option name') - return 0 - endif - - " Check the option actually exists - if !exists('&' . a:option) - call s:Error('No such option: ' . a:option) - return 0 - endif - - " Choose which set command to use - let set = a:local - \ ? 'setlocal' - \ : 'set' - - " Find whether the flag is set before the change - let before = s:Has(a:option, a:flag) - - " Assign -= or += as the operation to run based on whether the flag already - " appears in the option value or not - let operation = before - \ ? '-=' - \ : '+=' - - " Try to set the option; suppress errors, we'll check our work - silent! execute set - \ . ' ' - \ . a:option . operation . escape(a:flag, '\ ') - - " Find whether the flag is set after the change - let after = s:Has(a:option, a:flag) - - " If we made a difference, report the new value; if we didn't, admit it - if before != after - execute set . ' ' . a:option . '?' - else - call s:Error('Unable to toggle '.a:option.' flag '.a:flag) - endif - - " Return whether we made a change - return before != after - -endfunction - " User commands wrapping around calls to the above function command -nargs=+ -complete=option \ ToggleFlag - \ call <SID>Toggle(<f-args>, 0) + \ call toggle_flags#Toggle(<f-args>, 0) command -nargs=+ -complete=option \ ToggleFlagLocal - \ call <SID>Toggle(<f-args>, 1) + \ call toggle_flags#Toggle(<f-args>, 1) |