나는 .zshrc
입력 시간을 절약하고 화면과의 통합을 허용하는 여러 가지 쉘 기능을 정의했습니다. 예를 들어:
function s()
{
screen -t "$1" ssh "$@"
}
그러나 이러한 셸 기능을 사용할 때 zsh에 내장된 명령 완성 기능을 활용할 수 없습니다. (SSH의 경우 Known_hosts 및 ssh_config를 기반으로 호스트 이름이 자동으로 완성됩니다.) 래퍼를 만드는 명령에 대해 기존 완성 메커니즘에 연결하는 데 선호되는 방법은 무엇입니까?
편집하다:
아래 답변에 대해 Giles에게 감사드립니다. 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"의 완료는 작동하지 않습니다. "탭"을 클릭하면 대신 파일 목록을 제공하여 기본 자동 완성으로 돌아가는 것 같습니다. 호스트 이름을 완성하려고 합니다. SSH 완료가 처리되는 방식에 이상한 점이 있나요? 즉, 추가 작업이 필요하다는 뜻인가요?
답변1
명령이 시스템에 알려진 다른 명령인 것처럼 완료되도록 요청하려면 다음 compdef my_command=known_command
형식을 사용할 수 있습니다.compdef
.
compdef s=ssh
compdef {cxterm,uxterm,xterm-color}=xterm
뒤에서 이것은 기본적으로 _comps[s]=$_comps[ssh]
.
일부 완료 명령은 일련의 기능에 대해 작동하며 명령줄의 첫 번째 단어를 읽어 완료할 특정 명령을 결정합니다. 예를 들어, command ssh
, scp
등 의 일부 명령은 sftp
모두 함수에 의해 완성됩니다 _ssh
. 이 경우 완성 함수에 함수가 어떤 종류의 "서비스"인지 알려주어야 합니다(기본적으로 서비스는 실행 파일 이름이며 여기에는 함수 이름이 있습니다).
_s () {
local service=ssh
_ssh "$@"
}
compdef _s s