目的
- 日本語のコメントの入ったコードをコマンドラインからカラーで印刷する。
- 調べてみるとあんまりいい感じのツールはないようです。
enscript
はコードのカラー化ができますが残念なことに日本語がダメみたい。a2ps
は日本語はパッチが当たっているようですが、カラー化ができるのかすぐ見つからず、情報も古いのでなんだか面倒だとおもちゃいました。 vim
のコマンド:hardcopy
でカラーになっていい感じで印刷できますが、こちらも日本語が化けます。- そこで目につけたのが
vim
の:TOhtml
でhtmlにしてみるといい感じでブラウザで表示できました。これならコマンドラインから変換して印刷できそう。
環境
- MacOSX Darwin Kernel Version 17.7.0: MacBookPro11,1 Darwin
- wkhtmltopdf 0.12.5 (with patched qt)
- VIM - Vi IMproved 8.1 (2018 May 18, compiled Aug 3 2019 18:07:03)
- GNU bash, バージョン 5.0.11(1)-release (x86_64-apple-darwin17.7.0)
- これらのインストール情報は比較的簡単に見つかりますのでそちらでお試しください。またインストールの説明は冗長だと思いますので。
vimをバッチで使う
- vimは好きなエディタでインターラクティブに動きますが、バッチモードでも動きます。これを使います。下記のスクリプトではvimが開いて処理しますが、待てば自動でhtmlファイルが生成されます。
~$ cat script_vim_TOhtml
:TOhtml
:w!
:q!
:q!
~$ vim -s script_vim_TOhtml hoge.bash
tmp$ ls
hoge.bash print_script.bash script_vim_TOhtml
tmp$ vim -s script_vim_TOhtml hoge.bash
tmp$ ls
hoge.bash hoge.bash.html print_script.bash script_vim_TOhtml
(htmlファイルができています)
- 一応説明して置きますと、vimのバッチ処理で受け取った引数のファイルを
:TOhtml
でhtmlファイルに変換します。これはまだメモリ上のバッファなので、:w!
で強制上書きします。名前のデフォルトはファイル名に.htmlを加えたものです。バッファのhtmlのファイルと元のファイルを閉じるために:q!
を二回続けます。 vim -s
はスクリプトを読み込むオプションです。
全体のスクリプト
- これを
wkhtmltopdf
とlpr
に渡せばいいのです。こんなスクリプトです。
tmp$ cat print_script.bash
#!/usr/local/bin/bashf_html=$1.html
f_pdf=${1%.*}.pdf
vi -s script_vim_TOhtml $1cat$f_html | wkhtmltopdf - $f_pdf
lpr $f_pdf[$?-eq 0 ]&&echo"印刷成功"
tmp$
各行の説明です。
1. 2行目の${1%.*}.pdf
は拡張子をpdfに変換するbashのパターン置換です。
2. wkhtmltopdf
はファイルの拡張子がhtmlだとhttp://
をつけたURLを読みに行くのでcat $f_html
とパイプで標準入力に渡しています。wkhtmotopdf
の入力は-
で標準入力になります。
3. 出力に$f_pdf
を指定すればpdfファイルができます。これをlpr
で出力するだけ。多分pdfを介さずにパイプでいけるでしょうが、確認用にpdfも残すためにファイルにしています。
4. 最後の行はエラーチェックして成功を表示しています。
5. エラー処理はしていないので、適宜必要に応じて追加してもらえればいいなと思います。
結果
- こんな感じです。
tmp$ ls
hoge.bash print_script.bash script_vim_TOhtml
tmp$ ./print_script.bash hoge.bash
Loading pages (1/6)
Counting pages (2/6)
Resolving links (4/6)
Loading headers and footers (5/6)
Printing pages (6/6)
Done
印刷成功
tmp$ ls
hoge.bash hoge.bash.html hoge.pdf print_script.bash script_vim_TOhtml
tmp$
変換されたhtmlもpdfも残しています。これで複数あるコードも一括して印刷できるでし、どのファイルを印刷したのかもファイルを見ればわかります。
こんな短いコードですが、どなたかのお役に立てれば嬉しいです。