【问题标题】:Vim automatic scroll bufferVim 自动滚动缓冲区
【发布时间】:2013-07-19 01:41:18
【问题描述】:

我正在尝试做一些非常简单的事情:

我在 Vim 中有两个缓冲区,一个带有源代码 (B1),另一个带有文本文件 a.txt (B2)。 B1 中的源代码在 Vim 中使用自定义快捷方式运行,用文本填充 a.txt。我希望 Vim 在每次更新时自动滚动 B2,即使我的光标在 B1 中。所以,我只希望缓冲区 B2 的行为方式与 tail -f 一样。

不能使用 ConqueTerm 执行此操作,因为缓冲区 B2 可以是其他插件的预览缓冲区。

【问题讨论】:

    标签: vim buffer autoscroll


    【解决方案1】:

    一般来说,vim 事件会响应用户输入而触发。它们不只是在后台连续运行。

    This post 详细介绍了一些技巧,您可以重新编写一些自定义代码来重新加载“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。这是结果的图像。

    【讨论】:

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

    此命令移动到包含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)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多