Některé užitečné jemnosti...
\33[2K
vymaže celý řádek, na kterém je aktuálně kurzor
\033[A
přesune kurzor o jeden řádek nahoru, ale ve stejném sloupci tj. ne na začátek řádku
\r
přenese váš kurzor na začátek řádku (r je pro návrat vozíku Poznámka:návrat vozíku nezahrnuje nový řádek, takže kurzor zůstane na stejném řádku), ale není vymazat cokoliv
Konkrétně v xtermu jsem zkusil výše uvedené odpovědi a jediný způsob, jak jsem našel, jak vymazat řádek a začít znovu na začátku, je sekvence (z výše uvedeného komentáře zveřejněného @Stephan202 a také @vlp a @mantal) \33[2K\r
Poznámka k implementaci, aby to fungovalo správně, například ve scénáři odpočítávání, protože jsem nepoužíval nový řádek znak '\n'
na konci každého fprintf()
, takže jsem musel fflush()
stream pokaždé (abyste měli nějaký kontext, spustil jsem xterm pomocí fork na linuxovém stroji bez přesměrování stdout, pouze jsem zapisoval do bufferovaného ukazatele FILE fdfile
s neblokujícím deskriptorem souboru jsem seděl na pseudoterminálové adrese, která v mém případě byla /dev/pts/21
):
fprintf(fdfile, "\33[2K\rT minus %d seconds...", i);
fflush(fdfile);
Všimněte si, že jsem použil obě sekvence \33[2K k vymazání řádku následovaného \r
sekvence návratu vozíku pro přemístění kurzoru na začátek řádku. Musel jsem fflush()
po každém fprintf()
protože na konci nemám znak nového řádku '\n'
. Stejný výsledek bez potřeby fflush() by vyžadoval další sekvenci, která by šla o řádek nahoru:
fprintf(fdfile, "\033[A\33[2K\rT minus %d seconds...\n", i);
Všimněte si, že pokud máte něco na řádku bezprostředně nad řádkem, na který chcete psát, bude to přepsáno prvním fprintf(). Pro první pohyb o řádek nahoru byste museli ponechat jeden řádek navíc:
i = 3;
fprintf(fdfile, "\nText to keep\n");
fprintf(fdfile, "Text to erase****************************\n");
while(i > 0) { // 3 second countdown
fprintf(fdfile, "\033[A\33[2KT\rT minus %d seconds...\n", i);
i--;
sleep(1);
}
Můžete použít únikové kódy VT100. Většina terminálů, včetně xterm, podporuje VT100. Pro vymazání řádku je to ^[[2K
. V C to dává:
printf("\33[2K\r");
Můžete použít \r
(carriage return) pro návrat kurzoru na začátek řádku:
printf("hello");
printf("\rbye");
Tím se vytiskne sbohem na stejné lince. Nevymaže však stávající znaky a protože nashledanou je kratší než ahoj , skončíte s byelo . Chcete-li jej vymazat, můžete nový tisk prodloužit, aby se přepsaly další znaky:
printf("hello");
printf("\rbye ");
Nebo jej nejprve smažte pomocí několika mezer a poté vytiskněte nový řetězec:
printf("hello");
printf("\r ");
printf("\rbye");
Tím se vytiskne ahoj , pak přejděte na začátek řádku a přepište jej mezerami, poté se vraťte znovu na začátek a vytiskněte sbohem .