有时我们在终端运行一个命令,输出太大,我们忘了把“| 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来显示输出。
问题是我无法从用户那里获得输入。这意味着该解决方案根本不适用于交互式程序。
答案 0 :(得分:5)
尝试将此添加到您的.zshrc
export LESS="-FX"
-F
=“如果整个文件可以显示在第一个屏幕上,则自动退出会更少。”-X
=“禁止将termcap初始化和取消初始化字符串发送到终端。”(停止少清除屏幕)对我来说,这意味着less
用作寻呼机,当有多个文本屏幕时,zsh的内置寻呼机(zsh -c '< /dev/fd/0'
,如cat
)用于
HTH
答案 1 :(得分:4)
我不确定这是可能的。这需要zsh
做两件事:
第二个很简单。我们真正要做的是将每个命令的输出传递给less
,如果只需要一个屏幕,则使用一对选项自动退出less
。
preexec () {
eval "$3" | less -XF
}
但是,第一个标准比较棘手:我们不希望这样的命令
vi foo.txt
less bar.rtf
ssh remote.host.com
通过less
传送。不幸的是,对我来说,如何自动区分我们所做的和不想通过less
的程序并不明显。
答案 2 :(得分:0)
也许另一个选择是使用screen
或tmux
之类的内容,而不是试图强迫zsh
为您翻页。此解决方案为编辑器提供支持,例如vim
,ssh
连接,寻呼机less
,more
等,还提供多命令回滚功能,通过管道每个命令寻呼机不允许。
这种方法会给你:
这种方法要花费你:
screen
的时间是我真正想要的时间。 答案 3 :(得分:0)
你当然可以做的是包装命令,这些命令可能会输出带有shell函数的多个文本屏幕。
这就像是一个像自动分页的ls
function ls {
command ls $@ | less -RFX
}
您还可以编写一些将命令名列表作为条目的内容,并为每个命令生成包装函数。因此,您只需要将新命令名称添加到文件中并重新生成包装器。
那将是我的解决方法。