Vim自动滚动缓冲区

3
我想做一件非常简单的事情:
我在Vim中有两个缓冲区,一个是源代码(B1),另一个是文本文件a.txt (B2)。使用Vim中的自定义快捷键运行B1中的源代码时,会将a.txt 填充为文本。即使我的光标在B1中,我希望Vim每次更新时自动滚动B2,因此,我希望缓冲区B2的行为方式与tail -f相同。
使用ConqueTerm来实现这一点不是一个选择,因为缓冲区B2可以是来自其他插件的预览缓冲区。
2个回答

2
一般而言,vim事件是响应用户输入而触发的,它们不会在后台持续运行。此篇文章详细介绍了一些技巧,可以重新编写一些自定义代码,以定期重新加载您的“tail -f”缓冲区并滚动到底部。
与其试图在vim中完成所有这些操作,这里提出了另一个建议,可以使用GNU Screen实现类似的效果(一个终端区域用于vim编辑文件file1,另一个区域运行tail -f查看不同的文件file2)。
  • 下载/安装 GNU Screen(也许可以使用 apt-get install screen 命令)
  • 运行 screen
  • 运行 vim file1
  • 输入 Ctrl-A S 将终端水平分割成两半(或者在较新版本的 screen 中,可以使用 Ctrl-A | 命令将其垂直分割成两半)
  • 输入 Ctrl-A Tab 切换到分割后的另一侧
  • 输入 Ctrl-A c 在这一侧启动一个新的终端
  • 运行 tail -f file2

现在,分割后的一侧显示了 vim file1,而另一侧显示了 tail -f file2。以下是结果的图片。

Here's an image of me using <code>vim</code> and <code>gnu screen</code>.


你好,Russell,感谢你的回答,但屏幕不是一个选项。正如我所说,缓冲区B2可以是预览缓冲区(在我最重要的情况下是这样)。解决方案的想法是在vim内部,而不是外部。你的解决方案适用于像日志一样的外部文件,并且实际上不需要屏幕,只需要一个简单的终端窗口分割、新标签或使用多路复用器(屏幕或tmux)。我将继续寻找vim风格/语言的解决方案。 - oclinux

1
这个命令可以进入包含 a.txt 的窗口,重新载入 (edit),移动到结尾 (+$) 然后回到上一个窗口。你可以将它添加到运行源代码的快捷方式中,以便在每次运行代码时更新 a.txt

:exe bufwinnr("a.txt") . "wincmd w" | edit +$ | exe winnr("#") . "wincmd w"

如果您在映射中使用此功能,请记得转义诸如 (\|) 的管道符,并在末尾添加 <CR>

这将需要您的快捷方式在前台运行代码,直到完成为止,Vim 将不会响应(除非您按下 Ctrl-C)。如果您想让 Vim 在文件变化时自动重新加载 a.txt(绕过需要在前台运行代码的需求),则需要外部机制来检测文件更改(例如 Linux 上的 inotifywait)。据我所知,只有当您将光标移动到该窗口时,Vim 才会检查外部更改(使用 autoread)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接