此问题已经在这里有了答案:
我正在使用Ruby编写一个小的命令行实用程序来搜索Pubmed。现在,我提示用户进行查询并显示结果,并且用户可以选择追加到查询或输入全新的查询。我想添加编辑当前查询的功能;即提示应预先填充上一个查询的可编辑版本,例如:
Enter query: <PREVIOUS QUERY HERE>
很容易在提示旁边打印出上一个查询,但是如何使该输出可编辑,就像用户自己键入了一样?
@ casper:谢谢卡斯珀的回应。我尝试了您在下面提供的代码,并且确实可以单独运行。奇怪的是,当我尝试在宝石中使用它时,它似乎不起作用。我的宝石叫做db_hippo。我在gemspec中添加了rb-readline作为依赖项,并将扩展名放入lib / db_hippo / rb-readline.rb
中的RbReadline。module DbHippo
module RbReadline
<CASPER'S EXTENSION HERE>
end
end
我希望在DbHippo的另一个子模块DbHippo :: Source中使用该功能。在DbHippo :: Source中,我在顶部添加了:
require 'rb-readline'
require 'db_hippo/rb-readline'
然后使用DbHippo :: Source的方法之一,我有:
RbReadline.prefill_prompt(query)
query = Readline.readline("Query: ", true)
查询变量肯定不是空的,但是由于某种原因,在此上下文中,提示未预先填充。我还注意到,如果将扩展名放在同一文件(lib / db_hippo / rb-readline)中而不使其成为DbHippo的子模块,则会收到错误:未初始化的常量DbHippo :: Source :: Readline(NameError)] >在行上:
query = Readline.readline("Query: ", true)
这似乎都与模块的正确命名,require语句和gem有关。这是我尝试构建的第一个宝石。知道这里出了什么问题吗?
我正在使用Ruby编写一个小的命令行实用程序来搜索Pubmed。现在,我提示用户进行查询并显示结果,并且用户可以选择附加到查询中,或者......>
您可以使用RbReadline:
require 'rubygems'
require 'rb-readline'
module RbReadline
def self.prefill_prompt(str)
@rl_prefill = str
@rl_startup_hook = :rl_prefill_hook
end
def self.rl_prefill_hook
rl_insert_text @rl_prefill if @rl_prefill
@rl_startup_hook = nil
end
end
RbReadline.prefill_prompt("Previous query")
str = Readline.readline("Enter query: ", true)
puts "You entered: #{str}"
也许Google员工会发现这很有用。