Bash TAB完成双引号字符串

时间:2009-04-08 18:23:23

标签: bash shell twitter tab-completion

问题

我正在为命令行编写一个Twitter客户端(在C中)。我目前正在为Twitter屏幕名称进行TAB完成,如下所示:

  

推特“@ s< TAB>
  @sourcebits @spolsky

但是,我不能让它在mid-string中工作,例如:

  

推特“Foo bar @ s< TAB>

因为Bash将字符串视为一个单词。我在Bash手册页中找不到任何建议简单修复的东西,所以我决定破解它。以下是我对该问题的半成品解决方案。我只是按空格分割传入的字符串,取最后一个字(现在简化)并将其发送到compgen(下面的变量$last_word)。但是,我需要将$prefix附加到TAB完成产生的字符串的开头,因为它替换了整个输入字符串(记住:它被视为一个单词)。那就是我被困住的地方。

问题

如何做到这一点?

代码等。

__cltwitter_complete () {
  local cache="$HOME/.cltwitter_users.cache"
  local string=${COMP_WORDS[COMP_CWORD]}
  local last_word=${string##* }
  local prefix=${string% *}

  COMPREPLY=()

  #if [ ! -f ${cache} ] || [ "`find ${cache} -mmin +60`" != "" ]; then
  #  cltwitter-update-cache
  #fi

  if [[ "$last_word" == \"@* ]]; then  # if word is beginning of a quotation
    last_word=${last_word:2}
  elif [[ "$last_word" == @* ]]; then  # if user put '@' in front
    last_word=${last_word:1}
  fi

  COMPREPLY=( $( compgen -W "`cat $cache`" -P @ -- $last_word ) )
}

complete -F __cltwitter_complete tweet

Bash手册页中的相关部分:

  

COMP_WORDS

     
    

一个数组变量(参见下面的数组),由变量中的单个单词组成     当前命令行。单词在shell元字符上拆分为shell     解析器将它们分开。此变量仅在shell中可用     可编程完成工具调用的函数。

  

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

你真的需要报价吗?

例如,您的命令可能是:

tweet Foo bar @s<TAB>

然后@s只是你要完成的单词,你可以搜索它。在脚本内部,您仍然可以使用$ *获取整个字符串。

但是,你现在必须更加小心地调用,因为你不能使用特殊字符,比如!和()不再需要用反斜杠来逃避它们。