Imprimir páginas man con ancho fijo

11

Con el comando de ejemplo

man apropos > outputfile

Se genera un archivo de texto que contiene la manpágina formateada apropos(con algunas pequeñas diferencias con respecto a la man aproposimpresión directa en pantalla, como los caracteres en negrita).

Pero me gustaría establecer manualmente el ancho de línea máximo del archivo de salida generado, para que todos los párrafos se justifiquen a ese ancho.

manlas páginas se crean a través de groff: por ejemplo, traté de poner .ll 50antes de un párrafo del .gz manarchivo de texto original , pero es trivial si necesito trabajar en varias manpáginas. Además, no todos los personajes son reconocidos:

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

Entonces, me pregunto si existe un método más directo. ¿Cómo modificar el ancho máximo de línea, durante la creación de un outputfile? ¿Hay algún comando específico?


Editar :

(Todas las siguientes consideraciones son sobre Ubuntu 18.04: ya no puedo probarlas en versiones anteriores, incluido el 14.04 de la pregunta anterior).

En cuanto a una solución temporal de una línea, si MANWIDTHaún no se ha exportado con un valor personalizado, no hay diferencia entre

$ MANWIDTH=60 man apropos > outputfile

y

$ COLUMNS=60 man apropos > outputfile

MANWIDTHSin embargo , el primero, usar , es mejor en principio.


Edición 2 (no estrictamente relacionada con la pregunta):

Para hacer una configuración de ancho permanente que se aplicará a cualquier impresión de página de manual, es necesario exportar el valor deseado de la variable. Con:

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

man aproposse imprimirá con el mismo ancho independientemente de cualquier cambio de tamaño de la ventana de terminal. En lugar,

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

proporcionará el mismo resultado que antes solo si la ventana de terminal no cambia de tamaño entre exporty man <page> > outputfile.

BowPark
fuente
No puedo reproducir sus input codeerrores 195 168 podría ser è en UTF-8. ¿La página del manual está en inglés? ¿Cuál es tu implementación de hombre? ¿Cuál es tu localidad?
Stéphane Chazelas
el sistema es Ubuntu 14.04 (la versión man manes 2.6.7.1). La página del manual está en italiano y es UTF-8. ¿Qué quieres decir con locale?
BowPark
¿Cuál es el resultado de locale? y locale charmap?
Stéphane Chazelas
localesalida: LANG=it_IT.UTF-8 LANGUAGE= LC_CTYPE="it_IT.UTF-8" LC_NUMERIC="it_IT.UTF-8" locale charmapsalida:UTF-8
BowPark
1
Si el terminal no funcional es de lessporque TERMno se ha establecido. Quise decir env -i LANG=it_IT.UTF-8 man apropos > output(o | head).
Stéphane Chazelas

Respuestas:

18

Use la MANWIDTHvariable de entorno:

MANWIDTH=60 man apropos > apropos.txt

La página de manual para man 2.7.4 dice:

Si se establece $ MANWIDTH, su valor se utiliza como la longitud de la línea para la que se deben formatear las páginas del manual. Si no está configurado, las páginas del manual se formatearán con una longitud de línea apropiada para el terminal actual (usando el valor de $ COLUMNS, un ioctl (2) si está disponible, o retrocediendo a 80 caracteres si ninguno está disponible).

Es decir, anula ambos COLUMNSy el ioctlvalor. Prefiero no confiar en la modificación COLUMNS(aunque funciona aquí) ya que su valor se actualiza dinámicamente cada vez que cambia el tamaño de la ventana.

El uso en MANWIDTHlugar de COLUMNStambién le permite hacer que el cambio sea permanente al agregar una línea como export MANWIDTH=60a su archivo de inicio de shell.

Marcel M
fuente
Excelente trabajo. Tampoco quería cambiar COLUMNAS, y MANWIDTH funciona de maravilla en RHEL5. Salud.
Felipe Alvarez
1
Una nota para los lectores: es posible que deba usarlo export MANWIDTH=60si configura esto en su ~/.bashrc. Ver stackoverflow.com/a/30173376/82216 . Además, considere envolver manen una función para establecer ANCHO DEL HOMBRE dependiendo del ancho de su terminal, como se sugiere aquí en la wiki de Arch.
sampablokuper
@ Marcel M Gracias por su respuesta muy precisa. ¿Puede leer la actualización en la pregunta y editar su respuesta para incluir la sugerencia fundamental sobre export MANWIDTH=60?
BowPark
@BowPark Escribí la respuesta sin exportporque usted preguntó acerca de una solución temporal: "¿Cómo modificar el ancho máximo de línea, durante la creación de un archivo de salida? " (Énfasis mío). Es posible que incluso desee revertir su edición, ya que no se agrega a la pregunta. (Un comentario es más apropiado.)
Marcel M
@MarcelM En realidad tienes razón. Edité la pregunta en consecuencia. Escribí una segunda edición con las exportdeclaraciones porque en un comentario sería casi ilegible (no sería posible crear nuevas líneas).
BowPark
10

Intente configurar la COLUMNSvariable de entorno. Obras para mí con mande mandb2.7.0.2 en 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 versión en Ubuntu 14.04, necesito escribirla:

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

Allí, manparece ignorar la COLUMNSvariable de entorno si stdin es un terminal (luego consulta el dispositivo del terminal para conocer el ancho del terminal).

También puedes probar:

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

Que con zshusted puede acortar a:

STTY='cols 60' man apropos | head

Puede hacerlo invocando groffa mano como:

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

No puede encontrar el carácter con errores de código de entrada porque lo utilizó en -Tasciilugar de -Tutf8y no lo utilizó -kpara preprocesar los archivos preconv.

Stéphane Chazelas
fuente
Intenté el mismo comando: COLUMNS=60 man apropos | headpero desafortunadamente el ancho de salida es todo el ancho de la pantalla. ¿Puedo configurar la variable en COLUMNSotro lugar o de otra manera?
BowPark
2
Tratar COLUMNS=60 < /dev/null man apropos | head. Parece que en Ubuntu 14.04, no confía COLUMNSsi stdin es un terminal (y obtiene el ancho del dispositivo terminal).
Stéphane Chazelas
Tal vez es como supusiste. Y ahora funciona, gracias!
BowPark
4

Puede usar el fmtcomando, que hasta donde yo sé está presente en cualquier distribución de Linux.

man apropos | fmt -w 70 

cerrará líneas a 70 caracteres.

Dr_
fuente
1
sí, lo tengo, gracias, funciona y es bastante útil, pero necesito un texto justificado y simplemente termina las líneas.
BowPark
Lo siento, debo haberme perdido esa parte.
dr_
2

Puedes usar fold

man cp | fold -w 20

se plegará después de cada 20 caracteres (!). Tenga en cuenta que esto cortará las palabras en dos, ya que la única opción es "doblar cada 20 caracteres"

teniendo en cuenta esto, puede usar sedlo siguiente (con longitud de línea dinámica)

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

agregará una nueva línea después de 20 caracteres aleatorios seguidos de un espacio (es decir, una nueva palabra). Por lo tanto, las líneas pueden tener más de 20 caracteres (la coincidencia es de 20 caracteres y luego un espacio para que una palabra de 26 caracteres dé como resultado una línea de 26 caracteres)

Para omitir el último espacio en el sedcomando:

sed 's/\(.\{20\}\) /\1\n/g'
Fiximan
fuente
1
Gracias, probé sus ejemplos y funcionan, pero, como está escrito en un comentario a dr01, necesito un texto justificado.
BowPark