TTY com 256 cores?

25

Com o URxvt e o xterm, é possível usar um terminal virtual que suporta 256 cores em vez de apenas oito. Como minha placa de vídeo Intel GMA é bem suportada pelo driver KMS framebuffer, estou trabalhando exclusivamente no TTY. Infelizmente, ele suporta apenas oito cores, embora com o MPlayer (-vo fbdev / fbdev2) e outras ferramentas de buffer de quadros possam ser abordadas muito mais. Existe uma maneira de dizer ao TTY para usar mais de oito cores?

timn
fonte

Respostas:

10

Estou revisando minha resposta agora que tenho certeza das coisas.

Foi errado concluir que as seqüências ANSI estavam sendo manipuladas via BIOS ou fora do kernel; de fato, eles são tratados no kernel. Encontrei o que havia perdido antes graças ao hnaz_ no canal IRC do LinuxNewbies: drivers/char/vt.cimplementa uma emulação de um terminal Digital Equipment VT102 que é usado pelo driver do terminal virtual.

Então ... como resposta definitiva, depois de revisar o código-fonte que lida com as seqüências de escape para terminais virtuais: se você deseja suporte a 256 cores em terminais virtuais, precisará criar seu próprio kernel depois de estender o código que analisa as seqüências de escape para lidar com a especificação de cores mais ampla.

A função é chamada csi_m (). As alterações deverão ser semelhantes às que estendem os emuladores de terminal baseados em X para lidar com seqüências de escape, especificando os códigos de cores mais ricos. Provavelmente também haverá outras alterações necessárias, mas é aqui que você começaria.

pbr
fonte
11
Está certo. Eu estou falando sobre esses "terminais virtuais de baixo nível". Mas desde que eu estou usando o framebuffer, é o módulo do kernel do fbcon que está sendo empregado, eu acho. Consulte a documentação / fb / fbcon.txt. Ou o fbcon é apenas um invólucro em torno do n_tty adicionando alguns recursos adicionais? Observando o patch URxvt ( cvs.schmorp.de/rxvt-unicode/doc/… ), parece ser bastante fácil estender o suporte de 256 cores. Não tenho certeza se n_tty é o módulo do kernel correto, pois não vejo nenhuma definição de cores lá.
TiMn
Eu acho que o framebuffer é um dispositivo e o tty é outro - o terminal virtual requer o dispositivo tty, e esses usam o framebuffer como um dispositivo de exibição, mas o framebuffer não é o único dispositivo de exibição possível.
quack quixote
+1 parece mais provável (o vt102 não suporta as cores estendidas e o driver do terminal codificado para a emulação do vt102). boa parte de pesquisa.
quack quixote
11
A mesma situação em 2017. Eu acredito que kmsconé um terminal da terra do usuário que tenta melhorar o terminal (incluindo cores de 24 bits). Embora seu desenvolvimento tenha estagnado em favor de uma alternativa sistemática.
jiggunjer
O kmscon foi bifurcado e, a partir deste post, está sendo desenvolvido ativamente: github.com/Aetf/kmscon
user3751385
7

Seu RXVT de 256 cores / xterm / URXVT / etc é definido por terminfo e pela configuração da TERMvariável. Na maioria das distribuições Linux, seus terminais virtuais são definidos /etc/inittabe usam um tipo de terminal padrão que define quantas cores o terminal pode usar.

Existe uma maneira de dizer ao TTY para usar mais de oito cores?

Sim.

  • Verifique se o seu framebuffer está usando a resolução correta / profundidade de bits. Tente adicionar vga=773às opções do kernel, por exemplo, para obter 1024x768 e 256 cores (profundidade de cores de 8 bits).

  • Defina um TERM diferente (por exemplo, export TERM=foo). Você precisará experimentar para encontrar o caminho certo. Se você encontrar um que funcione, poderá modificá- /etc/inittablo para que seus terminais virtuais o executem por padrão (consulte a próxima seção).

  • Este artigo discute outras opções que podem funcionar para você. Ele recomenda o Qingy (Qingy não é GettY) como um substituto do getty e pode fornecer o que você está procurando se a troca de variáveis ​​TERM não for uma opção.

  • Por falar em substituições de getty, eu juro que vi instruções para substituir o getty por GNU screenalgum lugar ao longo do caminho. Não estou encontrando o link no momento, mas como há um TERM de 256 cores para screen, você pode procurar nele.


/etc/inittab usa linhas como esta para configurar terminais virtuais:

# 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

