为什么 Esc-[ 不在 `less` 中向左滚动?

为什么 Esc-[ 不在 `less` 中向左滚动?

根据联机帮助页对于lesskey,以下键绑定到左滚动和右滚动:

\e[       left-scroll
\e]       right-scroll
\e(       left-scroll
\e)       right-scroll
\kl       left-scroll
\kr       right-scroll

箭头键和Esc-(/可以正常工作,就像向右滚动Esc -)一样,但对于向左滚动则不起作用。相反,它只是在命令行提示符中显示:Esc-]Esc-[

ESC[

将此行添加到~/.lesskey函数中作为解决方法:

\e[ left-scroll

但为什么默认情况下它不起作用?

我在 Debian Stretch 和 Kubuntu 18.04 以及各种终端模拟器上的 XFCE4 中观察到了这种行为。

$ less --version
less 487 (GNU regular expressions)
Copyright (C) 1984-2016  Mark Nudelman

less comes with NO WARRANTY, to the extent permitted by law.
For information about the terms of redistribution,
see the file named README in the less distribution.
Homepage: http://www.greenwoodsoftware.com/less

我考虑过提交错误报告,但是已知错误和功能请求列表 表明这是一种已知的行为:

增强请求

[。 。 。 ]

参考编号:175

实现版本:322

添加 ESC-[ 的备用命令。

这实际上是 的限制less,还是终端处理 Escape 键的方式的一个怪癖?

答案1

这是因为它ESC [也恰好是某些终端上的几个功能键发送的字符序列的开始,例如HomeorEndPageUp... 这些也与 中的某些操作绑定less

因此,当less收到 时ESC [,它会等待更多(不会像其他应用程序那样超时)。

我的终端上ESC[6~PageDown.如果我按Alt+[,我会ESC [像你一样看到。但随后我可以输入6~并且会向下滚动。

如果您运行TERM=vt100 less而不是less,其中vt100terminfo 页面没有任何Home或 的条目End...您会看到ESC [有效。

但是,如果您添加\e[ left-scroll到您的~/.lesskey(并运行lesskey将其编译为~/.less),您会注意到ESC [作品向左滚动,但所有Home, PageUP... 停止工作,它们都向左滚动,并且它们发送的额外字符会导致一些蜂鸣声。

查看代码,一切都与命令表的处理顺序有关。命令~/.less表是最后添加, 但插入头部,因此它的条目被处理内置的。

输入时,如果首先找到ESC [的条目,则对其进行处理,如果首先找到的条目(在许多终端上翻译为),则\e[ left-scroll\kD forw-screen\e[6~ forw-screen这只是一个字首匹配, 和less等待更多输入

所以,这是一个错误。解决方法是添加超时。然而,添加较短的超时意味着放弃多键命令;为用户输入多键命令提供足够时间的较长超时可能会导致响应ESC [过于迟钝。

现在,具有PageUp等的终端通常也具有LeftRight键,它们也绑定到left-scroll, right-scroll,因此您可能想使用它来滚动。

相关内容