Mac の日本語 manpage の文字化け対策にひと工夫、ページロード時に nkf に文字コードを自動判別させてみる

[当方執筆の技術情報に関するライセンス、免責事項、禁止事項](https://qiita.com/EarthSimilarityIndex/items/6b9bb2ccacb38aae15b1)

****

#10.15 Catalina での注意事項

~~[キャタリナさーん](https://dic.pixiv.net/a/%E3%83%AD%E3%83%BC%E3%82%A2%E3%82%A4%E3%83%B3)~~

10.15 からは /usr/share/man もリードオンリーとなり、日本語 manpage を /usr/share/man/ja_JP.UTF-8 に置けなくなりました（なお、/etc/man.conf は問題なく編集可能でした）。

よって、日本語 manpage は /usr/local/share/man/ja_JP.UTF-8 にインストールするのが良さそうです。

場合によっては manpath の mapping も適宜修正する必要があるかもしれません。

<details><summary>man.conf の mapping セクション</summary><div>

```
#
# If people ask for "man foo" and have "/dir/bin/foo" in their PATH
# and the docs are found in "/dir/man", then no mapping is required.
#
# The below mappings are superfluous when the right hand side is
# in the mandatory manpath already, but will keep man from statting
# lots of other nearby files and directories.
#
MANPATH_MAP     /bin                    /usr/share/man
MANPATH_MAP     /sbin                   /usr/share/man
MANPATH_MAP     /usr/bin                /usr/share/man
MANPATH_MAP     /usr/sbin               /usr/share/man
MANPATH_MAP     /usr/local/bin          /usr/local/share/man
MANPATH_MAP     /usr/local/sbin         /usr/local/share/man
MANPATH_MAP     /usr/X11/bin            /usr/X11/man
MANPATH_MAP     /usr/bin/X11            /usr/X11/man
MANPATH_MAP     /usr/bin/mh             /usr/share/man
```

</div></details>

## 参考とした文献
macOS 10.15 CatalinaでファイルシステムがRead-Onlyになる仕様はオプトアウトなしで、完全に無効にすることは不可能。 | AAPL Ch.
https://applech2.com/archives/20190610-read-only-system-volume-apfs-refresh.html

****

# あっさり目に結論

```
$ brew install nkf
$ brew install groff
```

した上で、

```
JNROFF /usr/local/bin/nkf -w | GROFF_NO_SGR=true /usr/local/bin/groff -Dutf8 -Tutf8 -mandoc -mja -E
```
例えば上記の内容で ```JNROFF``` の指定に関する記述を書き換えます。記入先は ```/etc/man.conf``` でも良いですし、```/etc/man.conf``` から（コピペで） ```$HOME/.man/man.conf``` [^1] を作って ```alias man='man -C $HOME/.man/man.conf'``` を ```$HOME/.profile``` や ```$HOME/.bashrc``` に書き込んであげる等しても良いでしょう。

nkf の強力な文字コード自動認識により、ソースが euc でも sjis でも utf8 でも関係なく読めるようになります。

# スクリーンショット
![スクリーンショット 2019-06-26 16.45.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/ba3a0122-3dd7-ab4b-628e-ccfef34f0821.png)

![スクリーンショット 2019-06-26 16.50.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/bea310de-3688-8a60-b4d8-48d48e06bc5e.png)

![スクリーンショット 2019-06-26 16.51.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/ecac22d9-b250-afef-97e8-175b9ad452da.png)

![スクリーンショット 2019-06-26 16.53.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/82a90098-3dc6-9351-e1a2-93ed90a092cf.png)

![スクリーンショット 2019-06-26 16.54.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/df2526b8-2177-3ef9-478a-f8b192ee8479.png)

[^1]: $HOME はそれぞれの環境に応じて読み替えて下さい。ホームディレクトリは ```cd && pwd``` や ```echo $HOME``` 等で確認出来ます。

# man.conf サンプル
Color エスケープシーケンス利用版。文字を色分けしたい場合はターミナルエミュレータ[^2]の側で対応可。変更点は NROFF と JNROFF と PAGER の 3 箇所。PAGER については環境変数として指定することで動的に上書き出来る。

Color エスケープシーケンスを使わない場合はページャー[^3]の側で色分けを指定可。

```
#
# Generated automatically from man.conf.in by the
# configure script.
#
# man.conf from man-1.6c
#
# For more information about this file, see the man pages man(1)
# and man.conf(5).
#
# This file is read by man to configure the default manpath (also used
# when MANPATH contains an empty substring), to find out where the cat
# pages corresponding to given man pages should be stored,
# and to map each PATH element to a manpath element.
# It may also record the pathname of the man binary. [This is unused.]
# The format is:
#
# MANBIN		pathname
# MANPATH		manpath_element	[corresponding_catdir]
# MANPATH_MAP		path_element	manpath_element
#
# If no catdir is given, it is assumed to be equal to the mandir
# (so that this dir has both man1 etc. and cat1 etc. subdirs).
# This is the traditional Unix setup.
# Certain versions of the FSSTND recommend putting formatted versions
# of /usr/.../man/manx/page.x into /var/catman/.../catx/page.x.
# The keyword FSSTND will cause this behaviour.
# Certain versions of the FHS recommend putting formatted versions of
# /usr/.../share/man/[locale/]manx/page.x into
# /var/cache/man/.../[locale/]catx/page.x.
# The keyword FHS will cause this behaviour (and overrides FSSTND).
# Explicitly given catdirs override.
#
# FSSTND
FHS
#
# This file is also read by man in order to find how to call nroff, less, etc.,
# and to determine the correspondence between extensions and decompressors.
#
# MANBIN		/usr/local/bin/man
#
# Every automatically generated MANPATH includes these fields
#
MANPATH	/usr/share/man
MANPATH	/usr/local/share/man
MANPATH	/usr/X11/man
#
# Uncomment if you want to include one of these by default
#
# MANPATH	/opt/*/man
# MANPATH	/usr/lib/*/man
# MANPATH	/usr/share/*/man
# MANPATH	/usr/kerberos/man
#
# Set up PATH to MANPATH mapping
#
# If people ask for "man foo" and have "/dir/bin/foo" in their PATH
# and the docs are found in "/dir/man", then no mapping is required.
#
# The below mappings are superfluous when the right hand side is
# in the mandatory manpath already, but will keep man from statting
# lots of other nearby files and directories.
#
MANPATH_MAP	/bin			/usr/share/man
MANPATH_MAP	/sbin			/usr/share/man
MANPATH_MAP	/usr/bin		/usr/share/man
MANPATH_MAP	/usr/sbin		/usr/share/man
MANPATH_MAP	/usr/local/bin		/usr/local/share/man
MANPATH_MAP	/usr/local/sbin		/usr/local/share/man
MANPATH_MAP	/usr/X11/bin		/usr/X11/man
MANPATH_MAP	/usr/bin/X11		/usr/X11/man
MANPATH_MAP	/usr/bin/mh		/usr/share/man
#
# NOAUTOPATH keeps man from automatically adding directories that look like
# manual page directories to the path.
#
#NOAUTOPATH
#
# NOCACHE keeps man from creating cache pages ("cat pages")
# (generally one enables/disable cat page creation by creating/deleting
# the directory they would live in - man never does mkdir)
# 
#NOCACHE
#
# Useful paths - note that COL should not be defined when
# NROFF is defined as "groff -Tascii" or "groff -Tlatin1";
# not only is it superfluous, but it actually damages the output.
# For use with utf-8, NROFF should be "nroff -mandoc" without -T option.
# (Maybe - but today I need -Tlatin1 to prevent double conversion to utf8.)
#
# If you have a new troff (version 1.18.1?) and its colored output
# causes problems, add the -c option to TROFF, NROFF, JNROFF.
#
TROFF		/usr/bin/groff -Tps -mandoc -c
#NROFF		/usr/bin/groff -Wall -mtty-char -Tascii -mandoc -c
NROFF		/usr/local/bin/groff -Wall -mtty-char -Tascii -mandoc
#JNROFF		/usr/bin/groff -Tnippon -mandocj -c
JNROFF          /usr/local/bin/nkf -w | /usr/local/bin/groff -Dutf8 -Tutf8 -mandoc -mja -E
#JNROFF          /usr/local/bin/nkf -w | GROFF_NO_SGR=true /usr/local/bin/groff -Dutf8 -Tutf8 -mandoc -mja -E
EQN		/usr/bin/eqn -Tps
NEQN		/usr/bin/eqn -Tascii
JNEQN		/usr/bin/eqn -Tnippon
TBL		/usr/bin/tbl
# COL		/usr/bin/col
REFER		/usr/bin/refer
PIC		/usr/bin/pic
VGRIND		
GRAP		
#PAGER		/usr/bin/less -is
PAGER		/usr/bin/less -isR
#PAGER		/usr/local/bin/lv -c
#PAGER		/usr/local/bin/most -s
BROWSER		/usr/bin/less -is
HTMLPAGER	/bin/cat
CAT		/bin/cat
#
# The command "man -a xyzzy" will show all man pages for xyzzy.
# When CMP is defined man will try to avoid showing the same
# text twice. (But compressed pages compare unequal.)
#
CMP		/usr/bin/cmp -s
#
# Compress cat pages
#
COMPRESS	/usr/bin/bzip2
COMPRESS_EXT	.bz2
#
# Default manual sections (and order) to search if -S is not specified
# and the MANSECT environment variable is not set.
#
MANSECT		1:1p:8:2:3:3p:4:5:6:7:9:0p:tcl:n:l:p:o
#
# Default options to use when man is invoked without options
# This is mainly for the benefit of those that think -a should be the default
# Note that some systems have /usr/man/allman, causing pages to be shown twice.
#
#MANDEFOPTIONS	-a
#
# Decompress with given decompressor when input file has given extension
# The command given must act as a filter.
#
.gz		/usr/bin/gunzip -c
.bz2		/usr/bin/bzip2 -c -d
.z		
.Z		/usr/bin/zcat
.F		
.Y		
```

[^2]: OS 標準の「ターミナル」や、```brew cask install iterm2``` でインストール出来る iTerm2 など。

[^3]: less や most は設定でカラフルな表示が可能。

# こってり系の説明
## 環境
  機種名:	Mac mini
  機種ID:	Macmini7,1
  プロセッサ名:	Intel Core i5
  プロセッサ速度:	1.4 GHz
  プロセッサの個数:	1
  コアの総数:	2
  二次キャッシュ（コア単位）:	256 KB
  三次キャッシュ:	3 MB
  ハイパー・スレッディング・テクノロジ:	有効
  メモリ:	4 GB

🍎 macOS Mojave 10.14.5 🍏

![スクリーンショット 2019-06-25 16.21.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/5116970a-c6f9-ce6e-8689-3a5e9265b43e.png)

## 出典・参考文献
Unixシェル#主なUNIXシェルの設定ファイル - Wikipedia
https://ja.wikipedia.org/wiki/Unixシェル#主なUnixシェルの設定ファイル

FreeBSDで日本語マニュアル - PC日記
http://www.wizard-limit.net/mt/pc/archives/005138.html

第18回「温故知新」：玩式草子─ソフトウェアとたわむれる日々｜gihyo.jp … 技術評論社
https://gihyo.jp/lifestyle/serial/01/ganshiki-soushi/0018

サポートページ：Software Design 2018年8月号：｜gihyo.jp … 技術評論社
https://gihyo.jp/magazine/SD/archive/2018/201808/support

man page をHTML（PDF）にして持ち歩く - それマグで！
http://takuya-1st.hatenablog.jp/entry/2014/03/13/051804

homebrew - Qiita
https://qiita.com/tsunemiso/items/9d8cd616ae72572c77d9

日本語版のmanページをMacで開く(groffアップデート) - Qiita
https://qiita.com/yu-ichiro/items/ea9c672e2d7488416db9

manコマンドの表示を日本語化した話 - Qiita
https://qiita.com/fuwamaki/items/fbe7483444261e2425fe

nkfのmanページ文字化けをなんとかする - Qiita
https://qiita.com/Takeru/items/1694653253a9bf038b47

日本語のmanページをプレビューする - Qiita
https://qiita.com/miminashi/items/3f5855871fd431017354

Macのopenコマンドでファイルを開く - Qiita
https://qiita.com/aokiplayer/items/74c7adc3d951a6fbd41f

今回は各出典内・参考文献内の記述を色々と組み合わせ、混ぜ合わせ、繋ぎ合わせてみました。

## Homebrew
**公式サイト**
https://brew.sh/index_ja

公式サイトのワンライナーをコピペ実行。
最近のヤツは Xcode 関連のインストールについても案内してくれるようです。
ワンライナーで一発という性質上、偽サイトに気をつける必要があるかも。

とても便利。

## 日本語 manpage

### GNU 系と BSD 系でオプションが異なるコマンドに注意

参考：jmanを使わずにMacのmanを日本語化する方法 | Macとかの雑記帳
http://tukaikta.blog135.fc2.com/blog-entry-224.html

例えば stat コマンドなどはオプションが随分違います。

GNU の stat
http://linuxjm.osdn.jp/html/GNU_coreutils/man1/stat.1.html

FreeBSD の stat
https://www.freebsd.org/cgi/man.cgi?query=stat&apropos=0&sektion=0&manpath=FreeBSD+12.0-RELEASE+and+Ports&arch=default&format=html

他にも例えば標準採用のCコンパイラなんかにも違いが有ったような。

説明が合わないコマンドは ```LANG=C man コマンド名``` 等で英語のページを参照する、該当の日本語 manpage はインストールしない（例えば GNU Coreutils 系を除外）といった工夫が必要かもしれません。もしくはシステムを FreeBSD とのデュアルブートにして、日本語 manpage の参照先をそちらにリンクしてしまっても面白いかも。

なお、Web 上では以下のサイトで FreeBSD の日本語 manpage が参照出来るようです。

FreeBSDドキュメント jman(0) FreeBSDドキュメントJMan
https://kaworu.jpn.org/doc/FreeBSD/jman.php

### JM Project
https://linuxjm.osdn.jp
https://linuxjm.osdn.jp/download.html
https://linuxjm.osdn.jp/README.html
https://linuxjm.osdn.jp/INSTALL.html

Xcode関係が入っていれば、アーカイブ展開先のディレクトリで

```
$ make config
$ sudo make install
```
で行けるはず。

```/usr/share/man/ja_JP.UTF-8``` にインストールする場合、```make config``` の段階のディレクトリの所有権指定で group に wheel を設定する必要がありました（owner が root で group も root だとインストールが弾かれる）。

### wheel の語源について
sudo - Where did the "wheel" group get its name? - Unix & Linux Stack Exchange
https://unix.stackexchange.com/questions/1262/where-did-the-wheel-group-get-its-name

[Linux] なぜ sudo する権限のあるグループが「 wheel 」という名前なのか « Codaholic
http://codaholic.org/?p=1757

### wheel グループって何さ？

Wheel (computing) - Wikipedia
https://en.wikipedia.org/wiki/Wheel_(computing)

Linuxのユーザーとグループって何だろう？ (2/2)：“応用力”をつけるためのLinux再入門（10） - ＠IT
https://www.atmarkit.co.jp/ait/articles/1706/02/news014_2.html

## JNROFF
これは [/etc/man.conf](https://linuxjm.osdn.jp/html/man/man5/man.conf.5.html) で日本語 manpage の呼び出しに使われる nroff コマンドを指定するセクションです。

## nkf -w
**Network Kanji Filter**
https://ja.osdn.net/projects/nkf/

nkf のオプションで、BOM 無しの UTF-8 出力を命じています。

       -w -w8[0] -w16[BL][0]
           Unicode を出力する。

           -w -w80
               UTF8 コードを出力する。 (BOM 無し)

           -w8 UTF8 コードを出力する。

           -w16 -w16B0
               UTF16 コードを出力する。 (Big Endian / BOM 無し)

           -w16B
               UTF16 コードを出力する。 (Big Endian / BOM 有り)

           -w16L
               UTF16 コードを出力する。 (Little Endian / BOM 有り)

           -w16L0
               UTF16 コードを出力する。 (Little Endian / BOM 無し)

BOM / バイトオーダーマーク
https://ja.wikipedia.org/wiki/バイトオーダーマーク
## |（パイプ）
[pipe - パイプと FIFO の概要](https://linuxjm.osdn.jp/html/LDP_man-pages/man7/pipe.7.html)
https://ja.wikipedia.org/wiki/パイプ_(コンピュータ)
パイプです。前のコマンドの標準入力を次のコマンドの標準出力に流します。

## GROFF_NO_SGR=true

https://linux.die.net/man/1/grotty より。
>GROFF_NO_SGR
If set, the old drawing scheme for bold and underline (using the backspace character) is active. Colors are disabled.

この環境変数を指定することで、エスケープシーケンスによる表現力の高い文字の修飾機能が抑制されるようです。

詳しくはこちら。
[第18回　「温故知新」：玩式草子─ソフトウェアとたわむれる日々｜gihyo.jp … 技術評論社](https://gihyo.jp/lifestyle/serial/01/ganshiki-soushi/0018)

これを指定しない場合、日本語 man ページを正しく表示する為に、ページャーについて

```less -isR```

```less -isr```

あるいは lv なら例えば

```lv -c```

といったオプションが必要となります。
less の R オプションと r オプションについても上記「玩式草子─ソフトウェアとたわむれる日々」に詳細な言及があります。

以下は [JMProject の less のページ](https://linuxjm.osdn.jp/html/GNU_less/man1/less.1.html)より引用
>-i または --ignore-case
大文字小文字の区別をせず、大文字と小文字は同一とみなして検索をする。 このオプションは、検索パターンに大文字が含まれていた場合には無視される。 つまり、検索パターンに大文字が含まれていた場合、 大文字小文字の区別をした検索をする。
　
-s または --squeeze-blank-lines
連続した空白行を、1 行の空白行にまとめる。 nroff の出力を閲覧するときに役立つ。
　
-r または --raw-control-chars
「そのままの」制御文字を表示させるようにする。 デフォルトでは、制御文字をキャレット表記を使って表示する。 例えば、control-A (8 進数 001) は "^A" と表示される。 警告: -r オプションが指定されると、 less は (制御文字のタイプにどのように画面が反応するかに依存しているために) 画面の実際の状況の経過を追うことができない。 よって多くの場合、長い行が誤った位置で分割されてしまうといった問題が生じる。
　
-R または --RAW-CONTROL-CHARS
-r と似ているが、可能な場合には画面表示を正しく維持しようとする。 このオプションが有効なのは、入力が通常のテキストの場合である。 入力には ANSI の「カラー」エスケープシーケンスが含まれていてもよい。 このシーケンスは
       ESC [ ... m
　
のような形式で、"..." は "m" 以外の 0 個以上の文字である。 画面の状況を保つため、 全ての制御文字と ANSI カラーシーケンスは カーソルを移動させないと仮定している。 less に "m" 以外の文字を ANSI カラーエスケープシーケンスの終了文字として認識させることもできる。 そのためには、認識させたい終了文字のリストを 環境変数 LESSANSIENDCHARS に設定すればよい。


[以下は lv の公式サイトの記載](http://www.mt.cs.keio.ac.jp/person/narita/lv/index_ja.html)より引用（文字化けする場合はテキストエンコーディングを ISO 2022-JP に変更して閲覧）

>-c
文字の属性を指定するANSIエスケープシーケンスを通す.
　
-d
正規表現でサーチする際に, 大文字/小文字を区別しない.
　
-f
正規表現ではなく固定文字列でサーチを行なう.


### こぼれ話
/etc/man.conf には

```
# If you have a new troff (version 1.18.1?) and its colored output
# causes problems, add the -c option to TROFF, NROFF, JNROFF.
```

とありますが、groff 1.22.4 のオプションに -c を付けてもエスケープシーケンスだらけな表示は変わらず、-c の代わりに環境変数 GROFF_NO_SGR=true を用いると望む動作となりました。

PAGER="less -is" man bash
![スクリーンショット 2019-06-26 17.25.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/e5fcabac-b43d-4aa6-4807-3211e352e727.png)

PAGER="less -is" GROFF_NO_SGR=true man bash
![スクリーンショット 2019-06-26 17.28.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/d235eea5-1a80-4c01-472b-4d38671a7ccc.png)

PAGER="less -isR" man bash
![スクリーンショット 2019-06-26 17.43.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/294374b9-820c-9185-2aba-de4220a9cf98.png)


## groff -Dutf8 -Tutf8 -mandoc -mja
**GNU troff (Groff) — a GNU project**
https://www.gnu.org/software/groff/

mac に標準で付いてくる groff（バージョン1.19.2）については
```/usr/share/groff/1.19.2```
以下に -T で指定するデバイスや -m で指定する文書整形に関係するマクロが配置されています。このディレクトリの font 以下が -T で呼ぶやつで、tmac 以下が -m で呼ぶやつ（多分）。

mac 標準の groff（Ver 1.19.2）で日本語 manpage を呼び出そうとすると以下のエラー。

```
/usr/bin/groff: can't find `DESC' file
/usr/bin/groff:fatal error: invalid device `nippon'
```

エラーの通り、/usr/share/groff/1.19.2/font 内に nippon が見当たりません。

homebrew で導入出来る groff（1.22.4）については
```/usr/local/Cellar/groff/1.22.4/share/groff/1.22.4/```
に諸々あります。

### -D？
groff 1.22.4 ではプリプロセッサとして preconv が利用出来ます。
（他の内容物は ```/usr/local/Cellar/groff/1.22.4/bin/``` 以下参照）

この preconv に入力のエンコーディングを指定するのが -D オプション。
mac の groff バージョン 1.19.2 にはまだ存在しない機能です。

groff 1.22.4 の manpage より
>-D arg Set default input encoding used by preconv to arg.  Implies  -k.
　
-k     Preprocess with preconv.  This is  run  before  any  other  preprocessor.  Please refer to preconv's manual page for its behaviour if no -K (or -D) option is specified.
　
-K arg Set input encoding used by preconv to arg.  Implies -k.

※ -K と -D の違いがわからん。環境変数 GROFF_ENCODING の扱いに差があるとかかな？

### preconv
manpage より
>NAME
preconv - convert encoding of input files to something GNU troff understands

preconv の manpage でオンラインで読めるもの
http://man7.org/linux/man-pages/man1/preconv.1.html


以下は manpage 記載の preconv のエンコーディング探索アルゴリズム

       preconv tries to find the input encoding with the following
       algorithm.

       1.     If the input encoding has been explicitly specified with
              option -e, use it.

       2.     Otherwise, check whether the input starts with a Byte Order
              Mark (BOM, see below).  If found, use it.

       3.     Otherwise, check whether there is a known coding tag (see
              below) in either the first or second input line.  If found,
              use it.

       4      Finally, if the uchardet library (an encoding detector library
              available on most major distributions) is available on the
              system, use it to try to detect the encoding of the file.

       5.     If everything fails, use a default encoding as given with
              option -D, by the current locale, or ‘latin1’ if the locale is
              set to ‘C’, ‘POSIX’, or empty (in that order).

       Note that the groff program supports a GROFF_ENCODING environment
       variable which is eventually expanded to option -k.

### -T や -m
上述の preconv のオンライン manpage と同じサイトに新しめの manpage が公開されています。

groff の manpage（-T で呼び出されるデバイスとポストプロセッサの説明も含みます）
http://man7.org/linux/man-pages/man1/groff.1.html

-m で呼び出すマクロについての manpage
http://man7.org/linux/man-pages/man5/groff_tmac.5.html

ja は Language-specific Packages の一つと思われますが、新しい機能のためか言及がありません。

-mandoc 無し、-mja 無し
![スクリーンショット 2019-06-26 10.44.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/a264edb7-f8ac-6f50-490c-d1035ebd3ae7.png)

-mandoc 無し -mja 有り
![スクリーンショット 2019-06-26 10.46.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/e243fc6d-9aac-405d-d72b-b07020b98428.png)

-mandoc 有り、-mja 無し
![スクリーンショット 2019-06-26 10.48.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/a1c9bcb5-afdd-f2cd-bcee-a438b7f34707.png)

-mandoc 有り -mja 有り
![スクリーンショット 2019-06-26 10.33.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/4a3de968-ed2a-e15b-c02e-e3f7f8548843.png)

### -E
troff のエラー出力の抑制

出典：
サポートページ：Software Design 2018年8月号：｜gihyo.jp … 技術評論社
https://gihyo.jp/magazine/SD/archive/2018/201808/support

以下は [JMProject の groff のページ](https://linuxjm.osdn.jp/html/GNU_groff/man1/groff.1.html)及び [JMProject の troff のページ](https://linuxjm.osdn.jp/html/GNU_groff/man1/troff.1.html)より引用

>-E
エラーメッセージを一切出力しません。

-E 無し
![スクリーンショット 2019-06-26 10.30.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/855ecc07-2953-9ce0-66fc-ccaf8545a17a.png)

-E 有り
![スクリーンショット 2019-06-26 10.33.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/4a3de968-ed2a-e15b-c02e-e3f7f8548843.png)

# et cetera
## preconv -k
-Dutf8 の代わりに -k でプリプロセッサに preconv を指定してみる。
文字コードは自動判別でも大丈夫でした。
例）```groff -k -Tutf8 -mandoc -mja -E```

## nkf -w8
nkf に BOM を生成させると自動判別失敗の不安は無くなるかも。

```
JNROFF /usr/local/bin/nkf -w8 | GROFF_NO_SGR=true /usr/local/bin/groff -k -Tutf8 -mandoc -mja -E
```

## エスケープシーケンスと manpage のカラー表示
### 端末エミュレータ側で対応する
ANSI の「カラー」エスケープシーケンスを有効にしている場合、端末エミュレータのフォントカラーの指定で manpage を色分け出来ます。

#### ターミナル
![スクリーンショット 2019-06-26 16.53.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/82a90098-3dc6-9351-e1a2-93ed90a092cf.png)

##### 設定画面
![スクリーンショット 2019-06-27 11.59.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/7cea693d-ae1d-c050-9008-68113eb6ba7d.png)
「テキスト」セクションで色分けを指定します。

#### iTerm2
![スクリーンショット 2019-06-27 17.30.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/01752fb9-22dd-61b6-6f28-4065fa8fcc90.png)

##### 設定画面
![スクリーンショット 2019-06-27 11.58.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/1c9dcfba-4cac-d878-0fe4-51d08904bf91.png)
「Basic Colors」セクションで色分けを指定します。

iTerm2 の方が色分け可能な項目が多い印象。
### ページャー側で対応する

troff による「カラー」エスケープシーケンスを無効にし、ページャーに色分け作業を分担させます。

#### 参考文献：
【シェル芸奥義】tputを使ってみる【エスケープシークエンス】 - Qiita
https://qiita.com/onokatio/items/5d282b72ac5565ae4569

manをもっと便利に使おう！(ビルトインコマンドに対応 + 色付きで表示) - Qiita
https://qiita.com/ssh0/items/f148f0125faad5217160

コンソールのカラー出力 - ArchWiki
https://wiki.archlinux.jp/index.php/コンソールのカラー出力

less - Colors in Man Pages - Unix & Linux Stack Exchange
https://unix.stackexchange.com/questions/119/colors-in-man-pages

terminal - List of ANSI color escape sequences - Stack Overflow
https://stackoverflow.com/questions/4842424/list-of-ansi-color-escape-sequences

2 Easy Ways To Get Color Man Pages In Linux | 2daygeek.com
https://www.2daygeek.com/2-easy-ways-to-get-color-man-pages-in-linux-using-less-most-command/

#### less

![スクリーンショット 2019-06-27 16.40.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/d6441f43-84e3-153d-494a-ea83e7042928.png)

例えば以下のような内容を $HOME/Documents/Man_Page などの名前で保存し、専用のプロファイルを作成して起動時に source するようにします。

```
export GROFF_NO_SGR=true
export PAGER="less -is"

export LESS_TERMCAP_mb=$(tput bold)                # begin blinking
export LESS_TERMCAP_md=$(tput bold; tput setaf 14) # begin bold
export LESS_TERMCAP_me=$(tput sgr0)                # end mode
export LESS_TERMCAP_se=$(tput sgr0)                # end standout-mode
export LESS_TERMCAP_so=$(tput bold; tput setaf 11) # begin standout-mode
export LESS_TERMCAP_ue=$(tput rmul; tput sgr0)     # end underline
export LESS_TERMCAP_us=$(tput smul; tput setaf 41) # begin underline
```

※ 上記は[manをもっと便利に使おう！(ビルトインコマンドに対応 + 色付きで表示)](https://qiita.com/ssh0/items/f148f0125faad5217160)内の記述を元に一部改変し作成。

![スクリーンショット 2019-06-27 16.43.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/86397dab-6871-67ad-ca42-31b3cac9e53f.png)

###### tput setaf 数値

![スクリーンショット 2019-06-27 16.06.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/7d968941-45d3-1f56-f87a-c292001283dd.png)

terminfo の manpage より引用
http://man7.org/linux/man-pages/man5/terminfo.5.html

| Variable String | Capname | TCap Code | Description |
|:-:|:-:|:-:|:-:|
| set_a_foreground | setaf | AF | Set foreground color to #1, using ANSI escape |

※ こちらの節は[【シェル芸奥義】tputを使ってみる【エスケープシークエンス】](https://qiita.com/onokatio/items/5d282b72ac5565ae4569)を参考に作成。

##### most
The MOST pager
http://www.jedsoft.org/most/index.html

![スクリーンショット 2019-06-27 17.11.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/ffd19023-f0b3-ab51-9316-61379da6ebba.png)
[コンソールのカラー出力 - ArchWiki](https://wiki.archlinux.jp/index.php/コンソールのカラー出力)より引用
>カラーの値を変更するには ~/.mostrc または /etc/most.conf (システム全体に変更が適用されます) を編集する必要があります (ファイルが存在しない場合は作成してください)。~/.mostrc の例:
>
>>% Color settings
color normal lightgray black
color status yellow blue
color underline yellow black
color overstrike brightblue black

また、以下のような内容を $HOME/Documents/GROFF_NO_SGR などの名前で保存し、専用のプロファイルを作成して起動時に source するようにします。

```
export GROFF_NO_SGR=true
```

![スクリーンショット 2019-06-27 17.55.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/2cafa0bc-b6db-ef1a-9faf-097c521ee907.png)

##### w3mman
W3M Homepage
http://w3m.sourceforge.net

Debian(Tatsuya Kinoshita)版
https://github.com/tats/w3m

![スクリーンショット 2019-06-27 18.21.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/54fd1729-d706-ad33-4203-7936255d2a45.png)

![スクリーンショット 2019-06-27 18.19.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/c4f4a76c-cbdc-c0d5-9403-1e5f32452e30.png)

man.conf のページャーセクションに記述する上記二例と異なり、こちらは w3m を用いる man の置き換えコマンドです。```w3mman コマンド名``` で通常の man コマンドのように manpage を閲覧可能である他、 w3mman 単体で manpage ブラウザとして起動出来ます。テキストベースの web ブラウザでブラウジングする感覚で manpage を閲覧出来、他のコマンドへの言及をリンクとして辿ることも可能です。端末の背景及び太字や通常の文字の色については端末エミュレータ側の設定に、リンクのカラーは w3m における設定に準じるようです。

###### インストール
```
$ brew install w3m
```

##### w3mman の環境変数の設定
例えば $HOME/.man/man.conf で JNROFF を設定してある場合は

```export W3MMAN_MAN="man -C $HOME/.man/man.conf"```

を ```$HOME/.bashrc``` 辺りに記入しておきます。

また、以下のような内容を $HOME/Documents/GROFF_NO_SGR などの名前で保存し、専用のプロファイルを作成して起動時に source するようにします。

```
export GROFF_NO_SGR=true
```

![スクリーンショット 2019-06-27 17.55.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/2cafa0bc-b6db-ef1a-9faf-097c521ee907.png)


###### w3mの基本的なキーバインド
http://w3m.sourceforge.net/MANUAL.ja.html#Key:orig
※ 文字化けする場合はエンコーディングで EUC を指定して下さい。

###### w3m のマニュアル
http://w3m.sourceforge.net/MANUAL.ja.html
※ 文字化けする場合はエンコーディングで EUC を指定して下さい。

###### w3mman のマニュアル
https://github.com/tats/w3m/blob/master/scripts/w3mman/README

## 日本語 manpage を html に
### groff で nkf のマニュアルページを html に変換
cat は manpage が .gz 圧縮なら gzcat 等、適宜読み替えてください。 
#### HTML 出力
```
$ cat $(man nkf -w) | /usr/local/bin/nkf -w | /usr/local/bin/groff -Dutf8 -Thtml -mandoc -mja > $HOME/Documents/nkf.html
$ open $HOME/Documents/nkf.html
```

open コマンドは便利ですね。

インデントが深くなり過ぎる場合は -mja を外します。

また、PDF への変換は Safari の「PDFとして書き出す…」で行います。

### w3m 付属の manpage 検索・閲覧コマンド w3mman で nkf のマニュアルページを html に変換
#### 準備
##### w3m のインストール

```
$ brew install w3m
```

##### w3mman の環境変数の設定
例えば $HOME/.man/man.conf で JNROFF を設定してある場合は

```export W3MMAN_MAN="man -C $HOME/.man/man.conf"```

を ```$HOME/.bashrc``` 辺りに記入しておきます。

#### HTML 出力

```
$ GROFF_NO_SGR=true W3MMAN_W3M="w3m -dump_source" w3mman nkf > $HOME/Documents/nkf.html
$ open $HOME/Documents/nkf.html
```

環境変数 GROFF_NO_SGR=true で Color エスケープシーケンスを抑制。

環境変数 W3MMAN_W3M で w3m にダンプオプションを指定。

文字化けする場合は文字コードを UTF-8 に設定。もしくは、\<meta charset="utf-8"/\>を head 開始タグの直後に書き加えると良さそう。

出典:
HTMLで文字エンコーディングを指定する
https://www.w3.org/International/questions/qa-html-encoding-declarations.ja

### 以下、失敗中
groff の引数を -Tps や -Tpdf と置き換えるだけでは日本語を含む man ページは ps や pdf に上手く変換出来ませんでした。フォント指定に失敗しているのかな？ pdfroff を使っても上手く行かず。
[unicode - How do I convert a troff manpage with UTF-8 characters (czech to be precise) to PDF - Unix & Linux Stack Exchange](https://unix.stackexchange.com/questions/361274/how-do-i-convert-a-troff-manpage-with-utf-8-characters-czech-to-be-precise-to)
↑こちらはチェコ語の文字の話だけど、dviを経由するといいよとアドバイスがあるので、```brew cask install mactex```（mactex-no-gui でも良さそう）で MacTeX をインストール。そのままでは dvips が見つからないとエラーを吐くのでターミナルを開き直し、groff から -Tdvi で dvi 出力して dvipdf で pdf を生成するも、日本語が欠けてしまう点は変わらずでした。