Zsh

從不同的目錄呼叫 vared 和 complete 文件

  • September 16, 2020

我有以下 zsh 函式,它允許我使用varedZLE 內置函式編輯符號連結。

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/在打電話之前varedpopd之後跑步。但是,如果使用者在錯誤的時刻按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

現在它按預期工作。

引用自:https://unix.stackexchange.com/questions/120649