2010-12-20 5 views
13

Ich versuche, eine Tabelle zu drucken, die angenehmer für das Auge als die reine Textdarstellung ist. Grundsätzlich möchte ich so etwas konvertieren:Zeichnen von Tabellen im Terminal mit ANSI-Box-Zeichen

+-----+--------+ 
| age | weight | 
+-----+--------+ 
| 10 | 100 | 
| 80 | 500 | 
+-----+--------+ 

etwas wie folgt aus:

┌─────┬────────┐ 
| age | weight | 
├─────┼────────┤ 
│ 10 │ 100 │ 
│ 80 │ 500 │ 
└─────┴────────┘ 

hier ist der Screenshot von dem, was ich sehe in Terminal:

in terminal looks like this

Beachten Sie die Lücken zwischen den Zeilen. Mein Problem ist, dass sie nicht richtig verbinden, während andere Unix-Tools, die ANSI-Druck verwenden, im Terminal gut aussehen. Zum Beispiel, Baum, wenn ich tree -A in meinem Terminal laufen `ich diese:

tree in terminal

merken, wie vertikale Linien miteinander verbunden sind. es ist schon komisch, denn wenn ich kopieren und die Ausgabe der Baum in meinem Texteditor einfügen und mein Skript ausführen ich so etwas wie dieses:

tree in my code

Offensichtlich ich etwas über das Drucken ANSI Zeichen im Terminal bin fehlt und couldn‘ Finde nichts darüber, indem du es googelst. Kann jemand etwas zu diesem Thema erzählen?

Antwort

18

Ich denke, ich sollte meine eigene Frage beantworten. Nach ein wenig Nachforschung und der Hilfe von Freund und Chef, Linus, stellte ich fest, dass ich das Terminal zwingen musste, zuerst in den grafischen Modus zu gehen, dann die Sonderzeichen auszudrucken und dann zurück in den Textmodus zu gehen. Der ASCII-Code zum Umschalten in den graphischen Modus ist 14 und 15 wird zurück in den Textmodus zurückkehren. also hier ist der Code in Ruby:

printf("%c\n", 14) 
printf("%c ", 0x6A) # ┘ 
printf("%c ", 0x6B) # ┐ 
printf("%c ", 0x6C) # ┌ 
printf("%c ", 0x6D) # └ 
printf("%c ", 0x6E) # ┼ 
printf("%c ", 0x71) # ─ 
printf("%c ", 0x74) # ├ 
printf("%c ", 0x75) # ┤ 
printf("%c ", 0x76) # ┴ 
printf("%c ", 0x77) # ┬ 
printf("%c\n", 0x78) # │ 


a = sprintf("%c", 0x6C) + # ┌ 
sprintf("%c", 0x71) + # ─ 
sprintf("%c", 0x71) + # ─ 
sprintf("%c", 0x71) + # ─ 
sprintf("%c", 0x71) + # ─ 
sprintf("%c", 0x71) + # ─ 
sprintf("%c", 0x71) + # ─ 
sprintf("%c\n", 0x6B) + # ┐ 
sprintf("%c", 0x78) + # │ 
#print("  ") 
"  " + 
sprintf("%c\n", 0x78) + # │ 
sprintf("%c", 0x6D) + # └ 
sprintf("%c", 0x71) + # ─ 
sprintf("%c", 0x71) + # ─ 
sprintf("%c", 0x71) + # ─ 
sprintf("%c", 0x71) + # ─ 
sprintf("%c", 0x71) + # ─ 
sprintf("%c", 0x71) + # ─ 
sprintf("%c", 0x6A) # ┘ 

puts a 

printf("%c\n", 15) 
3

Sie sollten wirklich Ncurses und seine Varianten untersuchen. Es gibt eine Reihe von verschiedenen Sprachbindungen, obwohl es ursprünglich für C geschrieben wurde. Es bietet eine recht umfangreiche Sammlung von Bibliotheken zur Erstellung von TUIs (Text-UIs) mit Fenstern, Menüs, eingerahmten Rahmen usw. Hit wikipedia zu Beginn mit zu finden einige andere Referenzen.