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でなくbash、zshに依存。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が遅いのが難点。