Quelques subtilités intéressantes...
\33[2K
efface toute la ligne sur laquelle se trouve actuellement votre curseur
\033[A
déplace votre curseur d'une ligne vers le haut, mais dans la même colonne c'est-à-dire pas au début de la ligne
\r
amène votre curseur au début de la ligne (r est pour le retour chariot N.B. les retours chariot n'incluent pas de saut de ligne donc le curseur reste sur la même ligne) mais ne le fait pas effacer quoi que ce soit
Dans xterm spécifiquement, j'ai essayé les réponses mentionnées ci-dessus et le seul moyen que j'ai trouvé pour effacer la ligne et recommencer au début est la séquence (du commentaire ci-dessus posté par @Stephan202 ainsi que @vlp et @mantal) \33[2K\r
Sur une note d'implémentation, pour le faire fonctionner correctement, par exemple dans un scénario de compte à rebours puisque je n'utilisais pas de caractère de nouvelle ligne '\n'
à la fin de chaque fprintf()
, donc j'ai dû fflush()
le flux à chaque fois (pour vous donner un peu de contexte, j'ai démarré xterm en utilisant un fork sur une machine Linux sans rediriger stdout, j'écrivais juste dans le pointeur FILE tamponné fdfile
avec un descripteur de fichier non bloquant que j'avais assis sur la pseudo adresse du terminal qui dans mon cas était /dev/pts/21
):
fprintf(fdfile, "\33[2K\rT minus %d seconds...", i);
fflush(fdfile);
Notez que j'ai utilisé à la fois la séquence \33[2K pour effacer la ligne suivie du \r
séquence de retour chariot pour repositionner le curseur en début de ligne. J'ai dû fflush()
après chaque fprintf()
parce que je n'ai pas de caractère de saut de ligne à la fin '\n'
. Le même résultat sans avoir besoin de fflush() nécessiterait la séquence supplémentaire pour remonter d'une ligne :
fprintf(fdfile, "\033[A\33[2K\rT minus %d seconds...\n", i);
Notez que si vous avez quelque chose sur la ligne immédiatement au-dessus de la ligne sur laquelle vous voulez écrire, il sera écrasé par le premier fprintf(). Vous devrez laisser une ligne supplémentaire au-dessus pour permettre le premier mouvement vers le haut d'une ligne :
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);
}
Vous pouvez utiliser les codes d'échappement VT100. La plupart des terminaux, y compris xterm, sont compatibles VT100. Pour effacer une ligne, c'est ^[[2K
. En C cela donne :
printf("\33[2K\r");
Vous pouvez utiliser un \r
(retour chariot) pour ramener le curseur en début de ligne :
printf("hello");
printf("\rbye");
Cela affichera au revoir sur la même ligne. Cependant, cela n'effacera pas les caractères existants, et parce que au revoir est plus court que bonjour , vous vous retrouverez avec byelo . Pour l'effacer, vous pouvez allonger votre nouvelle impression pour écraser les caractères supplémentaires :
printf("hello");
printf("\rbye ");
Ou, effacez-le d'abord avec quelques espaces, puis imprimez votre nouvelle chaîne :
printf("hello");
printf("\r ");
printf("\rbye");
Cela affichera bonjour , puis allez au début de la ligne et écrasez-la avec des espaces, puis revenez au début et écrivez bye .