Terminali 24bit "truecolor"... e misteri

Postate qui per tutte le discussioni legate a Linux in generale.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
joe
Iper Master
Iper Master
Messaggi: 3797
Iscritto il: ven 27 apr 2007, 11:21
Slackware: 15.0
Kernel: 5.15.38
Desktop: dwm

Terminali 24bit "truecolor"... e misteri

Messaggio da joe »

Vi risparmio la storia lunga... anzi no, dai portate pazienza. Metto l'antefatto in blu, volendo si può saltare.

Cercando informazioni su markdown sono inciampato in un'immagine (o video non ricordo...) in cui veniva mostrato Vim che con l'aggiunta di un tema "rilassante" e un paio di plugin, Goyo e Limelight, diventava un cosiddetto distraction-free editor tipo quelli pensati per "scrittori" vari. Anni fa avevo provato una cosa del genere usando Focuswriter.
Al ché mi sono detto "bello, proviamo!".
Ovviamente non sono riuscito a cavare un ragno dal buco. O quasi.
Il problema parrebbe relativo al mio attuale tema di vim che era solarized dark versione originale. Infatti il plugin Limelight che praticamente "spegne" i paragrafi del testo non coinvolti dal cursore, ha un sistema per calcolare questa variazione di colore del testo. Disgraziatamente il solarized dark apporta modifiche alla palette, e il plugin non riesce a calcolare il colore giusto. Occorre qundi settare una opzione a mano scegliendo la numerazione opportuna del colore da usare, ma tra i colori disponibili non sono riuscito a trovarne uno soddisfacente.


Ho fatto caso che invece la situazione era funzionante in GVim.
Cercando informazioni mi sono imbattuto sul discorso palette di colori, 16 colori, 256 ecc ecc... fino al truecolor in cui i colori sono definiti univocamente e ad oggi sembra siano supportati un po' da tutti i terminali, multiplexer ecc ecc...

Metto un paio di links:
https://gist.github.com/XVilka/8346728
https://github.com/termstandard/colors

Mi sono anche ricordato che avevo visto anni addietro un tema "solarized" per vim, ma riscritto a 24bit, appunto turecolor quindi.
Al ché mi sono detto, benissimo tagliamo la testa al toro e proviamo ad attivare truecolor nel terminale e installare "solarized8" come tema di vim.

https://github.com/lifepillar/vim-solarized8

Con "xterm" sono riuscito. È stato sufficiente installare il tema in vim come plugin e richiamarlo poi con "clorscheme solarized8" manualmente o nella configurazione ~/.vimrc. In più sempre in vimrc va impostato il supporto a truecolor con "set termguicolors".

Xterm già di suo supporta il truecolor, per confermarlo si può usare ad esempio il test seguente:

Codice: Seleziona tutto

curl -s https://raw.githubusercontent.com/JohnMorales/dotfiles/master/colors/24-bit-color.sh | bash
Che disegna tutto il set di colori disponibili si vedone la variazione tra uno e l'altro in modo "continuo" senza "scalini" tra un colore e il successivo...

Ora, quello che non riesco a capire è per quale diamine di motivo, ad esempio in ST (suckless simple terminal) tutti i test mi confermano che il supporto a truecolor è attivo: qundi per capirci da shell l'arcobaleno viene stampato, ma aprendo vim non riesco a smuovermi da una situazione monocromatica... sembrano non funzionare neanche altri temi...tipo desert, slate... ecc ecc...

Perché "xterm" sì e "st" no?
Mistero...

Altra cosa, abitualmente uso il multiplexer "screen", che anche lui supporterebbe truecolor, se ben ricordo dalla versione 4.9 che ha slackware 15, e si attiva mettendo "truecolor on" in ~/.screenrc. Però se provo il test sopra con curl ecc, cio apro u xterm, avvio screen e lancio il comando di test, ecco che appaiono solamente alcuni colori e non l'arcobaleno come con xterm e st.
Altro mistero insomma!

