4

有时我们在终端运行一个命令,结果输出太大,最后忘了放“|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 ls --help”这样的“python p.py some commands”时,如果输出超过25行,这个脚本将使用less来显示输出。

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

4

4 回答 4

7

尝试将此添加到您的.zshrc

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

对我来说less,当有多个文本屏幕时,这种方式用作寻呼机,而当没有文本时,则使用 zsh 的内置寻呼机(zsh -c '< /dev/fd/0', like cat)。

高温高压

于 2013-11-02T15:18:35.497 回答
4

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

  1. 确定命令是否正在写入标准输出
  2. 如有必要,截取该输出并显示到寻呼机。

第二个相当简单。我们真正要做的是将每个命令的输出传递给less并使用一对选项less在只需要一个屏幕时自动退出。

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

然而,第一个标准更棘手:我们不想要这样的命令

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

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

于 2013-03-18T23:19:34.847 回答
0

也许另一种选择是使用类似的东西screentmux而不是试图强制zsh为您寻呼。该解决方案为诸如连接、寻呼机等编辑器提供了支持vimssh并且lessmore提供了多命令回滚功能,通过寻呼机管道传输每个命令是不允许的。

这种方法会给你:

  • 在多个命令(而不仅仅是最后输入的命令)上回滚(相当多的回滚)。
  • 重新加入你的会话(这样当你吃完午饭回来时,你就不会失去早上会话的回滚)。

这种方法会花费您:

  • 在运行命令之前,您需要建立一个要附加的会话。这不是很多工作,但根据我的经验,我忘记使用screen的时间是我真正非常想要的时间。
于 2013-03-20T04:12:49.107 回答
0

您当然可以做的是使用 shell 函数包装可能输出多于一屏文本的命令。

这就像一个自动分页的 ls

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

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

那将是我的解决方法。

于 2015-01-15T23:29:10.193 回答