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
これで期待どおりに動作します。