web-dev-qa-db-fra.com

Comment faire que la console win32 reconnaisse les séquences d'échappement ANSI/VT100?

Je construis une version allégée de la bibliothèque ncurses. Jusqu'à présent, cela fonctionne plutôt bien avec les terminaux compatibles VT100, mais la console win32 ne parvient pas à reconnaître le code \033 au début d'une séquence d'échappement:

# include <stdio.h>
# include "term.h"

int main(void) {
  puts(BOLD COLOR(FG, RED) "Bold text" NOT_BOLD " is cool!" CLEAR);
  return 0;
}

Screenshot

Que faut-il faire au niveau du code C pour que le pilote ANSI.SYS soit chargé et que les séquences d'échappement ANSI/VT100 soient reconnues?

50
Witiko

[MISE À JOUR] Pour la dernière version de Windows 10, veuillez lire la contribution utile de @ brainslugs83, ci-dessous dans les commentaires de cette réponse.

Pour les versions antérieures à Windows 10 Anniversary Update

ANSI.SYS est soumis à une restriction selon laquelle il ne peut être exécuté que dans le contexte du sous-système MS-DOS sous Windows 95-Vista.

Microsoft KB101875 explique comment activer ANSI.SYS dans une fenêtre de commande, mais cela ne s'applique pas à Windows NT. Selon l'article: nous aimons tous les couleurs , les versions modernes de Windows ne disposent pas de ce support Nice ANSI.

Au lieu de cela, Microsoft a créé un grand nombre de fonctions, mais vous n’êtes pas obligé d’exécuter la séquence d’échappement ANSI/VT100. 

Pour une explication plus détaillée, voir le article Wikipedia :

ANSI.SYS fonctionne également dans les systèmes dérivés de NT pour les programmes hérités 16 bits exécutés sous NTVDM.

La console Win32 ne supporte pas nativement les séquences d'échappement ANSI. Des logiciels tels que Ansicon peuvent toutefois servir de wrapper autour de la console Win32 standard et ajouter un support pour les séquences d'échappement ANSI.

Je pense donc que ANSICON de Jason Hood est votre solution. Il est écrit en C _, prend en charge les versions 32 bits et 64 bits de Windows et la source est disponible _.

J'ai aussi trouvé une autre question ou un article similaire auquel on a finalement répondu en utilisant ANSICON: 

51
Franco Rondini

À partir de Windows 10 TH2 (v1511), conhost.exe et cmd.exe prennent en charge les séquences d'échappement ANSI et VT100 prêtes à l'emploi (bien que elles doivent être activées ).

Voir ma réponse chez superutilisateur pour plus de détails.

33
rolve

À partir de Windows 10, vous pouvez utiliser ENABLE_VIRTUAL_TERMINAL_PROCESSING pour activer les séquences d'échappement ANSI:

https://msdn.Microsoft.com/en-us/library/windows/desktop/mt638032(v=vs.85).aspx

11
Star Brilliant

Pour Python 2.7, le script suivant fonctionne très bien avec Windows 10 (v1607)

import os

print '\033[35m'+'color-test'+'\033[39m'+" test end"
os.system('') #enable VT100 Escape Sequence for WINDOWS 10 Ver. 1607
print '\033[35m'+'color-test'+'\033[39m'+" test end"

Le résultat devrait être:

