2014-11-20 47 views
1

我正在使用node.js編寫一個命令行界面來生成單元測試文件。我一直在使用查詢器來獲取用戶輸入,但是有一個字段中用戶很可能希望複製粘貼和/或編輯JSON數據的大型多行塊。因此,我的目標是: 在CLI中打開vim @某些點 - >允許輸入 - >關閉vim - >寫出tmp文件 - >處理結果。在node.js的子進程中使用vim時的stdio /管道問題

問題是vim的輸入也會轉到父標準輸入,並且當返回鍵被擊中時,程序繼續在vim(混亂)之上。我很確定stdio/in/out/err沒有正確設置,但我似乎無法在任何地方找到確切的解決方案。我操縱流的每一次迭代似乎更接近,但我知道有一個小的缺失鏈接。

我已經沿着線嘗試了很多東西:

var vim = child_process.spawn('vim', [path], {stdin: 'pipe', stdout: 'pipe', stderr: 'pipe'});

var vim = child_process.spawn('vim', [path], {stdio: 'inherit'}); //{stdio: ['pipe','pipe','pipe']}

最後,我按照很多標準輸入輸出操作,從這個例子中,How do I open a terminal application from node.js?,但仍有仍然有一些小的缺失鏈接,我需要幫助

備註:

  • 我99%的確定我的異步承諾是有序的。
  • 它並不一定是VIM,因爲我檢查ENV爲 編輯第一
  • 我這個比喻來git的承諾,其中一個編輯器在關閉
  • 之前彈出,並允許輸入 小測試程序,我可以得到完善的功能,但是當 試圖做到這一點了另一個進程,它不順利

TL;博士:當輸入只能進入VIM我想忽略父進程(child_process),但我不能讓他們分開,a nd因此,該程序發生故障

如果有什麼我可以澄清,請讓我知道。 謝謝!

+0

爲什麼你不喜歡Git或Subversion或Mercurial?把你想讓你的用戶編輯的東西寫入臨時文件,用該文件打開Vim,編輯它的內容,然後寫下臨時文件的內容,用於下一步。 – romainl 2014-11-20 18:13:56

+0

這與我想要做的非常相似..問題是我如何獲得他們的輸入,因爲它在另一個程序中運行,並且這些流非常糾結可以這麼說。同樣,他們會把文本放進去,我不會給他們編輯的東西 – 2014-11-20 18:38:20

回答

1

我知道這是舊的,但無論如何6天前他們發佈了一個功能,2015.02.06版本0.12.0(穩定),這使得這很容易。

var spawnSync=require("child_process").spawnSync; 
spawnSync("vim",[__filename],{stdio:"inherit"}); 

它當然會阻止事件循環,但在這種情況下,您可能需要等待用戶。否則,在編輯時,最終可能會有節點寫入標準輸出和讀取標準輸入,這顯然非常令人困惑,並且是您遇到的問題。

如果您在編輯時仍然需要異步內容,則可能需要使用「child_process」。fork,這樣您就不會混淆stdin/stdout。我想你可以做一些花哨的東西來刪除所有的聽衆,並在稍後添加它們,但這可能不值得。