Eppure dovrebbe funzionare come si vede anche da qui. Post del 2020 tra l'altro...
https://www.linuxquestions.org/question ... 175676262/

Però, però... vedo ora che qui dicono che il supporto è realmente funzionante solo in "screen 5", attualmente ramo master git se ho ben capito, quindi potrei provare a ricompilare quello...

L'argomento immagino sia u po' di nicchia, per chi fa uso di terminale spesso e vuole ottenere anche un aspetto moderno... ma non si sa mai che qui qualcuno abbia qualche idea per aiutarmi a capirci qualcosa.
Eventualmente grazie in anticipo! :)
https://lists.gnu.org/archive/html/scre ... 00000.html

Avatar utente
joe
Iper Master
Iper Master
Messaggi: 3797
Iscritto il: ven 27 apr 2007, 11:21
Slackware: 15.0
Kernel: 5.15.38
Desktop: dwm

Re: Terminali 24bit "truecolor"... e misteri

Messaggio da joe »

Sono riuscito ad ottenere qualche risultato... aggiorno il monologo a futura memoria, magari potrà tornare utile a qualcun altro oltre me, che ripescherò qui le informazioni quando le avrò scordate.

Ricapitolando brevemente gli obiettivi erano:
  • Impostare un emulatore di terminale (io sto usando XTerm e ST) con pieno supporto a truecolor.
  • Avere lo stesso pieno supporto nel multiplexer "gnu screen".
  • Sfruttare questa funzionalità con tema solarized e in particolare vim-solarized8 all'interno dell'editor vim.
Cosa funzionava:
  • In XTerm solamente, riuscivo ad ottenere il truecolor e vim con resa corretta del tema solarized8.
Cosa non funzionava:
  • In screen non si riusciva ad ottenere il truecolor, quindi ancora prima di visualizzare qualcosa in Vim.
  • In ST il truecolor funzionava ma aprendo Vim con tema solarized8 si otteneva tutto monocromatico.

Impostazione ST

Per quanto riguarda ST ho risolto impostando due stringhe di escape nel vimrc:

Codice: Seleziona tutto

set termguicolors
let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum"
let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum"
XTerm non ne aveva bisogno, mentre ST evidentemente sì... less is more... ma con qualche attenzione in più!

Aggiungo che con ST il tema solarized nel terminale volevo ottenrlo come in XTerm, impostato da ~/.Xresources. Di suo ST non legge .Xresources, ma con una patch apposita dovrebbe... Invece la patch per quanto ho provato io rende possibile l'impostazione del font ad esempio, ma come colori ottengo un background nero. Ho risolto impostando il tema solarized applicando la patch apposita e ricompilando ST, e ho lasciato anche la patch Xresources che torna utile per il font.


Impostazione GNU Screen

Era corretto quanto avevo accennato: la versione stabile 4.x di default in slackware non supporta il truecolor, dovrebbe essere presente nella prossima versione 5.x.
Al momento si può però provare la versione di sviluppo di screen reperibile via git.
Ho provato ad adattare lo slackbuild di Pat, escludendo alcune patches che non si applicano automaticamente e ho poi aggiornato il pacchetto di default con la versione git di screen (attualmente indicata come 4.99).

OK, impostando in ~/.screenrc :

Codice: Seleziona tutto

truecolor on
term screen.xterm-256color
Ecco che il test truecolor riesce e si ottiene il solito arcobaleno nel terminale.

Ma Vim lanciato da una sessione Screen?
Dunque, calma e gesso... funzionicchia... :x
Sì, perché i colori del tema solarized8 sono resi correttamente... ma...
Il punto però è che c'è un dettaglio non trascurabile, un altro "mistero"!

Infatti il tema solarized8 non comprende solo la colorazione del testo ma anche il tipo di testo, ad esempio i commenti vengono impostati in "Italic". E la cosa è evidente se si apre Vim da ST o da XTerm.
Invece avviando Screen e aprendo lo stesso file con Vim, ecco l'inghippo: il font corsivo è sparito!

Per cui funziona, ma non del tutto.

