如何使用bash_autocomplete作为第二个参数?

时间:2016-10-06 15:46:22

标签: bash

用例:我试图让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脚本。但我宁愿正确地做到这一点!

2 个答案:

答案 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 编写的完成函数改编了此内容,我无法对其进行测试,但它应该可以正常工作