Ruby中的预填充提示

时间:2012-06-13 21:40:46

标签: ruby command-prompt

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

Enter query: <PREVIOUS QUERY HERE>

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

@casper: 谢谢你对Casper的回应。我尝试了下面提供的代码,它确实可以独立工作。奇怪的是,当我尝试在宝石中使用它时似乎不起作用。我的gem叫做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)

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

2 个答案:

答案 0 :(得分:4)

也许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!将可编辑

答案 1 :(得分:3)

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