Stampa pagine man con larghezza fissa


11

Con il comando di esempio

man apropos > outputfile

viene generato un file di testo che contiene la manpagina formattata di apropos(con alcune piccole differenze rispetto alla man aproposstampa diretta sullo schermo, come i caratteri in grassetto).

Ma vorrei impostare manualmente la larghezza massima della linea del file di output generato, in modo che tutti i paragrafi siano giustificati a tale larghezza.

manle pagine vengono create tramite groff: ad esempio, ho provato a mettere .ll 50un paragrafo del .gz manfile di testo di origine originale , ma è banale se devo lavorare su più manpagine. Inoltre non tutti i personaggi sono riconosciuti:

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

Quindi, mi chiedo se esiste un metodo più semplice. Come modificare la larghezza massima della linea, durante la creazione di un outputfile? C'è qualche comando specifico?


Modifica :

(Tutte le seguenti considerazioni riguardano Ubuntu 18.04: non posso più provarle nelle versioni precedenti, incluso il 14.04 della domanda sopra.)

Per quanto riguarda una soluzione temporanea su una riga, se MANWIDTHnon è già stata esportata con un valore personalizzato, non c'è differenza tra

$ MANWIDTH=60 man apropos > outputfile

e

$ COLUMNS=60 man apropos > outputfile

Il primo, usando MANWIDTH, è comunque migliore in linea di principio.


Modifica 2 (non strettamente correlato alla domanda):

Per rendere invece un'impostazione di larghezza permanente da applicare a qualsiasi stampa di manpage, è necessario esportare il valore desiderato della variabile. Con:

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

man aproposverrà stampato con la stessa larghezza indipendentemente dal ridimensionamento della finestra del terminale. Anziché,

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

fornirà lo stesso risultato di prima solo se la finestra del terminale non viene ridimensionata tra exporte man <page> > outputfile.


Non riesco a riprodurre i tuoi input codeerrori 195 168 potrebbe essere in UTF-8. La pagina man è in inglese? Qual è l'implementazione del tuo uomo? Qual è la tua lingua?
Stéphane Chazelas,

il sistema è Ubuntu 14.04 (la versione man manè 2.6.7.1). La pagina man è in italiano ed è UTF-8. Cosa intendi per locale?
BowPark,

Qual è l'output di locale? e locale charmap?
Stéphane Chazelas, l'

localeuscita: LANG=it_IT.UTF-8 LANGUAGE= LC_CTYPE="it_IT.UTF-8" LC_NUMERIC="it_IT.UTF-8" locale charmapuscita:UTF-8
BowPark

1
Sì, il terminale non funzionante proviene da lessperché TERMnon è impostato. Intendevo env -i LANG=it_IT.UTF-8 man apropos > output(o | head).
Stéphane Chazelas,

Risposte:


18

Usa la MANWIDTHvariabile d'ambiente:

MANWIDTH=60 man apropos > apropos.txt

La manpage per man 2.7.4 dice:

Se si imposta $ MANWIDTH, il suo valore viene utilizzato come lunghezza della linea per la quale le pagine del manuale devono essere formattate. Se non è impostato, le pagine del manuale verranno formattate con una lunghezza della linea adeguata al terminale corrente (utilizzando il valore di $ COLONNE, uno ioctl (2) se disponibile, o ricadendo a 80 caratteri se nessuno dei due è disponibile).

Cioè, sostituisce sia COLUMNSil ioctlvalore. Preferisco non fare affidamento sulla modifica COLUMNS(anche se funziona qui) poiché il suo valore viene aggiornato in modo dinamico ogni volta che cambia la dimensione della finestra.

L'uso di MANWIDTHinvece di COLUMNSconsente anche di rendere permanente la modifica aggiungendo una riga come export MANWIDTH=60al file di avvio della shell.


