Man: 人ではなく、man コマンドのことである。
Linux にせよ、OSX にせよ、コマンドインターフェースは旧態依然としている。良い面もあるが、今時ねぇ... と言いたくもある。man コマンドが一つの例である。
man コマンドが想定する出力先は、(基本的に) VT100 互換端末である注1。man コマンドは、VT100 の能力に合わせて、キーになる単語を太字で表示する。僕の記憶によれば、VT100 はスクリーンサイズが横80文字、縦25文字だったかと思う。その小さな画面に合わせてマニュアルが表示される。そのために、補助的なツールが必要であり、more とか less とかを通してマニュアルをみることになる。しかしこれは時代に合わない。OSX の Terminal.app は、自由に横幅を変える、高さは(仮想的に)無限大である。僕としては、more とか less を介さずに直性 Terminal.app に表示してほしいくらいである。
Plan9 は、古い伝統にとらわれる事なく、man の出力は直接ターミナルに出力する。さらに、テキストエディタでマニュアルを読むのが一般的なスタイルである。エディタでマニュアルを読む事ができれば、more や less の小さな窓から全体を眺める不便さが解消され、非常に読みやすくなるばかりか、大切な部分だけを切り取ってマニュアルを眺める事が可能になる。もちろん、テキストエディタであるから、太字はサポートされない。しかし、そのようなことは、得られる利益から見れば些細な事である。
OSX で類似の事はできないであろうか? 何とかできるようだ。
. $HOME/.profile
function man() {
t=`9 date -n`
IFS="-"; f="$HOME/tmp/$*-$t"; unset IFS
/usr/bin/man $* | col -b > $f
edit $f
sleep 1
rm $f
}
ここで最も重要な部分は
col -bである。これを通す事によって、マニュアルの出力は普通のテキストになる。従って、man の出力を、more や less を通したくなければ
man foo | col -bとすればよい。(foo は見たい項目である)
さて僕はエディタで見たい。そのために、出力を一旦ファイルに落としている。
ファイル名の衝突を防ぐために時刻の情報を一時ファイルに付加しているが、他の方法もあろう。ここでは時刻の情報を Plan9 の date コマンドを使って得ている注2。例えば
bash$ 9 date -n 1341394225 bash$であるが、UNIX の世界には類似のコマンドがあるかも知れなし、他の情報で代用可能かも知れない。
edit は...
僕は OSX にも edit コマンドが欲しかった。フリーのものもあると思うが、使い慣れた TextEdit.app が良い。
僕が愛用している edit コマンドは以下のようなものである。
#!/bin/sh
usage="usage: edit [-n] file"
EDITOR=TextEdit.app
#EDITOR=Xcode.app
function owner {
ls -l $1 | awk '{print $3}'
}
if test $# = 0 ; then
echo $usage
exit
fi
if test $1 = '-n' ; then
touch $2 && shift
fi
if [ `owner $1` == root ] ; then
b=`basename $1`
if ! test -e; then
mkdir ~/tmp/files
fi
cp -p $1 ~/tmp/files/$b
open -a $EDITOR ~/tmp/files/$b
f=true
while test $f = true ;
do
echo 'save?(y/n)'
read a
if test $a -a $a = 'y'; then
f=false
fi
if test $a -a $a = 'n'; then
f=false
fi
done
if test $a = 'y' ; then
sudo cp ~/tmp/files/$b $1
fi
exit
fi
open -a $EDITOR $1 || echo $usage
こんなに長くなったのは、この edit コマンドは、owner が root の、システム領域にあるファイルの編集を可能にしているからである。
(僕は、システム領域のファイルを編集するのに、vi や emacs を使うのは嫌である。使い慣れたエディタで全てを済ませたい。)
owner が root のファイルは、一旦 $HOME/tmp/files にコピーしてから編集している。従って前もってディレクトリ $HOME/tmp/files を作成しておく必要がある。
もう少し改善の余地はあると思うが、取りあえずこれで間に合っている。