2013-12-15 77 views
1

我有一個與用戶交互的腳本(向stderr輸出一些問題並從stdin獲取輸入),然後將一些數據輸出到stdin。我想把腳本的輸出放到vimscript中的一個變量中。它大概應該是這樣的:如何在vimscript中與外部命令交互?

let a = system("./script") 

假想的行爲是腳本運行時,與用戶進行交互,並且所有a後,被分配其輸出到標準輸出。但是,將a分配給輸出到stdout和stderr,因此用戶種子沒有提示。

你能幫我解決嗎?

回答

2

在Vim中最好避免交互命令;特別是使用GVIM(在Windows上)時,會彈出一個新的控制檯窗口;您可能沒有一個完整的功能終端,...

更好地查詢Vimscript本身的任何必需的參數(與input();或從自定義的Vim :command傳遞它們),並且只是非交互式地使用外部腳本,它需要的一切。

+0

插件的整個想法是與用戶交互。所以,我明白,這不是常用的方法。也許我應該嘗試以某種方式使用vim菜單,或者在Vimscript中重寫整個腳本。不管怎樣,謝謝! –

2

system()(以及:!)捕獲的內容由'shellredir'選項控制。它的通常值>%s 2>&1捕獲stdout以及stderr。您的腳本需要爲其輸出選擇一個(例如stdout),另一個用於用戶交互,並且調用它的Vimscript包裝必須(暫時)更改選項。

:let save_shellredir = &shellredir 
:set shellredir=> 
:let a = system('./script') " The script should interact via stderr. 
:let &shellredir = save_shellredir 
+0

謝謝!這是有道理的,但是,它並沒有完全幫助。現在我真的只接收來自system()調用的stdout,但stderr不顯示在任何地方。此外,腳本(即使是最簡單的「read x; print x」)也不會請求任何輸入;似乎stdin被vim以某種方式阻止。 –

+0

您可能需要再次獲取stdin('exec 0

0

呼叫與其他內的腳本,

. ./script.sh

我覺得這是你的意思。

+0

對不起,我不明白。這條線應放在哪裏?第一個點在這種情況下意味着什麼?順便說一句,腳本是用Perl編寫的,但不是bash,而且這種構造不能像我想的那樣工作。 –