2013/07/10

あなたの Vim は もっと Smart に Input できる

この記事は Vim Advent Calendar 2012 の 222 日目の記事です。

みなさま、こんにちは
もぷりです。

私の住む地域では、まだまだ梅雨が続いているにもかかわらず
連日が30度超とふざけてるのか?と思うくらいにジメジメと暑いです。
「這いよれ!ニャル子さんW」も無事放送終了し、少し残念な気持ちに浸っているところになんて天気でしょうかね。

さてさて、本日の内容は
Kanaさんこと、偉大なるVim神(グレートヴィムゴッド)によって作成された
この2つのPluginについてです。
数多のVim Pluginの中でもかなり強力なPluginだと思います。

単体でも十二分に有用ですが、それぞれの出来る事がきちんと分かれています。
それら2つを良い感じに組み合わせて使用する方法を紹介します。

組み合わせることで以下が出来るようになります。

  • SmartChrに条件を追加出来る
  • SmartInputに繰り返させる


早速、コード例は以下です。

NeoBundleLazy 'kana/vim-smartchr',  { 'autoload' : {'insert' : '1'} }
NeoBundleLazy 'kana/vim-smartinput', { 'autoload' : {'insert' : '1'} }

" Smartinput
let s:bundle = neobundle#get('vim-smartinput')
function! s:bundle.hooks.on_source(bundle)
    " ***ここから!***
    call smartinput#map_to_trigger('i', '%', '%', '%')
    call smartinput#define_rule({
                \ 'at'    : '\%([^''"][\sA-Za-z]\*\|^\|%\)\%#',
                \ 'char'  : '%',
                \ 'input' : "<C-R>=smartchr#one_of(' % ', '%')<CR>",
                \ })
   " ***ここまで!***
   " ~~略~~
endfunction
unlet s:bundle

" Smartchr
let s:bundle = neobundle#get('vim-smartchr')
function! s:bundle.hooks.on_source(bundle)
" ~~略~~
endfunction
unlet s:bundle


%を入力した時、カーソルより前に'か"があれば、SmartInputしないという設定(のつもり)です。
正規表現がうまくかけないものでして…
これによって、Cのprintfのフォーマット文字列ないでSmartInputされてしまうということを回避出来るようになります。

このSmartInputの設定ではExpressionレジスタ(:help @= 参照)を使って
SmartInputからSmartChrのマップ先を呼び出しているのがポイントです。

これを使えば自分で設定した関数なども呼び出せるので応用の幅が広がると思います。

下記参照でも使われていますが、<C-O>を使っても、インサートモードからコマンドを実行出来ます。
こちらを使って標準関数を読んだりなどもとても便利です。

詳しくは、:help smartinput と :help smartchr
もしくは@Linda_ppさんの記事がとても素晴らしいのでそちらを参考にしてほしいです。
また、githubに私のvimrcをあげていますのでそちらの設定が役に立てば幸いです。


その他補足説明:
先頭2行はNeoBundleの設定です。Lazyで遅延読み込みをしています。
非常にオススメなので、ちょいとそちらの説明をしましょう。

この設定だと、起動後に初めてインサートモードへ入った時、pluginが読み込まれます。
SmartInputとSmartChrは基本的にはインサートモードのマッピングを設定してくれるpluginです。
したがって、上記で問題ないかと思います。(ただし、コマンドラインモードでも使う人は設定を変えたほうがいいかも)

5から15行目にかけて、SmartInputの設定が記述してあります。
ここでは、neobundleのhook機能を使っています。
これによって、「pluginの読み込み時に実行する処理」(on_source時にhook)が書けるようになります。

2013/08/19追記
友人が組み合わせを発展させてくれたのでGistに貼っておきます。
以下ですとシングルクォートやダブルクォートないで+-=%などの補完を行いません。
また、四則演算子のあとで=を打つといい感じにしてくれます。

2 件のコメント:

  1. 上記の設定ありがたく使わせてもらっています。
    一点気になったのですが、smart!.vimの34行目リスト内のアスタリスクはエスケープの必要があるのではないでしょうか?
    :34s/'\*'/'\\\*'

    返信削除
    返信
    1. 報告ありがとうございます。

      仰るとおり間違っていましたので修正しておきました。

      削除