如何列出所有 zsh 自动补全?

How to list all zsh autocompletions?

在 zsh 中,我试图了解哪些命令具有现有的完成,以便我可以为没有的命令编写完成。

有没有一种方法可以列出 zsh 将完成的命令,而无需 grep 完成文件?例如,是否有内置命令可以列出它们?

已知完成列表存储在关联数组_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 扩展为 space 分隔的键值对列表。所以它是 "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 进行格式化输出,以便您获得漂亮的 table。 $command 代替 %-32s 打印,左对齐填充为 32 个字符 (-)。打印 $completion 代替 %s
  • | sort:关联数组是无序的,因此循环的输出需要从运行到sort才能得到有序列表。