How do I change bash history completion to complete what's already on the line?

I found a command a couple of months ago that made my bash history auto-complete on what's already on the line when pressing the up arrow:

$ vim fi

Press

$ vim file.py

I'd like to set this up on my new computer, because it saves a lot of time when keeping a big history. The problem is that I can't for the life of me remember where it was mentioned and reading through endless bash references and tutorials unfortunately didn't help either.

Does anybody know the command?


Solution 1:

Probably something like

# ~/.inputrc
"\e[A": history-search-backward
"\e[B": history-search-forward

or equivalently,

# ~/.bashrc
if [[ $- == *i* ]]
then
    bind '"\e[A": history-search-backward'
    bind '"\e[B": history-search-forward'
fi

(the if statement checks for interactive mode)

Normally, Up and Down are bound to the Readline functions previous-history and next-history respectively. I prefer to bind PgUp/PgDn to these functions, instead of displacing the normal operation of Up/Down.

# ~/.inputrc
"\e[5~": history-search-backward
"\e[6~": history-search-forward

After you modify ~/.inputrc, restart your shell or use Ctrl+X, Ctrl+R to tell it to re-read ~/.inputrc.


By the way, if you're looking for relevant documentation:

Bash uses The GNU Readline Library for the shell prompt and history.

Solution 2:

Update .inputrc with the following:

"\C-[OA": history-search-backward
"\C-[[A": history-search-backward

"\C-[OB": history-search-forward
"\C-[[B": history-search-forward

Solution 3:

If set enable-keypad on is in your ~/.inputrc as some st (suckless simple terminal) users might, be aware that the arrows keys are in keypad mode. Ubuntu ships with this useful /usr/share/doc/bash/inputrc.arrows:

# This file controls the behaviour of line input editing for
# programs that use the Gnu Readline library.
#
# Arrow keys in keypad mode
#
"\C-[OD"        backward-char
"\C-[OC"        forward-char
"\C-[OA"        previous-history
"\C-[OB"        next-history
#
# Arrow keys in ANSI mode
#
"\C-[[D"        backward-char
"\C-[[C"        forward-char
"\C-[[A"        previous-history
"\C-[[B"        next-history
#
# Arrow keys in 8 bit keypad mode
#
"\C-M-OD"       backward-char
"\C-M-OC"       forward-char
"\C-M-OA"       previous-history
"\C-M-OB"       next-history
#
# Arrow keys in 8 bit ANSI mode
#
"\C-M-[D"       backward-char
"\C-M-[C"       forward-char
"\C-M-[A"       previous-history
"\C-M-[B"       next-history

So I'm not sure if you'll need all, but it might not hurt to have in your ~/.inputrc:

# Arrow keys in keypad mode
"\C-[OA": history-search-backward
"\C-[OB": history-search-forward
"\C-[OC": forward-char
"\C-[OD": backward-char

# Arrow keys in ANSI mode
"\C-[[A": history-search-backward
"\C-[[B": history-search-forward
"\C-[[C": forward-char
"\C-[[D": backward-char

This is also on the same topic: My cursor keys do not work and also this xterm: special keys