Hatena::ブログ(Diary)

(ひ)メモ このページをアンテナに追加 RSSフィード

2007-12-28 (Fri)

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

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

標準入力に色(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するときなのかも。

2007-12-18 (Tue)

はてなワールドにはいれた!

鉢山町付近にいるよ! 黒いボディとトガった手が目印だよ!!

f:id:hirose31:20071218002837p:image

2007-12-15 (Sat)

ファイルだけじゃなくてディレクトリも監視できます

inotifyはファイルだけじゃなくてディレクトリもウォッチできて、配下にファイルが作られたり消されたりなどなどを監視できます。

$ watch-it.pl ~/tmp
(ls)
tmp          - IN_ISDIR IN_OPEN
tmp          - IN_ISDIR IN_CLOSE_NOWRITE IN_CLOSE

(echo test > foo)
tmp/foo      - IN_CREATE
tmp/foo      - IN_OPEN
tmp/foo      - IN_MODIFY
tmp/foo      - IN_CLOSE_WRITE IN_CLOSE

(echo test >> foo)
tmp/foo      - IN_OPEN
tmp/foo      - IN_MODIFY
tmp/foo      - IN_CLOSE_WRITE IN_CLOSE

(touch foo)
tmp/foo      - IN_OPEN
tmp/foo      - IN_ATTRIB
tmp/foo      - IN_CLOSE_WRITE IN_CLOSE

(chmod 644 foo)
tmp          - IN_ISDIR IN_OPEN
tmp/foo      - IN_ATTRIB
tmp          - IN_ISDIR IN_CLOSE_NOWRITE IN_CLOSE

(rm foo)
tmp/foo      - IN_DELETE


(mkdir bar)
tmp/bar      - IN_ISDIR IN_CREATE

(chmod 775 bar)
tmp          - IN_ISDIR IN_OPEN
tmp/bar      - IN_ATTRIB IN_ISDIR
tmp          - IN_ISDIR IN_CLOSE_NOWRITE IN_CLOSE

(rmdir bar)
tmp/bar      - IN_ISDIR IN_DELETE
#!/usr/bin/env perl
# Time-stamp: <2007-12-15 01:20:57 JST, hirose31>
use strict;
use warnings;
use utf8;
use Carp;

use Linux::Inotify2;

my %MASK;
{
    no strict 'refs';
    $MASK{$_} = &{"Linux::Inotify2::$_"} for @Linux::Inotify2::constants;
    delete $MASK{IN_ALL_EVENTS};
}
sub pretty_mask {
    my($mask) = @_;
    my @mname;
    @mname = grep { $mask & $MASK{$_} } keys %MASK;
    join ' ', @mname;
}

my $n = Linux::Inotify2->new or croak $!;

$n->watch($ARGV[0], IN_ALL_EVENTS) or croak $!;
while (1) {
    my @ev = $n->read;
    if (@ev > 0) {
        for my $e (@ev) {
            printf "%-12s - %s\n", $e->fullname, pretty_mask($e->mask);
        }
    } else {
        croak "read error: $!\n";
    }
}

__END__

# for Emacsen
# Local Variables:
# mode: cperl
# cperl-indent-level: 4
# indent-tabs-mode: nil
# coding: utf-8
# End:

# vi: set ts=4 sw=4 sts=0 :

2007-12-14 (Fri)

ファイルの変更を監視して、任意のコマンドを実行するスクリプト

d:id:hirose31:20070528:1180326347 のobserve-mtimeは、ファイルのmtimeの変更を定期的に確認してイベントを発火させてたんですが、それをLinuxのinotifyで置き換えてみました。

mtime監視だと調べてスリープしての繰り返しなので、変更してからイベントが起こせるまでちょっとタイムラグがあったんですが、inotifyを使うとファイルが変更された瞬間にぴこっとイベント発火できるのでこっちのほうがいいかも。

CPANにはLinux::Inotifyというのもあったのですが、$Config{archname}が/^i[456]86/だと動かなかったり(1行パッチで直せますけど)、作者が「もうアキタ だれかタノム」といってたので、Linux::Inotify2の方を使ってみました。

LimeChat for Macを透過させる

Contents/Resources/appcontroller.rbのapplicationDidFinishLaunchingの末尾にwindow.alphaValue = 0.8を加える。

bagel[~]$ diff -u /Applications/LimeChat.app/Contents/Resources/appcontroller.rb
{,.orig}
--- /Applications/LimeChat.app/Contents/Resources/appcontroller.rb      2007-12-14 00:04:30.000000000 +0900
+++ /Applications/LimeChat.app/Contents/Resources/appcontroller.rb.orig 2007-12-13 21:09:11.000000000 +0900
@@ -93,7 +93,6 @@

     start_timer
     @world.auto_connect
-    @window.alphaValue = 0.8
   end

   def applicationShouldTerminate(sender)

2007-12-13 (Thu)

RubyCocoaのバージョンを確認する方法

bagel[~]$ grep -A1 CFBundleShortVersionString /Library/Frameworks/RubyCocoa.framework/Versions/Current/Resources/Info.plist
 <key>CFBundleShortVersionString</key>
 <string>0.13.0</string>

2007-12-03 (Mon)

CRLFに変換してプロトコルをナマでしゃべりたい

HTTPとかSMTPとかmemcachedとか、終端子にCR+LFを求めるプロトコルをナマでしゃべりたいときのメモ。

$ rlwrap socat stdin tcp4:host:port,crnl
  • rlwrap(詳しくは d:id:secondlife:20060607:1149653094 を参照)で行内編集とかヒストリとかしながら、
  • socatで
    • 標準入力(ターミナルからのキーボード入力)を
    • crnlオプションでCR+LFに変換して、host:port に流し込む

で、長くて覚えられないんで、チョウ適当だけど~/.bashrcに

complete -W '"stdin tcp4:HOST:PORT,crnl"' socat

ってかいたよ。

でで、

  • nc使ったかっこいい方法はないかなん
  • ほかにスマートな方法はないかなん
2003 | 11 | 12 |
2004 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 05 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 12 |
2012 | 01 | 02 | 03 | 06 | 08 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 |
2015 | 01 | 02 | 07 | 10 |
2016 | 01 | 05 | 10 | 12 |
2017 | 07 |
2018 | 05 |