Друкувати підручні сторінки з фіксованою шириною


11

З командою example

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.


Я не можу відтворити ваші input codeпомилки, 195 168 можливо, це в UTF-8. Чи є сторінка man англійською? Яка ваша реалізація чоловіка? Яка ваша мова?
Стефан Шазелас

система Ubuntu 14.04 (версія від man man2.6.7.1). Сторінка чоловіка італійською мовою - це UTF-8. Що ви маєте на увазі під локалом?
BowPark

Який результат locale? і locale charmap?
Стефан Шазелас

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
Так, термінал не функціональний , lessоскільки TERMне встановлений. Я мав на увазі env -i LANG=it_IT.UTF-8 man apropos > output(або | head).
Стефан Шазелас

Відповіді:


19

Використовуйте MANWIDTHзмінну середовища:

MANWIDTH=60 man apropos > apropos.txt

На сторінці для чоловіка 2.7.4 написано:

Якщо встановлено $ MANWIDTH, його значення використовується як довжина рядка, для якого сторінки формату повинні бути відформатовані. Якщо його не встановлено, сторінки вручну будуть відформатовані довжиною рядка, відповідною до поточного терміналу (використовуючи значення $ COLUMNS, ioctl (2), якщо він є, або повертається до 80 символів, якщо жоден з них не доступний).

Тобто він переосмислює COLUMNSі ioctlзначення, і значення. Я вважаю за краще не покладатися на зміни COLUMNS(хоча це і працює тут), оскільки його значення динамічно оновлюється щоразу, коли розмір вікна змінюється.

Використання MANWIDTHзамість цього COLUMNSдозволяє також зробити зміни постійними, додавши такий рядок, як export MANWIDTH=60у файл запуску оболонки.


Відмінна робота. Я також не хотів міняти КОЛОНІ, і MANWIDTH працює ласощами в RHEL5. Ура.
Феліпе Альварес

1
Примітка для читачів: можливо, вам доведеться скористатися, export MANWIDTH=60встановивши це у своєму ~/.bashrc. Дивіться stackoverflow.com/a/30173376/82216 . Крім того, розгляньте можливість обгортання manфункції для встановлення MANWIDTH залежно від ширини вашого терміналу, як це запропоновано тут у вікі Arch.
sampablokuper

@Marcel M Дякую за дуже точну відповідь. Чи можете ви прочитати оновлення у запитанні та відредагувати свою відповідь, щоб включити основні пропозиції щодо export MANWIDTH=60?
BowPark

@BowPark Я відповів без відповіді, exportтому що ви запитали про тимчасове рішення: "Як змінити максимальну ширину рядка під час створення вихідного файлу? " (Акцент мій). Можливо, ви навіть хочете відновити свої зміни, оскільки це не додає до питання. (Коментар є більш відповідним.)
Marcel M

@MarcelM Насправді ви праві. Я відповідно редагував питання. Я написав другу редакцію з exportтвердженнями, тому що в коментарі це було б майже нечитабельним (неможливо створити нові рядки).
BowPark

10

Спробуйте встановити COLUMNSзмінну середовища. Роботи для мене з manвід mandb2.7.0.2 на Debian з groff1.22.3.

$ 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

Там, manсхоже, нехтують COLUMNSзмінною середовища, якщо stdin є терміналом (він запитує термінальний пристрій на ширину терміналу).

Ви також можете спробувати:

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, він не вірить, COLUMNSякщо stdin є терміналом (і отримує ширину від термінального пристрою).
Стефан Шазелас

Можливо, це так, як ти гадав. А зараз це працює, дякую!
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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.