在vim中捕获交互式脚本的输出
我有一个交互式Perl脚本,它将提示打印到STDERR并从STDIN中读取行。这个脚本的最终输出是一个IP地址,打印到STDOUT。下面是这样一个脚本的简单版本作为示例在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
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
它将执行以下操作:
:!/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'), '^.\+\%$')