我正在搜索允许用户编辑现有字符串。
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_hook
Readline 开始接受输入之前起作用。
我试过了:
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"