Logo address

Man

2012/07/04
2012/07/13 改訂

Man: 人ではなく、man コマンドのことである。
Linux にせよ、OSX にせよ、コマンドインターフェースは旧態依然としている。良い面もあるが、今時ねぇ... と言いたくもある。man コマンドが一つの例である。

man コマンドが想定する出力先は、(基本的に) VT100 互換端末である注1。man コマンドは、VT100 の能力に合わせて、キーになる単語を太字で表示する。僕の記憶によれば、VT100 はスクリーンサイズが横80文字、縦25文字だったかと思う。その小さな画面に合わせてマニュアルが表示される。そのために、補助的なツールが必要であり、more とか less とかを通してマニュアルをみることになる。しかしこれは時代に合わない。OSX の Terminal.app は、自由に横幅を変える、高さは(仮想的に)無限大である。僕としては、more とか less を介さずに直性 Terminal.app に表示してほしいくらいである。

注1: UNIX は termcap で幅広い端末に対応するが、今や昔の端末の名前は死語であり、VT100 だけが名前として生き残っている。

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
}
.bashrc

ここで最も重要な部分は

	col -b
である。これを通す事によって、マニュアルの出力は普通のテキストになる。従って、man の出力を、more や less を通したくなければ
	man foo | col -b
とすればよい。(foo は見たい項目である)

さて僕はエディタで見たい。そのために、出力を一旦ファイルに落としている。
ファイル名の衝突を防ぐために時刻の情報を一時ファイルに付加しているが、他の方法もあろう。ここでは時刻の情報を Plan9 の date コマンドを使って得ている注2。例えば

bash$ 9 date -n
1341394225
bash$
であるが、UNIX の世界には類似のコマンドがあるかも知れなし、他の情報で代用可能かも知れない。

注2: plan9port のインスールが必要である。

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
$HOME/bin/edit

こんなに長くなったのは、この edit コマンドは、owner が root の、システム領域にあるファイルの編集を可能にしているからである。
(僕は、システム領域のファイルを編集するのに、vi や emacs を使うのは嫌である。使い慣れたエディタで全てを済ませたい。)
owner が root のファイルは、一旦 $HOME/tmp/files にコピーしてから編集している。従って前もってディレクトリ $HOME/tmp/files を作成しておく必要がある。
もう少し改善の余地はあると思うが、取りあえずこれで間に合っている。