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>