什么会给我一个像ruby readline这样的默认值?
如果我想在终端上有一个已经输入了默认值的提示,我该怎么做 Ruby的标准什么会给我一个像ruby readline这样的默认值?,ruby,command-line,console,command-line-interface,readline,Ruby,Command Line,Console,Command Line Interface,Readline,如果我想在终端上有一个已经输入了默认值的提示,我该怎么做 Ruby的标准Readline.Readline()允许我设置历史记录,但不填写默认值(至少据我所知) 我想要这样的东西: 代码: 控制台: > default_text| 听起来像是ncurses的工作。看起来rbcurse()是目前维护最好的API。并没有完全按照您所描述的做,但可能已经足够接近了。我也在为同样的事情而挣扎 我现在的做法是: options = ["the_text_you_want"] question =
Readline.Readline()
允许我设置历史记录,但不填写默认值(至少据我所知)
我想要这样的东西:
代码:
控制台:
> default_text|
听起来像是ncurses的工作。看起来rbcurse()是目前维护最好的API。并没有完全按照您所描述的做,但可能已经足够接近了。我也在为同样的事情而挣扎 我现在的做法是:
options = ["the_text_you_want"]
question = "use TAB or up arrow to show the text > "
Readline.completion_append_character = " "
Readline::HISTORY.push options.first
Readline.completion_proc = proc { |s| options.grep( /^#{Regexp.escape(s)}/ ) }
while value = Readline.readline(question, true)
exit if value == 'q'
puts value.chomp.strip #do something with the value here
end
是的,这很愚蠢,但这是我找到的唯一的方法
有人找到解决办法了吗?+1到highline
尝试以下方法:
require 'highline/import'
input = ask('> ') {|q| q.default = 'default_text'} # > |default_text|
通过
Readline
可以实现您的要求。有一个回调,您可以在显示提示后获得控制权,并将一些文本插入读取缓冲区
这对我很有用:
Readline.pre_input_hook = -> do
Readline.insert_text "hello.txt"
Readline.redisplay
# Remove the hook right away.
Readline.pre_input_hook = nil
end
input = Readline.readline("Filename: ", false)
puts "-- input:#{input.inspect}"
顺便说一句,我试着使用HighLine,但它似乎是我的选择。令人失望的原因之一是,
HighLine#ask
将光标移动键作为常规输入读取。在那类发现之后,我不再朝那个方向看了。一个示例或插图可以让这个问题更清楚。很难给出交互式控制台行为的示例,但这里有一个尝试。您是否需要用户能够修改默认的\u文本,比如退格,或者您只是想读取一个空行作为默认文本?是的,我希望他们修改它。我对ext/readline.c的读取使我相信Ruby的readline库不支持它。如果这个功能在GNU Readline中是可行的,那么就可以创建一个扩展,否则,我支持Farrel的ncurses建议。垂直条(在注释中)表示什么?这就是您看到的输出。如果不输入任何内容。输入设置为“默认文本”。@rainkinz:所以,用户必须看到垂直条,不是吗?这在某种程度上是不寻常的:不仅在提示之后,而且在两个垂直条之间输入一些东西。这与原始帖子描述的要求不同——默认值应该是可编辑的。是的,有一个解决方案,寻找pre_input_hook
一个左右。这正是我想要的!谢谢感谢您展示这个伟大的解决方案。特别是Readline.pre\u input\u hook=nil
技巧。我不知道pre_-input_-hook可以这样使用。真聪明!小心!这在MacOS X上的Readline实现中不起作用。我花了一个小时试图找出它不起作用的原因。没有错误,没有警告,什么都没有,只是不起作用。在ubuntu中,它工作正常。看起来像是insert_text
调用GNU的rl_insert_text
,这在ubuntu和MacOS之间是不同的。
Readline.pre_input_hook = -> do
Readline.insert_text "hello.txt"
Readline.redisplay
# Remove the hook right away.
Readline.pre_input_hook = nil
end
input = Readline.readline("Filename: ", false)
puts "-- input:#{input.inspect}"