manラッパ

Gentooでsys-apps/groffのcjk問題が解決したのはもう何ヶ月も前の話だけど、JMによってメンテナンスされているman-pages-jaの内容物にはかなり古いものも多いし、複数セクションに同名のman pageがある時のことも考えるとなかなか面倒くさい。というわけで、解決策を考えてみた。

function findman() { [ -n "$1" ] && find /usr/share/man -name "$1.*"; }
function selectman() {
  set -- $(findman $1)
  case $# in
    0 ) ;;
    1 ) \man $1 ;;
    * ) select name;do \man $name;break;done;;
  esac
}

bash拡張のselect文を使ったことによりshでなくbashzshに依存。selectを使わなければPOSIXに規定されているshとfind以外への依存を無くせるだろうが、使った方が簡潔に書けるわけで。1行目の;はzshでは必要無いがbashでは必須らしい。

$ selectman ps
1) /usr/share/man/ja/man1/ps.1.gz 3) /usr/share/man/man1p/ps.1p.gz
2) /usr/share/man/man1/ps.1.gz
?#

のように、該当するものが複数ならば数値で選択してmanコマンドに渡す。$1をfindに渡しているので、

$ selectman 'zsh*'
1) /usr/share/man/man1/zsh.1.bz2
2) /usr/share/man/man1/zshparam.1.bz2
3) /usr/share/man/man1/zshtcpsys.1.bz2
4) /usr/share/man/man1/zshroadmap.1.bz2
5) /usr/share/man/man1/zsh-lovers.1.bz2
6) /usr/share/man/man1/zshall.1.bz2
7) /usr/share/man/man1/zshcompwid.1.bz2
8) /usr/share/man/man1/zshexpn.1.bz2
9) /usr/share/man/man1/zshzftpsys.1.bz2
10) /usr/share/man/man1/zshzle.1.bz2
11) /usr/share/man/man1/zshoptions.1.bz2
12) /usr/share/man/man1/zshbuiltins.1.bz2
13) /usr/share/man/man1/zshcompctl.1.bz2
14) /usr/share/man/man1/zshmodules.1.bz2
15) /usr/share/man/man1/zshcompsys.1.bz2
16) /usr/share/man/man1/zshcontrib.1.bz2
17) /usr/share/man/man1/zshmisc.1.bz2
?#

という風にfindで対応しているワイルドカードの使用も出来、zshでは

alias sman='noglob selectman'

として展開を止めることでワイルドカードをクオート無しで使えるように。
それなりに実用的に思えたが、ディスクキャッシュが残っていないとfindが遅いのが難点。