2012-12-10 13 views
5

Il personaggio \b di controllo, a quanto mi risulta, non dovrebbe cancellare il carattere precedente (questo sarebbe \b + a del personaggio pure), in modo da qualcosa come questo funziona:Qual è l'opposto del carattere b, cioè una specie di spazio non cancellabile?

>>> print 'pototo\b\b\ba' 
potato 

C'è un personaggio per andare avanti, come uno spazio non sovrascritto? utilizzo atteso sarebbe qualcosa di simile (Ho chiamato questo personaggio \x):

>>> print 'pototo\r\x\x\xa' 
potato 

Ovviamente su una macchina da scrivere uno spazio normale sarebbe farlo bene. Ma su un terminale uno spazio cancella la lettera sottostante.

mio caso d'uso è una sorta pexpect corrispondenza di scenario in cui voglio retrospettivamente tornare indietro e decorare alcune parti l'uscita di un flusso di caratteri con i colori, e mi chiedo se mantenere una cache di tutta la corrente la linea in memoria sarà necessaria o meno.

+1

Non sembra che ci sia un modo per spostarsi avanti nei [tokens di sequenza di escape di [python "] (http://docs.python.org/2/reference/lexical_analysis.html#grammar-token-escapeseq) ... –

+0

Non credo che ci sia un tale personaggio, almeno una ricerca esaustiva non ne ha rivelato nessuno. Tuttavia, con linux dovresti essere in grado di impostare esplicitamente la posizione del cursore usando il [modulo curses] (http://docs.python.org/2/library/curses.html). – primo

risposta

2

Se si può fare affidamento su ANSI escape code sequences nel vostro terminale (*), è possibile utilizzare la sequenza cursore in avanti (CUF) "CSI n C", in questo modo:

print "Pototo\b\b\ba\x1b[2Ces" 

e ottenere:

Potatoes 

CSI è \x1b[ e viene utilizzato per avviare sequenze di codice di escape ANSI. 2 è il numero di caratteri da spostare a destra e C è il comando per spostarsi verso destra.


(*) Una buona approssimazione è che è possibile fare affidamento sui codici ANSI a meno che non sia necessario supportare Windows.

+0

un altro caso d'uso: 'stampa 'Hello Tim \ b \ b \ bw \ x1b [2C, ottima domanda'' :) –

+0

Nice. 'stampa" pototo \ r \ x1b [3Ca "' sembra funzionare! – wim

0

Si dovrebbe ri-scrivere i caratteri:

>>> print 'pototo\rpota' 
potato 

Se non si vuole ri-scrittura, che si dovrebbe usare una libreria come curses per impostare manualmente la posizione del cursore.

+0

Il problema con questo è quindi non è possibile aggiungere nulla alla fine della parola (senza sovrascrivere). –

+0

@hayden Il mio punto è che la riga di comando non è stata scritta per consentire queste situazioni complesse. Puoi riscrivere completamente una singola riga (come fa notare la mia risposta) ma cercando di fare qualsiasi altra cosa non avrai codice portatile. Ti consiglio di usare 'curses' o un'altra libreria per la manipolazione del terminale se vuoi fare queste cose. – Bakuriu

+0

Mi spiace non aver letto correttamente la seconda parte della risposta. –