fish で、 z + peco を使った履歴cdツールを実行した時、
direnv が読み込まれない問題が発生していた。
移動後リターンを一回入れてあげれば読んでくれるんだけど、それを忘れて rails c とか実行するとクラッシュするし、spring stop しないと環境変数読み込み直してくれないしでイライラすることが何回かあった。
その辺のプラグインとか使えばいいのかもしれないけれど、個人的に sort 順逆にしたりとかしていじっていたので、調べてみたらdirenvはfishのイベントを拾って実行していたので、cdの後にイベントを発火させるようにすることで解決した。
function peco_z
set -l query (commandline)
if test -n $query
set peco_flags --query "$query"
end
z -l | sort -nr | peco $peco_flags | awk -F ' {5,}' '{ print $2 }' | read recent
if [ $recent ]
cd "$recent"
commandline -r ''
commandline -f repaint
echo
emit fish_prompt
end
end
イベントの発火はemit fish_promptの部分。
上記のpeco_z.fishはfish shellでzの結果をpecoって爆速でディレクトリ移動する - @ka2nを参考にさせていただきました。
2020-08-28 追記
direnv のコードが改善されて、イベント名が変わって上記コードが動かなくなりました。
emit fish_prompt の部分を emit fish_postexec にすることでできた。
どのイベントを使っているのかはdirenv hook fishを実行すると見ることができます。
--on-event の後ろがイベント名
function __direnv_export_eval --on-event fish_postexec;
"/usr/local/bin/direnv" export fish | source;
end