Je sais que, si un terminal coloré est disponible, on peut colorer sa sortie en utilisant des caractères d'échappement .
Mais y a-t-il une possibilité de savoir de quelle couleur la sortie est actuellement affichée? Ou mieux, de quelle couleur serait le texte, si je le sortais maintenant?
Je demande de ne pas casser les paramètres de couleur précédents lors de l'utilisation de ces caractères d'échappement. Le caractère d'échappement 'couleur de premier plan par défaut' obtient ses informations du jeu de couleurs, plutôt que la couleur du texte avant de le changer.
echotc Co
ouechoti colors
, mais il n'y a tout simplement pas de variable qui stocke la définition actuelle du code couleur.Réponses:
En général, l'obtention des couleurs actuelles est impossible. Le traitement de la séquence de contrôle d'un terminal se produit "à l'intérieur" du terminal, où que ce soit. Avec un émulateur de terminal tel que
xterm
ou celui intégré dans un noyau de système d'exploitation qui fournit les terminaux virtuels du noyau, l'état interne de l'émulateur, y compris sa notion du "rendu graphique" actuel (c'est-à-dire la couleur et les attributs), est sur la machine lui-même et est théoriquement accessible. Mais pour un vrai terminal, ces informations se trouvent dans un emplacement RAM sur une machine physiquement séparée connectée via une liaison série.Cela dit, certains terminaux incluent un mécanisme de lecture de ces informations dans le cadre de leur protocole de terminal, qui est envoyé sur cette liaison série. Ils fournissent des séquences de contrôle qu'un programme peut envoyer au terminal, qui lui font renvoyer des informations sur son état interne, en tant qu'entrée du terminal.
mikeserv
vous a montré les séquences de contrôle auxquelles l'xterm
émulateur de terminal répond. Mais ceux-ci sont spécifiques àxterm
. Les émulateurs de terminaux intégrés dans le noyau Linux et les différents noyaux BSD sont par exemple différents types de terminaux et n'implémentent pas du tout de telles séquences de contrôle. Il en va de même pour des familles entières de terminaux réels.Les terminaux DEC VT525 implémentent un mécanisme de lecture, mais ont un ensemble de séquences de contrôle qui n'a aucune relation avec celles utilisées par
xterm
. On envoie la séquence DECRQSS (Request Selection or Setting) pour demander le rendu graphique actuel, et le terminal répond en envoyant le DECRPSS (Report Selection or Setting). Plus précisément:$
q
m
ST (DECRQSS avec la partie fonction de contrôle de SGR comme paramètre)0
$
r
0
;
3
3
;
4
4
m
ST (DECRPSS avec les paramètres et la fonction de contrôle faisant partie d'une séquence de contrôle SGR qui définit les couleurs actuelles de premier plan et d'arrière-plan)Bien sûr, une lecture attentive de votre question révèle que vous agitez à nouveau une banane enrobée de chocolat dans ces systèmes monétaires européens. Ce que vous essayez réellement de faire, pour lequel vous avez sélectionné une solution puis demandé comment faire une partie de cette solution, est de conserver l'état précédent pendant que vous écrivez une sortie colorisée. Non seulement il y a une séquence de contrôle DEC VT pour ce faire, mais il y a une séquence de terminaux de console SCO qui est reconnue par
xterm
et divers émulateurs de terminaux intégrés au noyau, et une entrée termcap / terminfo qui vous indique ce qu'ils sont pour votre terminal.Les entrées termcap sont
sc
etrc
. Les entrées terminfo sontsave_cursor
etrestore_cursor
. Les noms sont quelque peu trompeurs quant à leur effet (bien qu'ils agissent comme un avertissement que vous comptez sur quelque chose qui est de facto plutôt que de jure ). Les séquences de contrôle DECSC, DECRC, SCOSC et SCORC réelles enregistrent et restaurent également le rendu graphique actuel.Étant donné que l'article que vous avez souligné concerne la génération de séquences de contrôle à partir de scripts shell, la commande que vous recherchez maintenant l' est
tput
.Lectures complémentaires
la source
sc
etrc
, vous voudrez peut-être également examiner le tampon alternatif si votre terminal le prend en charge. Et oui, c'est une excellente réponse. Minix, regardez peut-être aussi ceci: comment utiliser / dev / fb0 comme console depuis l'espace utilisateur . Lanosh
suite qu'il recommande est la sienne.DECRQSS
(environ 7 ans de retard ...).Dans un,
xterm
vous pouvez obtenir les codes de couleur RVB de couleur actuels signalés en modifiant un changement de couleur d'échappement à une requête. Utilisez leESC ] Ps m
- mais ajoutez un?
point d'interrogation. De la documentation :"?"
est donné plutôt qu'un nom ou une spécification RVB,xterm
répond avec une séquence de contrôle de la même forme qui peut être utilisée pour définir la couleur dynamique correspondante. Étant donné que plusieurs paires de numéros de couleur et de spécifications peuvent être fournies dans une même séquence de contrôle,xterm
plusieurs réponses peuvent être apportées .J'ai de sérieux doutes si cela est susceptible de fonctionner dans un autre émulateur de terminal, mais dans un
xterm
si vous exécutez ...... le
xterm
repoussera dans le tampon d'entrée de votre terminal une séquence comme celle-ci ...... pour le fond ou pour le premier plan:
la source
printf '\033]10;rgb:8f8f/8f8f/8f8f8f\007
, tout le texte du terminal qui était auparavant "normal" devient bleu clair. Par la suite, l'exécutionprintf '\033]10;rgb:bfbfbf/bfbfbf/bfbfbf\007'
ramène tout le texte bleu clair à "normal". Comment utiliser cette valeur pour modifier uniquement la couleur du texte à l'avenir?clear
abord?printf '\033]10;?\007'
demande à xterm la couleur de premier plan actuelle du terminal. Si votre terminal a été démarré avec "normal" (par exemple 7 comme couleur de premier plan), mais que vous exécuteztput setaf 3
avant d'exécuter laprintf
commande, laprintf
commande ci-dessus renvoie toujours "normal" - et c'est vrai, car c'est la couleur de premier plan actuelle de votre terminal. Ce que j'espérais, c'était un moyen de récupérer la couleur actuelle de la position actuelle du curseur afin de pouvoir l'enregistrer pour la "restaurer" plus tard - conformément à l'OP.xterm
le mainteneur et est un membre actif ici. (le lien est vers son site Web -xterm
les documents d'échappement de sont nombreux - et, fondamentalement, la référence standard pour tout autre programmeur souhaitant écrire un terminal)