Автозаполнение строк, начинающихся с @ (знак at) с помощью Readline в Ruby

Привет, ребята, я боролся с автозаполнением и строкой чтения, если у меня есть множество таких опций:

["@lorem", "@ipsum", "#bla", "#meh"]

и я в подсказке ставлю @ (при знаке) и нажимаю TAB, он показывает все варианты:

what do you want? > @[TAB] 
@lorem @ipsum #bla #meh

но если я использую любой другой знак, он работает:

what do you want? > #[TAB]
#bla #meh

Это код, который у меня есть до сих пор:

  opts = ["@lorem", "@ipsum", "#bla", "#meh"]
  question = "whatever? > "

  Readline.completion_append_character = " "
  Readline.completion_proc = proc { |s| opts.grep( /^#{Regexp.escape(s)}/ ) }

  while value = Readline.readline(question, true)
      exit if value == 'q'
      puts value.chomp.strip
  end
end

Кто-нибудь знает, как я могу сообщить Readline о @?


person raf    schedule 03.11.2010    source источник
comment
Можете ли вы показать нам, какой код у вас есть?   -  person Jordan Running    schedule 03.11.2010
comment
Я только что обновил пост с кодом, спасибо.   -  person raf    schedule 03.11.2010


Ответы (1)


Это вызвано тем, что знак @ включен в список символов разрыва слова, распознаваемых readline.

Вы можете удалить знак @ из списка символов разрыва слов, и тогда это сработает.

opts = ["@lorem", "@ipsum", "#bla", "#meh"]
question = "whatever? > "

Readline.basic_word_break_characters = 
    Readline.basic_word_break_characters.delete("@")
Readline.completion_append_character = " "
Readline.completion_proc = proc { |s| opts.grep( /^#{Regexp.escape(s)}/ ) } 

while value = Readline.readline(question, true)
    exit if value == 'q'
    puts value.chomp.strip
end

И результаты запуска этого были следующими: -

whatever? > #(TAB)
#bla  #meh  
whatever? > @(TAB)
@lorem  @ipsum  
whatever? > q
person Steve Weet    schedule 03.11.2010