2016-10-11 4 views
0

ich eine Java-Anwendung haben, die unverarbeitet Flucht ANSI escape sequences verwendet Farben anzuzeigen, positionieren Sie den Cursor usw.Sequenzen unter den „Cygwin“ Terminal

Es funktioniert unter regelmäßigen Unices fein, und auch unter xterm und mintty (in Cygwin), aber ich habe Probleme, es unter dem Terminal (dh bash gestartet von cmd.exe).

Wie Sie aus dem Screenshot sehen:

enter image description here

Escape-Sequenzen ausgegeben werden "wie sie ist", ohne zu verarbeiten. Auf der anderen Seite kann ich einfach wie echo -e '\033[1;31mTest' - und Farbtext wird nur da sein.

enter image description here

Auch, wenn ich auf meinem Windows melden Sie sich an:

Zur gleichen Zeit, wenn ich von einem Midnight Commander Subshell genau die gleiche Anwendung starten, Sequenzen, die durch die Anwendung erzeugt entkommen korrekt interpretiert werden Box mit SSH (dh ersetzen Sie die lokale Verbindung mit der Remote, aber behalten Sie die gleiche Terminal), wieder, Escape-Sequenzen sind in Ordnung.

Es sieht aus wie wenn eine Subshell einer Art erstellt wird (mc oder ssh), das Terminal in einen anderen Modus versetzt wird. Aber es war nicht hilfreich, mit zu spielen, noch war export'ing TERM=ansi.

Könnte jemand bitte irgendeine Lösung vorschlagen?

Ich bin mit

CYGWIN_NT-6.3 UNIT-725 2.5.1(0.297/5/3) 2016-04-21 22:14 x86_64 Cygwin 

und Windows 8.1.

+0

Ich bin ziemlich sicher, dass, wenn Sie Cygwins bash von cmd.exe starten, wird es weiterhin das von Windows zur Verfügung gestellte Konsolenfenster verwenden, anstatt ein eigenes zu erstellen. Die Konsole in der neuesten Version von Windows 10 unterstützt ANSI-Escapesequenzen (obwohl ich glaube, dass sie explizit aktiviert werden muss), frühere Versionen jedoch nicht. Ich weiß nicht, ob es irgendeinen Weg gibt, diese Arbeit zu machen. Ihre beste Option ist wahrscheinlich, einen Starter bereitzustellen, der Ihre Anwendung auf die richtige Weise startet. –

+0

... obwohl die Tatsache, dass echo funktioniert, nahelegt, dass Cygwin eine Art von Übersetzungsschicht hat. Wenn du die Ausgabe irgendwie über Cygwin fütterst, könnte das funktionieren. Vielleicht ein Bash-Skript, das die Ausgabe von Ihrem Prozess umleitet und es an die Konsole sendet? Oder einen Cygwin-basierten Java-Interpreter, wenn es so etwas gibt. –

+0

@HarryJohnston der Punkt ist, 'bash.exe' hat bereits Übersetzungsschicht (Escape-Sequenzen -> Win32 API-Konsolenaufrufe) beim Ausführen als direkte Kind von' cmd.exe' gesagt. Die Frage ist, warum die obige Übersetzung manchmal funktioniert und manchmal nicht. – Bass

Antwort

2

Um für eine Anwendung in der Lage sein, Sequenzen zu verwenden, ANSI entweichen, wenn aus cmd.exe (TERM=cygwin) gestartet, entweder die Anwendung selbst mit cygwin1.dll verbunden werden muss, oder dessen Ausgabe durch gefiltert werden muss noch einer was ist (z. B. oder ssh Unterschalen).

Das gleiche C Programm:

#include <stdio.h> 

int main() { 
    const char esc = 0x1b; 
    printf("%c[31;91;1mHello, World!%c[0m\n", esc, esc); 
    return 0; 
} 

unterstützt Ausgabefarbe, wenn sie mit Cygwin GCC zusammengestellt:

$ ldd test-ansi-escape.exe 
    ntdll.dll => /cygdrive/c/Windows/SYSTEM32/ntdll.dll (0x7ffeeb450000) 
    KERNEL32.DLL => /cygdrive/c/Windows/system32/KERNEL32.DLL (0x7ffee92c0000) 
    KERNELBASE.dll => /cygdrive/c/Windows/system32/KERNELBASE.dll (0x7ffee8700000) 
    cygwin1.dll => /usr/bin/cygwin1.dll (0x180040000) 

aber zeigt Müll wie

←[31;91;1mHello, World!←[0m 

wenn wi kompilierten th MSVC oder mingw64-x86_64-gcc:

$ ldd test-ansi-escape.exe 
    ntdll.dll => /cygdrive/c/Windows/SYSTEM32/ntdll.dll (0x7ffeeb450000) 
    ntdll.dll => /cygdrive/c/Windows/SYSTEM32/ntdll.dll (0x770a0000) 
    wow64.dll => /cygdrive/c/Windows/SYSTEM32/wow64.dll (0x76fd0000) 
    wow64win.dll => /cygdrive/c/Windows/system32/wow64win.dll (0x77020000) 
    wow64cpu.dll => /cygdrive/c/Windows/system32/wow64cpu.dll (0x77090000) 
    ??? => ??? (0x1040000) 
    KERNEL32.DLL => /cygdrive/c/Windows/SYSTEM32/KERNEL32.DLL (0x76480000) 
    ??? => ??? (0x1040000) 
    ??? => ??? (0x1040000) 
    KERNEL32.DLL => /cygdrive/c/Windows/SYSTEM32/KERNEL32.DLL (0x76480000) 
    KERNELBASE.dll => /cygdrive/c/Windows/SYSTEM32/KERNELBASE.dll (0x74b40000) 
    MSVCR120D.dll => /cygdrive/c/Windows/SYSTEM32/MSVCR120D.dll (0x62b90000) 

Eine alternative Lösung wird unter Verwendung von ConEmu als der externen Ausgangsfilter (bash.exe als direktes Kind von ConEmu.exe ausgeführt wird). Dieser Ansatz erfordert keine Verknüpfung mit cygwin1.dll, da die Ausgangsfilterung selbst von ConEmu durchgeführt wird. Der Nachteil ist, dass ConEmu Unterstützung für Escape-Sequenzen ist begrenzt (besonders, es versteht nicht VT100 alternative Zeichensatz für Linienzeichnung verwendet).

Verwandte Themen