That's why I use fish. Not only does it cycle like that by default, but it autocompletes entire commands, searches for the substring in the middle of words, looks better, is faster, etc etc.
It has a build in git status script you can include in your prompt that's awesome. Here's my fish prompt (note __fish_git_prompt):
function fish_prompt
set last_status $status
set_color $fish_color_cwd
printf '%s' (prompt_pwd)
set_color normal
printf '%s ' (__fish_git_prompt)
set_color normal
end
Sample: ~/G/Calendar (branch_name * ↩ =)http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.g...
Status codes and argument lists:
$status # replaces $?
$argv # replaces $@
Aliases are just functions (configure your startup in
~/.config/fish/config.fish): # alias ls="ls -lrth"
function lr; ls -lrth $argv; end
For-loops are familiar: # for n in one two three; do echo $n; done
for n in one two three; echo $n; end
The lack of '!$' confounded my hard-wired fingers until I settled on Alt-u to avoid up-arrows (see /usr/share/fish/functions/fish_default_key_bindings.fish): bind \eu history-token-search-backward # replaces !$
bind \ei history-token-search-forward # bonus fun
The remaining price for fish's pseudo-telepathic assistance is the occasional frustration with applications that rely on the value of a user's default shell (/etc/passwd).