macOSをCatalinaにしたらfish shellの補完が遅くなった話

1. 問題

fish shellでは下図のように,コマンドを入力すると途中で候補を薄く表示してくれて,TABを押すことでそれが補完されます.

f:id:Panaki:20191212191519p:plain
候補が薄く表示され,TABを押すことで補完される

反応もディレイなしと,非常に使い勝手が良かったのですが,Catalinaにアップデートしてから反応が悪くなりました.

私の環境では,clearcleまで入力してTABを押してから約1秒待たされるようになりました.

2. 解決策

解決策はこちらにありました.

github.com

上記サイトに依ると,__fish_describe_command が悪さをしているから,これを修正すれば解決するようです.

2.1 プロファイルの取得

まずプロファイルを取得し,__fish_describe_command が使っている時間を調べます.

以下のコードを実行することで新しくfish shellが立ち上がり,そのシェルを終了するまでの実行されたコマンドとその処理時間が output_filename に書き出されます.

$ fish --profile output_filename

上記コードを実行し,時間がかかっているコマンドを実行し,そしてシェルを閉じます. (私の環境ではclearの補完が死ぬほど遅かったので,cleまで入力 -> TABで補完,を行いました)

f:id:Panaki:20191212193311p:plain
プロファイル取得

吐き出された output.txt を見ると,cleの段階で__fish_describe_commandが実行され,そこに非常に時間がかかっていることが確認できました.

f:id:Panaki:20191212193806p:plain
1列目: コマンド単体の実行時間,2列目: コマンド全体の実行時間,3列目: 実行されたコマンド

2.2 関数の修正

参照サイトと同じ関数で時間がかかっていることが確認できたので,この関数を修正します.

この関数の場所は,上記画像の__fish_describe_commandの直後に書かれています. この関数ファイルを開き,関数をfunction __fish_describe_command; endで置き換えるだけです.

f:id:Panaki:20191212194724p:plain
関数の修正

修正後にもう一度先ほどと同じようにプロファイルをとって確認してみます.

f:id:Panaki:20191212194907p:plain
修正後

修正前は638459 [単位不明] かかっていたのに対し,修正後は232で終了していることが確認できました.