在列中显示终端输出以有效地查看更多输出

时间:2013-05-20 21:36:32

标签: unix pager tmux

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

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

这样我就可以将整个宽屏显示器专用于三列输出,可以同时显示来自同一流的垂直输出的三倍。我认为这是tmux可以很好地支持的东西,尽管由于移动文本的分裂性质,它可能会对网络流量造成稍大的负担。

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

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

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

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

无操作>>在开始时操作一次>>每次迭代时的操作

更多沉思: 我只想到一个简洁的想法,让这个功能快速而肮脏,如果我能想出一种方法来设置一个寻呼机(甚至只是cat,真的)来显示最后一页(这是一个无法对输出做任何事情的简单案例),显示倒数第二页,显示第三页到最后一页,等等。这些可以在一组tmux窗格中组合在一起。然后,当一条新线进入时,会发生什么,所有这些视图都会向上滚动,我们有一种错觉,即它不是单个缓冲区的连续显示。所以这将是一个基于tmux的hack,幸好不需要对每个新行进行某种类型的tmux调用... tmux让我们查询窗格的高度,这样我们就可以找出每个缓冲区中显示的“section”。如果可以使缓冲区同步滚动它们的历史记录,那么整个“列”集也可以滚动。

2 个答案:

答案 0 :(得分:0)

如果你正在查看三个文件,上面的工作正常,但听起来你正在看一个。我写了一些python应该做正确的事情(作为尾巴的替代品)。

#!/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。

答案 1 :(得分:0)

前几天(约2个月前)我遇到了this gem。我的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可以编写脚本以不断刷新并将其加载到多列缓冲区。