Не хочу я пока это структурировать, да и некогда. Да и нечего.

Буду просто набрасывать плохо документированные детали преимущественно про систему tab-дополнений в zsh.

_arguments

В ман-странице zshcompsys плохо объяснена разница между *::message:action и *:::message:action.
Оба эти спека выкидывают несколько первых слов (элементов $words) из рассмотрения системой автодополнения. (по определению такой спек может быть в вызове _arguments только один)

На примере:

_vboxmanage:

   1 _vbm-controlvm() {
   2     _arguments -C \
   3         ':virtual machines:__vbm_vms' \
   4         ':actions:__vbm_controlvm_actions' \
   5 # на следующей строке джва многоточия или три?
   6         '*:: :->post-command' \
   7     && return
   8 
   9     case $state in
  10     post-command)
  11         _message "$words"
  12         ;;  
  13     esac
  14 }

   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

see also

zshcompsys, zshcompwid

ArsenyMaslennikov/Zsh/Tips (последним исправлял пользователь ArsenyMaslennikov 2017-11-14 08:16:34)