Ruby中的预填充提示

我正在使用Ruby编写一个小命令行实用程序来搜索Pubmed。 现在,我提示用户进行查询并显示结果,用户可以选择附加到查询或输入全新的查询。 我想添加编辑当前查询的function; 即提示应预先填充上一个查询的可编辑版本,如下所示:

Enter query:  

打印出提示旁边的上一个查询很容易,但是如何使这个输出可编辑,就像用户自己输入一样?

@casper:谢谢Casper的回复。 我尝试了下面提供的代码,它确实可以自行运行。 奇怪的是,当我尝试在gem中使用它时它似乎不起作用。 我的gem叫做db_hippo。 我在我的gemspec中添加了rb-readline作为依赖项,并将扩展名放在lib / db_hippo / rb-readline.rb中的RbReadline中

 module DbHippo module RbReadline  end end 

我希望在DbHippo,DbHippo :: Source的另一个子模块中使用该function。 在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) 

这似乎与模块,需要语句和gem的正确命名有关。 这是我试图建造的第一颗gem。 知道这里出了什么问题吗?

你可以用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}" 

也许googlers会发现这很有用。

使用Ruby 2.1上的简单Readline ,您可以使用:

 def ask(prompt, default=nil) if default Readline.pre_input_hook = -> { Readline.insert_text(default) Readline.redisplay } end data = Readline.readline("#{prompt}: ") return data.chomp end ask("MOAR...?", "COMPUTARS!") # displays: MOAR...? COMPUTARS! 

在提示文本COMPUTARS! 将是可编辑的