确定bash tabcompletion中的最终字符

时间:2015-07-01 15:00:13

标签: python bash python-click

我想确定最后一个角色是否是一个空格。

$ mycli fl[TAB]  # no space
flag flare
$ mycli flare [TAB]  # yes space
A B C D

原因

如果是空格,则每个参数用于确定完成提示,但如果它不是空格,则前一个参数将用于确定最后一个完成提示。我只需要知道在我用来计算完成的Python脚本中要采用哪条路径。

_mycli () {
  COMPREPLY=();

  local cur=${COMP_WORDS[COMP_CWORD]}
  local opts=$(mycli tabcompletion $COMP_LINE)
  COMPREPLY=($(compgen -W "${opts}" $cur))

  return 0
}

complete -F _mycli -o bashdefault mycli

这可能超出了问题的范围,这是Python脚本的一部分。

@mycli.command()
@click.argument("arguments", nargs=-1, required=False)
def tabcompletion(arguments):
    # Discard `mycli tabcompletion`
    arguments = list(arguments)[2:]

    complete = False
    if ???:
       complete = True

我希望以某种方式确定(??? - 部分)参数是否已完成,或是否为其提供完成。

2 个答案:

答案 0 :(得分:2)

空格表示前一个单词的结尾和新单词的开头。因此,cur在第一种情况下为fl,在第二种情况下为空字符串。

答案 1 :(得分:0)

直到有更好的东西出现,这就是我如何解决它。

  1. 删除$COMP_LINE
  2. 的最后一项
  3. 将项目传递给Python脚本
  4. 如果项目的长度为1,则假定它不完整,例如dinosau [TAB]
  5. 否则,它将具有竞争单词的长度,例如恐龙
  6. 示例

    _be () {
      COMPREPLY=();
    
      local cur=${COMP_WORDS[COMP_CWORD]}
    
      if [ ${COMP_CWORD} -ge 2 ]; then
        if [ ${COMP_WORDS[1]} == "in" ]; then
          local opts=$(be tab $COMP_LINE ${COMP_LINE: -1})
          COMPREPLY=($(compgen -W "${opts}" $cur))
        fi
      fi
    
      return 0
    }
    
    complete -F _be -o bashdefault be
    

    我不完全理解它,其中一个限制是我无法完成由单个字符组成的项目,这不是理想的,但对原型来说还可以。