シンタックスハイライトするフィルタてないかな

シンタックスハイライトするフィルタてないすかねー
標準入力に色(ANSI color)つけて標準出力に出すだけのやつ。
view(vim)が出力して終了してくれればいいんだけど。。。

$ colorize < filename   | less -R

とか

$ crontab -l | colorize | less -R

とかしたい。

で、最終的にはLESSOPENで使いたい。

追記#1

PerlText::VimColorTerm::ANSIColorでフィルタ書いたす。

$ colorize < httpd.conf | less -R
$ crontab -l | colorize

LESSOPENで呼ばれるlesspipe.shをいじって必ずcolorizeでフィルタするようにしたら、ながーいファイルだとcolorizeの処理に数秒かかってイラっとしたのでこれはやめました。

その代わり、~/.lesskeyに

#command
c    shell colorize % | less

って書いて、

$ lesskey ~/.lesskey

で~/.lessを更新しておけば、lessでファイル開いた後で「イロつけてー」と思ったときは「c」を打鍵すればOK。(lessでファイルじゃなくてSTDINを見てるときはだめだけど)

#!/usr/bin/env perl
# colorize
use strict;
use warnings;
use Text::VimColor;

{
    package Text::VimColor;
    use Term::ANSIColor;
    my $ColorTable = {
        Comment    => 'yellow',
        Constant   => 'bold',
        Identifier => 'green bold',
        Statement  => 'bold cyan',
        PreProc    => 'bold cyan',
        Type       => 'bold',
        Special    => 'bold',
        Underlined => 'bold white',
        Error      => 'magenta',
        Todo       => 'yellow bold on_red',
    };

    no warnings 'once';
    *ansi = sub {
        my($self,$ctab) = @_;
        my $syntax = $self->marked;

        $ctab = { %$ColorTable, (ref $ctab eq 'HASH' ? %$ctab : ()) };

        my $ansi = '';
        foreach (@{ $syntax }) {
            if ( $_->[0] eq '' || ! exists $ctab->{$_->[0]} ) {
                $ansi .= $_->[1];
            } else {
                $ansi .= colored($_->[1], $ctab->{$_->[0]});
            }
        }
        return $ansi;
    };
}

print Text::VimColor->new(string => do { local $/; <> })->ansi;

__END__

追記#2

id:rayfill さんに教えてもらった

がよさげっス。

おっきめのファイルを通してもストレスないので、LESSOPENのデフォルトフィルタにしてもよさそうです。

入力フォーマットはファイルの拡張子で判断しているので、拡張子テーブルになかったり標準入力だったりすると起こられて変換してくれません。なので、てきとうもいいところなんですがshスクリプトにしてフォールバックするように。

あとついでに、

  • 好みの色に変えたり (esc.style)
  • 拡張氏の定義を変えたり (lang.map) (*.plがPerlじゃなくてPrologなので)

とかしたり。

#!/bin/sh
SH_ETC=~/etc/source-highlight
source-highlight \
  -f esc -o STDOUT \
  --style-file=$SH_ETC/esc.style \
  --lang-map=$SH_ETC/lang.map \
  "$@" 2>/dev/null \
  || \
source-highlight \
  -s text \
  --lang-def=$SH_ETC/text.lang \
  -f esc -o STDOUT \
  --style-file=$SH_ETC/esc.style \
  --lang-map=$SH_ETC/lang.map \
  "$@"

追記#3

そんなわけでsource-highlightのおかげでカラフルライフをエンジョイしています。

が、less (382+iso262) の-Rでみてて/で検索すると、検索文字列にマッチした部分のハイライトがずれたり文字化けしたりするのです。(lv -cだと問題なし)

なんでーとおもってたら、

  • Fix search bug when using -R and text contains ANSI color escape sequences.
Less version 418

というのを発見。これで直るのかもでも日本語化パッチがないからsjisとか表示できないのかも。そろそろalias less=lvするときなのかも。