web-dev-qa-db-ja.com

太字などのエスケープコードを使用してマンページを生成するにはどうすればよいですか?

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 = [email protected]
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

最初のフォームを生成するにはどうすればよいですか?

6
muru

「最初の形式」は... groff の機能です。 「nroff」がgroffのラッパーでない場合は、2番目の形式のみが表示されます。

この機能は、マニュアルページで参照されています grotty (タイプライターのようなデバイス用のgroffドライバー):

デフォルトでは、grottyはSGRエスケープシーケンス(ISO 6429から、ANSIカラーエスケープとも呼ばれます)を発行して、テキスト属性(太字、斜体、色)を変更します。これにより、8つの異なる背景の背景の地色と前景色を使用できます。さらに、太字と斜体の属性を同時に使用できます(BIフォントを使用)。

実際には、うまく機能しません。たとえば、同じコメント(これらのシーケンスの後処理)がどのようになっているのかを確認してください ここで誤ってレンダリングされます

デフォルトでは、grottyはSGRエスケープシーケンス(ISO 6429から、ANSIカラーエスケープとも呼ばれます)を発行して、テキスト属性(太字、斜体、色)を変更します。これにより、8つの異なるM [green] backgroundM []およびm [red] foregroundm []の色を使用できます。さらに、太字と斜体の属性をBI]同時に](BIフォントを使用して)使用できます。

そのため、一部の開発者はそれを使用しないことを選択します(たとえば、 このディスカッション Emacsメーリングリストから)。

ただし、マニュアルページに記載されているように「デフォルト」。したがって、groffがある場合は、それらのエスケープシーケンスを生成しているはずです。

パッケージャは、パッチを適用してプログラムを変更できます。 @muruによるコメントは、Debianのバージョンについて言及しています( バグレポート および パッケージページ を参照)。パッケージの変更ログには次のように書かれています。

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

ただし、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  <[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. 

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シーケンスが生成されます。

8
Thomas Dickey