Cetak halaman manual dengan lebar tetap

11

Dengan contoh perintah

man apropos > outputfile

file teks dihasilkan yang berisi manhalaman yang diformat apropos(dengan beberapa perbedaan kecil sehubungan dengan man aproposlangsung dicetak di layar, seperti huruf tebal).

Tapi saya ingin secara manual mengatur lebar garis maksimum dari file output yang dihasilkan, sehingga semua paragraf akan dibenarkan untuk lebar itu.

manhalaman dibuat melalui groff: misalnya, saya mencoba untuk meletakkan di .ll 50depan paragraf dari .gz manfile teks sumber asli , tetapi sepele jika saya perlu bekerja pada beberapa manhalaman. Apalagi tidak semua karakter dikenali:

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

Jadi, saya ingin tahu apakah ada metode yang lebih mudah. Bagaimana cara mengubah lebar garis maksimum, selama pembuatan outputfile? Apakah ada perintah khusus?


Edit :

(Semua pertimbangan berikut adalah tentang Ubuntu 18.04: Saya tidak dapat lagi mengujinya di versi sebelumnya, termasuk 14,04 dari pertanyaan di atas.)

Mengenai solusi sementara satu baris, jika MANWIDTHbelum diekspor dengan nilai khusus, tidak ada perbedaan di antara keduanya

$ MANWIDTH=60 man apropos > outputfile

dan

$ COLUMNS=60 man apropos > outputfile

Namun yang pertama, menggunakan MANWIDTH, pada prinsipnya lebih baik.


Sunting 2 (tidak terkait langsung dengan pertanyaan):

Untuk membuat pengaturan lebar permanen yang diterapkan pada pencetakan halaman manual, perlu untuk mengekspor nilai variabel yang diinginkan. Dengan:

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

man aproposakan dicetak dengan lebar yang sama terlepas dari ukuran jendela terminal apa pun. Sebagai gantinya,

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

akan memberikan hasil yang sama seperti sebelumnya hanya jika jendela terminal tidak diubah ukurannya antara exportdan man <page> > outputfile.

BowPark
sumber
Saya tidak dapat mereproduksi input codekesalahan Anda 195 168 bisa è di UTF-8. Apakah halaman manual dalam bahasa Inggris? Apa implementasi pria Anda? Apa lokasi kamu?
Stéphane Chazelas
sistemnya adalah Ubuntu 14.04 (versi dari man man2.6.7.1). Halaman manual dalam bahasa Italia dan itu UTF-8. Apa yang Anda maksud dengan lokal?
BowPark
Apa output dari locale? dan locale charmap?
Stéphane Chazelas
localeoutput: LANG=it_IT.UTF-8 LANGUAGE= LC_CTYPE="it_IT.UTF-8" LC_NUMERIC="it_IT.UTF-8" locale charmapoutput:UTF-8
BowPark
1
Ya, terminal tidak berfungsi dari lesskarena TERMtidak diatur. Maksud saya env -i LANG=it_IT.UTF-8 man apropos > output(atau | head).
Stéphane Chazelas

Jawaban:

18

Gunakan MANWIDTHvariabel lingkungan:

MANWIDTH=60 man apropos > apropos.txt

Halaman manual untuk man 2.7.4 mengatakan:

Jika $ MANWIDTH disetel, nilainya digunakan sebagai panjang baris untuk halaman buku panduan mana yang harus diformat. Jika tidak disetel, halaman manual akan diformat dengan panjang garis yang sesuai dengan terminal saat ini (menggunakan nilai $ COLUMNS, ioctl (2) jika tersedia, atau turun kembali ke 80 karakter jika tidak ada yang tersedia).

Artinya, itu menimpa keduanya COLUMNSdan ioctlnilai. Saya lebih suka untuk tidak bergantung pada modifikasi COLUMNS(meskipun itu bekerja di sini) karena nilainya diperbarui secara dinamis setiap kali ukuran jendela berubah.

Menggunakan MANWIDTHalih-alih COLUMNSjuga memungkinkan Anda untuk membuat perubahan permanen dengan menambahkan baris seperti export MANWIDTH=60ke file startup shell Anda.

