Bash home/end/delete key is inserting a tilde, or if preceded by escape key, [1~ [3~

bashcommand linekey-bindingkeyboard shortcuts

In bash, the home/end/delete key is inserting a tilde, or if preceded by escape key: [1~

So I type echo hellp, move cursor to hel|lp and type delete, and bam, i got ~tilde

Also, I type echo hellp, move cursor to hel|lp and type esc then delete, and bam, I got [3~

$ echo hel~lp
hel~lp

$ echo hell[3~o
hell[3~o
~

My version of bash:

$ bash --version
GNU bash, version 3.1.17(1)-release (i686-pc-msys)
Copyright (C) 2005 Free Software Foundation, Inc.

What I want is behavior like cmd.exe:

  1. I want Esc to clear the current line / buffer
  2. I want Home to move cursor to start of line before first character
  3. I want End to move cursor to end of line before first character
  4. I want delete to delete the next character (right of cursor) from current line/buffer

What do I have to edit to fix this?
Is this default on your bash?

update: i'm on a windows machine running a windows program, sh.exe ( as you can see above GNU bash), compiled with mingw for msys:

$ uname -s -m -o
MINGW32_NT-5.1 i686 Msys

Best Answer

You customize bash via an .inputrc file in your /home/username , you can copy the default

cp /etc/inputrc.default   ~/.inputrc

here is mine (comments start with # )

# Key-bindings for the command-line editor.

# Ask before displaying >50 items
# Since $WINDIR $PATH var can be in $PATH, this could list
# all window exectables in C:\WINDOWS
set completion-query-items 50

# Ignore case for the command-line-completion functionality
# on:  default to a Windows style console
# off: default to a *nix style console
set completion-ignore-case on

# none, visible or audible
set bell-style audible

# disable/enable 8bit input
set meta-flag on
set input-meta on
set output-meta off
set convert-meta on

# visible-stats
# Append a mark according to the file type in a listing
set visible-stats off
set mark-directories on

# Show all instead of beeping first
set show-all-if-ambiguous off

# MSYSTEM is emacs based
$if mode=emacs
    # Common to Console & RXVT
    "\C-?": backward-kill-line          # Ctrl-BackSpace
    "\e[2~": paste-from-clipboard       # "Ins. Key"
    "\e[5~": beginning-of-history       # Page up
    "\e[6~": end-of-history             # Page down

    $if term=msys # RXVT
        "\e[7~": beginning-of-line      # Home Key
        "\e[8~": end-of-line            # End Key
        "\e[11~": display-shell-version # F1
        "\e[15~": re-read-init-file     # F5
    #$endif
    #$if term=cygwin # Console
    $else
        "\e[1~": beginning-of-line      # Home Key
        "\e[4~": end-of-line            # End Key


"\e[3~": delete-char            # Delete Key
#~      "\e\e[D": backward-word         # Alt-LeftArrow
#~      "\e\e[C": forward-word          # Alt-RightArrow
            "\M-\e[D": backward-word            # Alt-LeftArrow
            "\M-\e[C": forward-word         # Alt-RightArrow
    `#~`        "\C-\E[D": backward-word        # Ctrl-LeftArrow, nowork, can't be made to work
    #~`enter preformatted text here`        "\C-\E[C": forward-word         # Ctrl-RightArrow, nowork, can't be made to work
    #~ to see current bindings use    bind -q backward-kill-line
            "\e\e": kill-whole-line        # double/triple escape works :) Esc/Escape to delete current line like cmd.exe

        $endif
    $endif

to find out what you need to type in your inputrc on the left side (the escape code, as it can vary between laptop/desktop...), at the prompt type echo ' then type Ctrl-V followed by the key , like Home, then type ' example

$ echo ' home key ^[[1~  '
 home key
~
$ echo ' end key ^[[4~  '
 end key
~
$ echo ' pg up page up ^[[5~ '
 pg up page up
~
$ echo ' pg dn page down ^[[6~ '
 pg dn page down
~

then replace each ^[ with \e add \M- for Alt theoretically you'd use \C- for Ctrl but it currently doesn't work (windows limitation)

the available commands (like backward-kill-line) are listed in http://www.gnu.org/software/bash/manual/bashref.html#index-backward_002dkill_002dline-_0028C_002dx-Rubout_0029

you can view existing keyboard shortcuts/bindings with bind -p or

$ bind -q backward-kill-word
backward-kill-word can be invoked via "\M-\C-h", "\M-\C-?".
~
$ bind -q backward-word
backward-word can be invoked via "\M-\M-[D", "\M-b", "\C-\E[[D".
~
$ bind -q beginning-of-line
beginning-of-line can be invoked via "\C-a", "\M-OH", "\M-[1~", "\M-[H".
~

don't mess with TERMCAP

Related Question