是否可以在zsh中自动分页输出?

时间:2013-03-16 19:02:43

标签: zsh

有时我们在终端运行一个命令,输出太大,我们忘了把“| less”放在最后。所以我想知道在zsh中它太大时可以分页输出吗?

我尝试使用python及less:

来实现此功能
#!/usr/bin/env python3
termHeight = 25
import sys
from subprocess import Popen, PIPE
p = Popen(['unbuffer'] + sys.argv[1:], stdin=PIPE, stdout=PIPE)
lines = []
for count in range(termHeight):
    line = p.stdout.readline()
    if not line:
        break
    print(line.decode('utf8'), end='')
    lines += [line]
if line:
    q = Popen(['less', '-Mr'], stdin=PIPE)
    q.stdin.writelines(lines)
    while True:
        line = p.stdout.readline()
        if not line:
            break
        q.stdin.write(line)
    q.communicate()

让我们将这个python脚本保存到p.py.所以当我们运行“python p.py some commands”之类的“python p.py ls --help”时,如果输出超过25行,这个脚本将使用less来显示输出。

问题是我无法从用户那里获得输入。这意味着该解决方案根本不适用于交互式程序。

4 个答案:

答案 0 :(得分:5)

尝试将此添加到您的.zshrc

export LESS="-FX"
  • -F =“如果整个文件可以显示在第一个屏幕上,则自动退出会更少。”
  • -X =“禁止将termcap初始化和取消初始化字符串发送到终端。”(停止少清除屏幕)

对我来说,这意味着less用作寻呼机,当有多个文本屏幕时,zsh的内置寻呼机(zsh -c '< /dev/fd/0',如cat)用于

HTH

答案 1 :(得分:4)

我不确定这是可能的。这需要zsh做两件事:

  1. 确定命令是否正在写入标准输出
  2. 如有必要,拦截输出并显示给寻呼机。
  3. 第二个很简单。我们真正要做的是将每个命令的输出传递给less,如果只需要一个屏幕,则使用一对选项自动退出less

    preexec () {
        eval "$3" | less -XF
    }
    

    但是,第一个标准比较棘手:我们不希望这样的命令

    • vi foo.txt
    • less bar.rtf
    • ssh remote.host.com

    通过less传送。不幸的是,对我来说,如何自动区分我们所做的和不想通过less的程序并不明显。

答案 2 :(得分:0)

也许另一个选择是使用screentmux之类的内容,而不是试图强迫zsh为您翻页。此解决方案为编辑器提供支持,例如vimssh连接,寻呼机lessmore等,还提供多命令回滚功能,通过管道每个命令寻呼机不允许。

这种方法会给你:

  • 在多个命令(而不是最后输入的命令)上向后滚动(相当多的回滚)。
  • 重新加入您的会话(因此,当您从午餐回来时,您不会从早上的会话中丢失回滚)。

这种方法要花费你:

  • 您需要在运行命令之前建立要附加的会话。这不是很多工作,但根据我的经验,我忘记使用screen的时间是我真正想要的时间。

答案 3 :(得分:0)

你当然可以做的是包装命令,这些命令可能会输出带有shell函数的多个文本屏幕。

这就像是一个像自动分页的ls

function ls {
   command ls $@ | less -RFX
 }

您还可以编写一些将命令名列表作为条目的内容,并为每个命令生成包装函数。因此,您只需要将新命令名称添加到文件中并重新生成包装器。

那将是我的解决方法。