Imprimir páginas man com largura fixa

7

Com o comando de exemplo

man apropos > outputfile

um arquivo de texto é gerado contendo a página man formatada de apropos (com algumas pequenas diferenças em relação a man apropos diretamente impressas na tela, como caracteres em negrito).

Mas gostaria de definir manualmente a largura máxima da linha do arquivo de saída gerado, para que todos os parágrafos sejam justificados para essa largura.

man páginas são criadas por groff : por exemplo, tentei colocar .ll 50 antes de um parágrafo do arquivo de texto original .gz man , mas é trivial se preciso trabalhar várias man páginas. Além disso, nem todos os personagens são reconhecidos:

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

Então, eu me pergunto se existe um método mais simples. Como modificar a largura máxima da linha, durante a criação de um outputfile ? Existe algum comando específico?

Editar :

(Todas as considerações a seguir são sobre o Ubuntu 18.04: não posso mais testá-las nas versões anteriores, incluindo o 14.04 da pergunta acima).

Em relação a uma solução temporária de uma linha, se MANWIDTH ainda não tiver sido exportado com um valor personalizado, não haverá diferença entre

$ MANWIDTH=60 man apropos > outputfile

e

$ COLUMNS=60 man apropos > outputfile

O primeiro, usando MANWIDTH , é melhor em princípio.

Editar 2 (não estritamente relacionado à pergunta):

Para criar uma configuração de largura permanente a ser aplicada a qualquer impressão de manual, é necessário exportar o valor desejado da variável. Com:

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

man apropos será impresso com a mesma largura, independentemente do redimensionamento de qualquer janela de terminal. Em vez disso,

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

fornecerá o mesmo resultado de antes apenas se a janela do terminal não for redimensionada entre export e man <page> > outputfile .

    
por BowPark 11.08.2015 / 15:42

4 respostas

13

Use a variável de ambiente MANWIDTH :

MANWIDTH=60 man apropos > apropos.txt

A manpage do homem 2.7.4 diz:

If $MANWIDTH is set, its value is used as the line length for which manual pages should be formatted. If it is not set, manual pages will be formatted with a line length appropriate to the current terminal (using the value of $COLUMNS, an ioctl(2) if available, or falling back to 80 characters if neither is available).

Ou seja, ele substitui os valores COLUMNS e ioctl . Eu prefiro não confiar em modificar COLUMNS (embora funcione aqui), já que seu valor é atualizado dinamicamente toda vez que o tamanho da janela é alterado.

Usar MANWIDTH em vez de COLUMNS também permite tornar a alteração permanente adicionando uma linha como export MANPATH=60 ao seu arquivo de inicialização do shell.

    
por 16.02.2016 / 11:52
10

Tente definir a variável de ambiente COLUMNS . Funciona para mim com man de mandb 2.7.0.2 no Debian com groff 1.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 ...

Com a versão no Ubuntu 14.04, preciso escrevê-lo:

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

Lá, man parece desconsiderar a variável de ambiente COLUMNS se stdin for um terminal (então ele consulta o terminal para a largura do terminal).

Você também pode tentar:

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

Com qual zsh você pode reduzir para:

STTY='cols 60' man apropos | head

Você pode fazer isso invocando groff manualmente:

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

Seus erros não podem encontrar caracteres com código de entrada foram porque você usou -Tascii em vez de -Tutf8 e não usou -k para pré-processar os arquivos com preconv .

    
por 11.08.2015 / 15:50
4

Você pode usar o comando fmt , que, até onde eu sei, está presente em qualquer distribuição Linux.

man apropos | fmt -w 70 

irá preencher as linhas com 70 caracteres.

    
por 11.08.2015 / 16:10
2

Você pode usar fold

man cp | fold -w 20

será dobrado após cada 20 caracteres (!). Note que isso cortará as palavras em dois, já que a única opção é "dobrar a cada 20 caracteres"

cuidando disso, você pode usar sed da seguinte maneira (com comprimento de linha dinâmico)

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

adicionará uma nova linha após 20 caracteres aleatórios seguidos de um espaço (ou seja, nova palavra). Assim, as linhas podem ter mais de 20 caracteres (a correspondência é de 20 caracteres, em seguida, um espaço para que uma palavra de 26 caracteres resulte em uma linha de 26 caracteres)

Para omitir o último espaço no comando sed :

sed 's/\(.\{20\}\) /\n/g'
    
por 11.08.2015 / 15:52