我有一个交互式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
它将执行以下操作:
根据一些回复提供更多信息:
如果我使用以下方法调用此脚本:
:!/path/to/myscript.pl
然后它执行正常,我能够在vim窗口中看到它的结果,然后是
Press ENTER or type command to continue
如果脚本的输出在执行后通过!保存在某个缓冲区中,是否可以在vimscript中访问该缓冲区并使用正则表达式捕获我想要的位(最后一行)?
答案 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
命令。