Question

I have a terminal that is set in ~(ICANON) mode and wondering how I can use the data that I get for the backspace (which is ^?) so I can send a putchar('\b') to the console to go back one space.

EDIT:

struct termios new;
newt.c_lflag &= ~(ICANON);
tcsetattr(STDIN_FILENO, TCSANOW, &newt); // Set the console to send each char straight away.

char c;
while ((c = getchar()) != '\n){
   // If the backspace key is pressed, the symbols ^? appear on the screen. How do I
   // Interpret the backspace to send back a '\b' char to the screen. I don't want the ^?
   // to appear on the screen when the backspace is pressed but rather the cursor move one
   // space to the left.
}

Thanks

Was it helpful?

Solution

With the terminal in raw mode (~ICANON), the BkSp key will output the byte 0x7f, which is not interpreted as a backspace by the terminal. (This is so that it can be distinguished from the keystroke ^H.) If you want this keystroke to be interpreted by the terminal as a backspace, you will need to:

  1. Disable echo on the terminal (~ECHO), then
  2. Echo back most characters as they are input, but echo 0x7f as 0x08 (\b). (You will also probably need to echo \n as \r\n.)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top