如何允许用户通过 ruby 中的 $stdin 编辑给定的字符串
How to allow users to edit given string via $stdin in ruby
我正在搜索允许用户编辑现有字符串。
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
给你。有关 terminal control sequences. Also, ANSI terminal codes.
的更多信息
我发现 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"
我正在搜索允许用户编辑现有字符串。
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
给你。有关 terminal control sequences. Also, ANSI terminal codes.
的更多信息我发现 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"