如何允许用户通过 ruby 中的$stdin编辑给定的字符串



我正在搜索允许用户编辑现有字符串。

Edit the following string: Edit me
# After user delete and add characters
Edit the following string: Edit you

我想在$stdin前面添加一些数据,但似乎这是不可能的,无论如何恕我直言,这是一个过于激进的解决方案。

有人告诉我使用 GNU Readline 的 Ruby 包装器,所以我快速浏览了一下,我找到了Readline#pre_input_hookReadline 开始接受输入之前起作用。

我试过了:

require 'readline'
Readline.pre_input_hook = -> { "Edit me" }
result = Readline.readline("Edit the following string: ")
puts result

但似乎不起作用。

begin
system("stty raw -echo")
print (acc = "Edit me: ")
loop.each_with_object(acc) do |_,acc|
sym = $stdin.getc
case sym.ord
when 13    # carriage return
break acc
when 127   # backspace
print "e[1D e[1D"
acc.slice!(acc.length - 1) if acc.length > 0
else       # regular symbol
print sym
acc << sym
end
end
ensure
system("stty -raw echo")
puts
puts "e[0mEntered: |#{acc}|"
end

给你。有关终端控制序列的更多信息。此外,ANSI 终端代码。

我从tty-prompt中找到prompt.ask满足了我的需求:

$ gem install tty-prompt
$ irb
irb(main):001:0> require "tty-prompt"
=> true
irb(main):002:0> prompt = TTY::Prompt.new
=> #<TTY::Prompt prefix="" quiet=false enabled_color=nil active_color=:green 
error_color=:red help_color=:bright_black input=#<IO:<ST...
irb(main):003:0> prompt.ask("What is your name?", default: ENV["USER"])
What is your name? xxx
=> "xxx"
irb(main):004:0> prompt.ask("What is your name?", value: "Mike")
What is your name? Michael
=> "Michael"

相关内容

  • 没有找到相关文章

最新更新