ziguzagu.org

zaw で local の CPAN モジュールを perldoc する

zaw には perldoc コマンドの補完候補を zaw source にする perldoc.zsh というのが標準で用意されてる。が、Perl なプロジェクトで Carton(もしくは cpanm -Llocal . とか)つかって local にモジュールいれないことはないし、コアモジュールだけ perldoc できても嬉しさ半減。本当に読みたい POD は local にあるのでそれも補完候補にいれたい。

function zaw-callback-perldoc-emacs() {
    local orig_buffer="${BUFFER}"
    BUFFER="emacsclient -t $(perldoc -lm "$1")"
    zle accept-line
}

function zaw-src-perldoc-local() {
    # global modules
    zaw-src-perldoc

    # local modules installed by carton into local/lib/perl5
    local -a carton
    if [[ -d local/lib/perl5 ]]; then
        carton=($(command find local/lib/perl5 -type f -name '*.pm' -or -name '*.pod'))
    fi

    candidates=($carton $candidates)
    actions=("zaw-callback-perldoc-view" "zaw-callback-perldoc-emacs")
    act_descriptions=("view perldoc" "open with emacs")
}

zaw-register-src -n perldoc-local zaw-src-perldoc-local
bindkey '^x^p' zaw-perldoc-local

(「vim で open」は用意されているが「emacs で open」がないので、それもないと嬉しささらに半減なので追加)

zaw は helm のような複数ソースには対応してないけど補完候補リストである $candidates 変数は上書きすることができるので、zaw-src-perldoc で生み出された $candidates に追加する感じ。cpanfile があるディレクトリで実行する前提の雑な感じで(自分的には必要十分)。

local の候補はファイルパス、コアモジュールは perldoc コマンドの補完ソースからとってくるのでパッケージ名ででてくる。

この投稿とは関係ないけど、zaw か peco かという点では zaw はカーソル位置のすぐ下に候補がでるので、

  • 視点移動がすくない
  • 画面大幅に書き換わらないので脳内コンテキストスイッチすくない

という2点が優れてるので zaw をずっと使ってるゾゥ。