かなり長い間zshを使用してフォルダに対してオートコンプリートを実行すると、パフォーマンスの問題が発生しました。最後に、問題の原因と解決策を理解するのに時間を費やしました。残念ながら「何を」で止まらなければならず、「どのように直すか」は依然として疑問符です。
トレースが有効になっている(およびトレースが無効になっている.zshrc.local
)デバッグでzshを実行すると、はっきりと見えます。
TABをダブルクリックして実行すると、次のような結果が$ cd ~/Documents/<TAB>
表示されます。
....
+_cd:88> eval 'dir=( ~Documents/ )'
+(eval):1> dir=( '~Documents/' )
....
最新の応答時間は約3秒です。
cd a/<TAB>
これは、フォルダオートコンプリート(、、、cd a/b/<TAB>
…)のすべてのレベルで発生しますcd <TAB>
。
設定を試してみましたset -o magicequalsubst
。
答え1
_cd
現在のバージョンの完成関数の88行目zsh
cdablevars
このオプションが有効になっている場合にのみアクセスできるセクションにあります。
このオプションを有効にすると、ユーザーのホームディレクトリまたはストレージパスに移動cd username
します(そのユーザーの/ varが存在し、cd var
現在のディレクトリに/ディレクトリがない場合)。つまり、ディレクトリ(内部または内部)として存在しない場合のように動作します。cd
username
$var
username
var
$cdpath
cd foo
cd ~foo
foo
.
$cdpath
cd
これで/の操作が完了しましたpushd
。_cd
可能な完成リストとDocuments/
これまでに入力した内容を作成するときは、フォルダのサブディレクトリのリストを提供する必要があります。Documents
有効にしたので、cdablevars
ユーザーのホームディレクトリまたはユーザーのホームディレクトリのサブディレクトリのリストを提供する必要があります。変数Documents
に格納されているディレクトリです$Documents
(存在する場合)。
そのため、そうすることですeval 'dirs=( ~Documents )'
。
キャッシュ(LDAP、NIS +...)を持たない大規模なネットワークユーザーデータベースを持つシステムを使用している場合、拡張が遅くなる可能性があります。 zshはハッシュテーブルを使用してユーザーのホームディレクトリを検索するために呼び出すので、何百万もの変数があっても高速でなければならないzsh
変数のリストを見ることができます。これはケース部分で遅くなることがあります。どちらが同じ電話をかける必要があるかを確認できます。Documents
getpwnam("Documents")
Documents
id Documents
getpwnam()
私は個人的にこのオプションを避けたいと思います。cdablevars
いつかは間違いなくあなたに悪い驚きを与えてくれるからです。あなたはいつもそれcd ~user
をしたりしないかもしれませんが、引数として提供されたディレクトリ以外のものに本当に入る場合は、明示的に要求する方が良いことがわかりましcd ~var
た。cd
cdablevars
基本的には、これを行うことにzsh
触発され、1990年の最初のバージョンにすでに存在していました。私の考えでは、tcsh
それは歴史的遺物と見なされるべきです~var
。cdablevars
速度低下の問題を解決する方法については、ネームgetpwnam()
サービスデータベースの調整を検討できます。たとえば、使用する場合、設定を増やしてsssd
バックエンドを再クエリする前にentry_negative_timeout
存在しないユーザー情報をキャッシュする期間を決定できます。Documents
ユーザーデータベースクエリの場合、3秒が長すぎるようです。これは、設定に問題があるか、プロバイダサーバーが利用できず、代替メカニズム(存在する場合)が最適に設定されていないことを示します。