Unite menuを使ってオプションのToggleを簡単にする
この記事はVim Advent Calendar 2012 321日目の記事です。
昨日の記事は id:osyo-manga さんの vimneosnippet.vim を活用しよう でした。
今日は unive.vim の Unite menu を使って Vim のオプションをトグル(反転)させる方法を紹介します。
■ 概要
- Vim の boolean option はいっぱいあるけど、めったに変えないオプションだと忘れてしまう。
- キーマップ設定してても、たまにしか使わないので思い出せない!
- unite menu 化して、曖昧な記憶でもオプションを Toggle 出来るようにしよう。
■ boolean option の基本
Vim にはboolean(0か1の値)オプションが沢山あります。
number とか hlsearch とかがそれです。
" 行番号を表示 set number " 1が表示される。 echo &number " 行番号を非表示 set nonumber " 0が表示される。 echo &number " 値を反転。0 => 1, 1=>0 set number! " 現在の設定値を表示 set number?
■ Unite menu 化する。
set number! の様に'!'をつけるとオプションをトグル出来ます。
set number? とすると現在の値が表示されます。
これをまずコマンドにしてみます。
" コマンド ToggleOption の定義 command! -nargs=1 ToggleOption set <args>! <bar> set <args>?
これで
:ToggleOption number
等とすることで、オプションの設定をトグルし、現在の値を表示出来るようになりました。
あとは、Unite menu の command_candidates で登録します。
let g:unite_source_menu_menus = {} let g:unite_source_menu_menus.toggle = {} let g:unite_source_menu_menus.toggle.command_candidates = { \ 'number': "ToggleOption number", \ 'hlsearch': "ToggleOption hlsearch", \ } " mac の 'Command-/' で呼び出し。 nnoremap <D-/> :Unite menu:toggle -start-insert -auto-resize<CR>
これで ':Unite menu:toggle' を実行すれば、Toggle 系のオプションを変えられる様になりました。
Vim のデフォルトのオプション以外にも、Toggle 系を全部まとめてしまえると便利です。
':Unite command' から toggle を検索してよく使いそうなものを探すといいです。
最終的には以下の様な設定を .vimrc に設定しました。
let g:unite_source_menu_menus = {} let g:unite_source_menu_menus.toggle = {} " vim 以外のオプション let g:unite_source_menu_menus.toggle.command_candidates = { \ 'tagbar': "TagbarToggle", \ 'nerdtree': "NERDTreeToggle", \ 'quickhl': "QuickhlTagToggle", \ 'neocomplete': "NeoCompleteToggle", \ } " options にスペース区切りでオプション名を列挙する。 let options = " \ paste spell list number relativenumber incsearch wrap hlsearch \ foldenable ignorecase readonly wrapscan" for opt in split(options) let g:unite_source_menu_menus.toggle.command_candidates[opt] = "ToggleOption " . opt endfor unlet options opt
これで NeoCompleteToggle とか、TagbarToggle とか Toggle 系のオプションがまとめて '
■ 最後に
上記のサンプルに反して、あまりにもよく使う number とか hlsearch とかのトグルは以下の様に設定してます。
'キーマップを手が覚えている' 状態のものは Unite menu:toggle に追加する必要はないです。
nnoremap <Space>n :ToggleOption number<CR> nnoremap <Space>/ :ToggleOption hlsearch<CR>