如何解决在Vim中,我可以“流式处理”例如“ w!红宝石”放入缓冲区,输出时逐行显示?
| 我目前正在做这样的事情: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和子进程的草图(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\')
这将简单地将输出的每一行附加到当前缓冲区的末尾,因为my command
发出了它。您可以根据需要直接扩展它,以支持输入和输出范围等。
,因此,一种可能的解决方案(可能不是最好的解决方案)是写入磁盘上的文件,在缓冲区中打开该文件,然后执行:setlocal autoread
,以便文件更改时自动更新。
但是,这种自动更新似乎很困难。 Tail Bundle.vim似乎对此有所改善。
希望有一个更好的答案。
,如何使用tee来使用tee
或:make
。
let fname = tempname()
exec \"w ! ruby 2>&1 | tee \".fname
exec \"new \".fname
编辑:似乎您使用的是Linux或在流水线进程之间创建4K缓冲区的操作系统。要解决此问题,请安装expect
(sudo apt-get install expect-dev
)并使用unbuffer
命令允许逐行流式传输(请参阅:https://stackoverflow.com/questions/1000674/turn-off-buffering-in-pipe )。
let fname = tempname()
exec \"! unbuffer ruby % 2>&1 | tee \".fname
exec \"new \".fname
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。