Como eu gero manpages usando códigos de escape para negrito, etc.?

5

Enquanto inspecionava o código-fonte de less , notei que a página de manual incluída ( less.man ) códigos de escape de terminal usados para mostrar texto em negrito:

^[[1mNAME^[[0m
       less - opposite of more

^[[1mSYNOPSIS^[[0m
       ^[[1mless -?^[[0m
       ^[[1mless --help^[[0m
       ^[[1mless -V^[[0m
       ^[[1mless --version^[[0m
       ^[[1mless [-[+]aABcCdeEfFgGiIJKLmMnNqQrRsSuUVwWX~]^[[0m

O comando usado para gerar aparentemente é nroff -man :

$ head Makefile.aut 
# Makefile for authoring less.

EMAIL = [email protected]
HOMEPAGE = http://www.greenwoodsoftware.com/less
SHELL = /bin/sh
RCS = rcs
NROFF = nroff -man

No entanto, se eu executar nroff -man less.nro , obtenho a saída da página de manual (normal) usando backspaces:

N^HNA^HAM^HME^HE
       less - opposite of more

S^HSY^HYN^HNO^HOP^HPS^HSI^HIS^HS
       l^Hle^Hes^Hss^Hs -^H-?^H?
       l^Hle^Hes^Hss^Hs -^H--^H-h^Hhe^Hel^Hlp^Hp
       l^Hle^Hes^Hss^Hs -^H-V^HV
       l^Hle^Hes^Hss^Hs -^H--^H-v^Hve^Her^Hrs^Hsi^Hio^Hon^Hn

Como faço para gerar o primeiro formulário?

    
por muru 18.11.2015 / 21:45

1 resposta

7

O "primeiro formulário" é um recurso do groff . Se o seu "nroff" não for um wrapper para groff , você verá apenas o segundo formulário.

O recurso é mencionado na página de manual para grotty (driver groff para dispositivos semelhantes a máquinas de escrever):

By default, grotty emits SGR escape sequences (from ISO 6429, also called ANSI color escapes) to change text attributes (bold, italic, colors). This makes it possible to have eight different back-ground background ground and foreground colors; additionally, bold and italic attributes can be used at the same time (by using the BI font).

Na prática, não funciona bem, por exemplo, veja como o mesmo comentário (pós-processamento dessas sequências) é misrendered aqui :

By default, grotty emits SGR escape sequences (from ISO 6429, also called ANSI color escapes) to change text attributes (bold, italic, colors). This makes it possible to have eight different M[green]backgroundM[] and m[red]foregroundm[] colors; additionally, bold and italic attributes can be used BI]at the same time] (by using the BI font).

e, por essa razão, alguns desenvolvedores optam por não usá-lo (por exemplo, esta discussão da lista de discussão do Emacs).

No entanto, como a página de manual diz "Por padrão" . Então, se você tiver groff, então ele deve estar produzindo essas sequências de escape.

Os empacotadores podem aplicar correções para modificar programas. Um comentário de @muru menciona a versão no Debian (veja relatórios de bugs e página do pacote . O changelog do pacote diz isto:

 -- Colin Watson <[email protected]>  Sat, 27 Jul 2002 18:41:46 +0100
groff (1.18-1) unstable; urgency=low 

  * Disable the new ANSI colour/bold/underline escapes in nroff mode,
    because most pagers either fail to cope with it or need special options
    to do so. It can be re-enabled by editing /etc/groff/man.local and
    /etc/groff/mdoc.local, or by setting the environment variable GROFF_SGR
    to something non-empty.

No entanto, a fonte groff não menciona GROFF_SGR ; tem apenas referências a GROFF_NO_SGR :

./NEWS:1108:  for the GROFF_NO_SGR environment variable also.
./NEWS:1450:o If the environment variable GROFF_NO_SGR is set, SGR output is disa...
./PROBLEMS:33:  1. Set the GROFF_NO_SGR environment variable.
./doc/webpage.ms:1920:.  URL #GROFF_NO_SGR GROFF_NO_SGR
./doc/webpagewebpage.ms:1922:. nop GROFF_NO_SGR
./doc/webpagewebpage.ms:2437:.TAG GROFF_NO_SGR        
./doc/webpagewebpage.ms:2439:If the environment variable GROFF_NO_SGR is set, SGR output is 
./src/devices/grotty/grotty.man:126:.B GROFF_NO_SGR
./src/devices/grotty/grotty.man:394:.B GROFF_NO_SGR
./src/devices/grotty/tty.cpp:864:  if (getenv("GROFF_NO_SGR"))

e o changelog (ChangeLog.118) não dá pistas:

2002-02-12  Werner LEMBERG  <[email protected]>

        * src/libs/libgroff/Makefile.sub (snprintf.o): Don't use
        $(COMPILE.c) to not include groff's assert.h.        
        * src/drivers/grotty/tty.cc (main): Add GROFF_NO_SGR environment
        variable.                           
        * NEWS, src/drivers/grotty/grotty.man: Document it. 

A configuração de GROFF_NO_SGR não fornecerá sequências SGR (a página de manual está correta). O comentário do changelog do Debian refere-se a este trecho de /etc/groff/man.local , onde o Debian adicionou uma verificação para a variável GROFF_SGR :

.  \" Debian: Disable the use of SGR (ANSI colour) escape sequences by
.  \" grotty. 
.  if '\V[GROFF_SGR]'' \
.    output x X tty: sgr 0

e a configuração da variável de ambiente faz com que ela gere sequências SGR para negrito, etc.

    
por 18.11.2015 / 23:12