Vim automatic scroll buffer

China☆狼群 提交于 2020-01-15 08:09:31

问题


I'm trying to do something very simple:

I have two buffers in Vim, one with source code (B1), another one with a text file a.txt (B2). The source code in B1 is run with a custom shortcut in Vim, filling a.txt with text. I want Vim to automatically scroll B2 every time it updates, even if my cursor is in B1. So, I just want that the buffer B2 to behave the way tail -f does.

Doing this with ConqueTerm is not an option, since buffer B2 can be a preview buffer from other plugin.


回答1:


In general, vim events fire in response to user input. They don't just run continuously in the background.

This post details some tricks you could repurpose to write some customization code to reload your "tail -f" buffer and scroll to the bottom periodically.

Rather than trying to do this all in vim, here is a different proposal that would achieve a similar effect using GNU Screen (one terminal area with vim editing a file file1, another running tail -f against a different file file2):

  • download/install GNU Screen (perhaps apt-get install screen)
  • run screen
  • run vim file1
  • type Ctrl-A S to split the terminal down the middle horizontally (or, in recent versions of screen, Ctrl-A | to split it down the middle vertically)
  • type Ctrl-A Tab to switch to the other side of the split
  • type Ctrl-A c to start a new terminal on this side
  • run tail -f file2

Now one side of the split shows vim file1 and the other side shows tail -f file2. Here's an image of the result.




回答2:


This command moves to the window containing a.txt, reloads it (edit), moves to the end (+$) and then jumps back to the previous window. You can add it to the shortcut that runs your source code to get a.txt to update whenever the code is run.

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

Remember to escape the bars (\|) and add a <CR> at the end if you use this in a mapping.

This will require your shortcut to run the code in foreground, and Vim will be unresponsive till it is done (unless you press Ctrl-C). If you want Vim to reload a.txt automatically whenever it is changed (thus bypassing the need for running the code in foreground), you will need an external mechanism for file change detection (such as inotifywait on Linux). As far as I know, Vim only checks for external changes (with autoread) when you move the cursor to that window.



来源:https://stackoverflow.com/questions/17751700/vim-automatic-scroll-buffer

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!