Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: _git Completion and custom commands

On Tue, 28 Sep 2010, Conrad Irwin wrote:

Hi Zsh,

I finally got round to trying out zsh today, and wow is it cool â I don't believe I've been stuck on bash for all this time :).

The one issue I've found is that the _git completion function (as of 4.3.10 shipped with Debian testing) does not include custom commands (though it does include aliases).

(For those of you unfamiliar with git, any executable in your path with a name like git-* can be called as git * with no hyphen)

My question is then: how would I add my custom commands' names to the list already completed by _git (without completely overriding or modifying the system-wide configuration)?

This has bothered me for a while, too. I think _git should include these by default. But, it's pretty easy to add:

zstyle ':completion:*:git:*' user-commands ${${(k)commands[(I)git-*]}#git-}

(I've found _git to be very about what it allows you to override via zstyles)

Explanation of the '${${(k)commands[(I)git-*]}#git-}' portion:

$commands is a built-in associative array that maps basenames to their full paths.

E.g. one of my custom git- commands that it picks up is:

So, we're looking for the keys '(k)'. And we only want entries in the hash that have (I)ndexes matching 'git-*'. Then we want to remove the leading 'git-' portion ( ${...#git-} ).


P.S. Played around a bit with (k), and [(MIRK)*], but couldn't seem to find a way to not repeat the 'git-' pattern. I'm sure a veteran could do it effortlessly.

P.P.S. I found it a bit odd that:
print -l ${(<Tab>
completes glob qualifiers rather than parameter expansion flags.

Messages sorted by: Reverse Date, Date, Thread, Author