E altro mistero, la cosa strana è che il corsivo da riga di comando funziona, con qualche stringa tipo le seguenti:

Codice: Seleziona tutto

echo -e "\e[1mbold\e[0m"
echo -e "\e[3mitalic\e[0m"
echo -e "\e[3m\e[1mbold italic\e[0m"
echo -e "\e[4munderline\e[0m"
echo -e "\e[9mstrikethrough\e[0m"
Di queste in XTerm e ST funzionano tutte, mentre con screen non funziona solamente l'ultimo echo cioè il "barrato".

In sintesi, cosa non funziona:
  • Lanciando Vim da in Screen non appare il testo formattato in corsivo. Ma sempre dalla stessa sessione screen, da shell il corsivo funziona col comando echo e le opportune stringhe di escape.

Avatar utente
joe
Iper Master
Iper Master
Messaggi: 3797
Iscritto il: ven 27 apr 2007, 11:21
Slackware: 15.0
Kernel: 5.15.38
Desktop: dwm

Re: Terminali 24bit "truecolor"... e misteri

Messaggio da joe »

Ho risolto per quello che era lo scopo, ovvero avere in Vim il tema solarized8 basato su Truecolor (24bit) anche all'interno di una sessione Screen avviata entro un terminale XTerm o ST.

Ricapitolando brevemente:
  • Il terminale deve supportare i 24bit quindi truecolor. XTerm e ST lo supportano (vedere test di verifica spiegati nei messaggi sopra).
  • Il multiplexer GNU Screen deve anche lui supportare i 24bit. Ma l'attuale versione stabile di questo software che troviamo in Slackware 15.0 (4.9 o 4.09) non lo supporta. Per cui occorre compilare quella di sviluppo (4.99) accessibile via git, si può usare lo slackbuild di Pat per lo scopo, io ho provato bypassando le patches che applica, però potrebbe funzionare anche con le patches, non ho provato...
  • Con in mano i software che supoprtano truecolor si può configurare ~/.vimrc e ~/.screenrc come già spiegato sopra.
Mancava il font "Italic" aprendo Vim da una sessione Screen, nonostante il font sia previsto dal colorscheme solarized8 per alcune parti del testo, ad esempio per i commenti.

A quanto ho capito e dalle prove che ho fatto, Screen in realtà supporterebbe l'italic, basta lanciare un:

Codice: Seleziona tutto

echo -e "\e[3mitalic\e[0m"
e si ottiene l'output in italic senza problemi da shell.
Il problema quindi riguarda in qualche modo l'accoppiata Vim e Screen.

Da quanto ho capito bisogna fare riferimento ai files "terminfo" dei vari emulatori di terminale e verificare che contengano le istruzioni relative all'italic definite dal corrispondente codice escape, che ha a che fare anche con "\E3m" (si vede anche nell'echo da shell sopra).
La istruzioni in questione sono chiamate "sitm" e "ritm". Per verificarle occorre cercarle entro il file terminfo relativo al proprio terminale in uso che viene rivelato dalla variabile d'ambiente TERM.

Nel mio caso ad esempio ho TERM impostata così:
  • per ST: st-256color
  • per XTerm: xterm-256color
  • per Screen: screen-256color
Questa impostazione è definita non via bashrc o profile ma a livello di terminale, per ST mi pare di ricordare che si possa impostare in fase di compilazione. Per XTerm non ne ho idea, comunque credo sia anche lì una definizione "a monte", e comunque non a casaccio perché ovviamente quel nome richiama il file terminfo rispetivo che contiene le istruzioni coerenti con lo specifico emulatore di terminale. Per Screen si definisce in ~/.screenrc, io l'ho modificata rispetto al messaggio precedente:

Codice: Seleziona tutto

