Zsh
從不同的目錄呼叫 vared 和 complete 文件
我有以下 zsh 函式,它允許我使用
vared
ZLE 內置函式編輯符號連結。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
+中斷了 shell,這不會恢復目前目錄。C
這可以通過完全正確地設置陷阱來解決,並且可能使用cd
而不是pushd
,這也可能有助於避免檢測連結是否在目前目錄中(在這種情況下pushd
不會推送任何內容)。我想盡量減少由目錄更改引起的中斷,這也意味著本地關閉
chpwd
、恢復OLDPWD
,也許還有更多我沒有想到的。另外,如果我沒有cd
返回目前目錄的權限,我會陷入困境——這是一種非常罕見的情況,但我更願意支持它。如果我可以設置一些東西,以便在呼叫****期間相對於不同的目錄完成文件
vared
,那就更簡單了。我怎樣才能做到這一點?如果這是不可能的,那麼將臨時目錄更改的影響降至最低的最佳方法是什麼?
在您的函式
lned
中,在呼叫之前添加以下內容vared
:local curcontext=lned:::
將以下內容放入
_lned
您的名為的文件中$fpath
:#autoload _files -W $link_path:h/
然後將此添加到您的
~/.zshrc
:zstyle ':completion:lned:*' completer _lned
現在它按預期工作。