背景
与许多其他软件包一样,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))))))
请让我知道它是否有效!我只在非常简单的网页上对其进行了测试。