前回,fishのコマンドをgitのサブコマンドとして呼び出せるラッパーを書きました.
で,実はこのラッパー,git-という名前の関数を作ると「無引数でgitを実行した場合の挙動」を上書きできます.
この性質,うまく利用できないかと思っていたのですが
という記事を参考に,次の関数を書いてみました.
git-.fish
function git-
if functions -q __git_mode
functions -e __git_mode
else
function __git_mode -e fish_postexec
commandline "git "
end
end
end
これを定義しておくと,gitと一度実行すると,次回以降コマンドラインにgit が挿入された状態になります.もう一度gitを空引数で実行するとgit の自動挿入が解除されます.便利!

余談
ちなみに,元ネタの"git " って打つのめんどくさい…!で紹介されているsubshコマンドをfishで書くと以下のようになります.
subsh.fish
function subsh
# 指定した文字列を毎回コマンドライン先頭に挿入するようにする関数
set -l sub "$argv"
# --inherit-variable でフック定義時の値をキャプチャ
function __subsh_hook -e fish_postexec --inherit-variable sub
if test -n "$sub" -a -n "$argv"
commandline "$sub "
else
# 空エンターあるいは引数なしの`subsh`で終了
functions -e __subsh_hook
end
end
end
fish版の面白いところは,フック関数__subsh_hookが呼ばれるタイミングでは変数subが存在しないのに,関数内部でsubを使えるところです.つまり,オプション--inherit-variableに渡された変数は関数の定義時に値が確定します.