[35mcolor-test[39m test end

color-test test end
8
Guestreader

Si ANSICON n'est pas acceptable car il nécessite l'installation de quelque chose sur le système, une solution plus légère qui analyse et convertit les codes ANSI dans les fonctions de la console Win32 API appropriées telle que SetConsoleTextAttribute .

https://github.com/mattn/ansicolor-w32.c

7
Joakim

Pour colorier la cmd, vous avez besoin de Windows.h et d'utiliser SetConsoleTextAttribute(), vous trouverez plus de détails dans http://msdn.Microsoft.com/en-us/library/windows/desktop/ms686047%28v=vs.85%29.aspx

5
rho

Personnellement, j'aime bien clink . Il traite non seulement les codes ANSI, mais ajoute de nombreuses autres fonctionnalités. La console Windows se comporte comme suit: bash (historique, recherche d'historique inversé, raccourcis clavier, etc.):

  • La même ligne d'édition que Bash (à partir de la bibliothèque Readline de GNU).
  • Persistance de l'histoire entre les sessions.
  • Achèvement sensible au contexte;
    • Exécutables (et alias).
    • Commandes de répertoire.
    • Variables d'environnement
    • Outils tiers; Git, Mercurial, SVN, Go et P4.
  • Nouveaux raccourcis clavier;
    • Coller du presse-papiers (Ctrl-V).
    • Recherche historique incrémentielle (Ctrl-R/Ctrl-S).
    • Puissant achèvement (TAB).
    • Annuler (Ctrl-Z).
    • "Cd .." automatique (Ctrl-PgUp).
    • Expansion de la variable d’environnement (Ctrl-Alt-E).
    • (appuyez sur Alt-H pour beaucoup plus ...)
  • Achèvement scriptable avec Lua.
  • Invite colorée et scriptable.
  • Réponse automatique à l'invite "Terminer le travail par lots?}".
1
Dawid Ferenczy

Dans la dernière victoire 10, cela peut être fait par SetConsoleMode(originMode | ENABLE_VIRTUAL_TERMINAL_PROCESSING). Voir https://docs.Microsoft.com/en-us/windows/console/console-virtual-terminal-sequences#example

1
bitlixi

Peut-être que ANSICON peut vous aider

Il suffit de télécharger et d'extraire des fichiers, en fonction de votre système d'exploitation Windows: 32 bits ou 64 bits

Installez-le avec: ansicon -i

1
user3137537

Ansi.sys (dans le dossier system32) est un "pilote MSDOS" fourni avec Windows XP, 2000 et les versions antérieures de NT. En 2000 et XP, il se trouve dans le dossier system32 (je ne me souviens pas de la structure des versions précédentes de NT). Les programmes qui s'exécutent dans le sous-système DOS et utilisent une sortie standard peuvent utiliser ANSI.SYS de la même manière qu'ils s'exécutent sur MSDOS.

Pour charger ansi.sys, vous devez utiliser la commande device = ou devicehigh = dans config, comme vous le feriez dans MSDOS. Sous Windows NT 5 (2K & XP), chaque copie du sous-système DOS peut recevoir un fichier de configuration séparé dans le fichier pif/raccourci (utilisez le bouton "avancé"). Un fichier par défaut appelé CONFIG.NT (également dans le dossier system32), qui est utilisé si le pif/raccourci ne spécifie pas un fichier de configuration spécial.

Quand ansi.sys est chargé correctement, mem/d signalera qu'il est chargé. Sur les versions antérieures de NT, vous pouvez et devez charger un environnement DOS approprié pour charger ansi.sys et ansi art fonctionnera à l'invite. Sous Windows 2K et XP, le chargement ansi.sys n'aura aucun effet sur votre "invite CMD" car CMD n'est pas un programme DOS: il s'agit d'un programme de console Windows 32 bits. Pour une raison que je ne comprends pas, sous WinXP, même si vous chargez une copie fixe de command.com à l’aide de "command.com/p", la commande Invite ne sera pas activée pour ansi. émule le chargement de command.com? 

Dans tous les cas, lorsque vous utilisez une version DOS réelle de command.com, ansi est activé après le chargement: vous pouvez démontrer son utilisation avec un peu d'art Ansi comme celui-ci:

command /c type ansiart.ans

(voici un exemple: http://artscene.textfiles.com/ansi/artwork/beastie.ans )

CONFIG.NT (dans le dossier system32) contient un exemple de syntaxe de chargement des pilotes de périphérique. Vous devez être un administrateur pour éditer ce fichier par défaut, ou vous pouvez en faire une copie.

Sur Windows 2K et XP, le "raccourci" par défaut pour MSDOS est un fichier .PIF, pas un fichier .LNK. Si vous créez un fichier .lnk dans CMD, vous ne pourrez pas définir de fichiers spéciaux config et autoexec, le fichier par défaut CONFIG.NT sera utilisé. Si vous souhaitez utiliser un fichier de configuration spécial pour une seule application DOS, vous pouvez effectuer une copie du "raccourci MSDOS" ou de "_default.pif", qui se trouve dans votre dossier Windows.

1
david

Avait le même problème. J'ai installé ConEmu et celui-là a résolu mon problème.

0
GeertVc

J'ai trouvé que cet outil fonctionnait pour ma fin . Microsoft Color Tool de GitHub

Décompressez le fichier compressé puis ouvrez CMD avec le droit d’administration.

Accédez au dossier dans lequel vous décompressez le fichier dans CMD.

Puis exécutez cette commande "colortool -b scheme-name"

Le nom du schéma doit être remplacé par l'une des options suivantes:

  • campbell.ini
  • campbell-legacy.ini
  • cmd-legacy.ini
  • deuternopia.itermcolors
  • OneHalfDark.itermcolors
  • OneHalfLight.itermcolors
  • solarized_dark.itermcolors
  • solarized_light.itermcolors

Dans mon cas, la commande serait comme ceci "colortool -b solarized_dark.itermcolors"

Cliquez à droite sur la fenêtre de la console et sélectionnez Propriétés.

Il n'est pas nécessaire de modifier les valeurs, il suffit de cliquer sur "OK" pour enregistrer le paramètre. (Vous remarquerez que votre police contient déjà des couleurs).

Propriété de la console

Puis redémarrez votre cmd ou powerShell.

La couleur ANSI doit être activée et fonctionner avec le jeu de couleurs que vous avez choisi auparavant.

0
Arung Isyadi

Sur la base de @ BrainSlugs83, vous pouvez activer la version actuelle de Windows 10 via register, avec cette ligne de commande:

REG ADD HKCU\CONSOLE /f /v VirtualTerminalLevel /t REG_DWORD /d 1
0
Daniel De León