在Vim中,我可以“流式传输”例如输出“w! ruby“进入缓冲区,逐行输出?

我现在正在做这样的事情:

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')

这将简单地将每行输出附加到当前缓冲区的末尾,因为我的命令会发出它.您可以相当直接地扩展它以支持输入和输出范围等,具体取决于您的需要.

点赞