Edited at

zsh で補完関数を作るときに便利な再読み込みするプラグインを作った

More than 5 years have passed since last update.


これは何?

zsh で自分で補完関数を作るとき、作った関数を直してもう一回読み込んで確認して、っていう手順がけっこうめんどくさい。それを簡単にしたくて、前にさっと再読み込みできるようにする関数を作った。

zsh で自分で作っている補完関数を簡単に再読み込みする - Qiita

でも呼び出し方が微妙に分かりにくかったり、使ってるうちに細かく不満が出てきて、独立したプラグインとして書き直したので紹介する。自作の補完関数をデバッグするときに役にたつので、そういうのを書く人は使ってみるといいと思う。

zload という名前にした。コードは GitHub に置いてある。

https://github.com/mollifier/zload


インストール

まず GitHub の zload のページから zload, _zload と2つファイルを取ってきて $fpath の通ったところに配置する。その後に .zshrc で autoload すれば OK。

例えば $HOME/zsh/functions/zload の下に配置したい場合はこんな感じ。

% cd $HOME/zsh/functions

% git clone https://github.com/mollifier/zload.git zload

# 手動でやる場合は $HOME/zsh/functions/zload ディレクトリを作成して、
# その下に zload, _zload を置く

その後 ~/.zshrc にこんな感じで書く。


.zshrc

# fpath の設定は autoload -Uz compinit; compinit とする前に書くこと

fpath=($HOME/zsh/functions/zload(N-/) $fpath)

autoload -Uz zload



使い方


基本的な使い方

zload 関数に読み込みたいファイルを引数で指定して使う。

% zload ~/work/function/_f

引数で指定するファイルの形式は zsh の補完ファイル、autoload して使うプラグインのどちらでもOK。

実際に使っている様子はこんな感じ。

% my-command

zsh: command not found: my-command
# 最初は当然呼び出せない

# zload を使うと...
% zload my-command _my-command
% my-command
...
# autoload したので my-command が呼び出せる

% my-command [TAB]
...
# 補完ファイルも読み込めてる

編集したときはもう一度 zload し直せば反映される。

% vim my-command _my-command

# 何か編集

# 再読み込み
% zload my-command _my-command


自動リロードを使う

-a オプションを付けると自動リロードの機能が有効になる。こうしておくと編集した後に明示的に再読み込みしなくても勝手に反映されるようになって便利。

# 最初の zload は手動で呼び出す

# -a オプションを付けると自動リロードが有効になる
% zload -a my-command _my-command

# これ以降 my-command, _my-command の変更が勝手に反映されるようになる

% vim _my-command
# ... 編集する
# ... 勝手にリロードされる

# -d オプションで自動リロードが無効になる
% zload -d

# もう一回 -a オプションを付けて起動するとまた有効になる
% zload -a

仕組みとしては zsh の preexec フックを使って、コマンドを実行する直前に zload で読み込み直してる。編集してない時でも毎回読み込み直してるので、でっかい関数を作ってる時は重くなるかもしれない(なのでデフォルトで無効にしている)。普通はそんなに重くならないと思うのでこの機能は使ったほうがいいと思う。


最後に

元の記事では zshrc に直接関数を書いてたので、修正するときに手でコピペして直す必要があった。それに呼び出す関数が3つもあって分かりにくかった。そのへんを直して1つのプラグインにしたので、きれいになって使いやすくなったと思う。

補完関数を自分で書くときはいろいろと直しながら試すことになると思うけど、これを使うと修正の確認が楽になるので、ぜひ試してみてください。