Задача
Я пишу клиент Twitter для командной строки (на С). В настоящее время я работаю над завершением TAB для экранных имен Twitter, например:
твит "@ с
@sourcebits @ spolsky
Однако я не могу заставить его работать в середине строки, например ::
твит "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
Переменная массива (см. Массивы ниже), состоящая из отдельных слов в
текущая командная строка. Слова разделены на метасимволы оболочки в качестве оболочки
парсер разделит их . Эта переменная доступна только в оболочке
функции, вызываемые программируемыми средствами завершения.