我在 mintty 中使用 GNU Screen。为了让滚轮工作,我必须使用转义码 ( ^[[?7787h
) 切换 mintty 滚轮模式。这会导致滚轮不再工作less
。要解决这个问题,我需要less
在启动和退出时将适当的转义码发送到外部终端。
我找到了^[P
可用于将转义码发送到运行 Screen 的终端的转义码。所以我想将其添加^[P^[[?7787l
到ti
screen 中的 termcap 中。为了实现这一点,我将以下行添加到我的.screenrc
:
termcapinfo * "" "\EP\E[?7787l\E[?1049h"
less
但那根本没有影响。我知道这^[P^[[?7787l
有效——如果我只是回显它,一切都很好。我可以编写一个less
包装器来处理这个问题,但我更希望能够通过 termcap 来做到这一点,因为它可以在所有应用程序中工作,而不仅仅是在 less 中。
所以我的问题是:当终端切换到备用屏幕时,如何更改less
发送到终端的转义代码?
答案1
该命令应该可以工作:
termcapinfo * "" "ti=\EP\E[?7787l\E\\\E[?1049h:te=\EP\E[?7787h\E\\\E[?1049l"
(*
用更具体的终端类型名称替换会更好,但我不知道TERM
mintty 设置了什么值。)
与您的版本的重要区别:
该命令的第二个和第三个参数
termcapinfo
必须包含以 分隔的 termcap 定义(name=value
):
,而不仅仅是一个简单的转义序列。转义序列
^[P
必须以 终止^[\
,否则过多的后续输出将直接进入终端,而不会经过 Screen 的适当处理(如果忘记了终止序列,则有一些保护措施可以避免 Screen 完全锁定,但显示仍然会混乱)。您应该同时更改
ti
和te
,以便退出less
(或任何其他全屏程序)时能够正确恢复先前的状态。
当然,如果您less
使用-X
选项调用,鼠标滚轮将无法正常工作,因为使用此选项less
不会将ti
和te
字符串发送到终端。请记住,此选项不仅可以在less
命令行中直接指定,还可以通过LESS
环境变量指定。
但是,如果less
编译为使用terminfo
而不是termcap
,则命令的第三个参数termcapinfo
将不会改变 的行为,因为它仅影响 导出到其子进程的环境变量less
的内容,并且数据库内容无法动态更改。在这种情况下,您将需要使用和之类的实用程序来创建包含和值的 terminfo 源条目(并对其进行修改),然后将条目编译为二进制格式;然后使用来使用此条目。TERMCAP
screen
terminfo
infocmp
tic
smcup
rmcup
term <your-entry-name>
.screenrc