pockestrap

Programmer's memo

banner (1) をベースに、Vim scriptでbannerを出すプログラム vanner を実装した

f:id:Pocke:20190709181435p:plain
Hello, Vanner!

github.com

実装の動機

keycast.vim というプラグインを紹介した(keycast.vimをつくった - pockestrap)ところ、macOSでうまく動かないという報告をもらいました。 調べてみると、keycast.vimが依存しているbannerコマンドの挙動がプラットフォームによって違うようです。 keycast.vimはArch Linuxに入っているbannerコマンドの挙動に暗に依存していたため、macOSに入っているBSDのbannerコマンドではうまく動作しませんでした。

bannerの種類

少なくとも、banner (1)には実装が3つあることがわかりました。

今回は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

変換後のフォントのデータ

https://github.com/pocke/vanner/blob/eabebc7c30335bdba03445857935098ab53cf69a/autoload/vanner/fonts.vim

ライセンス

今回、実装自体は大して大変ではありませんでした。一方、ライセンスの解釈をするのが若干大変でした。

shh版のbannerはArtistic Licenseが適用されています。

前述したとおりvannerはshh版bannerのソースコードを改変しているので、このライセンスに沿っていないといけないでしょう。 そのため、今回は原文と日本語訳を見比べながらライセンスを解釈し、Artistic Licenseを満たすように公開しました。

具体的には、3.aを満たすためにvannerのソースコードパブリックドメイン(CC-0)で公開し、4.bを満たすようにマシンリーダブルなソースコードを公開しています(これはVim scriptを置いているだけです)。


Vimでbannerを表示するvanner、使っていただければ幸いです。

https://github.com/pocke/vanner


  1. “System-V banner clone” とあるので、本家のコードは別にあるのかもしれない。