異なるディレクトリからのさまざまなフルファイル呼び出し

異なるディレクトリからのさまざまなフルファイル呼び出し

vared組み込みのZLEを使用してシンボリックリンクを編集できる次のzsh関数があります。

function lned {
  emulate zsh
  setopt err_return extended_glob local_options local_traps
  local -a data
  link_path=${1%%/##}
  zstat -A data -L +link $link_path
  target=$data[1]
  if [[ -z $target ]]; then
    print -rl 1>&2 "$link_path: not a symbolic link"
    return 2
  fi
  vared -p "${(q)1} -> " target
  if [[ -n $target && "$target" != "$data[1]" ]]; then
    # We can't use 'ln -sf' if $link_path is a symlink to a directory, so remove
    # it manually first.
    # Check that this is still a symlink, in case the file was changed while we
    # were editing (this leaves only a very small time interval where we might
    # remove a non-symlink).
    rm -- $link_path(@)
    ln -s -- $target $link_path
  fi
}

これはうまく機能しますが、現在のディレクトリ以外のディレクトリで相対シンボリックリンクを編集すると、ファイル名の完成が間違ったディレクトリに基づいています。私はこの問題を解決したい。

電話通話のpushd -- $link_path:h/前後varedに走ることができます。popdただし、ユーザーが間違った瞬間にシェルを停止するために+を押すと、Ctrl現在のディレクトリは復元されません。Cこの問題はトラップを正しく設定し、代わりにcd使用して解決できますpushd。これは、リンクが現在のディレクトリにあるかどうかを検出する必要がないようにするのに役立ちます(この場合はpushd何もプッシュされません)。

ディレクトリ変更によるダメージを最小限にしたいです。これは、ローカルのシャットダウンchpwd、復元OLDPWD、おそらく私が考えていないことを意味します。また、現在のディレクトリに戻る権限がないとcd閉じ込められます。これは非常にまれなケースですが、サポートしたい場合です。

簡単に設定できればもっと簡単だと思います。vared通話中に他のディレクトリに基づいてファイルが完成します。。どうすればいいですか?これが不可能な場合、一時ディレクトリの変更による影響を最小限に抑える最良の方法は何ですか?

答え1

関数の呼び出しlnedの前に以下を追加しますvared

local curcontext=lned:::

_lned以下をファイル名に入れます$fpath

#autoload
_files -W $link_path:h/

次に、これを次の項目に追加します~/.zshrc

zstyle ':completion:lned:*' completer _lned

これで期待どおりに動作します。

関連情報