iPython Like Command History For Shell
Bash does have that feature too, but it's not enabled by default. You can bind it to cursor up/down by sticking this into ~/.inputrc
:
"\e[A": history-search-backward
"\e[B": history-search-forward
I prefer to bind it to Ctrl+up/down instead:
"\e[1;5A": history-search-backward
"\e[1;5B": history-search-forward
edit: To preserve ctrl+left and ctrl+right for moving back and forward in whole words, also include these lines in ~/.inputrc
file:
# mappings for Ctrl-left-arrow and Ctrl-right-arrow for word moving
"\e[1;5C": forward-word
"\e[1;5D": backward-word
"\e[5C": forward-word
"\e[5D": backward-word
"\e\e[C": forward-word
"\e\e[D": backward-word
Try hitting Ctrl + R, and typing a few letters. It works in the reverse order as well.
And don't forget the fantastic history expansion shortcuts in bash. 1
I'm posting some excerpts from the manpage, in case you haven't tattooed them on your arm (or memorized them).
Event Designators
An event designator is a reference to a command line entry in the his‐
tory list.
! Start a history substitution, except when followed by a blank,
newline, carriage return, = or ( (when the extglob shell option
is enabled using the shopt builtin).
!n Refer to command line n.
!-n Refer to the current command line minus n.
!! Refer to the previous command. This is a synonym for `!-1'.
!string
Refer to the most recent command starting with string.
!?string[?]
Refer to the most recent command containing string. The trail‐
ing ? may be omitted if string is followed immediately by a new‐
line.
^string1^string2^
Quick substitution. Repeat the last command, replacing string1
with string2. Equivalent to ``!!:s/string1/string2/'' (see Mod‐
ifiers below).
!# The entire command line typed so far.
I frequently use the ability to refer to the last 'word' of the previous command. E.g.,
mkdir /foo/shmoo/adir.horribilus.foo
cp file1 file2 file3 file4 !$
ls -l !$
In both cases here, the !$
matches /foo/shmoo/adir.horribilus.foo
.
1... which were taken from csh. To mitigate the scope of bash's feature theft, the bash man page says
The shell supports a history expansion feature that is similar to the
history expansion in csh.
So, it's "similar". Any of this might break in csh
or tcsh
. Or whichever csh descendent you are not using due to the fact that it isn't as wonderful as bash
.