2014-06-19 27 views
0

我有一個交互式Perl腳本,它向STDERR輸出提示並從STDIN讀取行。該腳本的最終輸出是打印到STDOUT的IP地址。這裏有一個這樣的腳本的數字版本作爲例子。在vim中捕獲交互式腳本的輸出

my @pieces; 
for (1..4) { 
    print STDERR "please enter piece $_ of the IP:";  chomp(my $in = <>); 
    push @pieces, $in; 
} 
print join '.', @pieces; 
print "\n"; 

我使用vim-fireplace vim插件。這個插件有一個功能,我可以說:

:Connect nrepl://127.0.0.1:9999 

我想知道如何配置VIM,這樣,當我發出了一個特定的命令,讓我們說:

:InteractiveConnect 

將做到以下幾點:

  1. 運行Perl腳本,允許我輸入4個IP地址。
  2. 捕獲Perl腳本輸出的IP地址。
  3. 將IP地址插入到:Connect命令中
  4. 運行:Connect命令。根據一些答覆更

有點信息:

如果我把使用這個腳本:

:!/path/to/myscript.pl 

然後,它執行罰款,我能看到它打印的結果在Vim窗口,然後

Press ENTER or type command to continue 

如果腳本的輸出執行後通過!被保存在一定的緩衝,是possi可以在vimscript中訪問該緩衝區,並用正則表達式捕獲我想要的位(最後一行)?

+0

你想用控制檯來使用vim嗎? –

回答

1

好了,有可能是一個更優雅的方式來做到這一點,但這個怎麼樣:

function! <SID>InteractiveConnect() 
    let tempfile=tempname() 
    exe '!/path/to/your/script.pl >' . shellescape(tempfile) 
    try 
     exe 'Connect nrepl://' . readfile(tempfile, '', -1)[0] 
    finally 
     call delete(tempfile) 
    endtry 
endfunction 
command! -nargs=0 InteractiveConnect call <SID>InteractiveConnect() 

這將創建一個臨時文件,寫入它與腳本(使用system()不工作,因爲它不等待輸入),將臨時文件中的最後一行讀取到Connect命令,然後最後刪除臨時文件。

+0

謝謝,但那不是我真正想要的。該命令將命令行參數傳遞給Perl腳本。我上面發佈的腳本不能以這種方式工作。它打印提示,然後從STDIN讀取用戶響應。然後,一旦用戶回答了足夠的問題,就會打印出答案。 – clumsyjedi

+0

所以你想提示輸入,而不是直接從vim命令輸入它? – joshtch

+0

你能舉出一個更具代表性的最低工作例子嗎? 這也有助於瞭解命令的輸出是如何格式化的。編輯關於以前的評論:哦,對不起,這就是爲什麼它被稱爲「互動」連接。 – joshtch

0

也許是這樣的:

exec 'Connect nrepl://' . matchstr(system('your/script.pl'), '^.\+\%$') 

(未經測試)這將運行使用system()然後對正則表達式^.\+\%$(其中\%$意味着文件結束,輸出相匹配的腳本;如果你的文件被終止使用換行符,可能需要額外的\n),並將匹配的str送入Connect命令。 。