Emacsで画像のwidth,heightを自動取得しimgタグを生成、altへ移動する方法

こんにちは福山です。

EmacsでHTMLコーディングする際にimgタグwidth/heightサイズを自動で取得できるコードを見つけました。(ただし、ローカルの画像のみ)。

Emacs Lisp: Writing a Wrap-URL Function

ここのコードをinit.el(emacs.el)に記述します。C-x C-e で使えるようにするか、Emacsを再起動すると使えるようになります。

使い方は簡単。パスをバッファに普通に書いて、そのパスの文字列の途中や末尾にポインタをもってきて、M-x image-linkify と入力しエンター(return)キーを押します。もしくはキーボードショートカットに登録して使います。

でもaltにファイル名が入るのがいやだなぁ、altは手動で入力したいなぁと思い、方法を探って勝手に手を加えさせていただきました。


;; imgサイズ取得 & altへ
(defun image-linkify ()
  "Replace a path to image file with a HTML img tag.
   And move blank alt attribute"
  (interactive)
  (let
    (img-file-path bounds img-dim width height myResult)
    (setq img-file-path (thing-at-point 'filename))
    (setq bounds (bounds-of-thing-at-point 'filename))
    (setq img-dim (get-image-dimensions img-file-path))
    (setq width (number-to-string (car img-dim)))
    (setq height (number-to-string (car (last img-dim))))
    (setq myResult (concat "<img src="" img-file-path "" "
                           "alt="" "
                           "width="" width "" "
                           "height="" height "" />"))
    (save-excursion
      (delete-region (car bounds) (cdr bounds))
      (insert myResult))
    ;; 空のaltにポインタを移動(無理矢理)
    (execute-kbd-macro "C-saltC-fC-f")
    ))
;; width height 取得
(defun get-image-dimensions (img-file-relative-path)
  "Returns a image file's width and height as a list."
  (let (tmp dimen)
    (clear-image-cache)
    (setq tmp
          (create-image (concat default-directory img-file-relative-path)))
    (setq dimen (image-size tmp t))
    (list (car dimen) (cdr dimen))
    )
  )
(global-set-key (kbd "C-c i") 'image-linkify)

キーバインドはC-c iに設定しています。

elispという言語は最近知ったので無理矢理な気もしますが、キーボードマクロというものを関数に埋め込みました。これによって、サイズ付きのimgタグを展開後、空のalt属性にポインタをジャンプさせることができます。