Come si sposta il cursore oltre la fine della riga in modalità di inserimento quando si utilizza la modifica in linea in stile vi su bash?


2

In tutto ciò che segue, il ^ indica la posizione del cursore.

Sto usando bash su Terminal su OS X Yosemite e mi piacerebbe usare il montaggio in linea in stile vi:

prompt$ set -o vi
                 ^

Per impostazione predefinita, inizia in modalità di inserimento vi, quindi posso digitare immediatamente

prompt$ hello
             ^

Ora diciamo che uso il tasto freccia sinistra o H per spostare a sinistra:

prompt$ hello
            ^

Ora non posso più spostarmi al destra del o nel hello usando entrambi o L :

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

Se devo aggiungere qualcosa, devo colpire Esc poi Cambio UN .

Questo non succede in modalità emacs ( set -o emacs ) o su alcune macchine Linux (ssh'd in SLC 6.6 con bash 4.1, o nativamente sul mio amico (credo Arch) con bash 4.3). In tutti questi, poi mi porta alla fine della riga dove posso continuare a digitare; sul mio terminale Mac non posso a meno che non esca dalla modalità Insert.

Anche questo non succede con vim sul mio Mac; vim mi consente di passare oltre la fine delle linee con i tasti freccia nella modalità di inserimento. È solo in modalità vi leggibile.

Ho provato ad aggiornare il mio bash (con Homebrew) da 3.2 a 4.3; questo non l'ha risolto

Ho provato a rimuovere il mio .bash_profile e ad usare un Terminale non modificato; questo non l'ha risolto (Ho alcuni alias e prompt modificatori nel mio .bash_profile.)

ho letto Questo , Questo , e Questo . Non hanno risposte.

Grazie in anticipo per qualsiasi consiglio!

Modificare: Su un sistema Linux in cui le cose funzionano come vorrei, la variabile TERM dà

prompt$ echo $TERM
xterm-256color

Il contenuto di /etc/inputrc siamo

# 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

Puoi pubblicare il valore di TERM variabile ambientale così come i contenuti di /etc/inputrc e ~/.inputrc (se esiste) da uno dei sistemi in cui questo comportamento funziona come si desidera (solo le righe non commentate come il file è probabilmente abbastanza grande)?
mjturner

@mjturner Ho modificato il mio post. Non ho un .inputrc nella mia home directory. Ho pubblicato il contenuto di /etc/inputrc, è stato piuttosto breve, ma non so se questo particolare /etc/inputrc è quello che vuoi, dal momento che la macchina Linux su cui lavoro serve molti utenti.
Riju Dasgupta

C'è un'interessante discussione sullo stesso identico problema su mailing list bug-bash , anche se su un DEC Alpha. Se leggi la discussione completa, Chet Ramey suggerisce che una voce termcap (terminfo su un Mac) potrebbe inviare una Esc, causando problemi con la modalità vi.
mjturner

Ok, in realtà ha iniziato a lavorare in modo casuale. Suppongo che il mio aggiornamento bash abbia richiesto del tempo per "prendere". Quindi immagino che la soluzione sia aggiornare bash da 3.2 a 4.3 sui Mac. @mjturner Grazie per il tuo aiuto!
Riju Dasgupta

Risposte:


1

Risulta che la soluzione è semplice: aggiornare bash a 4.3 . Il bash predefinito su Mac (anche Yosemite) è 3.2. (La mia domanda sopra dice che ho fatto l'aggiornamento e non ha funzionato, ma penso che ci sia voluto un po 'per "prendere".)

Installa Homebrew con

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

Quindi fa

brew install bash

quindi cambia il percorso della shell di default (in Preferenze Terminale) a

/usr/local/bin/bash

e questo è tutto. Controlla la tua versione di bash con

bash --version

e come bonus aggiuntivo, puoi ottenere gli indicatori di modalità!

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

e mostrerà a + per la modalità di inserimento e : per la modalità Comando.


Idealmente, dovresti anche aggiungere la tua nuova versione di bash a /etc/shells e poi cambia la shell usando chsh (o Preferenze di Sistema & Gt; conti ).
mjturner
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.