Wie bewege ich den Cursor im Einfügemodus über das Ende der Zeile hinaus, wenn ich die Zeilenbearbeitung im vi-Stil auf Bash verwende?

Im Folgenden ^zeigt das die Position des Cursors an.

Ich verwende bash auf Terminal unter OS X Yosemite und möchte die Zeilenbearbeitung im vi-Stil verwenden:

prompt$ set -o vi
                 ^

Standardmäßig startet es im vi-Einfügemodus, sodass ich sofort tippen kann

prompt$ hello
             ^

Nehmen wir nun an, ich benutze die linke Pfeiltaste oder Hum mich nach links zu bewegen:

prompt$ hello
            ^

Jetzt kann ich mich nicht mehr mit entweder oder nach rechts vom oin bewegen :helloL

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

Wenn ich etwas anhängen soll, muss ich Escdann drücken ShiftA.

Dies passiert nicht im Emacs-Modus ( set -o emacs) oder auf bestimmten Linux-Rechnern (ssh in SLC 6.6 mit Bash 4.1 oder nativ auf dem meines Freundes (ich glaube Arch) mit Bash 4.3). In all diesen führt mich dann zum Ende der Zeile, wo ich weiter tippen kann; Auf meinem Mac-Terminal kann ich nicht, es sei denn, ich verlasse den Einfügemodus.

Dies passiert auch nicht mit vim auf meinem Mac; Mit vim kann ich im Einfügemodus mit den Pfeiltasten über das Zeilenende hinausgehen. Es ist nur readline vi-Modus.

Ich habe versucht, meine Bash (mit Homebrew) von 3.2 auf 4.3 zu aktualisieren; das hat es nicht behoben.

Ich habe versucht, mein .bash_profile zu entfernen und ein unverändertes Terminal zu verwenden. das hat es nicht behoben. (Ich habe einige Aliase und Eingabeaufforderungsmodifikatoren in meinem .bash_profile.)

Ich habe dies , dies und dies gelesen . Sie haben keine Antworten.

Danke im Voraus für jeden Rat!

Bearbeiten: Auf einem Linux-System, auf dem die Dinge so funktionieren, wie ich es möchte, gibt die TERM-Variable

prompt$ echo $TERM
xterm-256color

Der Inhalt von /etc/inputrcsind

# 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
Können Sie den Wert der TERMUmgebungsvariablen sowie den Inhalt von /etc/inputrcund ~/.inputrc(falls vorhanden) von einem der Systeme posten, auf denen dieses Verhalten so funktioniert, wie Sie es möchten (nur die nicht kommentierten Zeilen, da die Datei möglicherweise ziemlich groß ist) ?
@mjturner Ich habe meinen Beitrag bearbeitet. Ich habe keine .inputrcin meinem Home-Verzeichnis. Ich habe den Inhalt von gepostet /etc/inputrc, er war ziemlich kurz, aber ich weiß nicht, ob dieser hier genau der /etc/inputrcist, den Sie wollen, da der Linux-Rechner, auf dem ich arbeite, vielen Benutzern dient.
Es gibt eine interessante Diskussion über genau dasselbe Problem auf der Bug-Bash-Mailingliste , allerdings auf einer DEC-Alpha. Wenn Sie den vollständigen Thread lesen, schlägt Chet Ramey vor, dass ein termcap-Eintrag (termininfo auf einem Mac) ein Esc senden könnte, was Probleme mit dem vi-Modus verursacht.
Okay, es hat eigentlich nur zufällig angefangen zu arbeiten. Ich schätze, mein Bash-Update hat einige Zeit gebraucht, um "zu dauern". Ich denke, die Lösung besteht darin, Bash auf Macs von 3.2 auf 4.3 zu aktualisieren. @mjturner Danke für deine Hilfe!

Antworten (1)

Es stellt sich heraus, dass die Lösung einfach ist: Aktualisieren Sie bash auf 4.3 . Die Standard-Bash auf Macs (sogar Yosemite) ist 3.2. (Meine obige Frage besagt, dass ich aktualisiert habe und es nicht funktioniert hat, aber ich denke, es hat eine Weile gedauert, bis es "dauerte".)

Installieren Sie Homebrew mit

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

dann mach

brew install bash

Ändern Sie dann Ihren Standard-Shell-Pfad (in den Terminaleinstellungen) in

/usr/local/bin/bash

und das ist es. Überprüfen Sie Ihre Bash-Version mit

bash --version

und als zusätzlichen Bonus können Sie Modusanzeigen erhalten!

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

und es wird ein +für den Einfügemodus und :für den Befehlsmodus angezeigt.

Idealerweise sollten Sie auch Ihre neue Version von bash hinzufügen /etc/shellsund dann Ihre Shell mit chsh(oder System Preferences > Accounts ) ändern.