term screen-256color
Questi files terminfo si trovano in formato binario in /usr/share/terminfo/*. Esempio per screen si ha /usr/share/terminfo/s/screen*, metto l'asterisco perché appunto ve ne sono svariate versioni tra cui quella che interessava a me ovvero screen-256color (in realtà ho visto in seguito che ve ne sono appositi per screen col supporto all'italic, esempio "screen5", "screen.mlterm", "screen+italic". Ad ogni modo avevo già modificato quello in uso screen-256color aggiungendovi le istruzioni e come base di partenza andava bene per cui ho tenuto quello alla fine).

Per visulizzare il contenuto di questi files serve il comando infocmp e l'output si può passare a grep per trovare le istruzioni "*itm" relative all'italic:

Codice: Seleziona tutto

$ infocmp st-256color | grep itm
	ri=\EM, ritm=\E[23m, rmacs=\E(B, rmcup=\E[?1049l,
	sgr0=\E[0m, sitm=\E[3m, smacs=\E(0, smcup=\E[?1049h,
$ infocmp xterm-256color | grep itm
	rev=\E[7m, ri=\EM, rin=\E[%p1%dT, ritm=\E[23m, rmacs=\E(B,
	sgr0=\E(B\E[m, sitm=\E[3m, smacs=\E(0, smam=\E[?7h,
$ infocmp screen-256color | grep itm
$
Ecco l'intruso: il terminfo di screen-256color non comprende le istruzioni *itm, mentre quelli di ST e XTerm sì. Allora l'idea è quella di aggiungerle anche al terminfo di Screen e provare se Vim visualizza l'Italic anche dal multiplexer.

Ho trovato un problema analogo per un altro multiplexer, Tmux, in cui anche lì sembra esserci qualche problemino con l'Italic. Lì suggerivano di aggiungere le istruzioni nel seguente modo.
Preparare un file temporaneo chiamato per esempio screen-256color.terminfo:

Codice: Seleziona tutto

# A screen-256color based TERMINFO that adds the escape sequences for italic.
#
# Install:
#
#   tic screen-256color.terminfo
#
# Usage:
#
#   export TERM=screen-256color
#
screen-256color|screen with 256 colors and italic,
        sitm=\E[3m, ritm=\E[23m,
        use=screen-256color,
E quindi compilare il contenuto creando di fatto il nuovo file terminfo.

Codice: Seleziona tutto

$ tic screen-256color.terminfo
Occhio ai nomi: tic va a riscrivere il terminfo originale se lanciato come root, non toglie nulla ma aggiunge le istruzioni indicate, il contenuto del file terminfo è abbastanza auto-esplicativo.
Se lo si lancia come root va a sovrascrivere il file terminfo di sistema /usr/share/terminfo/s/screen-256color, se invece lo si lancia come utente semplice viene scritto in ~/.terminfo/s/screen-256color. E questo viene usato prioritariamente rispetto a quello di sistema.
La prima riga non commentata definisce il nome del file che verrà creato, quindi se non si vuole sovrascrivere nulla ma aggiungerne uno nuovo bisogna modificare lì.

Come verifica basta uscire da Screen e avviare una nuova sessione, forse basta aprire una nuova schermata (ctrl+a c)... quindi avviare Vim con del testo contenente delle righe commentate e verificare che queste siano rese in Italic.
Altra verifica sempre da Vim:

Codice: Seleziona tutto

:echo &t_ZH
Da come ho capito dovrebbe restituire l'escape

Codice: Seleziona tutto

^[[3m
OK, per il momento è tutto, avevo scritto anche sul github di vim-solarized8:

https://github.com/lifepillar/vim-solarized8/issues/100

Più o meno è la copia di questo monologo! :D

Mi resta ancora qualche dettaglio per curiosità.
In Screen non funziona il testo barrato, quello con tirata una riga sopra, come "cancellato"...
In XTerm e ST, quindi senza multiplexer funziona:

Codice: Seleziona tutto

$ echo -e "\e[9mstrikethrough\e[0m
... lanciato da dentro una sessione Screen restituisce testo regolare senza la riga di stralcio. Bò.. Evidentemente sarà sempre legato a qualche funzionalità di Screen limitata o da attivare in qualche modo... misteri! :-k

Rispondi