Impedisci al terminale Mac di illuminare il colore del carattere senza sfondo

2

Quando eseguo echo -e '3[49;36m\u25883[40;36m\u2588' in un terminale Linux, ottengo due blocchi dello stesso colore:

Qui,ilprimobloccononhacoloredisfondo(49)mentreilsecondobloccohauncoloredisfondonero.Ilcaratterevisualizzatogeneralmenteoccupatuttolospazio,quindilosfondononèvisibileeapparelostesso.

Tuttavia,seripetoquestonelMacTerminalottengoqualcosadimoltosorprendente:

Per qualche ragione, mac terminale sta cambiando il colore di primo piano per diversi colori di sfondo. Attraverso alcuni esperimenti, ho scoperto che il colore di primo piano è costante per qualsiasi colore di sfondo fisso e solo diverso per il colore di sfondo predefinito. Il colore che rende è distinto da una qualsiasi delle altre modifiche scure o luminose offerte dai terminali ansi.

Perché sta succedendo questo, e ancora più importante, posso ripararlo?

    
posta Erik 06.05.2017 - 23:19
fonte

1 risposta

3

Risposta breve: non utilizzare codici colore "composti" come 3[49;36m , utilizzare invece istruzioni di colore separate come 3[0;42m3[0;36m . La differenza può essere ben vista confrontando l'output di questi due comandi:

echo -e "3[0;42;36m\xe2\x96\x883[0;49;36m\xe2\x96\x88"
echo -e "3[0;42m3[0;36m\xe2\x96\x883[0;49;36m\xe2\x96\x88"

(nota che la mia versione di bash non poteva elaborare \u2588 , quindi ho dovuto ricorrere alla variante esadecimale \xe2\x96\x88 ).

Suggerimento per il codice futuro:

Crea un file (ad esempio in ~/.bash_color_definitions ) con il seguente contenuto:

# Setup some colors to use later in interactive shell or scripts

# Color reset:
export COLOR_RESET='3[0m' # reset color

# foreground colors

export FG_WHITE='3[1;37m'
export FG_BLACK='3[0;30m'
export FG_BLUE='3[0;34m' 
export FG_LIGHT_BLUE='3[1;34m'
export FG_GREEN='3[0;32m'
export FG_LIGHT_GREEN='3[1;32m'
export FG_CYAN='3[0;36m'
export FG_LIGHT_CYAN='3[1;36m'
export FG_RED='3[0;31m'
export FG_LIGHT_RED='3[1;31m'
export FG_PURPLE='3[0;35m'
export FG_LIGHT_PURPLE='3[1;35m'
export FG_BROWN='3[0;33m'
export FG_YELLOW='3[1;33m'
export FG_GRAY='3[1;30m'
export FG_LIGHT_GRAY='3[0;37m'


# background colors

export BG_WHITE='3[1;47m'
export BG_BLACK='3[0;40m'
export BG_BLUE='3[0;44m' 
export BG_LIGHT_BLUE='3[1;44m'
export BG_GREEN='3[0;42m'
export BG_LIGHT_GREEN='3[1;42m'
export BG_CYAN='3[0;46m'
export BG_LIGHT_CYAN='3[1;46m'
export BG_RED='3[0;41m'
export BG_LIGHT_RED='3[1;41m'
export BG_PURPLE='3[0;45m'
export BG_LIGHT_PURPLE='3[1;45m'
export BG_BROWN='3[0;43m'
export BG_YELLOW='3[1;43m'
export BG_GRAY='3[1;40m'
export BG_LIGHT_GRAY='3[0;47m'

E caricatelo su ogni inizio di bash inserendo source ~/.bash_color_definitions nel .bashrc o .bash_profile . Quindi inizia a produrre un codice più leggibile come questo:

 echo -e "$BG_BLACK$FG_CYAN\xe2\x96\x88$BG_GRAY$FG_CYAN\xe2\x96\x88$COLOR_RESET"

Modifica

È venuto fuori che il codice nella mia risposta ha effettivamente resettato lo sfondo (come notato da Erik nei commenti). Dopo un po 'di test, sembra che il terminale Mac "mescoli" i colori di primo piano / sfondo un po' diverso quando si tenta di utilizzare il codice colore 49 , cioè il "colore di sfondo predefinito".

Per esempio iTerm.app non si comporta in questo modo, quindi puoi facilmente cambiare terminale, se lo desideri.

Una soluzione valida, tuttavia, è specificare completamente il colore di sfondo (ad esempio, non utilizzare solo 49;36m , utilizzare 47;36m se lo sfondo è bianco). O meglio usare le specifiche di colore xterm-256color ; questo è 3[38;5;___m per il primo piano e 3[48;5;___m per i colori di sfondo (sostituendo il trattino basso con un numero in 0-255). Almeno sul mio computer, questo produce colori coerenti:

echo -e "3[48;5;256m3[38;5;6m\xe2\x96\x883[40;36m3[38;5;6m\xe2\x96\x883[0m"

Se vuoi verificare quale colore xterm-256 ANSI si adatta meglio al tuo reale colore di sfondo, puoi usare questo script (versione modificata da quella trovato qui ):

#!/bin/bash

for fgbg in 38 48 ; do #Foreground/Background
    for color in {0..256} ; do #Colors
        #Display the color
        echo -e "3[${fgbg};5;${color}m ${color}\t3[0m"
    done
    echo #New line
done

exit 0
    
risposta data 07.05.2017 - 14:44
fonte

Leggi altre domande sui tag