読者です 読者をやめる 読者になる 読者になる

vim のシンタックスハイライトと自分なりに付き合う

僕は長らく vim を使っている(おそらく 14,5年)のですが、常にシンタックスハイライトをオフにして使っていました。
オフにしている理由は、特にメリットを感じなかったことと、もうひとつは編集時のハイライトの挙動です。
vim のハイライトは編集モードであってもリアルタイムに色が変わっていくため、
文字列を書き始めようとクオートをタイプした途端、自分のいる行より下がすべて文字列としてハイライトされます。
f:id:tk0miya:20131215112231p:plain

僕はこの動作がとても嫌いで、クオートを打った瞬間にぎょっとしてしまいます。
とはいえ、コードを俯瞰するときにシンタックスハイライトされていると見やすいと感じるようになってきたので、
このシンタックスハイライトの挙動とうまく付き合えないか、周囲の人に相談したりぐぐったりしてみました。

対策1: すぐクオートを閉じる

多くの人がこの挙動は自然なものだと感じているようで、慣れればいいと言われます。
そして次にすぐクオートを閉じればいいじゃない、と言われるのです。
即ち、

print "Hello world!"

と打ちたい場合は
1. print "" とタイプし、インサートモードを抜ける
2. i でインサートモードに入り、Hello World! とタイプする
とすればよいという意見です。

シンプルな解決策ではあるのですが、問題が幾つかあって採用には至りませんでした。

  • 一瞬ハイライト状態になるので、チラツキを感じるのがうざったい
  • 思考とタイプ順が一致しない
  • 一回ノーマルモードに戻るのが耐えられない
  • print "Hello ", name, "-san!" って書きたい場合はいちいちノーマルモードに戻るの?

僕はずっとここで躓いて、シンタックスハイライトへの拒否反応を示していたというわけですね。

vim-autoclose を使う

今回試してみたのは vim-autoclose プラグインを使うというものです。
vim-autoclose はクオートや括弧の対を自動入力してくれるプラグインです。

インストールは NeoBundle で。

NeoBundle 'Townk/vim-autoclose'

プラグインを有効にすると、インサートモードで「print "」(クオートを開く)を入力すると

print ""

のように閉じ記号が自動的に入力されます。
しかも、まだ入力モードのままなので続けて Hello world とタイプすることで

print "Hello world"

という入力になります。
また、続けて閉じクオート「"」を入力しても編集結果は「print "Hello world"」のままです。

つまり、vim-autoclose を使わないときと同様に「iprint "Hello world!"」と入力できるのです。
しかも、バッファ上ではクオートが閉じられているためシンタックスハイライトは崩れません。
これで編集範囲外が勝手にハイライトされてしまうという問題を、新たな編集方法を導入せずに解決することができます :-)

…となれば一件落着だったのですが、残念な問題を見つけました。
シェルスクリプトRuby スクリプトでは vim-autoclose が正しく動作するのですが、
PerlPython などのスクリプトではクオート文字「"/'」に対する補完が無効になってしまうという現象があります*1
どこが問題になっているのか探そうかと思ったのですが vim script の勘所がわからないので見つけられませんでした orz

目に優しくしてみる

というわけで、驚き最小にハイライトさせるという目的を達成することはできなかったのですが、
せっかくなのでシンタックスハイライトを有効にしたまま生活して慣れてみることにしました。

しばらく検討してみた結果、ハイライトの色を変えてみると今より驚きが小さくなるのではないかと考え、
colorscheme を柔らかめの色にしてしばらく過ごすことにしました。
どれがいいのか幾つか試してみて、今は jellybeans を使っています。

さて、しばらく使ってみて慣れるのかどうかは来月あたりをお楽しみに、ということで。

まとめ

  • vim のシンタックスハイライトの挙動が気に入らない
  • vim-autoclose プラグインを試してみたが、一部のファイルタイプではクオートが保管されなくなってしまう
  • 結局慣れるしかなさそう…

*1:括弧などの他の記号は補完されます。syntax off の状態では正しく動作するので、どうやら autoclose と syntax on が競合している模様