In trang man với chiều rộng cố định


11

Với lệnh ví dụ

man apropos > outputfile

một tệp văn bản được tạo có chứa mantrang được định dạng của apropos(với một số khác biệt nhỏ liên quan đến man aproposin trực tiếp trên màn hình, chẳng hạn như các ký tự in đậm).

Nhưng tôi muốn đặt thủ công độ rộng dòng tối đa của tệp đầu ra được tạo, để tất cả các đoạn sẽ được chứng minh theo chiều rộng đó.

mancác trang được tạo thông qua groff: ví dụ: tôi đã cố gắng đặt .ll 50trước một đoạn của .gz mantệp văn bản nguồn gốc, nhưng nó không quan trọng nếu tôi cần làm việc trên một số mantrang. Ngoài ra, không phải tất cả các nhân vật đều được công nhận:

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

Vì vậy, tôi tự hỏi nếu một phương pháp đơn giản hơn tồn tại. Làm thế nào để sửa đổi độ rộng dòng tối đa, trong quá trình tạo một outputfile? Có một số lệnh cụ thể?


Chỉnh sửa :

(Tất cả các cân nhắc sau đây là về Ubuntu 18.04: Tôi không thể kiểm tra thêm chúng trong các phiên bản trước, bao gồm 14.04 của câu hỏi trên.)

Liên quan đến giải pháp tạm thời một dòng, nếu MANWIDTHchưa được xuất với giá trị tùy chỉnh, không có sự khác biệt giữa

$ MANWIDTH=60 man apropos > outputfile

$ COLUMNS=60 man apropos > outputfile

Cái đầu tiên, sử dụng MANWIDTH, tuy nhiên tốt hơn về nguyên tắc.


Chỉnh sửa 2 (không liên quan chặt chẽ đến câu hỏi):

Để thực hiện thay thế cài đặt độ rộng vĩnh viễn được áp dụng cho bất kỳ in ấn trang nào, cần phải xuất giá trị mong muốn của biến. Với:

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

man apropossẽ được in với cùng chiều rộng bất kể thay đổi kích thước cửa sổ đầu cuối. Thay thế,

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

sẽ cung cấp kết quả tương tự như trước chỉ khi cửa sổ đầu cuối không được thay đổi kích thước giữa exportman <page> > outputfile.


Tôi không thể tái tạo input codelỗi của bạn 195 168 có thể là è trong UTF-8. Là trang người đàn ông bằng tiếng Anh? Người đàn ông của bạn thực hiện những gì? Địa điểm của bạn là gì?
Stéphane Chazelas

hệ thống là Ubuntu 14.04 (phiên bản từ man man2.6.7.1). Trang người đàn ông bằng tiếng Ý và nó là UTF-8. Bạn có ý nghĩa gì bởi miền địa phương?
BowPark

Đầu ra của localecái gì? và locale charmap?
Stéphane Chazelas

localeđầu ra: LANG=it_IT.UTF-8 LANGUAGE= LC_CTYPE="it_IT.UTF-8" LC_NUMERIC="it_IT.UTF-8" locale charmapđầu ra:UTF-8
BowPark

1
thiết bị đầu cuối không hoạt độnglessTERMkhông được thiết lập. Ý tôi là env -i LANG=it_IT.UTF-8 man apropos > output(hoặc | head).
Stéphane Chazelas

Câu trả lời:


18

Sử dụng MANWIDTHbiến môi trường:

MANWIDTH=60 man apropos > apropos.txt

Trang web cho người đàn ông 2.7.4 nói:

Nếu $ MANWIDTH được đặt, giá trị của nó được sử dụng làm độ dài dòng cho các trang thủ công sẽ được định dạng. Nếu nó không được đặt, các trang thủ công sẽ được định dạng với độ dài dòng phù hợp với thiết bị đầu cuối hiện tại (sử dụng giá trị $ COLUMNS, ioctl (2) nếu có hoặc giảm xuống 80 ký tự nếu không có sẵn).

Đó là, nó ghi đè cả hai COLUMNSioctlgiá trị. Tôi không muốn dựa vào sửa đổi COLUMNS(mặc dù nó hoạt động ở đây) vì giá trị của nó được cập nhật động mỗi khi kích thước cửa sổ thay đổi.

Sử dụng MANWIDTHthay vì COLUMNScũng cho phép bạn thực hiện thay đổi vĩnh viễn bằng cách thêm một dòng như export MANWIDTH=60vào tệp khởi động shell của bạn.


Công việc tuyệt vời. Tôi cũng không muốn thay đổi CỘT, và MANWIDTH thực hiện một điều trị trong RHEL5. Chúc mừng.
Felipe Alvarez

