zsh에서 기존 자동 완성 기능을 사용하기 위해 쉘 함수를 얻으려면 어떻게해야합니까? 메커니즘에 연결하는 기본 방법은 무엇입니까? 편집하다: 아래의 답변에 대해

.zshrc입력에 저장하고 화면과 통합 할 수 있는 몇 가지 쉘 기능이 정의되어 있습니다. 예를 들면 다음과 같습니다.

function s()
{
     screen -t "$1" ssh "$@"
}

그러나 이러한 셸 함수를 사용하면 zsh의 기본 제공 명령 완료 기능을 활용할 수 없습니다. SSH의 경우 known_hosts 및 ssh_config를 기반으로 호스트 이름을 자동으로 완성합니다. 래퍼를 만든 명령의 기존 완료 메커니즘에 연결하는 기본 방법은 무엇입니까?

편집하다:

아래의 답변에 대해 Gilles에게 감사드립니다. compdef를 사용하는 것이이 방법으로 보이지만 흥미롭게도 균일하게 작동하지 않는 것 같습니다. 이 경우 다음과 같은 설정이 있습니다.

function s()
{
    screen -t "$1" ssh "$@"
}

function m()
{
    screen -t "man.$1" man "$1"
}

compdef $_comps[man] m
compdef $_comps[ssh] s

래퍼 함수 ‘m’의 완성은 예상대로 작동하지만 함수 ‘s’의 완성은 그렇지 않습니다. 호스트 이름을 완성하려고 시도하는 대신 ‘tab’을 눌렀을 때 파일 목록을 제공하여 기본 자동 완성으로 돌아갑니다. SSH 완료가 처리되는 방식에 이상한 점이 있습니까? 즉, 추가 작업이 필요합니까?



답변

다음 함수를 사용하여 함수 또는 별칭 또는 래퍼 스크립트 (예 :)를 s기존 명령 (예 :)처럼 완료해야합니다 ssh.

compdefas () {
  local a
  a="$1"
  shift
  compdef "$_comps[$a]" "${(@)*}=$a"
}
compdefas xterm cxterm uxterm xterm-color

일부 완료 명령은 기능 군에 적용되며 명령 행의 첫 단어를 읽어 어떤 특정 명령을 완료할지 결정합니다. 예를 들어, 명령 ssh, scp, sftp그리고 몇 가지 더 모든 기능에 의해 완성된다 _ssh. 이 경우 완성 기능에 어떤 “서비스”기능과 유사한 지 알려 주어야합니다 (기본적으로 서비스는 실행 파일 이름, 여기서는 기능 이름).

_s () {
  local service=ssh
  _ssh "$@"
}
compdef _s s