miauのブログ

はてなダイアリー「miauの避難所」をはてなブログに移行しました

Vim で ANSI color を表示する

Rails のログファイルは ANSI カラーが含まれているので、tail -f なんかで見ているときは

という感じで見やすいのですが、じっくりログを見たいような時に Vim で開くと、

となって見づらかったりします。これを Vim でも色づけできないか調べてみました。

方法は 2 種類あったんですが、どちらもやや難ありでした。

方法その1: HighlightConsoleCodes を使う

ちょっとググると見つかったのがこちら。

インストール方法は、

mkdir -p ~/.vim/plugin
vim ~/.vim/plugin/HighlightConsoleCodes.vim

とやって、上記ページのスクリプトを貼り付けて、4 行目と最終行の 2 箇所にある「^[」を <C-V><C-[> で実際のエスケープ文字に置き換えると。

置き換えとかが面倒だよコマンド一発でやりたいよ、という方は強引に

wget http://subtech.g.hatena.ne.jp/motemen/20080727/1217156437 -O - \
  | perl -MHTML::Entities -e 'for (<>) { if (m{<pre class="syntax-highlight">} .. m{</pre>}) { s{</?(pre|span).*?>}{}g; s/\^\[/\e/; print decode_entities($_) }}' \
  > ~/.vim/plugin/HighlightConsoleCodes.vim

とかやってもたぶん OK です。HTML::Entities を使ってるので、CentOS なら yum install perl-HTML-Parser で入れる感じで。

で、ログファイルを開いてみると・・・

手抜きとのことですが、

  • 下線に対応していない
  • 構文解析のハイライトとかぶったときに [0m が動作していない

くらいで、おおむねちゃんとハイライトされていそうです。

・・・ということで普段使いにはよさそうなんですけど、1MB くらいのログファイルを開いてみると

  • 開くまでに 1 分間くらいかかる
  • 改ページのたびに 5 秒間くらいかかる

という感じで、今回のようにログファイルをじっくり見る用途には適さないようで、他の方法も試してみることにします。

方法その2: AnsiEsc.vim を使う

上記のブログでも紹介されていた AnsiEsc.vim というプラグインを試してみます。

以前はソースに "conceal" パッチを当てる必要があったようですが、そのパッチが Vim 7.3 で本体に組み込まれているので、7.3 以降を使えば特にパッチを当てる必要はないようです。

ちなみに conceal というのは、

Vim 7.3 に追加された新機能に conceal と言うものがあり、これを使うとシンタックスハイライトされた要素の表示を消すことができる。対象自体がなかった文字のように文字が詰めて表示される。

とのことで。挿入モードに入ると隠された文字が見えるようになるそうです。(どうでもいいけどこのブログ、一行プロフィールが素敵・・・。)

さて、インストール方法ですが、Vim 7.3 を使っている前提で・・・(CentOS での Vim 7.3 のインストールについては 前のアイテム に書きましたので、よろしければどうぞ)、.vba というのは Vimball というもののようなので、

を参考にインストールしました。

wget http://www.vim.org/scripts/download_script.php?src_id=14498 -O AnsiEsc.vba.gz
gunzip AnsiEsc.vba.gz
vim AnsiEsc.vba

として Vim で対象のファイルを開いて、

:source %

を実行するとインストールされる形です。

この機能を使うには、対象のファイルを Vim で開いて

:AnsiEsc

とすればいいみたいで。表示はこんな感じです。

動作は軽いんですが、

  • 下線のハイライトに対応していない
  • 太字のハイライトに対応していない上に「m」の文字が残ってしまう
  • 折りたたんだ部分の折り返し位置が調整しづらいので見づらい

といった問題があります。エスケープコードが全部見えているよりはいくらか見やすいんですが・・・うーん。

単純にログを見たいだけであれば less -R なんかでしのいで、じっくりログを見たいような時だけ使う感じになりそうです。