Man

如何使用粗體等的轉義碼生成聯機幫助頁?

  • November 19, 2015

在檢查的原始碼時less,我注意到包含的聯機幫助頁 ( less.man) 使用終端轉義碼來顯示粗體文本:

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

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

用於生成的命令顯然是nroff -man

$ head Makefile.aut 
# Makefile for authoring less.

EMAIL = bug-less@gnu.org
HOMEPAGE = http://www.greenwoodsoftware.com/less
SHELL = /bin/sh
RCS = rcs
NROFF = nroff -man

但是,如果我執行nroff -man less.nro,我會使用退格鍵獲得(通常的)聯機幫助頁輸出:

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

如何生成第一個表單?

“第一種形式”是…的一個特徵groff。如果您的“nroff”不是 的包裝器groff,您將只看到第二種形式。

該功能在grotty(用於類似打字機的設備的 groff 驅動程序)的手冊頁中引用:

預設情況下, grotty 發出 SGR 轉義序列(來自 ISO 6429,也稱為 ANSI 顏色轉義)來更改文本屬性(粗體、斜體、顏色)。這使得有八種不同的背景背景背景和前景顏色成為可能;此外,可以同時使用粗體和斜體屬性*(* 通過使用 BI 字型)。

在實踐中,它不能很好地工作,例如,查看相同的評論(對這些序列進行後處理)是如何被錯誤渲染的

預設情況下,grotty發出 SGR 轉義序列(來自 ISO 6429,也稱為 ANSI 顏色轉義)來更改文本屬性(粗體、斜體、顏色)。這使得有可能有​​八個不同的M$$ green $$背景M$$ $$米$$ red $$前景$$ $$顏色; 此外,可以同時使用粗體和斜體屬性BI](通過使用 BI 字型)。

出於這個原因,一些開發人員選擇不使用它(例如,來自 Emacs 郵件列表的討論)。

但是,正如手冊頁所說的**“預設情況下”**。所以,如果你有 groff,那麼它應該會產生那些轉義序列。

打包者可以應用更新檔來修改程序。@muru 的評論提到了 Debian 中的版本(請參閱錯誤報告軟體包頁面)。包變更日誌這樣說:

-- Colin Watson <cjwatson@debian.org>  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.

但是,groff 消息來源沒有提及**GROFF_SGR;它僅引用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"))

並且更改日誌(ChangeLog.118)沒有給出任何線索:

2002-02-12  Werner LEMBERG  <wl@gnu.org>

       * 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. 

設置GROFF_NO_SGR不會給出 SGR 序列(手冊頁是正確的)。Debian 變更日誌註釋引用了來自 的這個塊/etc/groff/man.local,其中 Debian 添加了對GROFF_SGR變數的檢查:

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

並設置環境變數確實使它生成粗體等的 SGR 序列。

引用自:https://unix.stackexchange.com/questions/243953