In all that follows, the ^ indicates the position of the cursor.
I'm using bash on Terminal on OS X Yosemite and I'd like to use vi-style line editing:
prompt$ set -o vi
^
By default it starts in vi Insert mode, so I can immediately type
prompt$ hello
^
Now let's say I use the left arrow key ← or H to move left:
prompt$ hello
^
Now I can no longer move to the right of the o in hello using either → or L:
prompt$ hello # I can't move here anymore!
^
If I am to append something, I have to hit Esc then ShiftA.
This does not happen in emacs mode (set -o emacs) or on certain Linux machines (ssh'd into SLC 6.6 with bash 4.1, or natively on my friend's (I think Arch) with bash 4.3). In all of these, ← then → takes me to the end of the line where I can keep typing; on my Mac terminal I cannot unless I leave Insert mode.
This also does not happen with vim on my Mac; vim lets me move past end of lines with arrow keys in Insert mode. It's just readline vi mode.
I tried updating my bash (with Homebrew) from 3.2 to 4.3; that did not fix it.
I tried removing my .bash_profile and using an unmodified Terminal; that did not fix it. (I have some aliases and prompt modifiers in my .bash_profile.)
I have read this, this, and this. They don't have answers.
Thanks in advance for any advice!
Edit: On a Linux system where things work as I would like it to, the TERM variable gives
prompt$ echo $TERM
xterm-256color
The contents of /etc/inputrc are
# do not bell on tab-completion
#set bell-style none
set meta-flag on
set input-meta on
set convert-meta off
set output-meta on
# Completed names which are symbolic links to
# directories have a slash appended.
set mark-symlinked-directories on
$if mode=emacs
# for linux console and RH/Debian xterm
"\e[1~": beginning-of-line
"\e[4~": end-of-line
# commented out keymappings for pgup/pgdown to reach begin/end of history
#"\e[5~": beginning-of-history
#"\e[6~": end-of-history
"\e[5~": history-search-backward
"\e[6~": history-search-forward
"\e[3~": delete-char
"\e[2~": quoted-insert
"\e[5C": forward-word
"\e[5D": backward-word
"\e[1;5C": forward-word
"\e[1;5D": backward-word
# for rxvt
"\e[8~": end-of-line
"\eOc": forward-word
"\eOd": backward-word
# for non RH/Debian xterm, can't hurt for RH/DEbian xterm
"\eOH": beginning-of-line
"\eOF": end-of-line
# for freebsd console
"\e[H": beginning-of-line
"\e[F": end-of-line
1 Answer 1
It turns out the solution is simple: update bash to 4.3. The default bash on Macs (even Yosemite) is 3.2. (My question above says I did update and it didn't work, but I think it took a while for it to "take.")
Install Homebrew with
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
then do
brew install bash
then change your default shell path (in Terminal Preferences) to
/usr/local/bin/bash
and that's it. Check your bash version with
bash --version
and as an added bonus, you can get mode indicators!
bind 'set show-mode-in-prompt on'
and it will show a + for Insert mode and : for Command mode.
-
Ideally, you should also add your new version of bash to
/etc/shellsand then change your shell usingchsh(or System Preferences > Accounts).mjturner– mjturner2015年08月11日 12:44:07 +00:00Commented Aug 11, 2015 at 12:44
TERMenvironment variable as well as the contents of/etc/inputrcand~/.inputrc(if it exists) from one of the systems where this behaviour works as you want it to (just the non-commented lines as the file is possibly quite large)?.inputrcin my home directory. I posted the contents of/etc/inputrc, it was pretty short, but I don't know if this particular/etc/inputrcis the one you want, since the Linux machine on which I work serves many users.