Marcel M
sumber
Kerja bagus. Saya juga tidak ingin mengubah KOLOM, dan MANWIDTH bekerja dengan baik di RHEL5. Bersulang.
Felipe Alvarez
1
Catatan untuk pembaca: Anda mungkin perlu menggunakan export MANWIDTH=60jika menyetel ini di ~/.bashrc. Lihat stackoverflow.com/a/30173376/82216 . Juga, pertimbangkan manuntuk menggunakan fungsi untuk mengatur MANWIDTH tergantung pada lebar terminal Anda, seperti yang disarankan di sini di Arch wiki.
sampablokuper
@Marcel M Terima kasih atas jawaban Anda yang sangat tepat. Bisakah Anda membaca pembaruan dalam pertanyaan dan mengedit jawaban Anda untuk memasukkan saran mendasar tentang export MANWIDTH=60?
BowPark
@BowPark Saya menulis jawabannya tanpa exportkarena Anda bertanya tentang solusi sementara: "Bagaimana mengubah lebar garis maksimum, selama pembuatan file keluaran? " (Penekanan tambang). Anda bahkan mungkin ingin mengembalikan hasil edit karena tidak menambah pertanyaan. (Komentar lebih tepat.)
Marcel M
@ MarscelM Sebenarnya Anda benar. Saya mengedit pertanyaan sesuai. Saya menulis suntingan kedua dengan exportpernyataan karena dalam komentar itu hampir tidak dapat dibaca (tidak mungkin membuat baris baru).
BowPark
10

Coba atur COLUMNSvariabel lingkungan. Bekerja untuk saya dengan mandari mandb2.7.0.2 di Debian dengan 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 ...

Dengan versi di Ubuntu 14.04, saya perlu menulisnya:

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

Di sana, mantampaknya mengabaikan COLUMNSvariabel lingkungan jika stdin adalah terminal (kemudian meminta perangkat terminal untuk lebar terminal).

Anda juga dapat mencoba:

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

Yang dengan zshAnda dapat disingkat menjadi:

STTY='cols 60' man apropos | head

Anda bisa melakukannya dengan memohon groffdengan tangan sebagai:

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

Anda tidak dapat menemukan karakter dengan kesalahan kode input karena Anda menggunakan -Tasciialih-alih -Tutf8dan tidak menggunakannya -kuntuk melakukan pra-proses file preconv.

Stéphane Chazelas
sumber
Saya mencoba perintah yang sama:, COLUMNS=60 man apropos | headtetapi sayangnya lebar keluaran adalah semua lebar layar. Bisakah saya mengatur variabel di COLUMNStempat lain atau dengan cara lain?
BowPark
2
Coba COLUMNS=60 < /dev/null man apropos | head. Sepertinya pada Ubuntu 14.04, ia tidak percaya COLUMNSjika stdin adalah terminal (dan mendapatkan lebar dari perangkat terminal).
Stéphane Chazelas
Mungkin seperti yang seharusnya. Dan sekarang berhasil, terima kasih!
BowPark
4

Anda dapat menggunakan fmtperintah, yang sejauh yang saya tahu ada di distribusi Linux.

man apropos | fmt -w 70 

akan membungkus baris di 70 karakter.

dr_
sumber
1
ya saya memilikinya, terima kasih, ini berfungsi dan ini cukup berguna, tetapi saya membutuhkan teks yang dibenarkan dan itu hanya membungkus baris.
BowPark
Maaf, saya pasti ketinggalan bagian itu.
dr_
2

Kamu bisa menggunakan fold

man cp | fold -w 20

akan dilipat setelah setiap 20 karakter (!). Perhatikan bahwa ini akan memotong kata menjadi dua karena satu-satunya pilihan adalah "lipat setiap 20 karakter"

mengurus ini, Anda dapat menggunakan sedsebagai berikut (dengan panjang garis dinamis)

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

akan menambahkan baris baru setelah 20 karakter acak diikuti oleh spasi (yaitu kata baru). Jadi garis mungkin lebih panjang dari 20 karakter (kecocokan adalah 20 karakter kemudian spasi sehingga kata 26 karakter akan menghasilkan garis 26 karakter)

Untuk menghilangkan spasi terakhir dalam sedperintah:

sed 's/\(.\{20\}\) /\1\n/g'
Fiximan
sumber
1
Terima kasih, saya mencoba contoh Anda dan mereka berhasil, tetapi - seperti yang ditulis dalam komentar untuk dr01 - Saya perlu teks yang dibenarkan.
BowPark