Le caractère de retour en arrière (charcode ?\x08
son alias ?\b
et ses fréquentes ?\C-H
(Ctrl+H)) n'est pas le même que le caractère de suppression (charcode ?\x7f
c'est-à-dire ascii 127). La différence entre les deux est que le retour arrière déplace le curseur vers la gauche avant de l'effacer.
Notez que dans les deux cas, sur les plates-formes unix, la suppression correspond généralement à la séquence d'échappement kill, et que la dernière correspond à la suppression de la ligne à partir de la droite du curseur (c'est-à-dire comme le mappage Ctrl+K dans Terminal). En d'autres termes, ?\b
est équivalent à "\e[D\e[K"
(à gauche, tuer) et ?\x7f
est équivalent à "\e[K"
(tuer). Exemple de sortie dans IRB (Ruby 2.0.0, OSX) pour illustrer ceci :
>> print "abc\b" # abc, backspace
ab=> nil
>> print "abc\e[D\b" # abc, left, backspace
a=> nil
>> print "abc\x7f" # abc, delete
abc=> nil
>> print "abc\e[D\x7f" # abc, left, delete
ab=> nil
>> print "abc\e[D\e[D\x7f" # abc, left, left, delete
a=> nil
>> print "abc\e[D\e[D\e[K" # abc, left, left, kill
a=> nil
Le mot d'ordre dans ce qui précède est généralement . Si vous jouez avec getch dans un terminal, le comportement sera très différent de celui d'IRB. (Si ma mémoire est bonne, la touche delete déplace alors le caractère vers la gauche sans tuer la ligne, ou quelque chose de cet ordre).
Pour revenir à votre question après avoir clarifié ce point : à ma connaissance, il n'existe pas de séquence d'échappement pour tuer un seul caractère à la position du curseur ; il n'existe que des séquences pour tuer une ligne à gauche, à droite ou aux deux extrémités du curseur. La référence postée par Fred est très bonne si vous voulez vous plonger dans le sujet :
http://ascii-table.com/ansi-escape-sequences-vt-100.php
En tout cas, je suppose que tu joues avec getch
ou quelque chose de cet ordre. Ce que vous voulez faire, pour supprimer un seul caractère, c'est maintenir un tampon et la position du curseur en même temps que vous imprimez des caractères sur la sortie standard. Cela vous permettra de faire correspondre ?\b
o ?\x7f
comme vous le souhaitez, en utilisant quelque chose comme :
def refresh
rest = @buffer[@position..-1]
@stdout.print "\e[K"
@stdout.print rest, "\e[#{rest.length}D" if rest && !rest.empty?
nil
end
Sinon, essayez les suspects habituels pour vous épargner les maux de tête : readline, ncurses, la gemme highline, etc.