Sabit genişlikte kılavuz sayfalar yazdırma


11

Örnek komutla

man apropos > outputfile

biçimlendirilmiş mansayfasını içeren bir metin dosyası oluşturulur apropos( man aproposkalın karakterler gibi doğrudan ekrana basılmasıyla ilgili küçük farklılıklar vardır ).

Ancak, tüm paragraflar bu genişliğe haklı gösterilecek şekilde oluşturulan çıktı dosyasının maksimum çizgi genişliğini manuel olarak ayarlamak istiyorum.

mansayfalar aracılığıyla oluşturulur groff: örneğin, .ll 50orijinal .gz mankaynak metin dosyasının bir paragrafının önüne koymaya çalıştım , ancak birkaç mansayfada çalışmam gerekiyorsa önemsiz . Üstelik tüm karakterler tanınmıyor:

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

Daha basit bir yöntemin var olup olmadığını merak ediyorum. Bir çizginin oluşturulması sırasında maksimum çizgi genişliği nasıl değiştiriliroutputfile ? Belirli bir komut var mı?


Düzenle :

(Aşağıdaki tüm hususlar Ubuntu 18.04 ile ilgilidir: Yukarıdaki sorunun 14.04'ü dahil olmak üzere önceki sürümlerde bunları test edemiyorum.)

Tek satırlık geçici bir çözümle ilgili MANWIDTHolarak, önceden özel bir değerle dışa aktarılmamışsa, arasında bir fark yoktur.

$ MANWIDTH=60 man apropos > outputfile

ve

$ COLUMNS=60 man apropos > outputfile

Ancak ilki, MANWIDTHprensip olarak daha iyidir.


Düzenleme 2 (soru ile kesinlikle ilgili değil):

Bunun yerine, herhangi bir sayfa yazdırmaya kalıcı bir genişlik ayarı yapmak için , değişkenin istenen değerini dışa aktarmak gerekir . İle:

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

man aproposherhangi bir terminal penceresi yeniden boyutlandırmasına bakılmaksızın aynı genişlikte yazdırılacaktır. Yerine,

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

Terminal penceresi arasında boyutlandırılır değil, yalnızca daha önce olduğu gibi aynı sonucu sağlayacak exportve man <page> > outputfile.


input codeHatalarınızı yeniden oluşturamıyorum 195 168 UTF-8'de olabilir. Man sayfası İngilizce mi? Adamın uygulaması nedir? Yerel ayarınız nedir?
Stéphane Chazelas

sistem Ubuntu 14.04'tür (sürüm man man2.6.7.1'dir). Man sayfası İtalyanca ve UTF-8. Yerel ayarla ne demek istiyorsun?
BowPark

Çıktısı nedir locale? ve 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
Evet işlevsel olmayan terminali dan lessdolayı TERMayarlanmamış. Demek istedim env -i LANG=it_IT.UTF-8 man apropos > output(ya da | head).
Stéphane Chazelas

Yanıtlar:


19

MANWIDTHOrtam değişkenini kullanın :

MANWIDTH=60 man apropos > apropos.txt

2.7.4 erkek için manpage diyor:

$ MANWIDTH ayarlanırsa, değeri manuel sayfaların biçimlendirilmesi gereken satır uzunluğu olarak kullanılır. Ayarlanmadıysa, manuel sayfalar geçerli terminale uygun bir satır uzunluğu ile biçimlendirilir ($ COLUMNS değeri, varsa bir ioctl (2) kullanılarak veya mevcut değilse 80 karaktere geri döner).

Yani, hem değeri hem COLUMNSde ioctldeğeri geçersiz kılar . COLUMNSPencere boyutu her değiştiğinde değeri dinamik olarak güncellendiğinden (burada çalışmasına rağmen) değiştirmeye güvenmemeyi tercih ederim .

MANWIDTHBunun yerine kullanmak , kabuk başlangıç ​​dosyanıza COLUMNSgibi bir satır ekleyerek değişikliği kalıcı yapmanıza olanak tanır export MANWIDTH=60.


Mükemmel iş. Ben de COLUMNS değiştirmek istemiyordu ve MANWIDTH RHEL5 bir tedavi çalışır. Şerefe.
Felipe Alvarez