1
Một lưu ý cho độc giả: bạn có thể cần sử dụng export MANWIDTH=60nếu cài đặt cái này trong của bạn ~/.bashrc. Xem stackoverflow.com/a/30173376/82216 . Ngoài ra, hãy xem xét gói mantrong một chức năng để đặt MANWIDTH tùy thuộc vào độ rộng thiết bị đầu cuối của bạn, như được đề xuất ở đây trên wiki Arch.
sampablokuper 17/12/17

@Marcel M Cảm ơn bạn đã trả lời rất chính xác. Bạn có thể vui lòng đọc bản cập nhật trong câu hỏi và chỉnh sửa câu trả lời của bạn để bao gồm gợi ý cơ bản về export MANWIDTH=60không?
BowPark

@BowPark Tôi đã viết câu trả lời mà không cần exporthỏi vì bạn đã hỏi về một giải pháp tạm thời: "Làm cách nào để sửa đổi độ rộng dòng tối đa, trong quá trình tạo tệp đầu ra? " (Nhấn mạnh của tôi). Bạn thậm chí có thể muốn hoàn nguyên chỉnh sửa của mình vì nó không thêm vào câu hỏi. (Một nhận xét phù hợp hơn.)
Marcel M

@MarcelM Thật ra bạn đúng. Tôi chỉnh sửa câu hỏi cho phù hợp. Tôi đã viết một chỉnh sửa thứ hai với các exporttuyên bố vì trong một bình luận, nó gần như không thể đọc được (không thể tạo ra các dòng mới).
BowPark

10

Hãy thử thiết lập COLUMNSbiến môi trường. Hoạt động với tôi mantừ mandb2.7.0.2 trên Debian với 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 ...

Với phiên bản trên Ubuntu 14.04, tôi cần viết nó:

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

Ở đó, mandường như bỏ qua COLUMNSbiến môi trường nếu stdin là một thiết bị đầu cuối (sau đó nó truy vấn thiết bị đầu cuối cho chiều rộng của thiết bị đầu cuối).

Bạn cũng có thể thử:

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

Mà với zshbạn có thể rút ngắn để:

STTY='cols 60' man apropos | head

Bạn có thể làm điều đó bằng cách gọi groffbằng tay như:

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

Bạn không thể tìm thấy ký tự có lỗi mã đầu vào là do bạn đã sử dụng -Tasciithay vì -Tutf8và không sử dụng -kđể xử lý trước các tệp preconv.


Tôi đã thử cùng một lệnh: COLUMNS=60 man apropos | headnhưng không may chiều rộng đầu ra là tất cả chiều rộng màn hình. Tôi có thể đặt biến COLUMNSở nơi khác hoặc theo cách khác không?
BowPark

2
Hãy thử COLUMNS=60 < /dev/null man apropos | head. Giống như trên Ubuntu 14.04, nó không tin tưởng COLUMNSnếu stdin là thiết bị đầu cuối (và có chiều rộng từ thiết bị đầu cuối).
Stéphane Chazelas

Có lẽ nó giống như bạn nghĩ. Và bây giờ nó hoạt động, cảm ơn bạn!
BowPark

4

Bạn có thể sử dụng fmtlệnh, theo như tôi biết có trong bất kỳ bản phân phối Linux nào.

man apropos | fmt -w 70 

sẽ kết thúc các dòng ở 70 ký tự.


1
vâng tôi có nó, cảm ơn bạn, nó hoạt động và nó khá hữu ích, nhưng tôi cần một văn bản hợp lý và nó chỉ đơn giản là kết thúc các dòng thay thế.
BowPark

Xin lỗi, tôi đã bỏ lỡ phần đó.
dr01

2

Bạn có thể dùng fold

man cp | fold -w 20

sẽ gấp sau mỗi 20 ký tự (!). Lưu ý rằng điều này sẽ cắt các từ thành hai vì tùy chọn duy nhất là "gấp 20 ký tự"

quan tâm đến điều này, bạn có thể sử dụng sednhư sau (với độ dài dòng động)

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

sẽ thêm một dòng mới sau 20 ký tự ngẫu nhiên theo sau là khoảng trắng (nghĩa là từ mới). Vì vậy, các dòng có thể dài hơn 20 ký tự (khớp là 20 ký tự sau đó là khoảng trắng để một từ 26 ký tự sẽ dẫn đến một dòng 26 ký tự)

Để bỏ không gian cuối cùng trong sedlệnh:

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

1
Cảm ơn bạn, tôi đã thử các ví dụ của bạn và chúng hoạt động, nhưng - như được viết trong một bình luận cho dr01 - tôi cần một văn bản hợp lý.
BowPark
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.