zstyleの探し方メモ

zshで補完の挙動を変えたい場合,zstyleを適当に設定するか,該当するzstyleが存在しない場合自分で書くことになります.
ほしいzstyleが既に存在するのに同じような物を自分で書こうとして無駄な時間を使わないように,ボクなりのzstyleの探し方をメモってみようと思います.

例として:completion::complete:*:argument-rest:を探す方法を書いてみます.ちなみに

zstyle ':completion::complete:*:argument-rest:' list-dirs-first true

とするとファイル名の補完時にディレクトリが先に(一覧として)補完され,その下にディレクトリ以外のファイルが補完されるようになります.


まずは変更したい挙動がどれで定義されているのかを調べてみます.今回はファイル名を補完するときの挙動を変更したいので,そのような物を調べてみます.
とりあえずvim[Space]の後に_complete_helpを実行してみます.デフォルトでは^Xhに割り当てられています.

tags in context :completion::complete:vim::
    argument-rest options  (_arguments _vim (eval))
tags in context :completion::complete:vim:argument-rest:
    all-files  (_files _vim_files _arguments _vim (eval))
tags in context :completion::history:::
    history-words  (_history)

ここで見ておく部分はどのzstyleが呼ばれるのか,オプションは何なのか,そしてどの関数で定義されているかです.
今回は二つ目の":completion::complete:vim:argument-rest:"を見ていきます.その下の(_files _vim_files _arguments _vim (eval))のどれかで定義されているはずです.
とりあえず_filesを見ていきましょう.$FPATHのどこかのpathの中に_filesというファイルがあるはずなので探します.ちなみに

find $fpath -name _files

とすると見つかると思います.

_filesを開いてみると":completion:${curcontext}:"というのがあると思います.${curcontext}はこのとき":complete:vim:argument-rest"となるので,これが":completion::complete:vim:argument-rest:"となります.
次に設定できるオプションを探すとfile-patternsとlist-dirs-firstが見つかると思います.
今回はlist-dirs-firstを設定します.またvimだけで無く他のコマンドに関しても同様の挙動をさせたいので先に示したzstyleの設定を使用することになります.


このような具合に呼ばれる関数を調べておけば,仮にzstyleが存在しなくとも,これを参考にして自分で作成することができますね.