Мне пришлось сделать нечто очень похожее, так что это примерно то, что должно решить вашу проблему.
_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
Следует отметить, что если вы измените количество аргументов, вам нужно будет настроить переменную $ CURRENT
.