More Growl !?

What is Growl?

Growl とは、アプリケーションで何か事が起こると、そのことを「控えめに」ユーザーに知らせてくれる Mac OS X 向けに開発された通知システムである。現在、Growl をサポートするアプリケーション はかなりの数にのぼり、さらに Windows 用 Growl (Growl for Windows) や Linux 向け類似ライブラリ (Libnotify) も開発され、Growl を常用するユーザー数は増加の一途をたどっている。あまりにも他のアプリケーションに溶け込んでいて、それとは知らず使用しているユーザーもいるかもしれない。Web 上でも、本家の説明 に加え、このあたりこのあたり やその他たくさん、丁寧な解説に出会うことができる。Download は ここから 可能だが (MacportsFink からもおそらく可)、イメージファイルをマウントすると Extra という名前のフォルダが含まれており、この中には growlnotify というコマンドラインツールが含まれる。これは端末から Growl の通知をポストするツールで、使用方法は こちら で詳細が参照できるが (または $ man growlnotify)、簡単な例をあげると、

$ growlnotify --image ~/icns/growl/hello.png -t "Hello" -m "こんにちは。"

とターミナルから実行すると、

https://skalldan.files.wordpress.com/2011/06/wpid-hello.png

といったように画面上にフローティングした小さなウィンドウを表示させることができる (表示場所は画面の四隅いずれかを選択可能)。使い道は色々あると思うが、例えば、crontab を利用してバックグラウンドで何かスケジュールを実行させる際、その開始通知に利用できるだろう。

https://skalldan.files.wordpress.com/2011/06/wpid-cron.png

また、 ImageMagickFFmpeg などを利用して画像や動画を変換する場合、比較的時間がかかるので処理中は他の作業に移ることが多いが、エンコード処理終了を次のように通知させると処理終了をすばやく知ることができる。

https://skalldan.files.wordpress.com/2011/06/wpid-convert.png

LaTeX で Growl

LaTeX の処理を短いシェルスクリプトを書いて自動化している方も多いと思うが、普通は echo で出力させる箇所を growlnotify で代替したもの (platex-utf8-growl) を用意してみる1。なお、以下の作業環境の pTeX は Macports からインストールしたもの (pTeX 3.141592-p3.1.10, utf8.euc), growlnotify は version 1.2.2 である。例では Growl からの通知の種類を増やすため、多少大袈裟に処理を分離させている (-_-;)

#!/bin/sh
# growlnotify のアイコンは ~/icns/growl/ 以下にあるとする。

myname="platex-utf8-growl"

