Подтвердить что ты не робот

Как написать приложение командной строки Ruby, поддерживающее табуляцию?

Я хочу написать приложение командной строки, оболочку, если хотите, в Ruby.

Я хочу, чтобы пользователь мог нажать Tab в определенных точках и предложить завершение значений.

Как мне это сделать? Какую библиотеку я должен использовать? Можете ли вы указать мне некоторые примеры кода?

4b9b3361

Ответ 1

А, кажется, стандартная библиотека - мой друг. То, что я искал, это библиотека Readline.

Doc и примеры здесь: http://www.ruby-doc.org/stdlib-1.9.3/libdoc/readline/rdoc/Readline.html

В частности, это хороший пример с этой страницы, чтобы показать, как завершается работа:

require 'readline'

LIST = [
  'search', 'download', 'open',
  'help', 'history', 'quit',
  'url', 'next', 'clear',
  'prev', 'past'
].sort

comp = proc { |s| LIST.grep(/^#{Regexp.escape(s)}/) }

Readline.completion_append_character = " "
Readline.completion_proc = comp

while line = Readline.readline('> ', true)
  p line
end

ПРИМЕЧАНИЕ: proc получает только введенное последнее слово. Если вы хотите, чтобы вся строка была введена до сих пор (поскольку вы хотите выполнить контекстно-зависимое завершение), добавьте следующую строку к указанному выше коду:

Readline.completer_word_break_characters = "" #Pass whole line to proc each time

(По умолчанию этот параметр установлен в список символов, которые представляют границы слов, и приводит к передаче только последнего слова в ваш proc).

Ответ 2

Библиотека Readline превосходна, я использовал ее много раз. Но, если вы делаете это только ради удовольствия, вы также можете выполнить свое собственное завершение.

Здесь простое завершение script:

require 'io/console' # Ruby 1.9
require 'abbrev'

word = ""

@completions = Abbrev.abbrev([
   "function",
   "begin"
])

while (char = $stdin.getch) != "\r"
   word += char
   word = "" if char == " "
   if char == "\t"
      if comp = @completions[word = word[0..-2]]
         print comp[word.length..-1]
      end
   else
      print char
   end
end
puts

Ответ 3

Ну, я предлагаю вам использовать Emacs для запуска приложения командной строки Ruby. В Emacs мои друзья SO совсем недавно помогли мне решить завершение вкладки Autocomplete (здесь и здесь). Autocomplete, по-видимому, является самым интеллектуальным инструментом завершения слов на сегодняшний день.