Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么会给我一个像ruby readline这样的默认值?_Ruby_Command Line_Console_Command Line Interface_Readline - Fatal编程技术网

什么会给我一个像ruby readline这样的默认值?

什么会给我一个像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 =

如果我想在终端上有一个已经输入了默认值的提示,我该怎么做

Ruby的标准
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}"