Jam*_*mes 5 gnu-screen ncurses termcap terminfo
screen 是我自己编译的少数软件之一。我发现它往往比存储库中的版本更好地支持终端的一些现代功能。我这样做已经有一段时间了,没有遇到太大问题。然而,升级到 18.04 后,(真实)颜色似乎已损坏。
我运行这段代码来打印彩虹,它仍然可以在裸机中工作:
awk 'BEGIN{
s="/\\/\\/\\/\\/\\"; s=s s s s s s s s;
for (colnum = 0; colnum<77; colnum++) {
r = 255-(colnum*255/76);
g = (colnum*510/76);
b = (colnum*255/76);
if (g>255) g = 510-g;
printf "\033[48;2;%d;%d;%dm", r,g,b;
printf "\033[38;2;%d;%d;%dm", 255-r,255-g,255-b;
printf "%s\033[0m", substr(s,colnum+1,1);
}
printf "\n";
}'
Run Code Online (Sandbox Code Playgroud)
但是,当我启动屏幕时,颜色消失了。它似乎并没有回落到 256 色,而是颜色值错误。
我在重新编译屏幕之前就看到了这种行为。看到这个问题后,我重新编译,甚至破坏了我的 git 存储库,并重新克隆和重新编译,试图让事情正常工作,但无济于事。
想一想这到底是哪里出了问题?我什至不确定哪个库可能对此负责,或者它如何与 konsole 但不与 screen 一起工作。
有人提醒我这一点:这是屏幕中的一个错误(请参阅source-repo):
tputs(tparm("\E[48;2;%d;%d;%dm", _r, _g, _b), 1, DoAddChar);
Run Code Online (Sandbox Code Playgroud)
问题是它使用termcaptparm语法来处理3 个参数。但termcap只能代表2个参数。要在terminfo中执行此操作,开发人员应该执行以下操作:
tputs(tparm("\E[48;2;%p1%d;%p2%d;%p3%dm", _r, _g, _b), 1, DoAddChar);
Run Code Online (Sandbox Code Playgroud)
2017 年 ncurses 的错误修复之一使该代码片段变得过时:
+ improve _nc_tparm_analyze, using that to extend the checks made by
tic for reporting inconsistencies between the expected number of
parameters for a capability and the actual.
Run Code Online (Sandbox Code Playgroud)
顺便说一句,GNU screen 是一个termcap应用程序,并且混入terminfo调用(例如tparm,它不是termcap功能)使其不太可移植。对于格式化输出,termcap仅提供tgoto,它仅使用两个参数。
后续:经过本错误报告的一些讨论,建议的改进已于2018 年 11 月 18 日应用。