2017-01-30 4 views
2

最近、同僚はテキストを初期化した外部テキストエディタで一時ファイルを開いてユーザ入力を促すRubyスクリプトを作成し、それがエディタが閉じられると、この動作は、gitがコミット/タグ編集をどのように処理するかと似ています。実行された場所によって作成されたファイルに対する外部変更がRubyスクリプトに表示されない

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を使用しているときに私のマシン上で動作しないことを確認したので、これはOSの違いとRubyの違いによるものではないかと疑いを持っています。

私はRubyでほとんど仕事をしていないことに注意してください。

私の質問は、したがって、次のとおりです。矛盾を引き起こしている何

  1. 、それがどこかに文書化されていますか?これがバッファリングされるRubyに変更があったのでしょうか?それはOSのものですか?これがバッファリングされるかどうかは特に明記されていませんか? IO Ruby docsには何も明白ではありませんが、間違った場所を探している可能性があります。
  2. これはOSのバージョン間で動作するRubyイディオムとは何ですか?または、近道して再開したアプローチがベストショットですか?

答えて

0

これは私と同じenv(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の設定が干渉しているのでしょうか?

私のテスト:

  1. 一時バッファが(/終了を保存)「ねえ」と言うように編集されている場合、puts contentsはちょっと言います。私はこれがあなたが望んだものだと思います。
関連する問題