我一直在尝试使用 PA_translator.vim 插件,但发现它在 Win32 Gvim 中不起作用。这似乎是因为在嵌入式 Vim Ruby 脚本中,无法使用从子进程传入的任何命令。原始进程动态构建命令,然后启动子进程以获取 JSON 片段,如下所示:
cmd = "require 'net/http'; p Net::HTTP.get('%s', '%s')"% [host, path]
response = `ruby -e "#{cmd}"`
如果我在命令行 ruby 脚本中运行它,它可以正常工作,但在 Vim 脚本中,管道似乎返回一个空字符串。
我还尝试了其他几种产生相同结果的方法:
response = ''
IO.popen("ruby.exe", "w+") do |f|
f.write cmd
f.close_write
response = f.read
p response
end
乃至:
def redirect
orig_defout = $stdout
$stdout = StringIO.new
yield
$stdout.string
ensure
$stdout = orig_defout
end
response = redirect { eval cmd }
所有这些似乎都出于相同的原因而失败,无法从管道获取输出,我得到一个空字符串。GVim 是一个真正的 win32 进程,是否有某些原因导致子进程的管道不起作用?
编辑:如果我尝试从嵌入式 vim/perl 捕获管道输出,效果很好,所以我猜这是 vim -> win32 -> ruby 组合的一些特殊问题:
fun! SayHello()
perl << EOF
$bob = `ls`;
VIM::Msg($bob);
EOF
结束乐趣