if [ ! -z $1 ]; then
    if [ -f $1 ] || [ -f $1.tex ];then
        basename=${1%.tex}
    if [ $basename != ${basename#/} ];then
    growlnotify --image ~/icns/growl/attention.png -t "Attention" -m "$1 にはディレクトリを含めないで下さい。"
        exit 1
    fi
    else
    growlnotify --image ~/icns/growl/notfound.png -t "Not Found" -m "ファイル $1 が見つかりません。"
    exit 1
   fi
else
    growlnotify --image ~/icns/growl/usage.png -t "Usage:" -m "$myname $1 <filename>."
    exit 1
fi

if [ ! -e "${basename}.pdf" ] ; then
    platex -kanji=utf8 "$basename" &&
    dvipdfmx "$basename" &&
    growlnotify --image ~/icns/growl/success.png -t "Success" -m "PDF が作成されました。"
elif [ "${basename}.tex" -nt "${basename}.pdf" ] ; then
    platex -kanji=utf8 "$basename" &&
    dvipdfmx "$basename" &&
    growlnotify --image ~/icns/growl/update.png -t "Update" -m "PDF が更新されました。"
else
    growlnotify --image ~/icns/growl/notice.png -t "Notice" -m "前回からの変更はありません。"
fi

open "${basename}.pdf"

exit 0

これに実行権を与えて ($ chmod +x platex-utf8-growl)、以下のようにテストファイル (test.tex) で遊んでみる。

$ cd /tmp/growl
$ cat test.tex
% -*- japanese-latex -*-
documentclass{jsarticle}
begin{document}

This is a test.

end{document}
$ platex-utf8-growl /tmp/growl/test.tex

https://skalldan.files.wordpress.com/2011/06/wpid-attention.png

$ platex-utf8-growl sample.tex

https://skalldan.files.wordpress.com/2011/06/wpid-notfound.png

$ platex-utf8-growl

https://skalldan.files.wordpress.com/2011/06/wpid-usage.png

$ platex-utf8-growl test.tex

https://skalldan.files.wordpress.com/2011/06/wpid-success.png

変更を加えて、

$ platex-utf8-growl test.tex

https://skalldan.files.wordpress.com/2011/06/wpid-update.png

何も変更を加えなければ、

$ platex-utf8-growl test.tex

https://skalldan.files.wordpress.com/2011/06/wpid-notice.png

このように次々と通知されて楽しい。しかし端末からだと、 echo で出力させておけば従来通り端末内で確認できるので、こうして Growl で通知させてもあまり意味はない、と考えられるかも知れない。そこで今度は Emacs からこの作業を通知させてみる。

Emacs から Growl

Emacs で TeX 文書を扱う場合 AUCTeX を利用するか YaTeX を利用するかは意見が分かれるところであろう。それらを利用して Emacs から上記のスクリプトを実行させる場合、バックグラウンドでの処理となるので、端末から利用するよりは多少 Growl の面目躍如たるものがあるだろう。私自身は AUCTeX を利用しているので以下の例はそのままでは YaTeX には当てはまらないが、いずれの場合も TeX Command をカスタマイズできるので適宜読み替えが可能であろう。

AUCTeX の基本的な設定は TeX Wiki の説明に譲り、目下必要な設定だけ書くと、

(setq japanese-LaTeX-command-default "platex-utf8")
(add-hook 'LaTeX-mode-hook
          (function (lambda ()
                      (add-to-list 'TeX-command-list
                                   '("platex-utf8" "platex-utf8-growl %t" ; 上記の shell script
                                     TeX-run-TeX nil (latex-mode) :help "Run ASCII pLaTeX")))))

テストファイル (test.tex) を Emacs で開き、 TeX-command-master (C-c C-c) を実行すると mini-buffer に、

Command: (default platex-utf8)

と出るのでそのまま Return を押す。すると TeX Command が実行されて PDF が Growl の通知とともに表示されるはずだ。

https://skalldan.files.wordpress.com/2011/06/wpid-success_emacs.png

Emacs 上で test.tex になにか変更を加えて再度コマンドを実行すると、 https://skalldan.files.wordpress.com/2011/06/wpid-update_emacs.png

前回からなにも変更がないと、 https://skalldan.files.wordpress.com/2011/06/wpid-notice_emacs.png

といったように通知されるので、通常は Emacs の編集画面からは見えていない TeX 処理の完了が視覚的に確認される2

上の例は Emacs からシェルスクリプトを介して Growl を呼び出しているが、Growl 関連の Emacs-lisp は各所に見られる。Emacs Wiki 内で検索してもたくさんヒットするし、例えば elim さんの growl.el を利用させてもらうと、

(require 'growl)

(defun my-TeX-command-master (&optional override-confirm)
  "Run command on the current document with Growl notification."
  (interactive "P")
  (TeX-command (TeX-command-query (TeX-master-file)) 'TeX-master-file
               override-confirm)
  (growl "TeX Command が実行されました。")) ; ここにメッセージ

と定義しておいて、 M-x my-TeX-command-master を叩くと、

https://skalldan.files.wordpress.com/2011/06/wpid-growl_emacs1.png

と Emacs からの通知が届く。

このように Growl は便利な Mac のツールだが、上記の例はあくまでも少しその機能をデフォルメしたもので、実際になんでもかんでも通知させるとうるさくて集中力が途切れさせられて逆効果だ。あくまでも控え目な (unintrusive) 通知ツールとして。

Growl lets Mac OS X applications unintrusively tell you when things happen (Growl Home).

*なお、上記の例で使用したアイコン画像が欲しいという方がいらっしゃったら ここ に置いたのでテスト用にでも使用して下さい。Original は black-hand-icons.zip から。

Footnotes:

1 おそらく見る人が見れば分かるが、私はシェルスクリプトについてもまだまだ初級者である。有識者の訂正、提案を歓迎します。

シェルスクリプトは基本的にはやりたい事を並べるだけでなんとかなるので私のような素人にも手が付けやすいが、オプションなどいつも失念してしまう。そんな時 man コマンドは役に立つが、それをブラウザ上で閲覧可能とするアプリケーション “Bwana” にはいつも助けられる。このアプリケーションのアイコンはシンプルながらなかなか主張力があって (?!) 気に入っている。

https://skalldan.files.wordpress.com/2011/06/wpid-bwana2.png

Mac で似たようなアプリケーションが複数ある場合、最終的には大体そのアイコンで決めてしまう。

2 C-c C-l (TeX-recenter-output-buffer, サブプロセスとして走らせた TeX の出力のウィンドウを表示) で済む話、ということは今は置いておく…

2 thoughts on “More Growl !?

  1. Pingback: Hyper Estraier で PDF 管理 | Amrta

  2. Pingback: AUCTeX の設定と便利な機能 | Amrta

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s