【发布时间】:2018-11-18 21:17:24
【问题描述】:
我正在使用 oh-my-zsh,并且一直在尝试为 sdkman 开发自定义完成脚本。
但是我在尝试使某些命令相互化时遇到了一个小问题。
下面是完成脚本的开始。使用 _describe 方法输出完成帮助的三个函数。
#compdef sdk
zstyle ':completion:*:descriptions' format '%B%d%b'
# Gets candidate lists and removes all unecessery things just to get candidate names
__get_candidate_list() {
echo `sdk list | grep --color=never "$ sdk install" | sed 's/\$ sdk install //g' | sed -e 's/[\t ]//g;/^$/d'`
}
__get_current_installed_list() {
echo `sdk current | sed "s/Using://g" | sed "s/\:.*//g" | sed -e "s/[\t ]//g;/^$/d"`
}
__describe_commands() {
local -a commands
commands=(
'install: install a program'
'uninstall: uninstal an existing program'
)
_describe -t commands "Commands" commands && ret=0
}
__describe_install() {
local -a candidate_list
candidate_list=( $( __get_candidate_list ) )
_describe -t candidate_list "Candidates available" candidate_list && ret=0
}
__describe_uninstall() { # FIXME THis is not working, it only displays candidate list
local -a candidates_to_uninstall
candidates_to_uninstall=( $( __get_current_installed_list ) )
_describe -t candidates_to_uninstall "Uninstallable candidates" candidates_to_uninstall && ret=0
}
__get_candidate_list 与以下值相呼应:
ant asciidoctorj bpipe ceylon crash cuba cxf gaiden glide gradle grails groovy groovyserv infrastructor java jbake kotlin kscript lazybones leiningen maven micronaut sbt scala spark springboot sshoogr vertx visualvm
__get_current_installed_list 与以下值相呼应:
gradle java kotlin maven sbt scala
下面脚本的第二部分是我们调用所有内容的地方,以便 zsh 正确使用完成脚本:
function _sdk() {
local ret=1
local target=$words[2]
_arguments -C \
'1: :->first_arg' \
'2: :->second_arg' \
&& ret=0
case $state in
first_arg)
__describe_commands
;;
second_arg)
case $target in
install)
__describe_install
;;
uninstall)
__describe_uninstall
;;
*)
;;
esac
;;
esac
return $ret
}
_sdk "$@"
问题如下:当我输入 sdk install 时,我得到了正确的输出,来自 __get_candidate_list 方法的输出,但是当我使用 sdk uninstall 时,它仍然给我 __get_candidate_list 虽然我期待 __get_current_installed_list 输出。
编辑: 经过一番调试,似乎 zsh 没有错。我不知道为什么,但是 sdkman 从完成脚本内部给了我与 sdk list 和 sdk current (在 sed 命令之后)相同的输出。在我的 shell 中,这两个命令都可以在 shell 中正常工作。
我使用 _describe 方法的方式有问题吗? 还有什么我没看到的吗?
感谢您的帮助。
【问题讨论】: