Bash, how to globally fix ^H and ^? backspace problems

30,761

Solution 1

This page has all the information you will ever need on this issue; I suggest you read it. Now, if you are using bash, it should be enough to create an ~/.inputrc file containing these lines:

"\e[3~": delete-char
# this is actually equivalent to "\C-?": delete-char
# VT
"\e[1~": beginning-of-line
"\e[4~": end-of-line
# kvt
"\e[H":beginning-of-line
"\e[F":end-of-line
# rxvt and konsole (i.e. the KDE-app...)
"\e[7~":beginning-of-line
"\e[8~":end-of-line

As an added bonus, they will make Home and End work as well.

Solution 2

Most of the information in https://web.archive.org/web/20120621035133/http://www.ibb.net/~anne/keyboard/keyboard.html is indeed what you need. One correction to the information, is of their suggestion (for XTerm):

*VT100.Translations: #override \
          <Key>BackSpace: string(0x7F)\n\
          <Key>Delete:    string("\033[3~")\n\
          <Key>Home:      string("\033[1~")\n\
          <Key>End:       string("\033[4~")
*ttyModes: erase ^? 

While this will get XTerm to send the right character, and change stty to have backspace as ^?, it will still erroniously report ^H as backspace under some occasions, breaking i.e. backspace in Vim instert mode (see here: https://bugs.gentoo.org/154090). To avoid this, use VT100.backarrowKey: false instead, so:

*VT100.backarrowKey: false
*VT100.Translations: #override \
          <Key>Delete:    string("\033[3~")\n\
          <Key>Home:      string("\033[1~")\n\
          <Key>End:       string("\033[4~")
*ttyModes: erase ^? 

(see also https://wiki.archlinux.org/index.php/Xterm#Fix_the_backspace_key)

Share:
30,761

Related videos on Youtube

fragsworth
Author by

fragsworth

Updated on September 18, 2022

Comments

  • fragsworth
    fragsworth almost 2 years

    I'd like to fix this frequent problem where the shell on a remote server thinks my terminal's backspace key is ^? and sometimes it thinks it is ^H, and happens to be incorrect and outputs the wrong character when I press backspace. If I set it to ^H or ^? with stty erase ^H or stty erase ^? in my .bashrc file, and use some other terminal to access the server, it often ends up wrong. So I'm stuck having to manually type stty erase [whatever] to fix it when I notice the backspace key is wrong.

    What I'd like to do is bind both ^? and ^H to backspace, because if I can do this, I can just add it to all of my .bashrc files, and it will certainly end this nightmare. Is this possible? If so, how?