オプションをトグルする関数

先日の記事
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...