TTY有256种颜色吗?


24

使用URxvt和xterm,可以使用支持256种颜色而不是仅支持8种颜色的虚拟终端。由于KMS帧缓冲驱动程序很好地支持我的Intel GMA图形卡,因此我专门从事TTY工作。不幸的是,尽管使用MPlayer(-vo fbdev / fbdev2)和其他帧缓冲工具,它只能支持八种颜色。有没有办法告诉TTY使用八种以上的颜色?

Answers:


10

现在,我确定自己正在修改我的答案。

结论是通过BIOS或内核之外的其他方式处理ANSI序列是错误的结论。实际上,它们是在内核中处理的。由于在LinuxNewbies IRC频道上的hnaz_,我找到了之前错过的东西:drivers/char/vt.c实现了虚拟终端驱动程序使用的Digital Equipment VT102终端的仿真。

因此,作为一个明确的答案,已经查看了处理虚拟终端转义序列的源代码:如果要在虚拟终端上支持256色,则必须在扩展解析转义序列的代码后构建自己的内核处理更广泛的颜色规格。

该函数称为csi_m()。所做的更改必须类似于扩展基于X的终端仿真器以处理指定更丰富的颜色代码的转义序列的更改。可能还需要进行其他更改,但这是您将要开始的地方。


那就对了。我说的是这些“低层虚拟终端”。但是由于我使用的是帧缓冲区,所以我认为是fbcon内核模块正在使用。请参阅文档/fb/fbcon.txt。还是fbcon只是n_tty的包装,添加了一些附加功能?查看URxvt补丁(cvs.schmorp.de/rxvt-unicode/doc/…),似乎很容易扩展256色支持。我不确定n_tty是否是正确的内核模块,因为在那里我看不到任何颜色定义。
timn

我认为帧缓冲区是一个设备,而tty是另一个设备-虚拟终端需要tty设备,而那些使用帧缓冲区作为显示设备,但帧缓冲区不是唯一可能的显示设备。
魁北克吉x德09年

+1听起来更可能(vt102不支持扩展的颜色,并且终端驱动程序已硬编码为vt102仿真)。很好的研究。
quack quixote,09年

1
与2017年的情况相同。我相信kmscon是一个用户终端,它试图改进该终端(包括24位彩色)。尽管它的发展停滞不前,而是选择了系统的替代方案。
jiggunjer

kmscon已被派生,截至本文发稿
user3751385

7

您的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

1
〜惊叹所有这些很棒的信息,但是我不确定这将导致成功。您说“是”,然后说“实验”和“如果找到一个”。我走了一条更直接的路。我搜索了内核代码。我找不到任何处理颜色转义序列的代码-内核中的任何位置。不在fb代码中,不在tty代码中……无处。因此,我的结论是它已在BIOS中处理。我的记忆支持在DOS下使用完全相同的ANSI转义序列。我相信在两种情况下BIOS都可以处理各种ANSI转义序列。
pbr

@pbr:我也检查了内核代码。TTY代码对颜色的数量没有任何限制BIOS不会进入它 -您正在处理帧缓冲区,这可能需要各种位深度(具体取决于硬件,如果您禁用了帧缓冲区...)。16色限制可能在GeTTY中,因此建议检查Qingy,或者可能在terminfo内容中,因此建议尝试各种备用TERM定义。我无法提供其他建议,但您的BIOS设置不合理,无济于事
2009年

1
〜quack-你是对的,它不在BIOS中(请参阅下面的修订答案),但是建议对Qingy等人进行调查时还是不建议的。虚拟终端代码使用vt102仿真进行了硬编码。
pbr

6

看看fbterm-它是可以在256色模式下运行的替代帧缓冲区(您只需从TTY以root身份运行它)

我已经取得了不同的成功-某些应用程序可以正常工作,并报告256色。但是Emacs(我想要在TTY上使用256色的主要原因)似乎不起作用;这里有一些讨论,但是并没有得到解决:

http://lists.gnu.org/archive/html/emacs-devel/2011-08/msg00989.html

但是,mplayer应该可以工作!


与X终端客户端中的任何一个相比,看起来都很糟糕。
菲尔·皮罗

1
它在帧缓冲区中运行,因此无论如何您都只能使用256种颜色。
2014年

想知道您是否对这个fbterm问题有任何见识?superuser.com/questions/892028/…–
dtmland

emacs在内部运行tmux可能会有所帮助,因为它应该转换周围终端的转义序列。
汤姆·黑尔

1

kmscon

kmscon是一种无需安装Windows系统(X,Wayland)即可获得256种颜色和视频的方法。

它被废弃了,但目前通过叉子进行维护

有关安装的文档很少,但是此处的“自述”页面应该可以帮助您。


我已经安装了它,并将其用于需要256色(vim由于我的配置)的控制台应用程序。

仔细阅读安装说明。


-1

用于设置文本的前景色和背景色的ANSI转义序列是这里的限制。

从内存中看,这些序列看起来像是转义[01; 34m。在30的代码中有用于前景的代码,在我看来40的代码中有用于背景的代码。

因此,我认为没有任何方法可以实现您想要的。


2
实际上,这是可能的。否则,我将无法在URxvt中使用256色的杂色。:)另请参阅push.cx/2008/256-color-xterms-in-ubuntu但是,如何在TTY中获得相同的效果?
蒂姆
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.