在zsh中,我试图了解哪些命令已经完成,以便我可以为不要执行的命令编写完成。
有没有办法列出zsh完成的命令而无需点击完成文件?例如,是否有一个内置命令会列出它们?
答案 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
上进行迭代,同时在每次迭代时使用command
和completion
两个元素并为其运行COMMAND
。这也是for
- 循环的简短形式,不需要do
和done
。${(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
运行才能获得有序列表。