Estou escrevendo um wrapper ack
para procurar código localmente com algumas linhas adicionais de contexto canalizadas para um pager.
Aqui está o script do wrapper ackc
. Entre os diferentes exemplos, estarei variando o que é passado para ack
o --pager
.
#!/bin/sh
ack -C 20 -i \
--pager=most \
--heading \
--break \
--color \
--show-types \
"$@"
Com less
(sem o -R) como o pager, quase todas as sequências de escape são renderizadas usando a notação de acento circunflexo (não sei como isso é chamado. ^[
é a exceção. É renderizado como ESC
com cores de fundo invertidas (cores não reproduzidas aqui) .
Aqui está uma amostra da saída (produzida por ackc
with --pager=less
e variáveis de ambiente como LESS
, LESSPIPE
etc.)
ESC[1;32m.local/lib/python2.7/site-packages/markupsafe/_speedups.cESC[0m
...
ESC[1;33m19ESC[0m:#define PY_SSIZE_T_MAX ESC[30;43mINTESC[0m_MAXESC[0mESC[K
ESC[1;33m20ESC[0m:#define PY_SSIZE_T_MIN ESC[30;43mINTESC[0m_MINESC[0mESC[K
A sequência de escape importante aqui é a ^[[K
sequência no final de cada linha que contém um item destacado. Ele é tratado adequadamente por less -R
.
.local/lib/python2.7/site-packages/markupsafe/_speedups.c
...
19:#define PY_SSIZE_T_MAX INT_MAX
20:#define PY_SSIZE_T_MIN INT_MIN
most
, no entanto, não parece lidar muito bem com isso.
.local/lib/python2.7/site-packages/markupsafe/_speedups.c
1-/**
...
19:#define PY_SSIZE_T_MAX INT_MAX^[[K
20:#define PY_SSIZE_T_MIN INT_MIN^[[K
Ele passa pela ^[[K
sequência como está.
Esta sequência é CSI (n) K -- EL -- Erase in Line
. Quando não recebe nenhum argumento, ele apaga até o final da linha. Presumivelmente, isso é necessário para limpar os bits perdidos da cor de fundo se o termo correspondente aparecer no final da linha.
Existe uma razão pela qual most
não entende essa sequência? Posso configurá-lo para processá-lo corretamente?
o comportamento da maioria é codificado. O código-fonte tem vários pedaços como este para analisar depois que um caractere de escape é recebido:
Basicamente, ele diz que se encontrar um caractere de escape (
033
) e a-V
opção não estiver definida, procure por sequências de escape de cor ANSI.Todas as operações de limpeza também começam com um caractere de escape, portanto, a maioria não fará o que é solicitado.
A propósito, vejo que Davis fez uma alteração alguns dias atrás como solução alternativa. Em última análise, isso será em uma versão empacotada ...