什么会给我像 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 这样的默认值?的主要内容,如果未能解决你的问题,请参考以下文章