理系学生日記

おまえはいつまで学生気分なのか

zsh で perldoc H::S::P::N::S::P を実現する

Perl のモジュール名は長い

Perl のモジュール名には名前空間があり、一般的には名前空間の階層構造によって、そのモジュールのドメインが示されることになります。
その結果、場合によってはモジュール名が異常に長くなったりします。2009 年のエントリになりますが、nipotan さんがモジュール名の長さについてのランキングを作成されています。

こういう長いモジュール名を一々書いていくのはあまりにもメンドくさいので、IRC やブロク上では、モジュール名のうち '::' で区切られた頭文字だけを記述するという習慣があったりします。例えば、Hoge::Fuga::Bar っていうモジュールがあったとすると、H::F::B って記述したりって感じですね。
しかし、こういう簡略記法を perldoc は受け付けてくれません。ムカつく。
こういうときは zsh で勝手に補完させれば良いですね。パッと書くとすると、こんな感じでしょうか。

zstyle ':completion:*:(perldoc|perl):*' matcher 'r:|[:][:]=*'

例えば miyagawa さん作の Starman には HTTP::Server::PSGI::Net::Server::PreFork というモジュール名が事実上のエイリアスとして設定されていますが、上記設定により、perldoc H::S::P::N::S::P と記述できるようになります。perldoc Starman すれば良いじゃんっていうのは、話の腰を折るので自重しましょう。

ターミナル — screen — zsh — 180×54

すると、以下のように補完される!!!!!!!!!!!!!!!!!!!!!

ターミナル — screen — zsh — 180×54

原理

上記設定では、perldoc 及び perl コマンドでのモジュール名補完の際、"::" を zsh 内で "*::" に変換するようにしています。zsh はファイル名はもちろん、こういうモジュール名補完の際にもグロブを使うことができるので、これによってモジュール名が自動で補完されるっていう訳ですね。
ここらあたりの詳細は、man zshcompwid あたりで。

TODO

cpanm でも同じようなことをしたい。02packages.details.txt.gz からモジュール名を読み取る部分さえサクっと書けばすぐにできそう。