Не хочу я пока это структурировать, да и некогда. Да и нечего.
Буду просто набрасывать плохо документированные детали преимущественно про систему tab-дополнений в zsh.
_arguments
В ман-странице zshcompsys плохо объяснена разница между *::message:action и *:::message:action.
Оба эти спека выкидывают несколько первых слов (элементов $words) из рассмотрения системой автодополнения. (по определению такой спек может быть в вызове _arguments только один)
На примере:
_vboxmanage:
1 _vboxmanage() {
2 _arguments -C \
3 '(-): :_vbm_commands' \
4 '(-)*:: :->vbm-post-command' \
5 #
6 ret=$?
7
8 case "$state" in
9 post-command)
10 service="${service}-$words[1]"
11 curcontext=${curcontext%:*:*}:"$service:"
12 _call_function ret _vbm-$words[1]
13 # for command line: `vboxmanage controlvm <TAB>'
14 # _vbm-controlvm() is called
15 ;;
16 esac
17 }
В этом примере для третьего слова в строке vboxmanage controlvm <TAB>:
первая _arguments (_vboxmanage:2) попытается дополнить '(-)*:: :->vbm-post-command' и вызовет _vbm-controlvm
вторая _arguments из _vbm-controlvm (_vbm-controlvm:2) попытается дополнить ':virtual machines:__vbm_vms'
В этом же примере для пятого слова в строке vboxmanage controlvm myvirtmachine pause <TAB>:
первая _arguments поступит так же вторая _arguments, вызванная _vbm-controlvm, попытается дополнить '*:: :->post-command' _vbm-controlvm:11 и ничего не дополнит, а покажет $words (в иллюстративных целях, сами понимаете, «здесь могло быть Ваше автодополнение»
А цимес в том, что:
*::message:action оставит в $words только то, что должно было дополниться текущим вызовом _arguments:
% vboxmanage controlvm myvm pause one two three ''myvm one two three ''
*:::message:action оставит в $words только то, что должно было дополниться в рамках обработки текущего спека, а именно означенного *:::message:action:
% vboxmanage controlvm myvm pause one two there one two there