Emacsのimage-modeでimagemagickの力が封印されている件
- 2014.12.29
- Emacs

言わずもがな、Emacsでは画像が表示できるわけでして、これ とか あれ と比較した場合、大きなアドバンテージの一つではないかと思います。
そして、画像を表示するためのメジャーモードがimage-modeなのですが、調べてみると、実はいろいろと謎が隠されていました。
image-transform-fit-to-*という何ら仕事をしないコマンド
image-modeでは image-transform-fit-to-height
と image-transform-fit-to-width
というインタラクティブなコマンドが定義されています。名前からして、いかにもフレームサイズとかに合わせて、画像をリサイズしてくれそうです。おお、便利そう。
ところが、これらコマンドを実行しても何の変化も表われません。はて?と思い M-xdescribe-function
で関数を調べてみると次のようなことが書いてありました。
Fit the current image to the height of the current window. This command has no effect unless Emacs is compiled with ImageMagick support.
なるほど、コンパイル時にImageMagickを組みこんでコンパイルしておく必要があるわけです。
Emacsでは、Emacs24.1からコンパイル時に –without-imagemagick
をつけない限り、ImageMagickの機能をC source codeレベルで使役できるようになっています。
これら関数では、そのImageMagickの機能を使うようです。ただ、Linuxではコンパイル時に何の指定もしていなければ、ImageMagickつきでビルドしてくれるはずで、わざわざそのような手間をしてビルドした覚えもありません。うーん、さらに謎が深まります。
GNU Emacs Lisp Reference Manual を読む
こういう時は初心に戻りリファレンスを読むのが一番です。
(Info-goto-node "(elisp) ImageMagick Images")
そして、答は冒頭に書いてありました。
The image type symbol for images loaded via ImageMagick is `imagemagick’, regardless of the actual underlying image format.
つまり、imageオブジェクト相当のものを作る時に、=type=プロパティに明示的に imagemagick
を与えておかないと、組み込みImageMagickの恩恵を受けられないわけです。
一方、image-modeでは type
プロパティに imagemagick
を与えていません。このため、 image-mode
では image-transform-fit-to-height
と image-transform-fit-to-width
が有効に機能していないのです。
Workaround
ちょっと乱暴な方法ですが、画像タイプを返す image-type
が常に imagemagick
を返すように上書きしてしまいます。
(defun image-type (file-or-data nil data-p) 'imagemagick)
これで、 image-transform-fit-to-height
と image-transform-fit-to-width
が有効に機能するようになります。
また、 type
を imagemagick
にすることで様々な恩恵が得られます。Emacs上で画像を扱う場合、 create-imag
等で画像オブジェクト相当のものを作るわけですが、この時に width
, height
, angle
プロパティを適用することができ、画像を事前にリサイズしたり、回転させたりすることができるようになります。
通常、同様のことをする場合、imagemagickのconvert等の外部プログラムを呼びだす必要があったわけですがその手間が省け、とてもすっきりした記述で書けるようになります。
なぜ、ImageMagickの機能は封印されているのか
このように便利なプロパティが準備されているのに、なぜ利用されていないのでしょうか。バンドルされているアプリがそのような便利な機能を知らないはずがありません。
その理由を示唆する内容が、MLに書かれていました。
Re: imagemagic in image-mode and image-dired-thumbnail-mode?
ここを読んでみる限り、Joakimさんがいろいろと拡張してたけど忙しくなってきたので、放置しているというのが理由のようです。
うーん、そんな理由で放置するくらいなら、revertするなりブランチ切るなりして安定板には含めないでほしい。。。
ちなみに、このJoakimさん、あの有名なemacs-xwidgetの作者であり、ちょっと変わったEmacs拡張を作られてることでも有名で、度々EmacsのMLにも顔を出されます。もしかしたら、いつの日かimage-modeも改良されるかもしれません。
-
前の記事
Helmであまり知られてなさそうなのをいくつか 2014.12.25
-
次の記事
ファイルを開いたら、org2blogのマイナーモードを起動する 2014.12.30