以固定宽度打印手册页


11

使用示例命令

man apropos > outputfile

将生成一个文本文件,其中包含的格式化man页面apropos(与man apropos直接打印在屏幕上的字体有一些细微差别,例如粗体字符)。

但是我想手动设置生成的输出文件的最大行宽,以便所有段落都可以证明为该宽度。

man页面是通过创建的groff:例如,我试图将.ll 50原始.gz man源文本文件的段落放在前面,但是如果我需要在多个man页面上工作,这是微不足道的。此外,并非所有字符都可以识别:

apropos.1:45: warning: can't find character with input code 195
apropos.1:45: warning: can't find character with input code 168
apropos.1:47: warning: can't find character with input code 178
apropos.1:131: warning: can't find character with input code 169

因此,我想知道是否存在更直接的方法。在创建过程中如何修改最大线宽outputfile?有一些特定的命令吗?


编辑

(以下所有注意事项均与Ubuntu 18.04有关:在以上版本中,我无法再对其进行测试,包括上述问题的14.04。)

关于单行临时解决方案,如果MANWIDTH尚未使用自定义值导出,则两者之间没有区别

$ MANWIDTH=60 man apropos > outputfile

$ COLUMNS=60 man apropos > outputfile

但是,第一个使用MANWIDTH,原则上更好。


编辑2(与问题不严格相关):

为了使永久宽度设置适用于任何手册打印,必须导出所需的变量值。带有:

$ export MANWIDTH=60
# zero or more additional lines
$ man apropos > outputfile

man apropos无论终端窗口大小如何调整,都将以相同的宽度打印。代替,

$ export COLUMNS=60
# zero or more additional lines
$ man apropos > outputfile

仅当在export和之间未调整终端窗口的大小时,才会提供与以前相同的结果man <page> > outputfile


我无法重现您 在UTF-8中的input code错误195 168。手册页是英文的吗?你的男人执行什么?您的语言环境是什么?
斯特凡Chazelas

系统为Ubuntu 14.04(版本man man为2.6.7.1)。手册页是意大利语的,它是UTF-8。您的语言环境是什么意思?
BowPark

输出是locale什么?和locale charmap
斯特凡Chazelas

locale输出:LANG=it_IT.UTF-8 LANGUAGE= LC_CTYPE="it_IT.UTF-8" LC_NUMERIC="it_IT.UTF-8" locale charmap输出:UTF-8
BowPark

1
是的,由于未设置,终端无法正常工作。我的意思是(或)。lessTERMenv -i LANG=it_IT.UTF-8 man apropos > output| head
斯特凡Chazelas

Answers:


19

使用MANWIDTH环境变量:

MANWIDTH=60 man apropos > apropos.txt

man 2.7.4的手册页说:

如果设置了$ MANWIDTH,则将其值用作应格式化手册页的行长。如果未设置,则手册页的格式将以适合当前终端的行长进行格式化(使用$ COLUMNS的值,如果可用,则使用ioctl(2);如果都不可用,则使用80个字符)。

即,它同时覆盖COLUMNSioctl值。我宁愿不依赖于修改COLUMNS(尽管它确实可以在这里工作),因为每次窗口大小更改时,它的值都会动态更新。

使用MANWIDTH代替代替COLUMNS还允许您通过export MANWIDTH=60在外壳启动文件中添加一行来使更改永久生效。


极好的工作。我也不想更改COLUMNS,而MANWIDTH在RHEL5中有效。干杯。
Felipe Alvarez

1
读者注意事项:export MANWIDTH=60如果在中设置了,则可能需要使用~/.bashrc。请参阅stackoverflow.com/a/30173376/82216。另外,还要考虑包装man的功能设置MANWIDTH取决于你的终端宽度,如建议在这里的拱门维基。
sampablokuper

@Marcel M谢谢您的精确回答。您能否阅读问题中的更新并编辑您的答案以包括有关的基本建议export MANWIDTH=60
BowPark '18

@BowPark我写的答案没有,export因为您询问了一个临时解决方案:“如何在创建输出文件时修改最大行宽 ”(强调我的意思)。您甚至可能想要还原您的修改,因为它没有添加到问题中。(发表评论更合适。)
Marcel M

@MarcelM其实你是对的。我相应地编辑了问题。我用这些export语句编写了第二个编辑,因为在注释中几乎是不可读的(无法创建换行符)。
BowPark '18

10

尝试设置COLUMNS环境变量。manmandb2.7.0.2开始在Debian 1.22.3上为我工作groff

$ COLUMNS=60 man apropos | head
APROPOS(1)          Manual pager utils          APROPOS(1)



NAME
       apropos - search the manual page names and descrip
       tions

SYNOPSIS
       apropos [-dalv?V] [-e|-w|-r]  [-s  list]  [-m  sys

$ COLUMNS=70 man apropos | head
APROPOS(1)               Manual pager utils               APROPOS(1)



NAME
       apropos - search the manual page names and descriptions

SYNOPSIS
       apropos  [-dalv?V] [-e|-w|-r] [-s list] [-m system[,...]] [-M
       path] [-L locale] [-C file] keyword ...

对于Ubuntu 14.04上的版本,我需要编写它:

COLUMNS=60 < /dev/null man apropos | head

如果stdin是终端,则在那里man似乎忽略了COLUMNS环境变量(然后它在终端设备中查询终端宽度)。

您也可以尝试:

s=$(stty -g); stty cols 60; man apropos | head; stty "$s"

zsh您一起可以缩短为:

STTY='cols 60' man apropos | head

您可以groff通过以下方式手动调用:

gzip -dcf "$(man -w apropos)" |
  groff -ekpstR -mtty-char -mandoc -Tutf8 -rLL=60n |
  col -bpx

找不到带有输入代码错误的字符是因为您使用-Tascii而不是,-Tutf8并且不使用-k来对文件进行预处理preconv


我尝试了相同的命令:COLUMNS=60 man apropos | head,但是不幸的是输出宽度是所有屏幕宽度。我可以在COLUMNS其他位置或以其他方式设置变量吗?
BowPark

2
尝试COLUMNS=60 < /dev/null man apropos | head。在Ubuntu 14.04上看起来像,它不信任COLUMNSstdin是否为终端(并从终端设备获取宽度)。
斯特凡Chazelas

也许就像你想的那样。现在就可以了,谢谢!
BowPark

4

您可以使用该fmt命令,据我所知,该命令存在于任何Linux发行版中。

man apropos | fmt -w 70 

将以70个字符换行。


1
是的,我有它,谢谢,它有效并且非常有用,但是我需要一个合理的文本,而只是换行。
BowPark

抱歉,我一定错过了那部分。
dr_

2

您可以使用 fold

man cp | fold -w 20

每20个字符(!)折叠一次。请注意,这会将单词切成两半,因为唯一的选择是“每20个字符折叠一次”

为此,您可以使用sed以下内容(动态行长)

man cp | sed 's/.\{20\} /&\n/g'

将在20个随机字符后添加一个换行符,后跟一个空格(即新单词)。因此,行的长度可能会超过20个字符(匹配项是20个字符,然后是一个空格,因此26个字符的单词将导致26个字符的行)

要省略sed命令中的最后一个空格:

sed 's/\(.\{20\}\) /\1\n/g'

1
谢谢,我尝试了您的示例,并且它们可以正常工作,但是-如对dr01的注释中所写-我需要有正当理由的文字。
BowPark
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.