Salva a posição do cursor e restaura no terminal

2

Estou jogando com alguns recursos de terminal para criar uma saída de prompt assíncrona em bash . Eu quero obter algo assim: enquanto a saída de string em PROMPT_COMMAND , salvar a posição do cursor do terminal, imprimir colocar ... e ir fazer outras coisas (impressão de outras informações, por exemplo); então algum tempo depois volte para a posição memorizada e imprima algo novo. PS1 é projetado dessa maneira que o comando em si é colocado na nova linha, de modo que a saída assíncrona seja apenas texto no terminal.

Descobri a entrada cup terminfo para mover o cursor para determinada posição, e há códigos de escape para obter a posição atual (por exemplo, consulte esta questão ). Mas para mim, parece que todos eles trabalham com a posição do cursor na tela, em vez de no buffer de terminal. Isso significa que depois de colocar uma nova linha, minha posição lembrada estará errada.

Existe alguma maneira de trabalhar com a posição do cursor do terminal para armazenar e restaurar a posição do cursor com base na posição do buffer? Você pode assumir que a posição lembrada ainda está na parte visível do buffer (assim você pode colocar o cursor lá), mas pode subir várias linhas para cima. Por enquanto, não vamos considerar condições de corrida. Se não, vou tentar encontrar outros truques.

Existe zsh shell que na verdade tem suporte a prompt assíncrono, mas eu não sei se funcionará se antes o usuário de saída pressionar Enter para ir para a nova linha.

    
por Lapshin Dmitry 25.04.2016 / 10:25

1 resposta

5

A maioria dos terminais que você pode usar implementam sequências de escape para salvar e restaurar a posição do cursor. Esses são os recursos sc (salvar cursor) e rc (restaurar cursor) na descrição do terminal, que você pode usar via tput (como cup ):

tput sc
tput cup 50 10
echo some stuff
echo more stuff
tput rc

No entanto, se o seu programa escrever texto suficiente para forçar a rolagem, a posição restaurada ainda estará no mesmo lugar na tela do terminal. Não se move junto com o texto rolado.

POSIX, a propósito, documenta apenas parte de tput porque a ferramenta é na verdade parte de outro padrão, X / Open Curses. Isso está resumido na seção portabilidade da página de manual.

Voltar para a pergunta: não há sequências de escape que rastreiam a posição buffer (representando a rolagem). Para conseguir isso, seu aplicativo teria que acompanhar o que foi enviado para a tela. Resolver esse tipo de problema é o objetivo da biblioteca de maldições. Em um aplicativo de linha de comando simples, não há muito o que você pode fazer.

    
por 25.04.2016 / 10:31