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

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)