Search for a previous command with the same prefix when I press Up at a shell prompt
Add to the following to ~/.inputrc
:
# Press up-arrow for previous matching command
"\e[A":history-search-backward
# Press down-arrow for next matching command
"\e[B":history-search-forward
Explanation
~/.inputrc
is the configuration file for GNU readline. Many shells, including bash
and tcsh
use readline for command line editing. The two lines above will tell readline to invoke its history search functionality when the escape sequences for the up-arrow key (\e[A
) and down-arrow key (\e[B
) are encountered.
What's happening is that FreeBSD and Linux use different shells by default. FreeBSD defaults to tcsh, which had better interactive features than bash in the past (but bash has caught up) but markedly worse scripting features.
The most straightforward way to get the environment you're used to would be to switch your shell to tcsh on Linux. Provided that tcsh is installed system-wide (if it isn't, ask your system administrator to install it), run chsh -s tcsh
to change your default shell.
Alternatively, you can set up bash to have this command you're used to. By default, the Up and Down arrows navigate among all the commands in the history, not just the ones that start with the prefix you've typed. To change this to the behavior you're used to, put the following lines in bash's initialization file, which is .bashrc
in your home directory. Either run . ~/.bashrc
or start a new shell to re-read the initialization file.
bind '"\eOA": history-search-backward'
bind '"\e[A": history-search-backward'
bind '"\eOB": history-search-forward'
bind '"\e[B": history-search-forward'
The escape sequences are what your terminal sends to the shell when you press an arrow key. Up may be \eOA
(escape, O
, A
) or \e[A
depending on your terminal, and similarly for Down.
By default, bash offers different key bindings to search the command history. You can press Ctrl+R, then enter some characters to search for a command containing this substring anywhere on the line. Press Ctrl+S to go forward instead of backward. The search is incremental (i.e. as-you-type); Alt+P and Alt+N give you a non-incremental search.
Instead of bash and tcsh, you could switch to zsh, which has some neat features not found in other shells. Zsh has Ctrl+R and
Ctrl+S by default just like bash. To get Up and Down like you had in tcsh, put the following lines in ~/.zshrc
:
bindkey '\eOA' history-beginning-search-backward
bindkey '\e[A' history-beginning-search-backward
bindkey '\eOB' history-beginning-search-forward
bindkey '\e[B' history-beginning-search-forward
If you'd like to use the same shell everywhere, you can use bash or zsh on FreeBSD too, provided that the port is installed (again, ask your system administrator).