バックグラウンド
Ewwは、他の多くのパッケージと同様に、display
textプロパティを使用して画像を表示します。それが、invisible
textプロパティの切り替えが役に立たなかった理由です。テキスト自体を非表示にしますが、display
プロパティはまだ表示されています。
実際、これは非常に一般的なものなので、以下のコードは(ewwだけでなく)画像を表示する任意のバッファーで動作するはずです。
解決
最も簡単な解決策はdisplay
、バッファ全体からプロパティを削除することです。しかし、それは元に戻せないアクションです。ページを更新しないと画像を元に戻すことはできません。
以下に示すより堅牢なソリューションdisplay
は、バッファー内のプロパティを削除し、同時に別の(役に立たない)プロパティに画像をバックアップします。再度呼び出されると、コマンドはバックアップされたイメージをdisplay
プロパティに戻します。
(defvar-local endless/display-images t)
(defun endless/toggle-image-display ()
"Toggle images display on current buffer."
(interactive)
(setq endless/display-images
(null endless/display-images))
(endless/backup-display-property endless/display-images))
これはどこでもバックアップと復元を行う人です。テキストプロパティのコードは非常に読みやすいものではありませんが、この関数は自明なほど短いと思います。
(defun endless/backup-display-property (invert &optional object)
"Move the 'display property at POS to 'display-backup.
Only applies if display property is an image.
If INVERT is non-nil, move from 'display-backup to 'display
instead.
Optional OBJECT specifies the string or buffer. Nil means current
buffer."
(let* ((inhibit-read-only t)
(from (if invert 'display-backup 'display))
(to (if invert 'display 'display-backup))
(pos (point-min))
left prop)
(while (and pos (/= pos (point-max)))
(if (get-text-property pos from object)
(setq left pos)
(setq left (next-single-property-change pos from object)))
(if (or (null left) (= left (point-max)))
(setq pos nil)
(setq prop (get-text-property left from object))
(setq pos (or (next-single-property-change left from object)
(point-max)))
(when (eq (car prop) 'image)
(add-text-properties left pos (list from nil to prop) object))))))
機能するかどうかをお知らせください!非常に単純なWebページでのみテストしました。