タブを完成させるために「cdablevars」変数を使用するのはなぜですか?

タブを完成させるために「cdablevars」変数を使用するのはなぜですか?

使ってみようcdablevars.zshrc、私のファイルに設定してください

# Set directory variables
setopt cdablevars
Home=/Users/benjamin

ただし、タブが完了する前にを実行するcd Home必要があります。cd Home/Desktop/

ここに画像の説明を入力してください。

最初の端末ウィンドウでは、Homeタブ補完機能は使用できません。実行した後にcd Home。タブ補完が自動的に認識されるように変数を設定できますか?

答え1

/_cd組み込み機能の完成者は以下を提供します。cdpushd名前ディレクトリに追加されました名前ディレクトリハッシュテーブル(hash -dおよび$nameddirs関連配列を参照)

これらの内容は、対応する名前付きディレクトリを参照するときに入力されます。名前付きディレクトリハッシュの完全なビルドを実行しても、アイテムのみが追加されますhash -df~user文書に指定されています)。

一般的なzsh対話型セッションには何百ものグローバル変数があり、そのほとんどはディレクトリを含みません。それらを完成させることは非生産的です。

また、これはcdablevars歴史的な遺物に近く、主にtcsh予想以上の問題を含む多くの問題を引き起こし、発生するユーザーに対応するためのものです。私は個人的にそれを離れたいと思います。バラよりパスを評価するとzshが遅くなります。これについて詳しく学んでください。

しかし、とにかく、cd ~HoTab(使用して~... 明らかにIMOがより良い)に追加しない限り、その有無にかかわらずcdablevars完全ではありません。Home名前ディレクトリハッシュテーブル。

hash -dそれにもかかわらず、必要に応じてincludeを使用できますhash -d ${(k)parameters}

答え2

完了が常に機能しない理由

具体的な効果はcdable_varscd fooで許可されるショートカットですcd ~fooチルダ拡張いつを~foo表すことができるのは、値がスラッシュで始まる変数です。$foofoo

これ完全なコード~fooパラメータは実際には認識されません。コマンドを使用せずに問題を再現できます。cd最初はecho ~fTab完了しませんが、~fooこのコマンドを実行すると完了します。

2番目に成功した理由は、アドイン~foofoo正常に使用したためです。名前付きディレクトリハッシュテーブル(次からアクセスnameddirs大量に)、それが~foo完成コードが探しているものです。

特定の変数に対して機能させる方法

foo絶対パスを含む変数を定義したら、次を実行します。

hash -d foo=$foo

値が変更された場合は、このコマンドを再実行する必要はありませんfoo

自動的に機能させる方法

私が考えることができる唯一の方法は、_tildeコード補完を通じて、または名前付きディレクトリハッシュテーブルにそのパラメータを強制的に追加して、パラメータ名を名前付きディレクトリとしてサポートするようにパッチすることです。

未テスト:_tildeアイテムを強制的に追加するように修正されましたnameddirs

if [[ -o cdable_vars ]]; then
  local p
  for p in ${(k)parameters[(R)scalar*]}; do
    if [[ ${(P)p} == /* ]]; then : ~$p 2>/dev/null; fi
  done
fi

関連情報