vim-users.jp

Hack #135: ]で補完する

Posted at 2010/03/29
このエントリーをはてなブックマークに追加

多くの方はTabキーを補完のために使うため、以下のような設定をしていると思います。

inoremap <Tab> <C-n>

Tabキーを打鍵し続けると、左手小指が破壊されます。公平のため、右手小指も使うべきではないでしょうか。Tabキーと対称な位置にあるキーは[または]です。後述する理由のため、]Tabキーのかわりに補完用のキーに設定してみましょう。

まずは素直に、先ほどのTabキーと同様の方法で設定します。

inoremap ] <C-n>

これは便利なのですが、本当に]を入力したいときに、<C-v>]と打鍵しなければならないのがつらいです。

解決法1

そもそも]を入力しないで済むように、自動で入力するようにします。

inoremap [ []<Left>

[を入力した時点で自動的に]が入力されるので、]を手動で入力する必要がなくなります。 大抵の場合は]は対応する[があってこそ意味があるので、この解決方法でうまくいくことでしょう。

解決法2

実際には、勝手に]が入力されてしまうのは直感に反するとして嫌悪する方が多いのではないでしょうか。私がまさにそうです。 すこし複雑ですが、以下のような対処法はどうでしょうか。

  1. 通常は]<C-n>として動作する
  2. カーソル位置より手前に閉じていない[があれば、]]として動作する

これを実現するには、~/.vimrcに以下を記述します。

inoremap <expr> ] searchpair('\[', '', '\]', 'nbW', 'synIDattr(synID(line("."), col("."), 1), "name") =~? "String"') ? ']' : "\<C-n>"

ちょっとややこしいので、具体例で動作を説明します。

カーソル位置を_とします。まず、

aaa[bbb_

この状態で]を打鍵すると、

aaa[bbb]_

となります。いっぽう、

aaa bbb_

この状態で]を打鍵すると、

aaa bbba
   |bbbb|
   |bbbc|
   |bbbd|
   +----+

このように補完のポップアップメニューが出てきます。

また、""で囲まれた部分は無視します。

"[".t_

この状態で]を打鍵すると、

"[".t]_

ではなく、補完がはじまります。

謝辞

thincaさんの添削により、オリジナルで32行だった実装が1行になりました。そのときの履歴はこちらを参照ください。 https://gist.github.com/24e46f72cc08e53c59a1

ujihisa

もどる
blog comments powered by Disqus