Como faço para mover o cursor após o final da linha no modo de inserção ao usar a edição de linha no estilo vi no bash?

2

Em tudo o que se segue, o ^ indica a posição do cursor.

Estou usando o bash no Terminal no OS X Yosemite e gostaria de usar a edição de linhas no estilo vi:

prompt$ set -o vi
                 ^

Por padrão, ele inicia no modo de inserção do vi, para que eu possa digitar imediatamente

prompt$ hello
             ^

Agora digamos que eu use a tecla de seta para a esquerda ou H para mover para a esquerda:

prompt$ hello
            ^

Agora eu não posso mais me mover para o certo do o em hello usando qualquer ou eu :

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

Se eu tiver que acrescentar alguma coisa, tenho que acertar Esc então Mudança UMA .

Isso não acontece no modo emacs ( set -o emacs ) ou em certas máquinas Linux (ssh'd no SLC 6.6 com bash 4.1, ou nativamente no meu amigo (acho Arch) com bash 4.3). Em tudo isso, então leva-me ao final da linha onde posso continuar a escrever; no meu terminal Mac eu não posso a menos que eu deixe o modo de inserção.

Isso também não acontece com o vim no meu Mac; O vim me permite passar pelo final das linhas com as teclas de seta no modo Inserir. É apenas o modo readline vi.

Eu tentei atualizar meu bash (com o Homebrew) de 3.2 para 4.3; isso não resolveu.

Eu tentei remover meu .bash_profile e usar um terminal não modificado; isso não resolveu. (Eu tenho alguns aliases e modificadores de prompt no meu .bash_profile.)

eu li isto , isto e isto . Eles não têm respostas.

Agradecemos antecipadamente por qualquer conselho!

Editar: Em um sistema Linux onde as coisas funcionam como eu gostaria, a variável TERM dá

prompt$ echo $TERM
xterm-256color

O conteúdo de /etc/inputrc está

# 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
Riju Dasgupta
fonte
Você pode postar o valor do TERM variável de ambiente, bem como o conteúdo de /etc/inputrc e ~/.inputrc (se existir) de um dos sistemas em que esse comportamento funciona como você deseja (apenas as linhas não comentadas, pois o arquivo é possivelmente muito grande)?
mjturner
@mjturner Eu editei meu post. Eu não tenho .inputrc no meu diretório home. Eu postei o conteúdo de /etc/inputrc, foi bem curto, mas não sei se esse particular /etc/inputrc é o que você quer, já que a máquina Linux na qual eu trabalho serve muitos usuários.
Riju Dasgupta
Há uma discussão interessante sobre exatamente o mesmo problema no lista de discussão do bug-bash , embora em um DEC Alpha. Se você ler o tópico completo, Chet Ramey sugere que uma entrada termcap (terminfo em um Mac) poderia estar enviando um Esc, causando problemas com o modo vi.
mjturner
Ok, na verdade, apenas aleatoriamente começou a trabalhar. Eu acho que minha atualização bash levou algum tempo para "tirar". Então eu acho que a solução é atualizar o bash de 3.2 para 4.3 em Macs. @mjturner Obrigado pela sua ajuda!
Riju Dasgupta

Respostas:

1

Acontece que a solução é simples: atualize a festa para 4.3 . O bash padrão em Macs (até Yosemite) é 3.2. (Minha pergunta acima diz que atualizei e não funcionou, mas acho que demorou um pouco para "pegar".)

Instale o Homebrew com

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

então faça

brew install bash

em seguida, altere o caminho do shell padrão (em Preferências do Terminal) para

/usr/local/bin/bash

e é isso. Verifique sua versão bash com

bash --version

e como um bônus adicional, você pode obter indicadores de modo!

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

e mostrará um + para o modo de inserção e : para o modo de comando.

Riju Dasgupta
fonte
Idealmente, você também deve adicionar sua nova versão do bash para /etc/shells e depois mudar o seu shell usando chsh (ou Preferências do Sistema & gt; Contas ).
mjturner