2012-12-10 15 views
5

Charakter \b kontrola, jak rozumiem, nie ma, aby usunąć poprzedni znak (to byłoby \b + a del charakter, jak również), więc coś jak to działa:Co jest przeciwieństwem znaku b, tj. Rodzaju niewymieniającego miejsca?

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

Czy istnieje znak do poruszania się do przodu, jak przestrzeń bez nadpisywania? Oczekiwane wykorzystanie byłoby coś jak (mam nazywa tę postać \x):

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

Oczywiście na maszynie normalną przestrzeń by zrobić to dobrze. Ale na terminalu przestrzeń usuwa literę pod spodem.

Moje przypadek użycia jest rodzajem dopasowanie pexpect scenariusz gdzie chcę retrospektywnie wrócić i ozdobić niektóre części wyjściu strumienia znaków z kolorami, i zastanawiam się, czy utrzymywanie pamięci podręcznej całego prądu linia w pamięci będzie konieczna lub nie.

+1

Wygląda na to, że nie ma sposobu na przejście do przodu w [pythonowych] tokenach sekwencji ucieczki] (http://docs.python.org/2/reference/lexical_analysis.html#grammar-token-escapeseq) ... –

+0

Nie wierzę, że istnieje taka postać, przynajmniej wyczerpujące poszukiwania nie wykazały żadnych. Jednak pod Linuksem powinieneś być w stanie jawnie ustawić pozycję kursora za pomocą [modułu curses] (http://docs.python.org/2/library/curses.html). – primo

Odpowiedz

2

Jeśli można polegać na ANSI escape code sequences w terminalu (*), można wykorzystać kursor do przodu (CUF) sekwencję "CSI n C", podobnie jak to:

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

a otrzymasz:

Potatoes 

CSI to \x1b[ i służy do uruchamiania sekwencji kodów ewidencyjnych ANSI. 2 to liczba znaków do przesunięcia w prawo, a C to polecenie przesuwania w prawo.


(*) Dobrym przybliżeniem jest to, że można polegać na kodach ANSI, chyba że trzeba obsługiwać system Windows.

+0

inny przypadek użycia: 'print 'Witaj Tim \ b \ b \ bw \ x1b [2C, świetne pytanie'' :) –

+0

Miło. 'print" pototo \ r \ x1b [3Ca "' wydaje się działać! – wim

0

Należy ponownie napisać znaki:

>>> print 'pototo\rpota' 
potato 

Jeśli nie chcesz, aby ponownie zapisać je, niż powinieneś korzystać z biblioteki jak curses ręcznie ustawić położenie kursora.

+0

Problem polega na tym, że nie można dopisać niczego na końcu słowa (bez nadpisywania). –

+0

@hayden Moim celem jest to, że wiersz polecenia nie został napisany w celu umożliwienia tych złożonych sytuacji. Możesz całkowicie przepisać pojedynczą linię (jak wskazuje moja odpowiedź), ale próbując zrobić cokolwiek innego, nie będziesz miał przenośnego kodu. Radziłbym ci użyć 'curses' lub innej biblioteki do manipulacji terminalem, jeśli chcesz robić takie rzeczy. – Bakuriu

+0

Przepraszam, że nie przeczytałem poprawnie drugiej części odpowiedzi. –