O 'less' ou 'more' suporta ansi escape '\ x1b [2K' (erase_line)?

2

Basicamente eu quero animar meu terminal, mas como o texto é muito longo, eu preciso de um pager. Vamos apenas dizer que eu quero mudar a cor do meu texto periodicamente em menos. É possível?

    
por stevemao 12.02.2016 / 15:38

3 respostas

2

EDITAR As respostas de vonbrand e Thomas Dickey são tecnicamente mais precisos.

less oferece suporte a escopos ANSI brutos quando a opção -r é usada. Também suporta Apagar na linha.

Você não verá nenhuma animação. Por exemplo:

echo -e "foo\x1b[1G\x1b[2Kbar" > test.ansi
less -r test.ansi

Somente imprimirá bar .

more transmite escutas ANSI por padrão, mas não suporta edição de linha do que testei.

Veja também esta resposta do Stackoverflow sobre as diferenças de less , more e most .

    
por 12.02.2016 / 18:37
1

O que reage às sequências de escape é normalmente o tty (a menos que o programa em execução o determine a não honrá-los, caso em que o programa em si pode fazê-lo). more(1) faz reescrita de tela bastante primitiva (é realmente suficiente escrever linhas de comprimento de tela e esperar por um pressionamento de tecla), então eu acho que apenas passa a entrada. less(1) precisa de backup, por isso precisa de um controle mais detalhado da tela.

    
por 12.02.2016 / 18:54
1

Limpar a linha tem apenas uma relação indireta com a alteração das cores do terminal: se você alterar a cor background , muitos terminais (console Linux, rxvt, xterm e programas imitando um deles) irá colorir a área limpa do fundo usando essa cor.

less usa algumas operações de limpeza, mas não \x1b[2K . Lendo a fonte , ela usa vários recursos usando a interface termcap. As partes mais relevantes são descritas na página de manual terminfo (5) :

   clr_bol                   el1    cb   Clear to beginning
                                         of line
   clr_eol                   el     ce   clear to end of line
                                         (P)

Ou seja, \x1b[K e \x1b[K , para el1 e el , respectivamente. Não há capacidade de termcap convencional el2 e (a menos que você diga less para apenas passar o conteúdo de um arquivo usando a opção -r ou -R ), less não enviará \x1b[2K .

O mesmo é válido para more , por exemplo, como no pacote util-linux : ele usa apenas recursos do termcap. Ao contrário de less , more não tem opção para enviar caracteres não imprimíveis diretamente para o terminal.

Se você usa a opção -r ou -R de less , é necessário ter em mente que é limitado : less não sabe (ou se importa muito) o que essas fugas fazem. Na página de manual :

-r or --raw-control-chars
Causes "raw" control characters to be displayed. The default is to display control characters using the caret notation; for example, a control-A (octal 001) is displayed as "^A". Warning: when the -r option is used, less cannot keep track of the actual appearance of the screen (since this depends on how the screen responds to each type of control character). Thus, various display problems may result, such as long lines being split in the wrong place.

    
por 12.02.2016 / 23:16