boxes - 文字列をコメント文字で囲んだりアスキーアートを作ったり

http://jarp.does.notwork.org/diary/200710b.html#200710111 より

boxesは文字列を囲んだりアスキーアートを作ったりするツール。 http://boxes.thomasjensen.com/より入手できる。apt-get install boxesでもインストールできるが古いバージョンなのでソースからコンパイルするといい。といっても環境依存な点がないのでmake一発で終わる。

最新snapshotは以下より。
http://boxes.thomasjensen.com/download/boxes-SNAP-latest.tar.gz

$ echo foo | boxes  -a c -s 50 -d c
/************************************************/
/*                     foo                      */
/************************************************/
$ echo foo | boxes  -a c -s 50 -d lisp-cmt
;;                       foo
$ echo foo | boxes  -a c -s 50 -d html
<!-- ----------------------------------------- -->
<!--                    foo                    -->
<!-- ----------------------------------------- -->
$ echo foo | boxes  -a c -s 50 -d mouse
                  .--,       .--,
                 ( (  \.---./  ) )
                  '.__/o   o\__.'
                     {=  ^  =}
                      >  -  <
 _________________.""`-------`"".________________
/                                                \
\                      foo                       /
/                                                \
\________________________________________________/
                   ___)( )(___
                  (((__) (__)))
$ echo foo | boxes  -a c -s 50 -d sunset
                         .
                    .    |    .
                     \   |   /
                 '.   \  '  /   .'
                   '. .'```'. .'
<>............:::::::`.......`:::::::...........<>
<>:                    foo                     :<>
<>:............................................:<>
<><><><><><><><><><><><><><><><><><><><><><><><><>
$ echo foo | boxes  -a c -s 50 -d boy
                      .-"""-.
                     / .===. \
                     \/ 6 6 \/
                     ( \___/ )
  _______________ooo__\_____/___________________
 /                                              \
|                      foo                       |
 \____________________________ooo_______________/
                     |  |  |
                     |_ | _|
                     |  |  |
                     |__|__|
                     /-'Y'-\
                    (__/ \__)
$ echo foo | boxes  -a c -s 50 -d girl
                      .-"""-.
                     / .===. \
                    / / a a \ \
                   / ( \___/ ) \
  ______________ooo\__\_____/__/________________
 /                                              \
|                      foo                       |
 \_____________________________ooo______________/
                  /           \
                 /:.:.:.:.:.:.:\
                     |  |  |
                     \==|==/
                     /-'Y'-\
                    (__/ \__)

こういうツールにUnix系OSの遊び心を感じる。

自分用のBOXを定義する

まず設定ファイルをホームディレクトリにコピーする。

$ cp boxes-config ~/.boxes

なぜかlisp用のBOX設定(コメントではなくて囲むほう)がないので定義してみる。~/.boxesに追記だ。

BOX lisp

author "rubikitch <rubikitch(at)ruby-lang(dot)org>"
revision "1.0"
revdate "Fri Oct 12 07:39:16 JST 2007"
created "Fri Oct 12 07:39:21 JST 2007"

sample
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;  section used in Lisp ;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ends

shapes {
     w (";;;;") s(";;;;") n (";;;;") e(";;;;")
     ne(";;;;") nw(";;;;") se(";;;;") sw(";;;;")
}

padding { left 2 }

elastic (n,e,s,w)

END lisp

Emacsで使う

最新版(Debianのには含まれていない!)にはboxes.elが同梱されている。ただ、かなりいい加減な書き方をしているので手直ししてみる。

http://www.rubyist.net/~rubikitch/archive/boxes.el.patch

っつーか「use boxes to comment regions」ってあんたM-x comment-regionも知らないの?とツッコミたくなる。せっかくboxesを使うのだったら文字列を囲む設定にしてみる。(make-variable-buffer-local 'boxes-known-modes)を外しているのでEmacsを再起動してね。

(require 'boxes)
;; 文字列を囲む設定に書き換え。デフォルトは正直イラネ
(setq boxes-known-modes
  '((c-mode . "c") (c++-mode . "c") (java-mode . "c")
    (html-mode . "html") (sh-mode . "shell") (perl-mode . "shell")
    (python-mode . "shell") (ruby-mode . "shell")
    (emacs-lisp-mode . "lisp") (lisp-mode . "lisp")))
;; 設定ファイルのコメントは通常 # なので
(setq-default boxes-default-type "shell")
;; センタリングされてるほうがカッコイイ
(setq-default boxes-args "-s 75 -a c")
;; 簡単に作成・修正できるようにする
(defalias 'boxes 'boxes-mend)
  • M-x boxes-create で囲む
  • M-x boxes-remove で囲みを外す
  • M-x boxes-mend で囲みを再描画する(最新版のみ。俺が追加)

常にboxes-mendを使えば文字列を適切に囲んでくれる。

バグかも?

センタリングしつつM-x boxes-mendするとなぜか右にずれてしまうけど、boxesのバグかもしれない。

$ echo foo | boxes  -a c -s 10 -d shell
##########
#  foo   #
##########
$ echo foo | boxes  -a c -s 10 -d shell | boxes -a c -s 10 -m
 ##########
 #  foo   #
 ##########
$ echo foo | boxes  -a c -s 10 -d shell | boxes -a c -s 10 -m | boxes -a c -s 10 -m
  ##########
  #  foo   #
  ##########
  • a cでないとずれない。
$ echo foo | boxes -s 10 -d shell
##########
# foo    #
##########
$ echo foo | boxes  -s 10 -d shell | boxes  -s 10 -m
##########
# foo    #
##########
$


とりあえずバグ報告・パッチ送付してみた。

追記

boxes作者より返事が返ってきた。直したらメールしてくれるとのこと。
boxes.el作者からも返事が返ってきた。俺のパッチはそのうち本家に取り込まれるとのこと。