2015-06-07 14 views
5

Ich versuche, einen Fortschrittsbalken für eine Befehlszeilenanwendung zu implementieren, z.J verwandelt Carriage Return in Newline

[#####  ] 50% complete 

Ich weiß, ich kann einfach auf den Anfang der Zeile zurück und überschreiben, aber das scheint so eklig. Ich würde lieber den Wagenrücklauf verwenden, um den Cursor in die erste Spalte zu setzen und dann zu überschreiben.

Das Problem besteht darin, dass die J-Engine das Wagenrücklaufzeichen nicht zu rendern scheint und stattdessen einen Zeilenumbruch + Wagenrücklauf darstellt. Hier

ist, was ich versucht habe:

echo 'hi',(10{a.),'world' (wo 10{a. ist ASCII 10, dh Wagenrücklauf), die druckt

hi 
world 

echo 'hi',(13{a.),'world' (Newline), das druckt

hi 
world 

shell 'printf "%s\r%s" hi world' welche Drucke

hi 
world 

shell 'printf "%s\n%s" hi world', die schließlich

hi 
    world 

druckt, habe ich versucht, alle oben in JHS statt JConsole, mit identischen Ergebnissen.

Daraus sind drei Dinge offensichtlich:

  1. Die J-Frontends den Wagenrücklauf in einen Wagenrücklauf + newline drehen.
  2. Das J-Frontend verarbeitet auch extern erzeugte Wagenrückläufe (z. B. durch printf) in Zeilenumbrüche.
  3. J erkennt eine neue Zeile selbst, wie im letzten Beispiel gezeigt.

Irgendwelche Hilfe? Hässliche

+0

können Sie ANSI versuchen Escape-Codes, obwohl es weit hergeholt ist. Versuchen Sie '(ESC) [80D' anstelle des Wagenrücklaufs (wobei' (ESC) 'Zeichencode 27 ist) oder' (ESC) [A' nach einem Zeilenumbruch. – Sneftel

+0

Ich kann keine Quelle dafür finden, aber afaik 'CR',' LF' und 'CRLF' erzeugen alle den gleichen Zeilenumbruch in jconsole. Hast du die ncurses-Bibliothek ausprobiert? – Eelvex

+0

Laut '~ addons/docs/help/user/previous601.htm' scheint ANSI für UTF-8 ab J601 veraltet zu sein.Werde es aber versuchen. – hoosierEE

Antwort

5

aber funktioniert:

0$ stdout shell 'printf "99 problems\rno"' 
no problems 

UPDATE - 50% weniger hässlich!

Nicer zu vermeiden printf von der Shell Aufruf:

0$stdout 'hi world',(13{a.),'12' 
12 world 

UPDATE - 75% weniger hässlich!

Dank eines Kommentars von @Eelvex

0$stdout 'hi world',CR,'12' 
12 world 
+0

Netter Trick! Sie können 'CR' für' 13 {a.' – Eelvex

+0

verwenden. Wenn Sie es viel verwenden, können Sie ein Dienstprogramm Verb, wie folgt machen: 'cr =: [, CR,]' an welchem ​​Punkt Sie können schreibe "Hallo Welt" cr '12'' und ähnliches. – kaleidic