Lavoro eccellente. Non volevo nemmeno cambiare COLONNE e MANWIDTH funziona a meraviglia in RHEL5. Saluti.
Felipe Alvarez,

1
Una nota per i lettori: potrebbe essere necessario utilizzarlo export MANWIDTH=60se si imposta questo nel proprio ~/.bashrc. Vedi stackoverflow.com/a/30173376/82216 . Inoltre, considera il wrapping manin una funzione per impostare MANWIDTH in base alla larghezza del tuo terminale, come suggerito qui nella wiki di Arch.
sampablokuper,

@Marcel M Grazie per la tua risposta molto precisa. Potete leggere l'aggiornamento nella domanda e modificare la risposta per includere il suggerimento fondamentale in merito export MANWIDTH=60?
BowPark,

@BowPark Ho scritto la risposta senza che exporttu abbia chiesto una soluzione temporanea: "Come modificare la larghezza massima della linea, durante la creazione di un file di output? " (Sottolineatura mia). Potresti anche voler ripristinare la modifica in quanto non si aggiunge alla domanda. (Un commento è più appropriato.)
Marcel M

@MarcelM In realtà hai ragione. Ho modificato la domanda di conseguenza. Ho scritto una seconda modifica con le exportdichiarazioni perché in un commento sarebbe quasi illeggibile (non è possibile creare nuove righe).
BowPark,

10

Prova a impostare la COLUMNSvariabile di ambiente. Funziona con me mandalla mandb2.7.0.2 su Debian con 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 ...

Con la versione su Ubuntu 14.04, devo scriverla:

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

mansembra ignorare la COLUMNSvariabile d'ambiente se stdin è un terminale (quindi interroga il terminale per la larghezza del terminale).

Puoi anche provare:

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

Che con zshte puoi abbreviare a:

STTY='cols 60' man apropos | head

Potresti farlo invocando groffa mano come:

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

Il tuo personaggio non riesce a trovare con il codice di ingresso gli errori erano perché si è utilizzato -Tascii, invece di -Tutf8e non è stata utilizzata -kper pre-processo i file con preconv.


Ho provato lo stesso comando COLUMNS=60 man apropos | head:, ma sfortunatamente la larghezza dell'output è tutta la larghezza dello schermo. Posso impostare la variabile COLUMNSaltrove o in altro modo?
BowPark,

2
Prova COLUMNS=60 < /dev/null man apropos | head. Sembra su Ubuntu 14.04, non si fida COLUMNSse stdin è un terminale (e ottiene la larghezza dal dispositivo terminale).
Stéphane Chazelas, l'

Forse è come hai supposto. E ora funziona, grazie!
BowPark,

4

Puoi usare il fmtcomando, che per quanto ne so è presente in qualsiasi distribuzione Linux.

man apropos | fmt -w 70 

coprirà le righe con 70 caratteri.


1
sì, ce l'ho, grazie, funziona ed è abbastanza utile, ma ho bisogno di un testo giustificato e invece semplicemente racchiude le righe.
BowPark,

Scusa, devo aver perso quella parte.
dr_

2

Puoi usare fold

man cp | fold -w 20

si piegherà dopo ogni 20 caratteri (!). Nota che questo taglierà le parole in due poiché l'unica opzione è "piega ogni 20 caratteri"

prendendoti cura di questo, potresti usare sedcome segue (con lunghezza della linea dinamica)

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

aggiungerà una nuova riga dopo 20 caratteri casuali seguiti da uno spazio (ovvero nuova parola). Quindi le righe potrebbero essere più lunghe di 20 caratteri (la corrispondenza è di 20 caratteri quindi uno spazio in modo che una parola di 26 caratteri si tradurrebbe in una riga di 26 caratteri)

Per omettere l'ultimo spazio nel sedcomando:

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

1
Grazie, ho provato i tuoi esempi e funzionano, ma - come scritto in un commento a dr01 - ho bisogno di un testo giustificato.
BowPark,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.