実装の動機
keycast.vim というプラグインを紹介した(keycast.vimをつくった - pockestrap)ところ、macOSでうまく動かないという報告をもらいました。 調べてみると、keycast.vimが依存しているbannerコマンドの挙動がプラットフォームによって違うようです。 keycast.vimはArch Linuxに入っているbannerコマンドの挙動に暗に依存していたため、macOSに入っているBSDのbannerコマンドではうまく動作しませんでした。
bannerの種類
少なくとも、banner (1)には実装が3つあることがわかりました。
- Sverre H. Husebyによる実装(以下shh版)
- https://shh.thathost.com/pub-unix/ から入手可能
- Arch Linuxのbannerパッケージで入るのはこれ。
- 今回vannerを実装する際に参考にした。
- System Vの実装
- http://packages.qa.debian.org/s/sysvbanner.html から入手可能1
- Arch Linuxのsysvbannerパッケージ(AUR)で入るのはこれ。
- BSDの実装
- macOSで使われているもの。
今回は1つめのshh版を参考にしています。
当初System Vの実装を参考にすることも考えましたが、これは小文字のフォントが小さい大文字になってしまって、個人的に好みではなかったので候補から外しました。 ただライセンスはpublic domainのようなので、ライセンスを気にせず扱いやすいSystem Vの実装を使えなかったのが残念です。
# 小文字のaが小さい大文字になっている例 $ sysvbanner Aa # # # ## # # # # # # # # ####### ###### # # # # # # # # # shh版だと小文字になる $ banner Aa ** * * * * * * **** * * * ****** ***** * * * * * * * ** * * *** *
また、BSD版の実装は単にソースコードを探すのが面倒だったため候補から外しました。
vannerの実装方法
vannerはshh版のbannerコマンドからフォントのデータを取り出して使用しています。
bannerコマンドは、各文字に対するフォントのデータが文字列の配列としてコード中に定義されています。 そのためvannerではそのフォントの定義を取り出し、Vim scriptの変換をしています。
変換するプログラム(Ruby)
https://github.com/pocke/vanner/blob/eabebc7c30335bdba03445857935098ab53cf69a/convert.rb
変換後のフォントのデータ
ライセンス
今回、実装自体は大して大変ではありませんでした。一方、ライセンスの解釈をするのが若干大変でした。
shh版のbannerはArtistic Licenseが適用されています。
- 原文 Artistic License 1.0 (Artistic-1.0) | Open Source Initiative
- 日本語訳 The Artistic License Japanese Translation 1.0
前述したとおりvannerはshh版bannerのソースコードを改変しているので、このライセンスに沿っていないといけないでしょう。 そのため、今回は原文と日本語訳を見比べながらライセンスを解釈し、Artistic Licenseを満たすように公開しました。
具体的には、3.aを満たすためにvannerのソースコードをパブリックドメイン(CC-0)で公開し、4.bを満たすようにマシンリーダブルなソースコードを公開しています(これはVim scriptを置いているだけです)。
Vimでbannerを表示するvanner、使っていただければ幸いです。
https://github.com/pocke/vanner
-
“System-V banner clone” とあるので、本家のコードは別にあるのかもしれない。↩