我发现 groff 使用不同的方式来指示utf8
输出格式的粗体文本。
在 FreeBSD 14 上,groff 为终端发出转义码 (ESC, [1m
):
$ printf ".Dd today\n.Sh NAME\n" | groff -mandoc -Tutf8 | od -c
0000000 \n 033 [ 1 m N A M E 033 [ 0 m \n
[...]
在 Linux (debian Bookworm) 上使用退格键和加粗键:
$ printf ".Dd today\n.Sh NAME\n" | groff -mandoc -Tutf8 | od -c
[...]
0000120 N \b N A \b A M \b M E \b E \n
为什么会这样?有没有办法让 Linux groff 也对终端使用 ESC 代码?我已从上到下阅读了 groff 手册页,但找不到更改此行为的选项。
(我需要对结果进行后处理,ESC 代码使这变得更加容易和灵活。)
编辑:解决方案(感谢 @egmont)是阅读 Debian 的 grotty(1) 手册,然后使用以下命令强制 SGR 行为
printf ".Dd today\n.Sh NAME\n" | GROFF_SGR=y groff -mandoc -Tutf8
答案1
Debian Bookworm 将 groff 1.22 配置为您在此处看到的旧退格覆盖行为,并将其记录在其修补的grotty
手册页中以及如何恢复到较新的 SGR(\e[1m
类似)行为:
printf ".Dd today\n.Sh NAME\n" | GROFF_SGR=y groff -mandoc -Tutf8
似乎给定的配置和补丁不再存在于 的 groff 1.23 包中unstable
,以及 Ubuntu 23.04 中。所以这可能是您看到的具有这种旧行为的最后一个 Debian 版本,他们正在切换到新的 SGR 方法,遵循上游 groff 的默认设置。
答案2
您可以滥用script
和less
来转换退格序列:
script --return --quiet -c "printf '.Dd today\n.Sh NAME\n' | groff -mandoc -Tutf8 | less" /dev/null | od -c
…
0000200 1 m N A M E 033 [ 0 m 033 [ m \r \n