Lire le texte actuel de la couleur dans un xterm
Je suis en train d'écrire divers utilitaires, et je suis vraiment aimer colorisée texte. Rien de compliqué, juste en utilisant les séquences d'échappement. J'ai créé une classe simple qui a une pprint(msg, couleur) de la fonction. J'ai eu travaille assez facilement après avoir trouvé les codes ici.
Le problème que je rencontre est que je devrais être en mesure de désactiver la couleur après l'impression. Par exemple, supposons qu'un utilisateur exécute mon programme qui imprime presque tout dans le terminal par défaut de la couleur, 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 dans le rouge. Malheureusement, tout le texte est en rouge jusqu'à ce que je le change. C'est généralement bien alors que mon programme est en cours d'exécution parce que je sais quelle est la couleur des messages devrait être. Cependant, la couleur reste après mon programme se termine. En gros, je voudrais lire la couleur en cours lors de mon démarrage du programme, et de les restaurer lorsque vous avez terminé. De la même manière que les scripts de restauration de la ddt lors de la sortie.
Comment puis-je connaître la séquence d'échappement?
Système:
Red Hat 5.x
Bash
Python 2.3
Merci pour l'aide.
Vous devez vous connecter pour publier un commentaire.
Je ne crois pas que c'est possible et c'est peu de chances d'être portable si c'était le cas. Le meilleur que vous pouvez faire est d'envoyer
sgr0
qui réinitialise tous les attributs par défaut (pas de précédent). Sur des xterms,sgr0
estEsc[m
. Si vous souhaitez réinitialiser les couleurs et ne pas affecter d'autres attributs, envoyerop
qui sur des xterms estEsc[39;49m
.Ces codes ne doivent pas être codé en dur. Vous devez utiliser terminfo, termcap ou [n]malédictions.
Plutôt que d'utiliser d'obfuscation des séquences d'échappement, l'utilisation de la
tput
établissement de la place. Voici un extrait de mon~/.bashrc
que j'utilise pour ma PS1 invite:Pour réinitialiser les informations de couleur telle que du texte qui suit est dans la normale terminal de couleur ajouter
${NORMAL}
à la fin comme suit:echo "${RED}this is red ${NORMAL}this is normal"
tput
est livré avec ncurses, donc même si c'est pas un bash intégré, c'est à peu près partout..sh
des scripts en combinaison avec Git Bash et il y a beaucoup de Linux les outils que je n'ai pas à ma convenance.tput
est l'un d'entre eux. Bien sûr, je pourrais utiliser cygwin ou même déposer un tput exécutable dans mon répertoire Git, mais cela semble exagéré lorsque les séquences d'échappement fonctionne parfaitement bien. TBH,$(tput setaf 6)
n'est pas moins obscure que'\e[00;36m'
pour moi. Ils ont également ne pas la fourche d'un autre processus à 15 fois lors de l'initialisation des constantes de couleur.Cette fonction retourne une chaîne de caractères à imprimer colorisé, avec le terminal automatiquement réinitialisé après.
En fait, il est possible — pour
xterm, et compatible terminaux.
xtermcontrol utilise par exemple le
de la CVMO 10
la séquence de commande pour récupérer le par défaut de premier plan/arrière-plan de couleurs. Il a été documenté dans un xterm depuis 2002.Pour les autres terminaux:
OSC 10
(testé avec l'équivalent de CentOS 5).Curieux quand elle a été ajoutée, l'ours à l'esprit que la TEV développeurs de ne pas écrire de la documentation. Alors... l'étude de la commande git log montre
D'autre part, la par défaut les couleurs ne sont pas les mêmes que les actuel couleurs. Les utilisateurs ont été en mesure de le faire avec xterm depuis patch #93 en 1999 à l'aide de la
DECRQSS
séquence de contrôle. C'est, de mettre le terminal en mode raw et de faire quelque chose commene serait-il obtenir de réponse de la chaîne rempli avec le SGR paramètres.
Si les couleurs ont été définies à l'aide de la RGS, ces codes seraient une partie de la réponse, par exemple
pour désigner la couleur de premier plan numéro 3 (codé comme
33
).Vous pourrait s'arrêter là (parce qu'on pourrait en extraire ces paramètres et de les réutiliser pour définir le terminal de l'état même plus tard), mais l'obtention de la réelle couleurs RVB serait possible à l'aide de
OSC 4
. Il vous suffit d'utiliser le numéro de la couleur (de la SGR de la séquence), et d'envoyer quelque chose comme ceci:Donc c'est certainement faisable avec un xterm. Il y aura une démo/test-script pour
DECRQSS
dans la prochaine mise à jour de xterm.Pour les autres programmes, vous avez besoin de plus de temps:
xtermcontrol du développeur négligé
DECRQSS
(il n'a pas de fonction pour le réglage/mise en SGR de codes).TEV développeurs de copie xterm fonctionnalités en réponse aux rapports de bogues; le TEV source ne mentionne pas
DECRQSS
. Ses git log mentionneOSC 4
en 2009, mais la mise en œuvre est incomplète (il ne permet que d' ensemble une couleur, pas obtenir la couleur).