1
Okuyucular için bir not: bunu export MANWIDTH=60ayarlamanız durumunda kullanmanız gerekebilir ~/.bashrc. Bkz. Stackoverflow.com/a/30173376/82216 . Ayrıca, burada Arch wiki'de manönerildiği gibi, terminal genişliğinize bağlı olarak MANWIDTH değerini ayarlamak için bir işlev sarmayı düşünün .
sampablokuper

@Marcel M Çok kesin cevabınız için teşekkür ederim. Lütfen sorudaki güncellemeyi okuyabilir ve yanıtınızı ilgili temel öneriyi içerecek şekilde düzenleyebilir export MANWIDTH=60misiniz?
BowPark

@BowPark Cevabı, exportgeçici bir çözüm sorduğunuz için yazmadım : "Bir çıktı dosyasının oluşturulması sırasında maksimum satır genişliği nasıl değiştirilir ? " (Benimkini vurgulayın). Hatta soruyu eklemediği için düzenlemenizi geri almak isteyebilirsiniz. (Bir yorum daha uygundur.)
Marcel M

@MarcelM Aslında haklısınız. Soruyu buna göre düzenledim. exportİfadelerle ikinci bir düzenleme yazdım çünkü bir yorumda neredeyse okunamayacaktı (yeni satırlar oluşturmak mümkün değil).
Eylül

10

COLUMNSOrtam değişkenini ayarlamayı deneyin . Benim için Works mangelen mandbile Debian 2.7.0.2 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 ...

Ubuntu 14.04 sürümü ile yazmam gerekiyor:

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

Orada, stdin bir terminal ise ortam değişkenini mangöz ardı ediyor gibi görünüyor COLUMNS(daha sonra terminal cihazını terminal genişliği için sorgular).

Ayrıca deneyebilirsiniz:

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

Hangi ile zshkısaltabilirsiniz:

STTY='cols 60' man apropos | head

Bunu groffelinizle şu şekilde çağırarak yapabilirsiniz :

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

Kişisel giriş kodu ile bulamıyorum karakter kullanmış çünkü hatalar vardı -Tasciiyerine -Tutf8ve kullanımı vermedi -kdosyaları-sürecini öncesi preconv.


Aynı komutu denedim: COLUMNS=60 man apropos | headama ne yazık ki çıktı genişliği tüm ekran genişliği. Değişkeni COLUMNSbaşka bir yerde veya başka bir şekilde ayarlayabilir miyim ?
BowPark

2
Deneyin COLUMNS=60 < /dev/null man apropos | head. Ubuntu 14.04'te olduğu gibi, stdin'in COLUMNSbir terminal olup olmadığına güvenmiyor (ve terminal cihazından genişliği alıyor).
Stéphane Chazelas

Belki de sandığınız gibi. Ve şimdi çalışıyor, teşekkürler!
BowPark

4

fmtBildiğim kadarıyla herhangi bir Linux dağıtımında bulunan komutu kullanabilirsiniz .

man apropos | fmt -w 70 

satırları 70 karakter olacak.


1
evet var, teşekkür ederim, işe yarıyor ve oldukça kullanışlı, ama haklı bir metne ihtiyacım var ve bunun yerine satırları tamamlıyor.
BowPark

Üzgünüm, o kısmı kaçırmış olmalıyım.
dr_

2

Kullanabilirsiniz fold

man cp | fold -w 20

her 20 karakterden sonra katlanır (!). Bunun tek seçenek "her 20 karakteri katla" olduğu için, bu kelimelerin ikiye bölüneceğini unutmayın.

sedbununla ilgilenirken, aşağıdaki gibi kullanabilirsiniz (dinamik çizgi uzunluğunda)

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

20 rastgele karakter ve ardından bir boşluk (yani yeni sözcük) sonra yeni satır ekler. Bu nedenle satırlar 20 karakterden daha uzun olabilir (eşleşme 20 karakterden sonra bir boşluktur, böylece 26 karakterlik bir kelime 26 karakterlik bir satırla sonuçlanır)

Komuttaki son alanı atlamak için sed:

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

1
Teşekkür ederim, örneklerinizi denedim ve işe yarıyorlar, ama - dr01'e yaptığı bir yorumda yazıldığı gibi - haklı bir metne ihtiyacım var.
BowPark
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.