Bash TAB-завершение внутри строки в двойных кавычках - PullRequest
3 голосов
/ 08 апреля 2009

Задача

Я пишу клиент 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

Переменная массива (см. Массивы ниже), состоящая из отдельных слов в текущая командная строка. Слова разделены на метасимволы оболочки в качестве оболочки парсер разделит их . Эта переменная доступна только в оболочке функции, вызываемые программируемыми средствами завершения.

Ответы [ 2 ]

1 голос
/ 09 апреля 2009

Посмотрите на программируемое завершение: http://www.faqs.org/docs/bashman/bashref_103.html

0 голосов
/ 14 апреля 2009

Вам действительно нужны цитаты?

Например, ваша команда может быть:

tweet Foo bar @s<TAB>

Тогда @s будет просто словом, которое вы пытаетесь завершить, и вы можете найти его. Внутри скрипта вы можете получить всю строку с $ *.

Вы должны быть более осторожными, вызывая сейчас, так как вы не можете использовать специальные символы, такие как! и () больше без необходимости убегать от них с обратной косой чертой.

...