オプションをトグルする関数
先日の記事
http://d.hatena.ne.jp/pneumaster/20090825/1251210686
の中で作ったToggle_option_number()がnumber以外にも使えたらよいと思い、
1つ上のレベルの関数を作ることにしました。
" 関数の概要 " void Toggle_option(String) " Stringで与えられたbooleanオプションをトグルする。 " 使い方: " Toggle_option('number') " Toggle_option('nonumber') function! Toggle_option(target_opt) " 次の場合エラーになる可能性がある " 1. a:target_optが'no'から始まるが、その後に続く文字列が " Vimのオプションに存在するものでない場合 " a:target_optの例) noabcdefg " 2. a:target_optが'no'から始まらず、文字列全体が " Vimのオプションに存在するものでない場合 " a:target_optの例) abcdefg if (a:target_opt =~# "no.*") let s:target_inv_opt = a:target_opt[2:] let s:opt_added_amp = '&' . eval('s:target_inv_opt') else let s:target_inv_opt = 'no' . a:target_opt let s:opt_added_amp = '&' . eval('a:target_opt') endif if eval(s:opt_added_amp) execute 'setlocal' s:target_inv_opt else execute 'setlocal' a:target_opt endif unlet s:target_inv_opt unlet s:opt_added_amp endfunction
作り終わってから、コード探してみるととても短くできることを知りました。
http://github.com/kana/config/blob/4d9b8598975fef45d1f71405633332e593b5f848/vim/dot.vimrc#L927
function! s:toggle_option(option_name) execute 'setlocal' a:option_name.'!' execute 'setlocal' a:option_name.'?' endfunction
oh...