2015-06-07 18 views
5

Sto tentando di implementare una barra di avanzamento per un'applicazione della riga di comando, ad es.J trasforma il ritorno a capo in newline

[#####  ] 50% complete 

So che posso solo tornare indietro all'inizio della riga e sovrascrivere, ma sembra così grave. Preferisco usare il ritorno a capo per posizionare il cursore sulla prima colonna e quindi su sovrascrivere.

Il problema è che il motore J non sembra rendere il carattere di ritorno a capo, mentre invece restituisce un ritorno a capo + ritorno a capo.

Ecco che cosa ho provato:

echo 'hi',(10{a.),'world' (dove 10{a. è ASCII 10, vale a dire il ritorno a capo) che stampa

hi 
world 

echo 'hi',(13{a.),'world' (nuova riga) che stampa

hi 
world 

shell 'printf "%s\r%s" hi world' che stampa

hi 
world 

shell 'printf "%s\n%s" hi world' che stampa

hi 
    world 

Infine, ho provato tutto quanto sopra in JHS anziché JConsole, con risultati identici.

Da questo, tre cose sono evidenti:

  1. Il J estremità anteriori ruotare il ritorno del carrello in un ritorno + newline.
  2. Il front-end J elabora anche i ritorni a capo generati esternamente (ad esempio da printf) in newlines.
  3. J fa riconosce una nuova riga da solo come mostrato nell'ultimo esempio.

Qualsiasi aiuto?

+0

Si può provare codici di escape ANSI, anche se è un colpo lungo. Prova '(ESC) [80D' invece del ritorno a capo (dove' (ESC) 'è il codice carattere 27), o' (ESC) [A' dopo una nuova riga. – Sneftel

+0

Non riesco a trovare una fonte per questo, ma afaik 'CR',' LF' e 'CRLF' producono tutti la stessa interruzione di riga in jconsole. Hai provato la libreria ncurses? – Eelvex

+0

In base a '~ addons/docs/help/user/previous601.htm' sembra che ANSI fosse deprecato per UTF-8 a partire da J601.Ci proveremo comunque. – hoosierEE

risposta

5

brutto, ma funziona:

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

AGGIORNAMENTO - 50% in meno brutto!

più bello per evitare di chiamare printf dalla shell:

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

AGGIORNAMENTO - meno brutta 75%!

Grazie ad un commento da @Eelvex

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

Bel trucco! Puoi usare 'CR' per' 13 {a' – Eelvex

+0

Se lo userai molto potresti voler fare un verbo di utilità, come questo: 'cr =: [, CR,]' a quel punto puoi scrivi "hi world" cr "12" e simili. – kaleidic