用例:我试图让source activate <env>
自动填充我的conda环境的名称(即~/anaconda3/envs/
中的目录列表)。
如果我不需要激活&#39;我已设法让它工作。在那里使用这段代码:
_source ()
{
local cur
COMPREPLY=()
cur=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=($(ls ~/anaconda3/envs | xargs -I dirs bash -c "compgen -W dirs $cur"))
return 0
}
complete -F _source source
我已尝试将complete
的最后一个参数设置为source\ activate
和'source activate'
,但这不起作用(它只是使用本地文件自动填充)。
问题似乎是因为source activate
不是一个功能,它不能解决它。
当然,简单的解决方案是制作一个只包含source activate $1
的单字bash脚本。但我宁愿正确地做到这一点!
答案 0 :(得分:0)
我的解决方案改编自this conda issue。
它会检查第一个参数是activate
然后使用你输入的第二个单词来执行compgen。
#!/bin/bash
_complete_source_activate_conda(){
if [ ${COMP_WORDS[COMP_CWORD-1]} != "activate" ]
then
return 0
fi
local cur=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=($(ls ~/anaconda3/envs | xargs -I dirs bash -c "compgen -W dirs $cur"))
return 0
}
complete -F _complete_source_activate_conda source
将该脚本放在/etc/bash_completion.d/中。不幸的是,它会杀死第一个字的自动完成 - 有些更麻烦,它可能能够同时处理它们。
答案 1 :(得分:0)
使用 case 语句可以让自动完成功能为第二个参数工作 像这样
_source()
{
local cur prev opts
case $COMP_CWORD in
1) opts="activate";;
2) [ ${COMP_WORDS[COMP_CWORD-1]} = "activate" ] && opts=$(ls ~/anaconda3/envs | xargs -I dirs bash -c "compgen -W dirs $cur");;
*);;
esac
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
COMPREPLY=( $(compgen -W "$opts" -- ${cur}) )
return 0
}
complete -F _source source
compgen 是在 bash 的函数中构建的,然后您可以使用 $opts
为第一个参数提供要完成的选项,它将自动完成“激活”,但可以将其调整为更存在的列表,并且对于第二个参数在尝试完成之前首先检查第一个参数是否为“激活”
免责声明,我根据我为 ubports-qa 编写的完成函数改编了此内容,我无法对其进行测试,但它应该可以正常工作