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

Posted

技术标签:

【中文标题】什么会给我像 ruby​​ readline 这样的默认值?【英文标题】:What will give me something like ruby readline with a default value? 【发布时间】:2011-01-19 19:45:43 【问题描述】:

如果我想在终端上显示已输入默认值的提示,我该怎么做?

Ruby 的标准 Readline.readline() 允许我设置 历史记录,但不填写默认值(至少据我所知)

我想要这样的东西:

代码:

input = Readline.readline_with_default('>', 'default_text')

控制台:

> default_text|

【问题讨论】:

一个例子或插图可以让这个问题更清楚。 很难给出交互式控制台行为的例子,但这里有一个尝试。 您是否需要用户能够修改 default_text,例如在其上退格,或者您只是想读取一个空行作为默认文本? 是的,我希望他们修改它。 我对 ext/readline.c 的阅读让我相信 Ruby 的 Readline 库不支持它。如果这个功能在 GNU Readline 中是可能的,那么可以创建一个扩展,否则,我赞同 Farrel 的 ncurses 建议。 【参考方案1】:

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 将光标移动键读取为常规输入。在那种发现之后,我不再朝那个方向看。

【讨论】:

这正是我想要的!谢谢! 感谢您展示这个出色的解决方案。特别是Readline.pre_input_hook = nil 技巧。我不知道 pre_input_hook 可以这样使用。太聪明了! 警告!这在 MacOS X 上的 Readline 实现中不起作用。我尝试了一个小时来弄清楚它为什么不起作用。没有错误,没有警告,什么都没有,只是不起作用。在 ubuntu 中,它可以正常工作。 看起来 insert_text 调用了 GNU 的 rl_insert_text,这在 Ubuntu 和 MacOS 之间有所不同。 apidock.com/ruby/Readline/insert_text/class【参考方案2】:

+1 到高线

尝试类似:

require 'highline/import'
input = ask('> ') |q| q.default = 'default_text' # > |default_text|

【讨论】:

竖线(在评论中)代表什么? 这就是你所看到的输出。如果你什么都不输入。输入设置为“default_text”。 @rainkinz:所以,用户必须看到竖线,不是吗?这有点不寻常:不仅在提示符之后输入内容,而且在两个竖线之间输入内容。 它与原始帖子描述的要求不同——默认值应该是可编辑的。【参考方案3】:

听起来像是 ncurses 的工作。似乎 rbcurse (http://rbcurse.rubyforge.org/) 是目前维护最好的 API。

【讨论】:

【参考方案4】:

我也在为同样的事情苦苦挣扎。

我现在的做法是:

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

是的,这很愚蠢,但这是我发现的唯一方法。

有人找到解决办法了吗?

【讨论】:

是的,有解决办法,找pre_input_hook周围的。【参考方案5】:

Highline 不完全符合您的描述,但可能已经足够接近了。

【讨论】:

以上是关于什么会给我像 ruby​​ readline 这样的默认值?的主要内容,如果未能解决你的问题,请参考以下文章

Rails控制台:在`require':无法加载这样的文件 - readline(LoadError)

为啥使用溢出会给我这个问题?

为什么这个双链表程序会给我一个空指针异常? [重复]

为啥这会给我一个空引用异常? [复制]

为啥这个 fgets 函数会给我一个分段错误?

如何让 Mac 的 Ruby 使用 libreadline