如何在不刷新页面的情况下在eww中切换显示图像?


18

我使用eww浏览互联网,并且经常不希望加载图像,其中似乎没有为eww内置的自定义项太多,也没有处理图像的问题。

目前,我有一个系统设置程序,该程序可以让我开始和停止以eww形式显示图像,但只有在刷新页面后,我想要的是一种无需打开页面即可打开和关闭图像的方法。

这是我当前的方法,它利用了shr-put-imageeww使用的内部原理。

(defvar display-graphic-override nil
  "Used to override `display-graphic-p' behavior.
Should either be nil, or a list where the car is the override.")

(defadvice display-graphic-p (around sometimes-lie activate)
  "Use the override if it is non nil."
  (if display-graphic-override
      (car display-graphic-override)
    ad-do-it))

(defadvice eww-render (around no-images activate)
  "Temporarily lie about supporting graphics"
  (let ((display-graphic-override '(nil)))
    ad-do-it))

我还尝试过切换图像在其中的“不可见文本”属性,但似乎不起作用。

Answers:


13

背景

与许多其他软件包一样,Eww使用displaytext属性显示图像。这就是为什么切换invisibletext属性没有帮助的原因。您正在使文本本身不可见,但该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))))))

请让我知道它是否有效!我只在非常简单的网页上对其进行了测试。


1
美丽,对我来说效果很好。
Boccaperta-IT 2014年

我经常使用它,不知道如何隐藏内嵌图像并默认显示文本?
yi.tang.uni 2015年

7

从Emacs 25.1开始,您可以传递参数以eww-reload从缓存而不是从网络加载。我正在使用以下内容:

(defun my/eww-toggle-images ()
  "Toggle whether images are loaded and reload the current page fro cache."
  (interactive)
  (setq-local shr-inhibit-images (not shr-inhibit-images))
  (eww-reload t)
  (message "Images are now %s"
           (if shr-inhibit-images "off" "on")))

(define-key eww-mode-map (kbd "I") #'my/eww-toggle-images)
(define-key eww-link-keymap (kbd "I") #'my/eww-toggle-images)

;; minimal rendering by default
(setq-default shr-inhibit-images t)   ; toggle with `I`
(setq-default shr-use-fonts nil)      ; toggle with `F`

默认情况下,这将禁用图像和比例字体。F默认情况下,字体切换是绑定的,因此我I用于切换图像。(这取代了的默认绑定shr-insert-image,但我从未使用过。)


使用defvar shr-inhibit-images和之间的任何区别defcustom shr-blocked-images
罗勒

我不这么认为。inhibit是一个布尔值,并且blocked是一个正则表达式,因此您可以使用正则表达式始终阻止某些URL,同时仍然使用inhabit来启用和禁用其他所有功能。
glucas

@glucas谢谢你!我想知道的eww-link-keymap是,阅读*Help*没有帮助;)您能解释一下它是什么,为什么还要为此添加一个键绑定?
legends2k

1
@ legends2k当点位于eww缓冲区中的链接上时,将应用该键映射。可能实际上并不需要额外的绑定,因为Emacs仍然会退回到那里的模式映射。
glucas

1
@ legends2k对不起,我刚才错了。需要附加的绑定,因为默认情况下,eww在eww-link-keymap中的shr-insert-image上绑定了“ I”,因此我将替换该绑定。如果您使用与其他eww默认设置不冲突的其他密钥,则只需将其添加到模式映射。
glucas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.