【问题标题】:Print editable to console in Ruby [duplicate]在Ruby中打印可编辑到控制台[重复]
【发布时间】:2016-12-27 07:58:48
【问题描述】:

假设我在 Ruby 中有以下代码:

print("Enter a filename:")
editableprint("untitled.txt")
filename = gets.chomp!

什么是函数“editableprint”,以便“untitled.txt”成为用户获取函数的输入的一部分? (因此用户可以编辑“untitled.txt”字符串或简单地保持原样”)

【问题讨论】:

  • 这是一个非常困难的问题。要么使用 File.readFile.writegets.chomp,要么只使用常规文本编辑器 ...

标签: ruby io console


【解决方案1】:

herehere也有类似的问题

但是,那里的解决方案似乎没有按预期工作,所以看起来这是 ruby​​ 版本或平台相关的?

例如,这对我不起作用,但也不会引发错误。

require "readline"

filename = Readline.insert_text("untitled.txt").readline("Enter a filename:")
print filename

但由于它看起来好多了,并且应该根据 ruby​​ >= 2 的文档工作,所以我暂时将其留在那里。

以下适用于我的系统(ruby 2.3.1,OS X)

require "readline"
require 'rb-readline'

module RbReadline
  def self.prefill_prompt(str)
    @rl_prefill = str
    @rl_startup_hook = :rl_prefill_hook
  end

  def self.rl_prefill_hook
    rl_insert_text @rl_prefill if @rl_prefill
    @rl_startup_hook = nil
  end
end

RbReadline.prefill_prompt("untitled.txt")
str = Readline.readline("Enter a filename:", true)

puts "You entered: #{str}"

【讨论】:

    【解决方案2】:

    我会使用 vim 来编辑文件。 Vim 会将编辑过的文件保存在~/.viminfo 中。最后编辑的文件标有'0。文件条目的模式是'N N N filename,其中 N 代表整数。

    def editableprint(filename)
      system "vi #{filename}"
      regex = /(?<='0\s{2}\d\s{2}\d\s{2}).*/
      viminfo = File.expand_path("~/.viminfo")
      File.read(viminfo).scan(regex).first
    end
    

    为了让它工作,你必须改变你的代码

    print("Enter a filename:")
    filename = gets.chomp!
    filename = "untitled.txt" if filename.emtpy?
    edited_filename = editableprint("untitled.txt")
    

    【讨论】: