在zsh中,我试图了解哪些命令有现有的完成,这样我就可以为没有完成的命令编写完成。
有没有一种方法可以列出zsh将完成的命令,而不需要查看完成文件?例如,是否有一个内置命令会列出它们?
发布于 2016-10-12 23:25:28
已知完成的列表存储在关联数组_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
-loop的一个简短形式,它不需要do
和done
。${(kv)ASSOC_ARRAY}
将关联数组ASSOC_ARRAY
扩展为键-值对的空格分隔列表.因此,这是一个交替的列表"key1 value1 key2 value2 key3 value3…“。,这是由for
-loop的两个参数处理的。$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
运行,才能得到有序的列表。https://stackoverflow.com/questions/40010848
复制