Answers:
现在,我确定自己正在修改我的答案。
结论是通过BIOS或内核之外的其他方式处理ANSI序列是错误的结论。实际上,它们是在内核中处理的。由于在LinuxNewbies IRC频道上的hnaz_,我找到了之前错过的东西:drivers/char/vt.c
实现了虚拟终端驱动程序使用的Digital Equipment VT102终端的仿真。
因此,作为一个明确的答案,已经查看了处理虚拟终端转义序列的源代码:如果要在虚拟终端上支持256色,则必须在扩展解析转义序列的代码后构建自己的内核处理更广泛的颜色规格。
该函数称为csi_m()。所做的更改必须类似于扩展基于X的终端仿真器以处理指定更丰富的颜色代码的转义序列的更改。可能还需要进行其他更改,但这是您将要开始的地方。
kmscon
是一个用户终端,它试图改进该终端(包括24位彩色)。尽管它的发展停滞不前,而是选择了系统的替代方案。
您的256色RXVT / xterm / URXVT / etc由terminfo和TERM
变量的设置定义。在大多数Linux发行版中,您的虚拟终端在中定义/etc/inittab
,并使用默认终端类型来定义终端可以使用的颜色。
有没有办法告诉TTY使用八种以上的颜色?
是。
确保您的帧缓冲区使用正确的分辨率/位深度。尝试添加vga=773
到内核选项,例如,获取1024x768和256色(8位色深)。
设置另一个术语(例如export TERM=foo
)。您需要进行实验以找到合适的产品。如果找到有效的方法,则可以对其进行修改,/etc/inittab
以使虚拟终端默认运行它(请参阅下一节)。
本文讨论了可能适合您的其他选项。它建议使用Qingy(Qingy不是GettY)代替getty,如果不选择TERM变量,可能会为您提供所需的信息。
说到盖蒂的替换,我发誓我已经看到了GNU screen
沿途用某处替换盖蒂的说明。我目前找不到该链接,但是由于有256色TERM用于screen
,因此您可以进行研究。
/etc/inittab
使用这样的行来设置虚拟终端:
# Format:
# <id>:<runlevels>:<action>:<process>
#
1:2345:respawn:/sbin/getty 38400 tty1
2:2345:respawn:/sbin/getty 38400 tty2
3:2345:respawn:/sbin/getty 38400 tty3
这是联机帮助页/sbin/getty
(来自我的Debian系统,因此从技术上来说是agetty
程序):
SYNOPSIS
agetty [-8ihLmnw] [-f issue_file] [-l login_program] [-I init]
[-t timeout] [-H login_host] baud_rate,... port [term]
请注意baud_rate,... port [term]
最后的。这与/etc/inittab
(/sbin/getty 38400 ttyN
)行中的命令相匹配-注意没有[term]
参数,因此我们得到一个默认值(echo $TERM
在您登录虚拟控制台以查看您的系统使用后运行)。再次从联机帮助页:
ARGUMENTS
term The value to be used for the TERM environment variable. This over‐
rides whatever init(8) may have set, and is inherited by login and
the shell.
如果找到有效的TERM,请在inittab中修改getty行,并在末尾添加适当的TERM:
1:2345:respawn:/sbin/getty 38400 tty1 TERM-with-256-colors
2:2345:respawn:/sbin/getty 38400 tty2 TERM-with-256-colors
看看fbterm-它是可以在256色模式下运行的替代帧缓冲区(您只需从TTY以root身份运行它)
我已经取得了不同的成功-某些应用程序可以正常工作,并报告256色。但是Emacs(我想要在TTY上使用256色的主要原因)似乎不起作用;这里有一些讨论,但是并没有得到解决:
http://lists.gnu.org/archive/html/emacs-devel/2011-08/msg00989.html
但是,mplayer应该可以工作!
emacs
在内部运行tmux
可能会有所帮助,因为它应该转换周围终端的转义序列。
用于设置文本的前景色和背景色的ANSI转义序列是这里的限制。
从内存中看,这些序列看起来像是转义[01; 34m。在30的代码中有用于前景的代码,在我看来40的代码中有用于背景的代码。
因此,我认为没有任何方法可以实现您想要的。