less
envia seu próprio "reset" no final da linha, que é derivado do terminfo sgr0
por (ncurses) eliminando o ^O
(redefinir conjunto de caracteres alternativos) porque less
é usando a interface termcap. O recurso termcap me que corresponde ao terminfo sgr0 convencionalmente não modifica o estado do conjunto de caracteres alternativos, como observado na página de manual curs_termcap(3x) :
Note that termcap has nothing analogous to terminfo's
sgr
string. One consequence of this is that termcap applications assumeme
(terminfosgr0
) does not reset the alternate character set. This implementation checks for, and modifies the data shown to the termcap interface to ac- commodate termcap's limitation in this respect.
Talvez less
esteja fazendo essa redefinição para recuperar seqüências de escape inesperadas: a opção -R
é projetada apenas para manipular cores ANSI (e saídas formatadas de forma semelhante, como negrito, sublinhado, piscada, destaque). O código-fonte não menciona isso, mas a atribuição A_NORMAL
informa less
para posteriormente emitir a redefinição:
/*
* Add a newline if necessary,
* and append a 'reset=$(tput rmul)
' to the end of the line.
* We output a newline if we're not at the right edge of the screen,
* or if the terminal doesn't auto wrap,
* or if this is really the end of the line AND the terminal ignores
* a newline at the right edge.
* (In the last case we don't want to output a newline if the terminal
* doesn't ignore it since that would produce an extra blank line.
* But we do want to output a newline if the terminal ignores it in case
* the next line is blank. In that case the single newline output for
* that blank line would be ignored!)
*/
if (column < sc_width || !auto_wrap || (endline && ignaw) || ctldisp == OPT_ON)
{
linebuf[curr] = '\n';
attr[curr] = AT_NORMAL;
curr++;
}
Como alternativa aos atributos de vídeo sgr0
(que redefine todos e é apenas parcialmente entendido por menos), você pode fazer
/*
* Add a newline if necessary,
* and append a 'reset=$(tput rmul)
' to the end of the line.
* We output a newline if we're not at the right edge of the screen,
* or if the terminal doesn't auto wrap,
* or if this is really the end of the line AND the terminal ignores
* a newline at the right edge.
* (In the last case we don't want to output a newline if the terminal
* doesn't ignore it since that would produce an extra blank line.
* But we do want to output a newline if the terminal ignores it in case
* the next line is blank. In that case the single newline output for
* that blank line would be ignored!)
*/
if (column < sc_width || !auto_wrap || (endline && ignaw) || ctldisp == OPT_ON)
{
linebuf[curr] = '\n';
attr[curr] = AT_NORMAL;
curr++;
}
e (para muitos terminais / muitos sistemas, incluindo TERM=screen-256color
) redefinem apenas o sublinhado. No entanto, isso não afeta negrito , nem existe um recurso terminfo / termcap convencional para redefinir negrito. Mas a tela implementa a sequência ECMA-48 correspondente que faz isso (SGR 22 versus 24 usado em rmul
), então você poderia codificar esse caso.