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