image-diredで,ディレクトリやアーカイブファイルの表紙を表示する  †
準備  †
(require 'image-dired)
(call-process  "mkdir" nil nil nil "-p" "/dev/shm/image-dired/temp")
(custom-set-variables '(image-dired-dir "/dev/shm/image-dired"))
(setq image-dired-archive-file-pattern "\\.\\(zip\\|ZIP\\)$")
image-dired-dired-toggle-marked-thumbs  †
(defun image-dired-dired-toggle-marked-thumbs (&optional arg)
  ;; argがnon-nil の場合は,マークされたファイルのかわりに
  ;; 指定されたファイルを対象にします.
  (interactive "P")
  (dired-map-over-marks
   ;; それぞれのマークされた行について
   ;; body(第一引数)を評価して,結果のリストを返します.
   (let* ((image-pos  (dired-move-to-filename))
          ;; 画像を挿入する位置
          (image-file (dired-get-filename nil t))
          ;; 画像ファイル名
          thumb-file
          ;; サムネイルファイル(?)
          overlay)
     ;; オーバーレイ(?)
     (when (and image-file
                (or (file-directory-p image-file)
                    (string-match-p image-dired-archive-file-pattern image-file)
                    (string-match-p (image-file-name-regexp) image-file)))
       ;; 画像ファイル名が non-nilで,かつ
       ;; ファイル名が image-file-name-regexp(\\.BMPとか)
       ;; に一致するとき
       ;; 式1
       (setq thumb-file (image-dired-get-thumbnail-image image-file))
       ;; 式2
       ;; If image is not already added, then add it.
       (let* ((cur-ovs (overlays-in (point) (1+ (point))))
              (thumb-ov (car (cl-remove-if-not
                              (lambda (ov) (overlay-get ov 'thumb-file))
                              cur-ovs))))
         (if thumb-ov
             (delete-overlay thumb-ov)
           (put-image thumb-file image-pos)
           (setq overlay
                 (cl-loop for o in (overlays-in (point) (1+ (point)))
                          when (overlay-get o 'put-image) collect o into ov
                          finally return (car ov)))
           (overlay-put overlay 'image-file image-file)
           (overlay-put overlay 'thumb-file thumb-file)))))
   arg             ; Show or hide image on ARG next files.
   'show-progress) ; Update dired display after each image is updated.
  (add-hook 'dired-after-readin-hook
            'image-dired-dired-after-readin-hook nil t))
image-dired-get-thumbnail-image  †
(defun image-dired-get-thumbnail-image (file)
  "Return the image descriptor for a thumbnail of image file FILE."
  ;; サムネイル画像のディスクリプタ(FILE)をかえす.
  (message "image-dired-get-thumbnail-image")
  (unless
      (or (string-match     (image-file-name-regexp)         file)
          (string-match     image-dired-archive-file-pattern file)
          (file-directory-p                                  file))
    (error "%s is not a valid image file" file))
  ;; 引数が image-file-name-regexp にマッチしないときは
  ;; エラーをかえす.
  (let ((thumb-file (image-dired-thumb-name file)))
    ;; file に, ディレクトリのハッシュ値をつけた絶対パス(文字列)
    (unless (and (file-exists-p thumb-file)
                 ;; サムネイルファイルがナイこと,かつ
                 (<= (float-time (nth 5 (file-attributes file)))
                     (float-time (nth 5 (file-attributes thumb-file)))))
      ;; サムネイルファイルが,元のファイルより古い場合
      ;; アーカイブファイルの場合:
      ;; 1. file(zipファイル名)から,表紙画像をとりだして
      ;;    (image-dired-dir)に展開する
      ;; 2. file を,1.でつくったファイル名で上書きする
      (if (string-match image-dired-archive-file-pattern file)
          (progn
            (setq file
                  (shell-command-to-string
                   (concat "archiveImageThumb.rb " file)))
            (message "archivefile's thumb: %s" file)))
      ;; file がディレクトリのときは,ディレクトリ内の表紙ファイルに
      ;; 置換する->対象ディレクトリ内のファイルを数字順にソート
      ;; TODO: 画像以外のファイルがある場合(Thumbs.dbとか),コケる.
      (if (file-directory-p file)
          (progn
            (setq file (concat file "/"
                               (shell-command-to-string
                                (concat "find " file " -type f | "
                                        "sed 's!^.*/!!' | "
                                        "sort -n | "
                                        "head -1 | "
                                        "tr -d '\\n'  " ))))
            (message file)))
      (image-dired-create-thumb file thumb-file))
    ;; サムネイルを生成しておく
    (message "creating image thumb...")
    (create-image thumb-file)
    ;;     (list 'image :type 'jpeg
    ;;           :file thumb-file
    ;; 	  :relief image-dired-thumb-relief :margin image-dired-thumb-margin)
    ))