Jak ustawić reguły autouzupełniania Zsh dla drugiego argumentu (funkcji) zgodnie z regułami istniejącego polecenia?

9

Mam niestandardową funkcję Zshg :

function g() {
  # Handle arguments [...]
}

W nim obsługuję krótkie argumenty, które wykonują polecenia Git. Na przykład:

g ls # Executes git ls-files ...
g g  # Executes git grep ...

Muszę być w stanie ustawić reguły autouzupełniania na reguły Gita dla krótkich argumentów, ale nie jestem pewien, jak to zrobić.

Na przykład muszę g ls <TAB>uzupełnić tabulatorem reguły, dla git ls-files <TAB>których otrzymam argumenty za git ls-files:

$ g ls --<TAB>
--abbrev                 -- set minimum SHA1 display-length
--cached                 -- show cached files in output
--deleted                -- show deleted files in output
# Etc...

Nie jest to po prostu ustawienie gautouzupełniania, gitponieważ mapuję moje niestandardowe krótkie polecenia na polecenia Git.

Erik Nomitch
źródło
1
Jeśli twoja funkcja odwzorowuje tylko krótsze nazwy na podkomendy git, możesz również użyć do tego systemu aliasów git. Przeczytaj o tym w mapage: man git-config.
Lucas,

Odpowiedzi:

3

Znalazłem /usr/share/zsh/functions/Completion/Unix/_gitkilka wskazówek dla takich aliasów i ostatecznie zdefiniowałem następujące funkcje dla aliasów:

_git-ls () {
  # Just return the _git-ls-files autocomplete function
  _git-ls-files
}

Potem zrobiłem strita compdef g=git. System autouzupełniania zobaczy na przykład, że jesteś uruchomiony g lsi użyjesz _git-lsfunkcji autouzupełniania.

Dzięki user67060 za kierowanie mną we właściwym kierunku.

Erik Nomitch
źródło
2

Musiałem zrobić coś bardzo podobnego, więc z grubsza powinno to rozwiązać Twój problem.

_g () {
    case "${words[2]}" in
      ls) words[1,2]=(git ls-files);;
      g) words[1,2]=(git grep);;
      *) return 1;;
    esac

    _git # Delegate to completion
}
compdef _g g

Należy zauważyć, że jeśli zmienisz liczbę argumentów, będziesz musiał dostosować $CURRENTzmienną.

Kevin Cox
źródło
1

Oto co bym zrobił:

_tg () {
    local _ret=1
    local cur cword prev

    cur=${words[CURRENT]}
    prev=${words[CURRENT-1]}
    cmd=${words[2]}
    let cword=CURRENT-1

    case "$cmd" in
    ls)
        emulate ksh -c _git_ls_files
        ;;
    g)
        emulate ksh -c _git_grep
        ;;
    esac

    let _ret && _default && _ret=0
    return _ret
}

compdef _tg tg

Jednak wykorzystuje to uzupełnienie Gita, a nie uzupełnienie zsh:

https://git.kernel.org/cgit/git/git.git/tree/contrib/completion/git-completion.zsh

FelipeC
źródło
Dzięki, wybrałem inną trasę, ponieważ nie wiedziałem, gdzie znaleźć reguły wypełniania Gita i otrzymywałem błędy. Zobacz moją odpowiedź.
Erik Nomitch