如何列出所有zsh自动完成?

时间:2016-10-13 01:26:48

标签: shell autocomplete zsh tab-completion zsh-completion

在zsh中,我试图了解哪些命令已经完成,以便我可以为不要执行的命令编写完成。

有没有办法列出zsh完成的命令而无需点击完成文件?例如,是否有一个内置命令会列出它们?

1 个答案:

答案 0 :(得分:6)

已知完成列表存储在关联数组_comps中。命令名称和其他完成上下文用作_comps的键,而相应的完成函数则存储为值。

您可以使用以下命令获取具有相关完成的命令的完整列表:

for command completion in ${(kv)_comps:#-*(-|-,*)}
do
    printf "%-32s %s\n" $command $completion
done | sort

说明:

  • for command completion in LIST; COMMAND会在LIST上进行迭代,同时在每次迭代时使用commandcompletion两个元素并为其运行COMMAND。这也是for - 循环的简短形式,不需要dodone
  • ${(kv)ASSOC_ARRAY}将关联数组ASSOC_ARRAY扩展为以空格分隔的键值对列表。所以它是" key1 value1 key2 value2 key3 value3 ..."的交替列表,它由for - 循环的两个参数占用。 $ASSOC_ARRAY只会扩展为值列表。
  • ${ASSOC_ARRAY:#PATTERN}从其展开过滤掉ASSOC_ARRAY的所有元素,其中密钥与PATTERN匹配。
  • 模式-*(-|-,*)与所有特殊情境的名称相匹配,例如-math--parameter--value-,NAME,COMMAND。它还会过滤任何匹配-*--*-,*的命令名称,如果这样的命令在您的系统上完成。 (你可以放弃模式过滤器以确保)
  • printf "%-32s %s\n" $command $completion执行格式化输出,以便您获得一个漂亮的表。打印$command代替%-32s,填充为32个字符,左对齐(-)。打印$completion代替%s
  • | sort:关联数组是无序的,因此循环的输出需要通过sort运行才能获得有序列表。