.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