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

在vim中捕获交互式脚本的输出,vim,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; pr

我有一个交互式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,以便在发出特定命令时,可以说:

:InteractiveConnect
它将执行以下操作:

  • 运行Perl脚本,允许我输入4个IP地址
  • 捕获Perl脚本输出的IP地址
  • 在:Connect命令中插入IP地址
  • 运行:Connect命令
  • 根据一些回复提供更多信息:

    如果我使用以下命令调用此脚本:

    :!/path/to/myscript.pl
    
    然后它执行得很好,我可以看到它的结果打印在vim窗口中,然后是

    Press ENTER or type command to continue
    

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

    好的,可能有一种更优雅的方法来实现这一点,但是这个呢:

    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()
    
    函数!InteractiveConnect()
    让tempfile=tempname()
    exe'/路径/to/your/script.pl>'。shellescape(临时文件)
    尝试
    exe“Connect nrepl://”。readfile(临时文件“”,-1)[0]
    最后
    调用删除(临时文件)
    末日
    端功能
    命令-nargs=0 InteractiveConnect调用InteractiveConnect()
    
    这将创建一个临时文件,用脚本写入(使用
    system()
    无法工作,因为它不等待输入),将tempfile中的最后一行读取到
    Connect
    命令,然后最后删除tempfile。

    可能类似于:

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

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

    你想把vim当作控制台来使用吗?谢谢,但这不是我真正想要的。此命令将命令行参数传递给Perl脚本。我上面发布的脚本不是这样工作的。它打印一个提示,然后从STDIN读取用户响应。然后,一旦用户回答了足够多的问题,它就会打印答案。因此,您希望得到输入提示,而不是直接从vim命令输入?您能给出一个更具代表性的最小工作示例吗?了解命令输出的格式也会有所帮助。编辑之前的评论:哦,对不起,这就是为什么它被称为“交互式”连接。我不知道我是否可以再减少Perl脚本,我的问题中包含的是我实际需要的功能的一个非常精简的版本。如果你将这个脚本保存在一个文件中并运行它,那么它是如何获取输入的,这一点应该很明显。谢谢你的关注。
    exec 'Connect nrepl://' . matchstr(system('your/script.pl'), '^.\+\%$')