7
votes

Couleurs ANSI en C et NCurses

Je sais que je peux faire le attron code> et attrovation code> avec la couleur que j'ai choisi de, cependant, je voudrais savoir s'il est possible de le faire avec la couleur ANSI Codes d'échappement dans les ncurses:

#include <stdio.h>
#include <ncurses.h>

int main()
{
   initscr();
   char *s2 = NULL;
   const char *s1 = "World";
   int n = 10; 

   // What would be a good way to colour %d?
   // seems it is not safe to us the ANSI color escape in here...
   s2 = malloc (snprintf (NULL, 0, "Hello %s \033[22;31m%d", s1, n) + 2); 
   sprintf (s2, "Hello %s \033[22;31m%d", s1, n); 
   printw("%s", s2);
   refresh();
   getch();
   endwin();

   return 0;
}


4 commentaires

@schneiderfelipe Cette ancienne question ne mentionne rien de pourquoi op veut cela. Cela ressemble à un XY Problème pour moi. Pourquoi vous voulez ceci? Quel est le véritable objectif que vous ne pouvez pas réaliser avec des malédictions seules?


@Tedlyngmo Merci de demander! J'écris actuellement un cadre TUI basé sur des malédictions ( Github.com/schneiderfelipe/kay ). Il traduit des séquences d'échappement ANSI dans les appels de malédictions. Les réponses à cette question pourraient m'aider avec ce projet.


Merci, mais .. Pourquoi l'ancien cadre est-il une ligne directrice? Tu n'aurais pas pu partir ... de toute façon?


Qu'entendez-vous par «vieux framework»? ANSI Escape séquences? J'aime l'idée que c'est simplement une chaîne, ce qui facilite la propagation d'une petite bibliothèque principale.


4 Réponses :


3
votes

Je pense que vous vous attachez probablement à un territoire dangereux là-bas. Les malédictions suivront presque certainement les positions de caractères sur la base de caractères de sortie et, étant donné qu'il fournit sa propre gestion des couleurs, il ne détectera probablement pas également les séquences d'échappement Ansi.

Si vous après une possible moyen d'autoriser les séquences d'échappement ANSI Dans vos chaînes, alors une façon (kludge si c'est) serait d'intercepter la chaîne et de le modifier. Avoir une fonction d'assistant comme myprintw () qui prend une chaîne et le casse en panne, quelque chose comme (pseudo-code): xxx

ceci serait essentiellement décomposer la chaîne dans des séquences de caractères normales et des séquences d'ANSI et vous traiteriez chacun séparément.

Il nécessiterait une table de recherche (ou des smarts si vous devez gérer des séquences ANSI avec des paramètres arbitraires) afin de Traduisez les séquences dans les appels de code attron / désactivé souhaité.


4 commentaires

Oui, j'ai essayé, mais cela n'a pas fonctionné. Je me demande, quel serait un bon moyen de faire ce qui précède (j'ai mis à jour mon exemple de code)


J'aime l'approche, cependant, je me demande si la table de recherche est nécessaire?


Si vous pouvez trouver une formule pour convertir la séquence ANSI en ColorPair, ce serait mieux. Mais puisque je ne exactement ce que Color_Pair (A, B) fera sur une mise en œuvre générale, il est probablement plus sûr d'utiliser une recherche.


Hé, cette solution paires vraiment bien avec les liens trouvés dans La réponse de @Ciro Santilli . Il semble que la voie à suivre écrit un analyseur. @paxdiablo vous avez la prime 🎉



1
votes

Oui. Tout dépend de quel type de logiciel ou de microprogramme écoute la production du programme. Pour v3.3 msdos, non, cela ne fonctionnera pas à moins que le pilote de périphérique ANSI.SYS est chargé.

Les fenêtres de terminal modernes ont tendance à avoir sémantique ANSI X3.64 , donc ces séquences d'échappement travaillera souvent. Mais ne vous attendez pas à trop: des caractères extra larges et extra grands sont notoirement mal soutenus.


0 commentaires

1
votes

Ce ne sera pas trop sûr intégrer ANSI sur ncurses . Vous souhaitez utiliser attron / off appels et peut-être diviser la chaîne en % s et % d . Pour> 2 conversions, vous devez implémenter votre propre printw


0 commentaires

1
votes

Thread de la liste de diffusion 2008 Traduction de ceci: https: / /lists.gnu.org/archive/html/bug-ncurses/2008-11/msg00026.html

Les possibilités soulevées devaient:


0 commentaires