Aqui está a página de manual /sbin/getty(do meu sistema Debian, então é tecnicamente o agettyprograma):

SYNOPSIS
       agetty [-8ihLmnw] [-f issue_file] [-l login_program] [-I init]
       [-t timeout] [-H login_host] baud_rate,...  port [term]

Observe o baud_rate,... port [term]lá no final. Isso corresponde ao comando da /etc/inittablinha ( /sbin/getty 38400 ttyN) - observe que não há [term]argumento; portanto, obtemos um padrão (execute echo $TERMlogo após o login em um console virtual para ver o que o sistema usa). Na página de manual novamente:

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.

Se você encontrar um TERM que funcione, modifique as linhas getty no seu inittab e adicione o TERM adequado no final:

1:2345:respawn:/sbin/getty 38400 tty1 TERM-with-256-colors
2:2345:respawn:/sbin/getty 38400 tty2 TERM-with-256-colors
charlatão quixote
fonte
11
~ publique todas essas informações incríveis, mas não tenho certeza de que isso levará ao sucesso. Você diz "Sim", mas depois diz "experimento" e "se encontrar um". Eu segui uma rota mais direta; Eu procurei o código do kernel. Não consegui encontrar nenhum código que lida com seqüências de escape para cores - EM QUALQUER LUGAR no kernel. Nem no código fb, nem no código tty ... em lugar nenhum. Assim, a minha conclusão de que é tratado no BIOS. Isso é suportado por minhas memórias de usar exatamente as mesmas seqüências de escape ANSI no DOS. Eu acredito que as várias seqüências de escape ANSI estão sendo manipuladas pelo BIOS nos dois casos.
PBR
@ pbr: verifiquei o código do kernel também. O código TTY não impõe limites ao número de cores. O BIOS não entra nele - você está lidando com o buffer de quadros , que pode levar vários bits de profundidade (os detalhes dependem do hardware, embora se você desativou o buffer de quadros ...). a limitação de 16 cores pode estar em GeTTY, portanto, a recomendação para verificar Qingy, ou pode estar no material terminfo, portanto, a recomendação para tentar várias definições de TERM alternativas. Não posso aconselhar além disso, mas o seu discurso sobre o BIOS é fora da base e não é útil .
quack quixote
11
~ charlatão - você está certo de que não está no BIOS (veja minha resposta revisada abaixo), mas continua recomendando investigar Qingy et al. O código do terminal virtual é codificado com emulação vt102.
1/09
6

Dê uma olhada no fbterm - é um buffer de quadro de substituição que pode ser executado no modo de 256 cores (você apenas o executa como root em um TTY)

Eu tive sucesso misto com ele - alguns aplicativos funcionam bem e relatam 256 cores; no entanto, o Emacs (a principal razão pela qual eu queria 256 cores no TTY) parece não funcionar; há um pouco de discussão sobre isso aqui, mas não é realmente resolvido:

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

No entanto, mplayer deve funcionar!

Seb
fonte
Parece horrível em comparação com qualquer um dos clientes do X terminal.
Phil Pirozhkov
11
Ele está sendo executado em um buffer de estrutura, para que você tenha apenas as 256 cores disponíveis para o buffer de estrutura.
Seb
Querendo saber se você tem alguma idéia sobre este problema temporário? superuser.com/questions/892028/…
dtmland 20/03
Correndo para emacsdentro tmuxpode ajudar, pois deve traduzir as seqüências de escape para o terminal circundante.
Tom Hale
1

kmscon

O kmscon é uma maneira de obter 256 cores e vídeos sem ter um sistema Windows (X, Wayland) instalado.

Foi abandonado, mas atualmente é mantido por um garfo .

A documentação sobre a instalação é pequena, mas a página README aqui deve ajudá-lo.


Instalei isso e o uso para aplicativos de console que exigem 256 cores (vim devido à minha configuração).

Leia atentamente as instruções de instalação.

user3751385
fonte
-1

As seqüências de escape ANSI para definir as cores de primeiro e segundo plano do texto são as coisas que limitam aqui.

Da memória, essas sequências parecem algo como escape [01; 34m. Existem códigos nos anos 30 para primeiro plano e acho que os 40 para segundo plano.

Portanto, acho que não há como alcançar o que você está procurando.

pbr
fonte
2
Na verdade, é possível. Caso contrário, eu não seria capaz de usar mutt com 256 cores no URxvt. :) Veja também push.cx/2008/256-color-xterms-in-ubuntu Mas como obtenho o mesmo efeito em um TTY?
TiMn