在不拉伸单页输入的情况下滚动到末尾

在不拉伸单页输入的情况下滚动到末尾

当我通过管道将某些内容输入less --quit-if-one-screen +G(alias -F +G) 时,如果输出超出终端大小,则 less 打开并滚动到末尾。

不幸的是,它在关闭之前也会滚动到末尾,并占据整个终端屏幕,看起来像这样(如果终端有 6 行):

❯ echo hi | less --quit-if-one-screen +G
~
~
~
~
~
hi

有没有办法防止这种情况,即如果输入少于一页,则保持输入不变,但如果少于一页,则滚动到末尾。

答案1

我认为唯一的方法是根据您传递的内容使用单独的命令。

首先,为了方便演示,我将创建两个变量,一个包含 4 行文本,另一个包含 20 行文本。

SmallVar=$(cat <<EOF
01 SmallVar
02 A
03 B
04 C
EOF
)
LargeVar=$(cat <<EOF
01 LargeVar
02 A
03 B
04 C
05 D
06 E
07 F
08 G
09 H
10 I
11 J
12 K
13 L
14 M
15 N
16 O
17 P
18 Q
19 R
20 S
EOF
)

echo
echo "Lines in SmallVar: $(echo "${SmallVar}" | wc -l)"
echo "Lines in LargeVar: $(echo "${LargeVar}" | wc -l)"
echo "Lines available in terminal: $(tput lines)"
echo

上面的输出是:

Lines in SmallVar: 4
Lines in LargeVar: 20
Lines available in terminal: 15

这些都在一行上,但可以分成多行以便于阅读。tmpVar是您传递的变量或文件内容。 (如果您要传递文件内容,则可以使用tmpVar="$(cat filename.txt"

候选名单

tmpVar="${SmallVar}"; if [ $(echo "${tmpVar}" | wc -l) -le $(tput lines) ]; then echo "${tmpVar}" | less -FX; else echo "${tmpVar}" | less +G -FX; fi;

长名单

tmpVar="${LargeVar}"; if [ $(echo "${tmpVar}" | wc -l) -le $(tput lines) ]; then echo "${tmpVar}" | less -FX; else echo "${tmpVar}" | less +G -FX; fi;

将其分成单独的行可能更容易阅读:

tmpVar="${SmallVar}";
#tmpVar="${LargeVar}";
if [ $(echo "${tmpVar}" | wc -l) -le $(tput lines) ];
then
    echo "${tmpVar}" | less -FX;
else
    echo "${tmpVar}" | less +G -FX;
fi;

首先,它会将if变量中的行数与终端中的行数进行比较(tput lines自行运行,调整窗口大小并再次运行)。如果等于或小于,则忽略+G.否则,它将使用+G.用于-X在退出后将值保留在屏幕上。当您按q退出时,它会保留屏幕上的最后几行而不清除它们。

比较

$ tmpVar="${SmallVar}"; if [ $(echo "${tmpVar}" | wc -l) -le $(tput lines) ]; then echo "${tmpVar}" | less -FX; else echo "${tmpVar}" | less +G -FX; fi;
01 SmallVar
02 A
03 B
04 C
$ 

$ tmpVar="${LargeVar}"; if [ $(echo "${tmpVar}" | wc -l) -le $(tput lines) ]; then echo "${tmpVar}" | less -FX; else echo "${tmpVar}" | less +G -FX; fi;
...........[scroll]...........
07 F
08 G
09 H
10 I
11 J
12 K
13 L
14 M
15 N
16 O
17 P
18 Q
19 R
20 S
(END)

 

相关内容