如何使用粗體等的轉義碼生成聯機幫助頁?
在檢查的原始碼時
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 序列。