【问题标题】:Bash TAB-completion inside double-quoted string双引号字符串中的 Bash TAB 补全
【发布时间】:2010-10-18 09:20:25
【问题描述】:

问题

我正在为命令行(用 C 语言)编写 Twitter 客户端。我目前正在为 Twitter 屏幕名称进行 TAB 补全,如下所示:

推特“@s
@sourcebits @spolsky

但是,我无法让它在中间字符串中工作,例如:

tweet "Foo bar @s

因为 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 中可用 由可编程完成设施调用的函数。

【问题讨论】:

    标签: bash shell twitter tab-completion


    【解决方案1】:

    【讨论】:

      【解决方案2】:

      你真的需要引号吗?

      例如,您的命令可能是:

      tweet Foo bar @s<TAB>
      

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

      不过,您现在必须更加小心地调用,因为您不能使用特殊字符,例如 !和 ( ) 不再需要用反斜杠转义它们。

      【讨论】:

      • 我已经考虑过了。基本上,这不是我希望做的事情,因为它只是感觉不对(在 UNIX 意义上)。此外,由于可以选择将更多参数传递给可执行文件,因此消息现在必须是最后一个参数,因为它是可变长度的,这变得很尴尬,因为它是唯一的强制参数。
      • 通常,其他命令行实用程序通过使用以破折号为前缀的选项来解决此问题,然后使用分隔符 (--) 表示“这之后的所有内容都是一个参数,即使它看起来像一个选项” (即,以破折号开头)。然后您仍然可以执行以下操作:tweet -x 我的推文太棒了! tweet -x -- - 此消息以破折号开头!推特--这个也是
      • 啊,间距被评论系统扼杀了,但你明白了。
      猜你喜欢
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-20
      • 2014-11-27
      • 1970-01-01
      • 2014-09-26
      相关资源
      最近更新 更多