如何列出所有 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
,同时在每次迭代中采用两个元素 command
和 completion
,并且 运行 宁 COMMAND
为他们。这也是 for
循环的缩写形式,不需要 do
和 done
.
${(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
才能得到有序列表。
在 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
,同时在每次迭代中采用两个元素command
和completion
,并且 运行 宁COMMAND
为他们。这也是for
循环的缩写形式,不需要do
和done
.${(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
才能得到有序列表。