Readline: Vinculando uma sequência de escape ANSI a uma chave

4

Eu gostaria de ligar uma chave com bash / readline, para limpar a parte inferior da tela do meu console.

A sequência ANSI para limpar a parte inferior da tela é \e[J , então eu tentei adicionar a seguinte linha ao meu .inputrc , mas isso não funciona, ele simplesmente ignora os três caracteres:

Control-N: "\e[J"

Se eu adicionar alguns caracteres de teste dentro da string:

Control-N: "BEFORE \e[J AFTER"

, então a string BEFORE é inserida e pára por aí.

Por enquanto, encontrei esta solução alternativa, mas obviamente exibe uma linha com o comando echo e não a quero:

Control-N: "echo -ne \"\e[J\"\n"

É possível enviar sequências ANSI com uma ligação readline ?

    
por yolenoyer 15.12.2015 / 20:08

2 respostas

2

Duas partes:

  • o bash permite vincular uma chave à linha de leitura função clear-screen (que parece ser o objetivo original).
  • no bash, o propósito da readline é preparar texto (editando, etc) para emitir comandos para bash . Uma seqüência de escape seria enviada ao terminal . Nenhuma das funções listadas para readline funcionaria como um substituto para echo ou printf .

Ligações de teclas para readline esperam um único nome de função ou cadeia literal. No seu exemplo, readline leu o que considerou um nome de função possível e ignorou o resto da linha.

Portanto, não, bash / readline não fornece recursos úteis para ecoar uma seqüência de escape diretamente como uma ligação de chave. Você tem que ir a outro nível, como observado, usando echo .

    
por 16.12.2015 / 01:02
0

Ao melhorar um pouco o uso do comando echo dentro do comando .inputrc , se finalmente obtiver o resultado que eu queria exatamente:

Eu coloquei o seguinte func no meu .bashrc , escolhendo deliberadamente um nome curto para o func:

cbs()
{
    echo -ne '\e[J\e[F\e[2K'
    history -d $(history 1)
}

Ele usa sequências ANSI para limpar a parte inferior da tela ( \e[J ), em seguida, move o cursor de volta para a mesma linha original ( \e[F ) antes de finalmente limpar a linha onde o comando foi inserido ( \e[2K ).

O comando também é removido diretamente do histórico do bash para não poluí-lo.

Um nome abreviado para o comando é importante, porque se a linha ficar dentro de uma janela de console muito pequena, o truque não funcionará corretamente.

Então eu ligo Ctrl-N de acordo com .inputrc :

Control-N: "cbs\n"
    
por 03.02.2017 / 15:14