如何在不切换焦点的情况下刷新Vim终端缓冲区内容?
解决Vim终端缓冲区内容延迟更新问题
你在.vimrc中定义的get_errors函数,在获取终端缓冲区内容时出现延迟,是因为Vim默认不会自动同步后台终端进程的输出到缓冲区内存,只有当终端缓冲区获得焦点时才会触发同步。要在不切换缓冲区的情况下获取最新内容,可以通过以下方式修改函数:
function s:get_errors() let term_buf = filter(map(getbufinfo(), 'v:val.bufnr'), 'getbufvar(v:val, "&buftype") is# "terminal"')[0] " 强制同步终端进程的最新输出到缓冲区 call term_wait(term_buf, 0) let lines = getbufline(term_buf, 1, '$') let text = join(lines, "\n") echo text endfunction command PrintErrors call s:get_errors()
关键说明
term_wait(term_buf, 0):这个函数会让Vim立即读取终端进程的所有可用输出,同步到对应的缓冲区中,参数0表示不阻塞等待,直接获取当前已有的最新内容。调用后,getbufline就能拿到终端缓冲区的实时内容,无需手动切换焦点。- 如果你的Vim版本较旧(低于8.1),
term_wait可能不可用,此时可以尝试使用bufload(term_buf)强制加载缓冲区内容,但效果不如term_wait针对终端场景的优化直接。
内容的提问来源于stack exchange,提问作者Vinz
相关产品推荐
相关产品推荐

