Come posso ottenere le funzioni della mia shell per utilizzare il completamento automatico esistente in zsh?


10

Ho un paio di funzioni shell definite nel mio .zshrcche risparmiano sulla digitazione e consentono l'integrazione con lo schermo. Per esempio:

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

Tuttavia, quando utilizzo queste funzioni della shell, non posso sfruttare le funzionalità di completamento del comando integrate di zsh. (Nel caso di SSH, completamento automatico dei nomi host basati su known_hosts e ssh_config). Qual è il modo preferito di collegarsi ai meccanismi di completamento esistenti per i comandi per i quali ho creato i wrapper?

MODIFICARE:

Grazie a Gilles per la sua risposta qui sotto. L'uso di compdef sembra essere il modo per farlo, ma è interessante notare che non funziona in modo uniforme. In questo caso, ho la seguente configurazione:

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

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

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

Il completamento per la mia funzione wrapper 'm' funziona come previsto, tuttavia il completamento per la mia funzione 's' no; anziché tentare di completare i nomi host, sembra ricadere al completamento automatico predefinito fornendomi un elenco di file quando premo 'tab'. C'è qualche stranezza nel modo in cui viene gestito il completamento di SSH, il che significa che devo fare qualcosa di più?

Risposte:


9

Uso la seguente funzione per dire che una funzione o uno script alias o wrapper (ad es. s) Deve essere completato come un comando esistente (ad es. ssh):

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

Alcuni comandi di completamento si applicano a una famiglia di funzioni e leggono la prima parola della riga di comando per determinare quale particolare comando completare. Ad esempio, i comandi ssh, scp, sftpe pochi altri sono tutti completate dalla funzione _ssh. In tal caso, è necessario indicare alla funzione di completamento quale "servizio" assomiglia alla propria funzione (per impostazione predefinita, il servizio è il nome eseguibile, qui il nome della funzione).

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

Grazie - supponevo che compdef fosse ciò che volevo usare. Per interesse, c'è qualche motivo per cui si crea una variabile locale e si sposta, anziché fare riferimento a $ 1 e $ 2 nella chiamata a compdef?
Murali Suriar,

@Murali: è così che posso scrivere qualcosa del genere compdefas xterm cxterm uxterm xterm-color.
Gilles 'SO- smetti di essere malvagio' il

1
interessante - quindi ho definito due wrapper, uno per "man" e uno per "ssh". Usando compdef, il completamento per il mio wrapper 'man' funziona, ma il completamento per il mio wrapper 'ssh' no. Hai mai incontrato problemi come questo prima? C'è qualcos'altro che devo fare in modo che _ssh funzioni con il mio alias / wrapper?
Murali Suriar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.