一位同事最近写了一个Ruby脚本,它通过在外部文本编辑器中打开带有一些初始化文本的临时文件来提示用户输入,然后在编辑器关闭后对其进行操作。此行为类似于git处理提交/标记编辑的方式。
require 'tempfile'
@command = options[:cmd] || "vim"
@file = Tempfile.new("buffer")
@file.write("This is the initial text in the file")
puts @file.read
@pid = Kernel.spawn("#{@command} #{@file.path}")
Process.wait(@pid)
@file.rewind
contents = @file.read
# Do stuff with "contents"
这个脚本对我的一些同事来说很好,但是当我运行它时,它不会接受我对临时文件所做的更改:它仍然将临时文件视为具有初始化文本。我将问题跟踪到如何阅读文件; @file.rewind
不足以让它接受更改。我可以让它工作,如果不是通过文件对象重新读取文件,而是每File.new(@file.path)
创建一个新文件。因此,我怀疑文件内容在运行时是缓冲的,但不是在它们运行时。
我在macOS 10.12.2上使用Ruby 2.4.0p0。这适用于在OS X 10.11.6上使用Ruby 2.0.0p643的同事,以及在Ubuntu上使用2.3.0-p0的另一位同事。当我使用Ruby 2.0.0p648时,我确认它在我的机器上不起作用,因此我怀疑这可能是由于操作系统的不同而不是Ruby差异。
请注意,我在Ruby中做的工作很少,所以我可能会遗漏一些明显的东西。
我的问题是:
答案 0 :(得分:0)
这对我来说和你一样(mac / ruby 2.4.x)。这里是内容在临时缓冲区中更改的完整脚本。
require 'tempfile'
options = {}
@command = options[:cmd] || "nano"
@file = Tempfile.new("buffer")
@file.write("This is the initial text in the file")
puts @file.read
@pid = Kernel.spawn("#{@command} #{@file.path}")
Process.wait(@pid)
@file.rewind
contents = @file.read
puts contents
我将其更改为nano
,但vim
也有效。也许你的vim配置是干扰?
我的测试:
puts contents
说嘿。我想这就是你想要的。