2015-11-20 87 views
0

我目前正在研究一個Ruby寶石CocoaPods的功能。有一個現有的命令可以接受多個選項。我想添加一個額外的選項,使用戶可以通過打開默認的文本編輯器來輸入自定義消息,並且當用戶保存並退出編輯器時,消息被輸入到執行的命令中。從命令行打開編輯器並獲取輸入

我想要複製的是如何將-m添加到git commit命令以讓您輸入提交消息。我幾乎沒有創建命令行工具的經驗,因此非常感謝任何幫助。

目標是執行特定命令command --message,打開編輯器,讓用戶輸入自定義消息,然後執行該命令,其中自定義消息是存儲在argv中的參數之一。

+0

的'interactive_editor'寶石似乎與你試圖達到的目標。我沒有檢查消息來源,但可能有想法可以選擇。 –

回答

1

共同工作流程是:

  • 呼叫者應用程序創建的臨時文件;
  • 確定默認編輯器(對於基於Debian的編輯器,它將爲/usr/bin/editor,對於其他的編譯器 - 編譯器變量的內容爲$EDITOR等);
  • 在子窗體中運行shell命令(不帶反引號!
  • 等待它退出;
  • 確定退出代碼,如果不是0,則跳過以下代碼;
  • 讀取在步驟1中創建的臨時文件的內容並刪除該文件。

在紅寶石這將是這樣的:

▶ f = Tempfile.new 'cocoapods' 
#⇒ #<File:/tmp/am/cocoapods20151120-6901-u2lubx> 
-rw------- 1 am am 0 nov 20 15:03 /tmp/am/cocoapods20151120-6901-u2lubx 
▶ path = f.path 
#⇒ "/tmp/am/cocoapods20151120-6901-u2lubx" 
▶ f.puts 'This content is already presented in file' 
#⇒ nil 
▶ f.close # HERE MUST BE ENSURE BLOCK, BUT FOR THE SAKE OF AN EXAMPLE... 
#⇒ nil 
▶ system "editor #{path}" 
#⇒ Vim: Warning: Output is not to a terminal 

如果您在控制檯測試此,只需要輸入任何東西,然後Esc鍵:瓦特q。在現實生活中,會有正常的vim(或默認編輯器)打開。

▶ File.read path 
#⇒ "GGGGGGGGGThis content is already presented in file\n" 

一起:

#!/usr/bin/env ruby 

require 'tempfile' 

f = Tempfile.new 'cocoapods' 
path = f.path 
f.puts 'This content is already presented in file' 
f.close # HERE MUST BE ENSURE BLOCK, BUT FOR THE SAKE OF AN EXAMPLE... 
system "editor #{path}" 
puts File.read path 
+0

這是一個很好的開始。我遇到的問題是在Ruby腳本退出之前獲取文件的內容。編輯器打開時,Ruby腳本將退出。我希望/期待在編輯關閉的時候它會繼續執行。你寫'File.read路徑'。你在哪裏閱讀臨時文件的內容? –

+1

噢,對不起,我搞砸了:在相同的上下文中調用編輯器(在子shell中),應該使用['Kernel#system'](http://ruby-doc.org/core-2.1.5 /Kernel.html#method-i-system)而不是反引號。爲了您的方便,我使用整個腳本的代碼更新了答案。 – mudasobwa

相關問題