Jak uzyskać funkcje powłoki, aby korzystać z istniejącego autouzupełniania w Zsh?

10

Mam kilka zdefiniowanych funkcji powłoki, .zshrcktóre oszczędzają na pisaniu i umożliwiają integrację z ekranem. Na przykład:

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

Jednak kiedy używam tych funkcji powłoki, nie mogę skorzystać z wbudowanych funkcji uzupełniania poleceń zsh. (W przypadku SSH, automatyczne uzupełnianie nazw hostów na podstawie znanych_hostów i ssh_config). Jaki jest preferowany sposób podłączenia istniejących mechanizmów uzupełniania poleceń, dla których utworzyłem opakowania?

EDYTOWAĆ:

Dzięki Gillesowi za jego odpowiedź poniżej. Sposobem na to jest użycie compdef, ale co ciekawe, wydaje się, że nie działa ono jednolicie. W takim przypadku mam następującą konfigurację:

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

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

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

Uzupełnianie mojej funkcji opakowania „m” działa zgodnie z oczekiwaniami, jednak uzupełnianie mojej funkcji „s” nie; zamiast próbować uzupełnić nazwy hosta, wydaje się, że wraca do domyślnego autouzupełniania, udostępniając mi listę plików, gdy kliknę „tab”. Czy jest jakiś dziwny sposób w obsłudze zakończenia SSH, co oznacza, że ​​muszę zrobić coś dalej?

Murali Suriar
źródło

Odpowiedzi:

9

Używam następującej funkcji, aby powiedzieć, że funkcja lub alias lub skrypt opakowujący (np. s) Ma zostać uzupełniony jak istniejące polecenie (np. ssh):

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

Niektóre polecenia uzupełniania dotyczą rodziny funkcji i odczytują pierwsze słowo wiersza poleceń, aby określić, które polecenie należy wykonać. Na przykład, polecenia ssh, scp, sftpi kilka innych są zakończone przez funkcję _ssh. W takim przypadku musisz powiedzieć funkcji zakończenia, jaką „usługą” jest twoja funkcja (domyślnie usługa jest nazwą pliku wykonywalnego, tutaj nazwa twojej funkcji).

_s () {
  local service=ssh
  _ssh "$@"
}
compdef _s s
Gilles „SO- przestań być zły”
źródło
Dzięki - założyłem, że chciałem użyć compdef. Z braku zainteresowania, czy jest jakiś powód, dla którego tworzysz zmienną lokalną i zmieniasz ją, zamiast odwoływać się do 1 $ i 2 $ w wezwaniu do compdef?
Murali Suriar
@Murali: Tak, żebym mógł napisać coś takiego compdefas xterm cxterm uxterm xterm-color.
Gilles „SO- przestań być zły”
1
ciekawe - zdefiniowałem więc dwa opakowania, jeden dla „man” i jeden dla „ssh”. Przy użyciu compdef, uzupełnianie dla mojego opakowania „man” działa, ale uzupełnianie dla mojego opakowania „ssh” nie. Czy napotkałeś już takie problemy? Czy jest coś jeszcze, co muszę wcisnąć, aby _ssh działało z moim aliasem / opakowaniem?
Murali Suriar