応用編:イベントハンドラとカスタム補完
変数の変更やシェル終了などに連動するイベント駆動フック、および自作コマンド向けのインテリジェントなタブ補完定義(complete)の作成方法を解説します。
イベントハンドラ(Event Handler)の仕組み
fish には、シェルの特定のライフサイクルや変数の変動を検知して関数を自動起動する「イベント駆動モデル」が組み込まれています。
関数を定義する際に、イベント指定オプションを付与します。
» 1. 変数の変更を監視(–on-variable)
指定した変数の値が書き換わった瞬間に処理を実行します。例えばカレントディレクトリ($PWD)を監視して、ディレクトリ移動のたびに自動処理を行えます。
function on_pwd_change --on-variable PWD
# Git リポジトリ内であれば簡易ステータスを表示
if test -d .git
git status --short
end
end
» 2. イベントの発火を監視(–on-event)
特定の内部イベントが発生したときに実行されます。
| イベント名 | 発生タイミング |
|---|---|
fish_prompt | プロンプトが表示される直前 |
fish_postexec | ユーザーが入力したコマンドの実行が完了した直後 |
fish_exit | シェルが終了するとき(一時ファイルのクリーンアップ等) |
# 長時間かかったコマンドの終了時に実行時間を表示
function notify_long_command --on-event fish_postexec
set -l duration $CMD_DURATION # コマンドの実行時間(ミリ秒)
if test $duration -gt 10000
set -l sec (math "$duration / 1000")
echo "[Notice] Command took $sec seconds to finish."
end
end
自作コマンドのタブ補完(complete)
fish では、自作のスクリプトやツールに対しても、標準コマンドと全く同じ高品質なタブ補完(説明文付き)を簡単に追加できます。
補完スクリプトは ~/.config/fish/completions/<コマンド名>.fish に配置しておくと、必要になった瞬間にオートロードされます。
» complete コマンドの基本構文
# ~/.config/fish/completions/mytool.fish
# 1. 短いオプション (-v) と長いオプション (--verbose) の定義
complete -c mytool -s v -l verbose -d "詳細なログを出力する"
# 2. 値を要求するオプション (--env) と固定候補の提示
complete -c mytool -l env -x -a "development staging production" -d "対象の環境を指定"
# 3. 引数としてファイルではなく特定の文字列だけを補完させる (-f)
complete -c mytool -s h -l help -f -d "ヘルプを表示する"
» 主要なオプションの意味
-c <cmd>: 補完対象のコマンド名-s <char>: 短いオプション(ハイフン1文字)-l <name>: 長いオプション(ハイフン2文字)-d <text>: 補完一覧に表示される説明文(Description)-a <candidates>: 補完候補として表示する文字列(またはコマンド置換(cmd))-f: ファイル名補完を無効化(コマンド独自の固定引数のみを表示したい場合)
独自の補完を定義することで、チーム内ツールの利用ミスを劇的に減らし、操作性を向上させることができます。