Como faço para que minhas funções do shell façam uso do autocomplemento existente no zsh?

10

Eu tenho algumas funções de shell definidas no meu .zshrc , que economizam na digitação e permitem a integração com a tela. Por exemplo:

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

No entanto, quando uso essas funções do shell, não posso aproveitar os recursos internos de conclusão de comandos do zsh. (No caso do SSH, completando automaticamente nomes de host baseados em known_hosts e ssh_config). Qual é a maneira preferida de conectar-se aos mecanismos de conclusão existentes para comandos para os quais criei wrappers?

EDITAR:

Obrigado a Gilles pela sua resposta abaixo. Usar compdef parece ser a maneira de fazer isso, mas, curiosamente, parece não funcionar uniformemente. Neste caso, tenho a seguinte configuração:

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

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

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

A conclusão da minha função de wrapper 'm' funciona como esperado, no entanto a conclusão da minha função 's' não; em vez de tentar completar nomes de host, parece voltar ao autocompletar padrão, fornecendo-me uma lista de arquivos quando eu clico em 'tab'. Existe alguma estranheza na forma como a conclusão do SSH é tratada, o que significa que preciso fazer algo mais?

    
por Murali Suriar 24.01.2011 / 00:26

1 resposta

9

Eu uso a seguinte função para dizer que uma função ou um alias ou script de wrapper (por exemplo, s ) deve ser concluído como um comando existente (por exemplo, ssh ):

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

Alguns comandos de conclusão se aplicam a uma família de funções e lêem a primeira palavra da linha de comando para determinar qual comando específico deve ser concluído. Por exemplo, os comandos ssh , scp , sftp e mais alguns são todos preenchidos pela função _ssh . Nesse caso, você precisa dizer à função de conclusão qual é o “serviço” da sua função (por padrão, o serviço é o nome do executável, aqui o nome da sua função).

_s () {
  local service=ssh
  _ssh "$@"
}
compdef _s s
    
por 24.01.2011 / 00:41