¿Cómo puedo alternar la visualización de imágenes en eww sin una actualización de página?

18

Utilizo eww para navegar por Internet y la mayoría de las veces no quiero que se carguen las imágenes, no parece haber mucho en términos de personalizaciones integradas para eww y ninguna que trate con imágenes.

Actualmente tengo una configuración del sistema que me permite comenzar y dejar de mostrar imágenes en eww, pero solo después de una actualización de la página, lo que quiero es una forma de activar y desactivar las imágenes sin actualizar la página .

Aquí está mi método actual que aprovecha las shr-put-imagepartes internas que utiliza eww.

(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))

También he intentado alternar la 'propiedad de texto invisible donde están las imágenes, pero eso no parece funcionar.

Jordon Biondo
fuente

Respuestas:

13

Antecedentes

Eww, como muchos otros paquetes, usa la displaypropiedad de texto para mostrar imágenes. Es por eso que alternar la invisiblepropiedad de texto no ayudó. Está haciendo que el texto en sí sea invisible, pero la display propiedad aún se muestra.

De hecho, esto es algo tan común que el siguiente código debería funcionar en cualquier búfer que muestre imágenes (no solo eww).

Solución

La solución más fácil es simplemente eliminar la displaypropiedad de todo el búfer. Pero esa es una acción irreversible, no podría volver a activar las imágenes sin actualizar la página.

La solución más robusta, presentada a continuación, elimina las display propiedades en el búfer y simultáneamente realiza una copia de seguridad de la imagen en otra propiedad (inútil). Cuando se vuelve a llamar, el comando mueve las imágenes respaldadas nuevamente a la displaypropiedad.

(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))

Este es el tipo que hace la copia de seguridad y la restauración en todas partes. El código de propiedad de texto no es terriblemente fácil de leer, pero creo que esta función es lo suficientemente corta como para explicarse por sí misma.

(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))))))

Por favor, hágamelo saber si funciona! Solo lo probé en páginas web muy simples.

Malabarba
fuente
1
Hermoso, me funciona muy bien.
Boccaperta-IT
Lo usé mucho y me pregunto cómo puedo ocultar la imagen en línea y mostrar el texto de forma predeterminada.
yi.tang.uni
7

A partir de Emacs 25.1 puede pasar un argumento eww-reloadpara cargar desde el caché en lugar de la red. Estoy usando lo siguiente:

(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`

Esto desactiva las imágenes y las fuentes proporcionales de forma predeterminada. La alternancia de fuentes está vinculada Fde forma predeterminada, por lo que estoy usando Ipara alternar imágenes. (Esto reemplaza un enlace predeterminado para shr-insert-image, pero nunca lo he usado).

glucas
fuente
¿Hay alguna diferencia entre usar el defvar shr-inhibit-imagesy el defcustom shr-blocked-images?
Albahaca
No lo creo. inhibites un booleano y blockedes una expresión regular, por lo que puede usar la expresión regular para bloquear siempre ciertas URL mientras todavía usa inhabit para activar y desactivar todo lo demás.
glucas
@glucas ¡Gracias por esto! Quiero saber que eww-link-keymapes; la lectura *Help*no ayudó;) ¿Podría explicar qué es y por qué agregar un enlace clave a eso también?
legends2k
1
@ legends2k Ese mapa de teclas se aplica cuando el punto está en un enlace en un búfer eww. Ese enlace adicional probablemente no sea realmente necesario ya que Emacs recurrirá al mapa de modos allí de todos modos.
glucas
1
@ legends2k Lo siento, me equivoqué en este momento. El enlace adicional es necesario porque eww tiene "I" enlazado a shr-insert-image en el mapa de teclas eww-link-key de forma predeterminada, por lo que estoy reemplazando ese enlace. Si usa una clave diferente que no entre en conflicto con los valores predeterminados de eww, solo necesitará agregarla al mapa de modo.
glucas