在vim中捕获交互式脚本的输出

时间:2014-06-19 05:08:50

标签: vim

我有一个交互式Perl脚本,它将提示打印到STDERR并从STDIN读取行。此脚本的最终输出是一个IP地址,打印到STDOUT。以下是这样一个脚本的简洁版本。

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命令。
  5. 根据一些回复提供更多信息:

    如果我使用以下方法调用此脚本:

    :!/path/to/myscript.pl
    

    然后它执行正常,我能够在vim窗口中看到它的结果,然后是

    Press ENTER or type command to continue
    

    如果脚本的输出在执行后通过!保存在某个缓冲区中,是否可以在vimscript中访问该缓冲区并使用正则表达式捕获我想要的位(最后一行)?

2 个答案:

答案 0 :(得分: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()不起作用,因为它不等待输入),将临时文件中的最后一行读取到{ {1}}命令,然后最后删除临时文件。

答案 1 :(得分:0)

可能是这样的:

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

(未经测试。)这将使用system()运行脚本,然后将输出与正则表达式^.\+\%$匹配,(其中\%$表示文件结束;如果您的文件已终止使用换行符,在它之前可能需要额外的\n并将匹配的str提供给Connect命令。