【发布时间】: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