CentOS標準のless (less-436) で日本語(EUC/JIS/SJIS)を自動判別して文字化けせずに表示する方法

設定

自動変換シェルスクリプト(/usr/local/bin/lesspipej.sh)を作成する。
#!/bin/sh

ORIGINAL_LESSOPEN=/usr/bin/lesspipe.sh
CONV_UTF8_COMMAND="/usr/bin/nkf -w"

conv_utf8() {
    $CONV_UTF8_COMMAND "$1"
}

if [ $# -eq 0 -o "$1" == "-" ] ; then # pipe
    conv_utf8 - 2> /dev/null
else                                  # file
    if [ -x $ORIGINAL_LESSOPEN -a `$ORIGINAL_LESSOPEN "$1" | head | wc -c` -gt 0 ] ; then
         $ORIGINAL_LESSOPEN "$1" | conv_utf8 - 2> /dev/null
    else
         conv_utf8 "$1" 2> /dev/null
    fi
fi
環境変数LESSOPENを設定する。
export LESSOPEN="|-/usr/local/bin/lesspipej.sh %s"

説明

CentOS標準のlessには、jamパッチが含まれておらず、EUC/JIS/SJISを正しく表示できないが、UTF-8の日本語は正しく表示できる。 一方、lessには外部コマンドを入力プロセッサとして使う機能(環境変数LESSOPEN)があり、.gzファイルなどをunzipしたりディレクトリリストを表示させるためのscript(lesspipe.sh)が既定値でセットされている。 そこで、nkfで文字コード判定とUTF-8への変換もやらせるようにLESSOPENを強化すれば良い。 巨大なファイルの読み込みが遅くなる副作用があるが、その場合はless -LでLESSOPENを無効にすれば良い。

lvを使うという選択肢もあるが、複数ファイルを見る時や/で再検索する時など微妙な違いが個人的には気になる。
連絡先:matsu@uri.jp