如何允许用户通过 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"