Emacs でポイントの下の画像ファイル名をツールチップに表示


はじめに

この記事は「なぜ我々はいまだに文字列でコメントを書いているのか」に触発されて、Emacs でも画像のポップアップが出来ないか試しに実装してみたものです。

使い方

Gist に image-tooltip.el をアップしました。

;;; -*- lexical-binding: t; -*-

(defun image-tooltip-at-point ()
  "ポイントやマウスカーソルの下の画像ファイルをツールチップ内に表示します。

使い方:
 (define-key c-mode-map \"\\C-co\" 'image-tooltip-at-point)
 (define-key c-mode-map [mouse-1] 'image-tooltip-at-point)

./very-sorry.png
./very-sorry.gif

上記のようなファイル名を`ffap'が認識出来れば C-c o やマウス左クリックでポップアップします。"
  (interactive)
  (unless (display-graphic-p)
    (error "Window system required."))
  (require 'ffap)
  (let ((file (ffap-file-at-point)))
    (when file
      (unless (and (stringp file)
                   (not (directory-name-p file))
                   (file-exists-p (setq file (expand-file-name file))))
        (error "File not found."))
      (when (image-type-from-file-name file)
        (let* ((x-y (window-absolute-pixel-position))
               (tooltip-frame-parameters `((left . ,(+ (car x-y) tooltip-x-offset))
                                           (top . ,(+ (cdr x-y) tooltip-y-offset))
                                           (internal-border-width . 0)
                                           (border-width . 0)))
               (image (create-image file))
               (x-gtk-use-system-tooltips nil)) ; Linux ではこれしないと表示されない…
          (image-animate image)
          (tooltip-show (propertize "a" 'display image)))))))

この関数をinit.el等にコピーして、

(define-key c-mode-map "\C-co" 'image-tooltip-at-point)
(define-key c-mode-map [mouse-1] 'image-tooltip-at-point)

のようにキーに割り当ててください。
その後、ソースコード等を開いてコメントに書いたファイル名の上でC-c oか左ボタンクリックすると画像がポップアップします。
ツールチップなので、ポイントやマウスを動かすか暫くすると自動的に消えます。

制限事項

GIF や PNG 等の画像サポートが有効な GUI 版 Emacs が必要です。
Windows 版と Linux 版で動作確認しました。

ファイル名の認識にffapを使っているので、制限や癖などは全てそれに準じます。

実行画面

GIF アニメも再生されます。

すぐ動作確認出来るように PNG 画像の方は置いておきます。(GIF の方は著作権的に不明なので(汗…各々で用意してください。PNG の方はいらすとやから拝借)

最後に

取り敢えず、自分はこれで満足してます。
コードは非常に単純なので、皆さんの方で色々改良してみてください!
何か不具合などあった場合はコメントして頂ければ出来る限り直すつもりです。
それでは。

編集履歴

2018/10/1 画像をフレームではなくツールチップに表示するバージョンに変更