readline - por que ele só faz o retorno de carro e não um avanço de linha ao chegar ao fim da linha?

3

Eu desenvolvi um aplicativo python que usa o módulo cmd para criar uma interface de linha de comando interativa. Este módulo cmd usa readline para gerenciamento de linha de comando: conclusão, histórico ...

Meu problema é: no computador que estou tentando usar esse aplicativo, quando digito linhas muito longas, ele volta ao início da linha e não insere uma linha. Então estou escrevendo sobre a linha em si. Isso faz com que os comandos de navegação e edição na história sejam uma dor real. Embora funcione bem na minha caixa de desenvolvimento.

Eu tentei mudar o shell do qual eu comecei python (do bash para sh), sem diferença, Tentei mudar o terminal que usei (do Terminator para XTerm ou UXTerm), sem diferença.

Qual seria o seu palpite sobre de onde vem e como resolver esse problema?

Editar: Aqui está uma captura de tela. Eu encontrei a causa do bug, ele vem de caracteres de cor que não são bem tratados quando comparado ao comprimento da linha terminal, eu acho.

Na primeira parte da captura de tela (acima da linha verde), estou usando um prompt colorido (você pode ver o pink /) e, ao chegar ao final da linha, começo a escrever sobre o prompt. Se eu continuar escrevendo, posso escrever uma linha completa, sobrescrevendo a primeira linha original completamente e então ela começa a alimentar novas linhas.

Na segunda parte (abaixo da linha verde), estou escrevendo até o final da linha e o feed de linha aparece no momento certo.

Qual poderia ser a explicação por trás desse comportamento? (Isso não acontece em todas as configurações, como eu disse). Como eu poderia consertar isso?

    
por DaLynX 28.11.2014 / 12:00

1 resposta

2

Estava vindo do meu uso de cores. Eu estava usando as seguintes strings para colorir meu texto:

class colors:
    HEADER = '3[95m'
    OKBLUE = '3[94m'
    OKGREEN = '3[92m'
    WARNING = '3[93m'
    FAIL = '3[91m'
    ENDC = '3[0m'

Adicionei %code%21 e %code% caracteres e agora funciona!

class colors:
    HEADER = '
class colors:
    HEADER = '3[95m'
    OKBLUE = '3[94m'
    OKGREEN = '3[92m'
    WARNING = '3[93m'
    FAIL = '3[91m'
    ENDC = '3[0m'
13[95m
class colors:
    HEADER = '%pre%13[95m%pre%2'
    OKBLUE = '%pre%13[94m%pre%2'
    OKGREEN = '%pre%13[92m%pre%2'
    WARNING = '%pre%13[93m%pre%2'
    FAIL = '%pre%13[91m%pre%2'
    ENDC = '%pre%13[0m%pre%2'
2' OKBLUE = '%pre%13[94m%pre%2' OKGREEN = '%pre%13[92m%pre%2' WARNING = '%pre%13[93m%pre%2' FAIL = '%pre%13[91m%pre%2' ENDC = '%pre%13[0m%pre%2'

Post de solução relacionada: link

    
por 02.12.2014 / 14:15