¿Cómo muevo el cursor más allá del final de la línea en el modo Insertar cuando uso la edición de línea estilo vi en bash?

En todo lo que sigue, el ^indica la posición del cursor.

Estoy usando bash en Terminal en OS X Yosemite y me gustaría usar la edición de línea estilo vi:

prompt$ set -o vi
                 ^

De forma predeterminada, comienza en el modo de inserción vi, por lo que puedo escribir inmediatamente

prompt$ hello
             ^

Ahora digamos que uso la tecla de flecha izquierda o Hpara moverme a la izquierda:

prompt$ hello
            ^

Ahora ya no puedo moverme a la derecha del oen hellousando o L:

prompt$ hello  # I can't move here anymore!
             ^

Si voy a agregar algo, tengo que presionar Escentonces ShiftA.

Esto no sucede en modo emacs ( set -o emacs) o en ciertas máquinas Linux (ssh'd en SLC 6.6 con bash 4.1, o de forma nativa en la de mi amigo (creo que Arch) con bash 4.3). En todos estos, luego me lleva al final de la línea donde puedo seguir escribiendo; en mi terminal Mac no puedo a menos que deje el modo Insertar.

Esto tampoco sucede con vim en mi Mac; vim me permite pasar el final de las líneas con las teclas de flecha en el modo Insertar. Es solo el modo readline vi.

Intenté actualizar mi bash (con Homebrew) de 3.2 a 4.3; eso no lo arregló.

Intenté eliminar mi .bash_profile y usar una Terminal sin modificar; eso no lo arregló. (Tengo algunos alias y modificadores de solicitud en mi .bash_profile).

He leído esto , esto y esto . No tienen respuestas.

¡Gracias de antemano por cualquier consejo!

Editar: en un sistema Linux donde las cosas funcionan como me gustaría, la variable TERM da

prompt$ echo $TERM
xterm-256color

Los contenidos de /etc/inputrcson

# 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
¿Puede publicar el valor de la TERMvariable de entorno, así como el contenido de /etc/inputrcy ~/.inputrc(si existe) de uno de los sistemas donde este comportamiento funciona como desea (solo las líneas no comentadas ya que el archivo es posiblemente bastante grande) ?
@mjturner Edité mi publicación. No tengo una .inputrcen mi directorio de inicio. Publiqué el contenido de /etc/inputrc, fue bastante breve, pero no sé si este en particular /etc/inputrces el que desea, ya que la máquina Linux en la que trabajo sirve a muchos usuarios.
Hay una discusión interesante sobre exactamente el mismo problema en la lista de correo de bug-bash , aunque en un DEC Alpha. Si lee el hilo completo, Chet Ramey sugiere que una entrada de termcap (terminfo en una Mac) podría estar enviando un Esc, causando problemas con el modo vi.
De acuerdo, en realidad comenzó a funcionar al azar. Supongo que mi actualización de bash tomó algún tiempo para "tomar". Así que supongo que la solución es actualizar bash de 3.2 a 4.3 en Mac. @mjturner ¡Gracias por tu ayuda!

Respuestas (1)

Resulta que la solución es simple: actualice bash a 4.3 . El bash predeterminado en Mac (incluso Yosemite) es 3.2. (Mi pregunta anterior dice que actualicé y no funcionó, pero creo que tomó un tiempo para que "tomara").

Instalar Homebrew con

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

entonces hazlo

brew install bash

luego cambie su ruta de shell predeterminada (en Preferencias de terminal) a

/usr/local/bin/bash

y eso es. Comprueba tu versión de bash con

bash --version

y como bono adicional, ¡puedes obtener indicadores de modo!

bind 'set show-mode-in-prompt on'

y mostrará una +para el modo Insertar y :para el modo Comando.

Idealmente, también debe agregar su nueva versión de bash /etc/shellsy luego cambiar su shell usando chsh(o Preferencias del sistema > Cuentas ).