Sea*_*sey 5 ruby command-prompt
我正在使用Ruby编写一个小命令行实用程序来搜索Pubmed.现在,我提示用户进行查询并显示结果,用户可以选择附加到查询或输入全新的查询.我想添加编辑当前查询的功能; 即提示应预先填充上一个查询的可编辑版本,如下所示:
Enter query: <PREVIOUS QUERY HERE>
Run Code Online (Sandbox Code Playgroud)
打印出提示旁边的上一个查询很容易,但如何使此输出可编辑,就好像用户自己键入了它一样?
@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
Run Code Online (Sandbox Code Playgroud)
我希望在DbHippo,DbHippo :: Source的另一个子模块中使用该功能.在DbHippo :: Source我在顶部添加:
require 'rb-readline'
require 'db_hippo/rb-readline'
Run Code Online (Sandbox Code Playgroud)
然后在DbHippo :: Source的一个方法中,我有:
RbReadline.prefill_prompt(query)
query = Readline.readline("Query: ", true)
Run Code Online (Sandbox Code Playgroud)
查询变量绝对不是空的,但由于某种原因,在此上下文中,提示不会被预先填充.我还注意到,如果我将扩展名放在同一个文件(lib/db_hippo/rb-readline)中而不使其成为DbHippo的子模块,我会得到错误:未初始化的常量DbHippo :: Source :: Readline(NameError)就行了:
query = Readline.readline("Query: ", true)
Run Code Online (Sandbox Code Playgroud)
这似乎与模块,需要语句和宝石的正确命名有关.这是我试图建造的第一颗宝石.知道这里出了什么问题吗?
也许谷歌员工会发现这很有用。
Readline在 Ruby 2.1 上使用普通的,你可以使用:
def ask(prompt, default=nil)
if default
Readline.pre_input_hook = -> {
Readline.insert_text(default)
Readline.redisplay
# prevent re-trigger on every `readline`
Readline.pre_input_hook = nil
}
end
data = Readline.readline("#{prompt}: ")
return data.chomp
end
ask("MOAR...?", "COMPUTARS!") # displays: MOAR...? COMPUTARS!
Run Code Online (Sandbox Code Playgroud)
在提示时,文本COMPUTARS!将是可编辑的
您可以使用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}"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
458 次 |
| 最近记录: |