我想在Ruby中编写命令行应用程序,如果你愿意,可以写一个shell。
我希望用户能够在某些点按Tab键并提供值的完成。
我该怎么做?我必须使用哪个库?你能指点我一些代码示例吗?
答案 0 :(得分:31)
啊,看来标准库毕竟是我的朋友。我正在寻找的是Readline库。
此处的文档和示例: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中。)
答案 1 :(得分:10)
Readline库很棒,我已多次使用它。但是,如果你只是为了它的乐趣而制作它,你也可以自己完成。
这是一个简单的完成脚本:
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
答案 2 :(得分:-10)