1

假设我有大量的日志输出或者我想要密切关注的东西,以便能够同时查看尽可能多的输出。

我有很多屏幕空间,为了更好地利用它,我希望能够设置一个特殊的缓冲区来垂直包装终端输出,所以它看起来像一个列布局(如书或网页)。

通过这种方式,我可以将整个宽屏显示器专用于三列输出,它们可以同时显示来自同一流的正常垂直输出的三倍。我认为这是 tmux 可以很好地支持的东西,尽管由于移动文本的分裂性质,它可能会稍微增加网络流量的负载。

最好的情况是 tmux 已经通过某个选项支持此功能,但如果没有,也许可以编写脚本!是否可以以编程方式“检索”特定窗格的 tmux 历史缓冲区的内容?我反对需要tmux在每个传入的输出行上调用的脚本,但对于慢速输出日志来说仍然值得。

也许这甚至不是需要 tmux 的东西,也许这是寻呼程序的功能空间内的东西。Vim 可能无法处理它,因为我需要它来支持 ANSI 颜色代码显示(Vim 不能很好地显示)。

这里的动机是更好地利用水平空间。在某种程度上,它是将寻呼程序的功能扩展到第二维。如果我可以简单地购买更多显示器,以便能够同时查看更多数据,而无需操纵我的软件来显示我数据的不同部分,那么我可以通过减少我一直做的所有滚动来提高工作效率。

来回查看 >> 设置窗格并滚动两个缓冲区以便来回查看 >> 在单个缓冲区中来回滚动

无操作>> 开始操作一次>> 每次迭代操作

更多的思考:我只是想到了一个巧妙的想法来快速构建这个功能,如果我能想出一种方法来设置一个寻呼机(甚至只是cat, 真的)显示最后一页(这是一个对输出不做任何事情的小例子),显示倒数第二页,显示倒数第三页等。这些可以在一组 tmux 窗格中组合在一起. 那么,当新行出现时,所有这些视图都会向上滚动,我们会产生一种错觉,即它们都是单个缓冲区的连续显示,即使它不是。所以这将是一个基于 tmux 的 hack,谢天谢地,它不需要对每个新行进行某种 tmux 调用...... tmux 让我们可以查询窗格的高度,以便我们可以确定在每个缓冲区中显示哪个“部分”。如果可以使缓冲区同步滚动浏览它们的历史,那么也可以滚动整个“列”集。

4

2 回答 2

0

前几天(大约 2 个月前)我偶然发现了这颗宝石。我的 vimrc 包含这个魔法:

:noremap <silent> <Leader>c :<C-u>let @z=&so<CR>:set so=0 noscb<CR>:bo vs<CR>Ljzt:setl scb<CR><C-w>p:setl scb<CR>:let &so=@z<CR>

非常非常酷,而且非常强大,因为它是 Vim。唯一的缺点是 Vim 不能真正有效地用于查看实际的原始终端输出(可能包括 ANSI 颜色代码,这是 Vim 在处理时特别糟糕的东西),但对于大多数目的,查看(和编辑)非常大型源文件等,这很好用。

编辑:我注意到这实际上并没有真正回答我的问题,这基本上是如何更好地用许多终端输出的列(例如,来自脚本或编译或日志的输出)填充我的屏幕,而这个 vim 缓冲区的东西不是真的很擅长。

不过它有一些潜力,任何日志都可以通过管道传输到文件中,然后 Vim 可以编写脚本以不断刷新并将其加载到多列缓冲区中。

于 2014-05-23T01:29:30.720 回答
0

如果您正在查看三个文件,则上述内容可以正常工作,但听起来您正在查看一个文件。我写了一些应该做正确事情的python(作为tail的替代品)。

#!/usr/bin/python

import time, os, sys

fname = sys.argv[1]
lines_per_page = 50
if len(sys.argv) > 2:
    page_from = int(sys.argv[2])
    pages_per_page = int(sys.argv[3])
else:
    page_from = 0
f = open(fname)
f.seek(os.stat(fname).st_size)

b = []

while 1:
    where = f.tell()
    line = f.readline()
    if not line:
        time.sleep(1)
        f.seek(where)
    else:
        # keep a buffer
        if page_from > 0:
            b.append(line)
            front = lines_per_page * page_from
            if len(b) > front:
                print b[-front],
        else:
            print line,

您可以将其调用为tail.py file 0 num_of_rows_in_your_term,然后为每个其他垂直窗格增加 1。

于 2013-05-21T01:47:45.713 回答