A pesquisa reversa do histórico no bash seguida pelas teclas de seta faz com que o cursor seja exibido no local errado

10

Notei que muitas vezes quando estou pesquisando o histórico reverso na linha de comando via CTRL+ r, se eu quiser editar o comando, às vezes o cursor salta para a posição errada quando pressiono uma tecla de seta ou digito CTRL+ aou CTRL+ e. A posição específica que salta para parece ser um deslocamento igual ao tamanho da minha linha de comando prompt de como conjunto em PS1.

Isso causa dificuldade porque a localização real do cursor é diferente da renderizada na tela; edições futuras no comando são renderizadas como se o cursor estivesse onde ele saltou, mas o comando real mantém o local correto sem nenhum salto.

Alguém sabe o que está causando isso ou como corrigi-lo?

Edição: se eu adicionar uma nova linha no final do PS1problema parece desaparecer. No entanto, eu preferiria inserir o comando na mesma linha que o prompt.

jonderry
fonte

Respostas:

6

Isso geralmente é causado por comandos no seu histórico com mais de 1 linha. Quando você seleciona um item mais curto do histórico, ele não leva em consideração a largura do prompt na nova renderização da linha de comando; portanto, tudo depois desse comando longo é complicado.

A solução fácil que encontrei é pressionar a tecla Home, inserir "eco" e pressionar Enter. Em seguida, chame o último comando e edite a partir daí. (Primeiro removendo o eco. :)

cabbey
fonte
Obrigado, tentei isso há pouco tempo. No meu caso, fui descuidado e explodi um arquivo porque havia um cano no comando que engoliu o eco. Você está correto, isso parece afetar apenas comandos longos, de acordo com minha experiência.
precisa saber é o seguinte
Uma solução melhor do que o eco que eu acabei de encontrar: Anexe um '#' ao início da linha em vez de um eco. Dessa forma, o bash trata toda a linha como um comentário.
jonderry
1
Ainda melhor: o problema parece desaparecer se a linha atual for redesenhada. Cl para limpar a tela e redesenhar a linha atual ou criar uma ligação de tecla para a função não acoplada redesenhar-linha-atual.
jonderry
Eu esqueci de mencionar a solução Cl, porque eu realmente odeio perder o buffer de rolagem, mas sim, é uma falha temporária na renderização da navegação do histórico, portanto, forçar um redesenho o corrigirá. redesenhar a linha atual parece uma solução ainda melhor!
Cabbey #
13

Talvez você tenha seqüências de escape não imprimíveis no PS1 não incluídas em \ [e \].

Certifique-se de incluir todos eles assim:

\[\e[33m\]\w\[\e[31m\] $ \[\e[0m\]
Aleksandr Somov
fonte
1
Funciona muito bem se você incluir apenas as seqüências não-impressão em \[e \](assim você precisar de vários grupos de estas citações em bloco)
Andomar