zsh에서 기존 자동 완성 기능을 사용하기 위해 쉘 함수를 얻으려면 어떻게해야합니까?


10

.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 완료가 처리되는 방식에 이상한 점이 있습니까? 즉, 추가 작업이 필요합니까?

답변:


9

다음 함수를 사용하여 함수 또는 별칭 또는 래퍼 스크립트 (예 :)를 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

고마워-compdef가 내가 사용하고 싶은 것이라고 가정했습니다. 흥미롭게도 compdef 호출에서 $ 1과 $ 2를 참조하는 대신 로컬 변수와 시프트를 작성하는 이유가 있습니까?
Murali Suriar

@Murali : 그래서 나는 같은 것을 쓸 수 있습니다 compdefas xterm cxterm uxterm xterm-color.
Gilles 'SO- 악마 그만해'

1
흥미 롭기 때문에 두 개의 래퍼를 정의했습니다. 하나는 'man'과 하나는 'ssh'입니다. compdef를 사용하면 'man'래퍼에 대한 완료가 작동하지만 'ssh'래퍼에 대한 완료는 작동하지 않습니다. 전에 이와 같은 문제가 발생 했습니까? _ssh가 내 별칭 / 래퍼와 함께 작동하기 위해 찌를 다른 것이 있습니까?
Murali Suriar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.