我现在正在做这样的事情:
redir => m
silent w ! ruby
redir END
new
put=m
它以Ruby代码的形式执行当前缓冲区的内容,并将输出放在新的缓冲区中.
但是,如果我运行的Ruby代码是类似的
puts "start"
sleep 10
puts "end"
然后我会看到没有输出10秒,然后同时“开始”和“结束”.
有没有一种方法可以将输出“流”输出到缓冲区,一行一行?所以我会看到“开始”,然后10秒后我会看到“结束”?与我刚做的情况类似
w ! ruby
并查看命令行下的输出.
最佳答案 Vim并没有真正公开这种I / O的原语,但你可以从其中一个嵌入式语言接口中完成它.
这是使用Python和subprocess的草图(Ruby看起来很相似;见if_ruby):
python << EOF
import vim
import subprocess
def output_lines_to_buffer(cmd):
"""
Append the given shell command's output linewise to the current buffer.
"""
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
for line in iter(p.stdout.readline, ''):
vim.current.buffer.append(line)
vim.command('redraw')
EOF
使用:
:python output_lines_to_buffer('my command')
这将简单地将每行输出附加到当前缓冲区的末尾,因为我的命令会发出它.您可以相当直接地扩展它以支持输入和输出范围等,具体取决于您的需要.