[vox-tech] readline questions (in bash)
Peter Jay Salzman
vox-tech@lists.lugod.org
Fri, 13 Jun 2003 12:34:32 -0700
hi all,
it took me about 3 years of searching to find the answer to this.
i can't remember the guy's name who wrote this, but i've found the
results to be very, very satisfactory. i'm quite pleased with these
bindings.
basically, you're in emacs mode, so ^w, ^e, ^a, ^u work, as do up/down
arrow keys.
once you press escape, you're in vi command mode. however, the arrow
keys actually work! another annoyance with vi mode was that ^l didn't
work either without pressing escape first. that's fixed by these
bindings as well.
i put all this in a file /etc/skell/.bash_bindings and ~/.bash_bindings.
then i source it everytime an interactive shell is started.
hth,
pete
## .bash_bindings: source this file from your .bashrc or .bash_profile
#
# For those who want to use Vi bindings in bash, this corrects a
# few annoyances:
#
# 1) up and down arrows retrieve history lines even in insert mode
# 2) left and right arrows work in insert mode
# 3) Ctrl-A and Ctrl-E work how you expect if you have had to
# live in Emacs mode in the past.
# 4) So does Ctrl-D.
# 5) And Ctrl-L.
## Command-mode bindings
# Ctrl-A or Home: insert at line beginning like in emacs mode
bind -m vi-command 'Control-a: vi-insert-beg'
# Ctrl-E or End: append at line end like in emacs mode
bind -m vi-command 'Control-e: vi-append-eol'
# to switch to emacs editing mode
bind -m vi-command '"ZZ": emacs-editing-mode'
## Insert-mode bindings
# up arrow or PgUp: append to previous history line
bind -m vi-insert '"\M-[A": "=10=05"'
bind -m vi-insert '"\M-[5~": "=10=05"'
bind -m vi-insert 'Control-p: previous-history'
# dn arrow or PgDn: append to next history line
bind -m vi-insert '"\M-[B": "=0E=05"'
bind -m vi-insert '"\M-[6~": "=0E=05"'
bind -m vi-insert 'Control-n: next-history'
# Ctrl-A: insert at line start like in emacs mode
bind -m vi-insert 'Control-a: beginning-of-line'
# Ctrl-E: append at line end like in emacs mode
bind -m vi-insert 'Control-e: end-of-line'
# Ctrl-D: delete character
bind -m vi-insert 'Control-d: delete-char'
# Ctrl-L: clear screen
bind -m vi-insert 'Control-l: clear-screen'
## Emacs bindings
# Meta-V: go back to vi editing
bind -m emacs '"\ev": vi-editing-mode'
## Specify vi editing mode
set -o vi