fishでコミットメッセージの一部でハッシュを補完する関数を作る
fish にはコミット・メッセージの一部からコミットのハッシュを補完する便利な機能があります。
この記事では、この機能を自分で定義した関数でも使えるようにすることを目的としています。
実際に補完される様子は下の動画をご覧ください。
やることは以下のみです。
- 関数を作る
-
complete
で補完方法を指定する。(必要なら補完用の関数を作る)
この記事では、git の fixup をシンプルに実行する関数を作ってみます。
では、順を追って見て行きましょう。
関数を作る
function gifu
set --local hash $argv[1]
git commit --fixup $hash &&
git rebase --autostash --autosquash $hash~
end
コミット・ハッシュを引数に渡すとそこで fixup して rebase までしてくてるという関数です。
引数を指定する時にハッシュ値の一部やコミット・メッセージで補完できると便利ですよね。
補完方法を指定する
complete
について詳しくは公式のドキュメントや、/usr/share/fish/completions
などにあるcomplete
の設定例を参考にしてください。
ここではcomplete
で補完の挙動を指定する方法を簡単に説明をします。
function my-completion
echo -e "foo\t(first comment)\nbar\t(second comment)\nbaz\t(third comment)"
end
function foo
echo -e "arguments are $argv."
end
complete --no-files --command foo --keep-order --arguments '(my-completion)'
上記の例では--no-files
でカレント・ディレクトリにあるファイルは補完候補に入れないように設定し、--keep-order --arguments '(my-completion)'
の部分で、my-completion
で得られた結果を順番を変更せずに補完候補として受け取るという設定をしています。
my-completion
は補完候補が表示される直前に評価されます。
また、\t
以降はコメントとして扱われるようです。補完時に表示はされますが、実際に入力されるのはその手前までです。
それでは、先程定義したfixup
用の関数にも補完方法を設定しましょう。
complete --no-files --command gifu --keep-order --arguments '(__fish_git_recent_commits)'
__fish_git_recent_commits
とはfish
側で定義されている、直近50件のコミット・ハッシュを取得するための関数です。
fish
にはこのように便利な補完用の関数がいくつか用意されています。
公式のドキュメントでもいくつか紹介されていますが、自分でも使ってみたいと思ったり気になったりする補完方法があったらソース・コードを見て確認してみると良いでしょう。
ちゃんとfoo
だけを含むコミットだけが表示されていますね。
これでめでたく補完ができるようになりました!
Discussion