zsh: 전체 상대 경로를 절대 경로로 사용하시겠습니까?

zsh: 전체 상대 경로를 절대 경로로 사용하시겠습니까?

인수가 절대 경로여야 하는 명령에 대한 완성 함수를 작성하려고 합니다. (아니요, 이유는 모르겠습니다.) 상대 경로를 입력할 수 있으면 좋겠다고 생각했지만 완료하면 절대 경로로 확장됩니다. 이렇게 하면 절대 경로에 대한 요구 사항을 잊어버린 경우 완료를 통해 문제가 해결됩니다. 나. 예를 들어, 내 작업 디렉터리가 home이고 "foo" 파일이 있고 을 입력하면 그 대신 fo<TAB>에 완료됩니다 ./usr/me/foofoo_files

문제는 어떻게 해야할지 모르겠다는 것입니다. _files위와 위의 모든 표지판을 살펴봤지만 compadd관련성이 있는 것 같지는 않습니다. _canonical_paths가까워 보이지만 아무것도 할 수 없습니다. 매개변수가 절대 경로이면 _files문제는 이 첫 번째 단계에서 발생합니다. 제안?

답변1

다음 함수는 파일의 일반적인 완성 함수인 $PWD/에 전달하기 전에 상대 경로에 추가합니다 ._files

_absolute_files () {
  local expansion=$PREFIX$SUFFIX; expansion=${(e)expansion}
  if [[ "${expansion%%/#}" != "${expansion:a}" ]]; then
    PREFIX="\$PWD/$PREFIX"
  fi
  _files "$@";
}

~/이는 및 (예: 절대 경로) 로 시작하는 경로 식별 및 변수를 사용하여 표시되는 경로를 포함하여 많은 일반적인 경우에 적용됩니다 . 확장(예: 와일드카드) 및 임베딩과의 가능한 모든 상호 작용을 고려하지 않았습니다.

관련 정보