Question

Je vous écris divers services publics, et je suis vraiment aimer le formatage du texte. Rien de fantaisie, juste en utilisant des séquences d'échappement. J'ai créé une classe simple qui a une fonction pprint (msg, couleur). Je l'ai travailler assez facilement après avoir trouvé les codes .

Le problème que je vais avoir est que je devrais être en mesure de désactiver la couleur après l'impression. Par exemple, supposons que l'utilisateur exécute mon programme qui imprime presque tout dans la couleur par défaut du terminal, mais il y a une erreur, et je veux imprimer l'erreur en rouge. Je préfixe mon message d'erreur avec « \ 033 [0; 32m », et le message est en rouge. Malheureusement, tout le texte est rouge jusqu'à ce que je le change. C'est généralement bien pendant que mon programme est en cours d'exécution parce que je sais de quelle couleur les messages devraient être. Cependant, la couleur reste après mes extrémités du programme. Au fond, je voudrais lire la couleur actuelle lorsque mon programme démarre, et le restaurer lorsque vous avez terminé. De la même façon que les scripts de restauration PWD lors de la sortie.

Comment puis-je lire la séquence d'échappement actuelle?

Système: Red Hat 5.x Frapper Python 2.3

Merci pour l'aide.

Était-ce utile?

La solution

Je ne crois pas que ce soit possible et il est peu susceptible d'être portable si elle était. Le mieux que vous pouvez faire est d'envoyer sgr0 qui remet à zéro tous les attributs à défaut (non précédent). Sur xterm, sgr0 est Esc[m. Si vous souhaitez réinitialiser les couleurs et ne pas affecter d'autres attributs, envoyer op qui, xterms est Esc[39;49m.

Ces codes ne doit pas être codé en dur. Vous devez utiliser terminfo, termcap ou [n] malédictions.

Autres conseils

Au lieu d'utiliser des séquences d'échappement brouillées, au lieu d'utiliser l'installation de tput. Voici un extrait de mon ~/.bashrc que j'utilise pour mon PS1 invite:

BLACK=$(tput setaf 0)
RED=$(tput setaf 1)
GREEN=$(tput setaf 2)
YELLOW=$(tput setaf 3)
LIME_YELLOW=$(tput setaf 190)
POWDER_BLUE=$(tput setaf 153)
BLUE=$(tput setaf 4)
MAGENTA=$(tput setaf 5)
CYAN=$(tput setaf 6)
WHITE=$(tput setaf 7)
BRIGHT=$(tput bold)
NORMAL=$(tput sgr0)
BLINK=$(tput blink)
REVERSE=$(tput smso)
UNDERLINE=$(tput smul)

Pour réinitialiser les informations de couleur telle que le texte qui suit est la couleur terminal normal que vous ajoutez ${NORMAL} à la fin comme ceci:

echo "${RED}this is red ${NORMAL}this is normal"

RED = 31
GREEN = 32
ESCAPE = '%s[' % chr(27)
RESET = '%s0m' % ESCAPE
FORMAT = '1;%dm'

def colorize(text, color):
    return ESCAPE + (FORMAT % (color, )) + text + RESET

Cette fonction retourne une chaîne qui imprimera colorisé, avec le terminal étant automatiquement remis à zéro après.

En fait, il est possible - pour xterm et compatible terminaux.

xtermcontrol par exemple utilise le OSC 10 séquence de contrôle pour récupérer le default de premier plan / couleurs de fond. Il a été documenté dans xterm depuis 2002.

Pour d'autres terminaux:

  • Dans RHEL 5, le programme "Terminal" est gnome-terminal 2.16.0; cette version ne reconnaît pas OSC 10 (testé avec CentOS équivalent 5).
  • La question a été posée en 2010, en se référant à la Red Hat l'entreprise version, qui, si quoi que ce soit, est plus lent à la mise à jour de Debian.
  • Aller de l'avant dans le temps, gnome-terminal 3.4.1.1 sur Debian 7 (début 2012) n'a pas non plus reconnu la séquence de contrôle.
  • Enfin, dans Debian 8 avec 3.14.1 (fin 2014) la fonction est reconnue.
  • CentOS 7 de gnome-terminal 3.14.3 reconnaît la séquence de contrôle.

Curieux quand il a été ajouté, gardez à l'esprit que les développeurs de TEV ne pas les documents d'écriture. Alors ... étudier les salons git log

commit 1b8c6b1aac587b79476a60a5830385abc939430d 
Author: Egmont Koblinger <egmont@gmail.com> 
Date:   Wed Jan 22 00:13:51 2014 +0100

    emulation: Add support for OSC 1?1[017] (fg, bg, highlight colors)

    https://bugzilla.gnome.org/show_bug.cgi?id=567444

D'autre part, le par défaut couleurs ne sont pas les mêmes que les courant couleurs. Les utilisateurs ont été en mesure de le faire avec xterm depuis correctif # 93 en 1999 en utilisant le DECRQSS séquence de contrôle . Autrement dit, mettre le terminal en mode brut et de faire quelque chose comme

printf '\033P$m\033\\'

obtiendrait à répondre avec la chaîne rempli avec les paramètres SGR.

Si les couleurs ont été définies à l'aide SGR, ces codes feraient partie de la réponse, par exemple.

\033P1$r0;33m\033\\

pour indiquer le numéro de la couleur de premier plan 3 (codé comme 33).

Vous pourriez arrêter là (parce que vous pouvez extraire ces paramètres et de les réutiliser pour définir le terminal au même état plus tard), mais obtenir les couleurs RVB réelles seraient possibles en utilisant OSC 4 . Vous souhaitez utiliser le numéro de couleur (de la séquence SGR), et d'envoyer quelque chose comme ceci:

printf '\033]4;3;?\033\\'

Il est certainement faisable avec xterm. Il y aura une démo / script de test pour DECRQSS dans la prochaine mise à jour pour xterm.

Pour les autres programmes, vous avez besoin de plus de temps:

  • développeur de xtermcontrol négligé DECRQSS (il n'a pas de fonction pour obtenir des codes / réglage SGR).

  • Les développeurs de TEV fonctions de copie xterm en réponse aux rapports de bugs; la source de TEV ne mentionne pas DECRQSS . Son journal git mentionne OSC 4 en 2009, mais la mise en œuvre est incomplète (elle ne permet qu'une seule à ensemble une couleur, pas get la couleur).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top