Как написать приложение командной строки Ruby, поддерживающее табуляцию?
Я хочу написать приложение командной строки, оболочку, если хотите, в Ruby.
Я хочу, чтобы пользователь мог нажать Tab в определенных точках и предложить завершение значений.
Как мне это сделать? Какую библиотеку я должен использовать? Можете ли вы указать мне некоторые примеры кода?
Ответы
Ответ 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, по-видимому, является самым интеллектуальным инструментом завершения слов на сегодняшний день.