Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

bash home/end/delete key inserting tilde, or if preceded by escape key, [1~

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

$ echo hel~lp

$ echo hell[3~o

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

what i want is cmd.exe like behaviour,

I want Esc to clear the current line / buffer I want Home to move cursor to start of line before first character I want End to move cursor to end of line before first character 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
share|improve this question
windows, no terminal emulator, msys.bat, if I knew how to report the setting, I wouldn't be asking how to set them – optional Feb 16 '13 at 3:39
up vote 13 down vote accepted

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
    #$if term=cygwin # Console
        "\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


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

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

share|improve this answer
find / -name 'inputrc.default' finds nothing on my machine. My home and end used to work... :( Also, FYI to others: To reload the .inputrc file, use bind -f ~/.inputrc. – aliteralmind Jan 10 '15 at 20:47
Ah! Correction: I used your .inputrc, except for the $if mode=emacs block. I added these two lines, and they work again!! :D "\e[1~": beginning-of-line ... "\e[4~": end-of-line. – aliteralmind Jan 10 '15 at 20:57

Well, since you say you're working on Windows and not using a proper terminal emulator such as PuTTY (with mintty, puttycyg et al), I would recommend you consult the readline documentation and learn the shortcuts for readline. It'll be better in the long run.

If you were to use a terminal emulator instead of the console window (not talking about the interpreter/shell here) that comes with Windows, you'd get a more configurable alternative. Once you attempt using other programs like Vim, things will only get worse.

The gist: use a proper terminal emulator, even on Windows or learn the readline shortcuts. I tested the ones I use most just now and they work with msys.bat.

mingw-get install mintty && mintty

The file to edit would be /usr/share/terminfo (which doesn't exist in MinGW) - use tic to "compile" rules (which isn't even included because everyone knows that the support would be severely crippled). However, I haven't seen any useful development to make this even near usable on Windows. This is why you should use a proper terminal emulator in the first place. But I'm sure a surgeon will be able to use a kitchen knife for surgery, so why shouldn't you use the Windows built-in console windows. Good luck.

share|improve this answer

I found the following helpful as well:


If your keys are not working, it could be because your particular terminal sends escape codes not in this list. First you need to find out what escape codes are being sent. To see them, you can use a Readline command called "quoted-insert" or run the command showkey --scancodes which outputs the value of a key verbatim. The default binding for quoted-insert is Ctrl+V.

For example, you could give the following series of inputs in your terminal:


And get as output

$ ^[[1~ ^[[4~

The ^[ indicates an escape character in your shell, so this means that your Home key has an escape code of [1~ and you End key has an escape code of [4~. Since these escape codes are not listed in the default Readline config, you will need to add them:

"\e[1~": beginning-of-line
"\e[4~": end-of-line

Note that Readline uses \e to indicate an escape character.

The relevant piece for me was putting this in inputrc:

"\e[1~": beginning-of-line
"\e[4~": end-of-line
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.