다른 디렉토리에서 다양한 전체 파일 호출

다른 디렉토리에서 다양한 전체 파일 호출

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

이제 예상대로 작동합니다.

관련 정보