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
이제 예상대로 작동합니다.