Comment basculer l'affichage des images dans eww sans rafraîchissement de page?


18

J'utilise eww pour naviguer sur Internet et le plus souvent je ne veux pas que les images se chargent, il ne semble pas y avoir beaucoup de personnalisations intégrées pour eww et aucune ne traite des images.

Actuellement, j'ai une configuration système qui me permet de commencer et d'arrêter d'afficher des images dans eww mais uniquement après une actualisation de la page, ce que je veux, c'est un moyen d'activer et de désactiver les images sans rafraîchir la page .

Voici ma méthode actuelle qui tire parti des internes shr-put-imagedont utilise 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))

J'ai également essayé de basculer la «propriété de texte invisible où se trouvent les images, mais cela ne semble pas fonctionner.

Réponses:


13

Contexte

Eww, comme beaucoup d'autres packages, utilise la displaypropriété text pour afficher les images. C'est pourquoi le basculement de la invisiblepropriété text n'a pas aidé. Vous rendez le texte lui-même invisible, mais la display propriété est toujours affichée.

En fait, c'est quelque chose de si commun que le code ci-dessous devrait fonctionner sur n'importe quel tampon qui affiche des images (pas seulement eww).

Solution

La solution la plus simple consiste à simplement supprimer la displaypropriété de l'ensemble du tampon. Mais c'est une action irréversible, vous ne pourriez pas réactiver les images sans rafraîchir la page.

La solution plus robuste, présentée ci-dessous, supprime les display propriétés du tampon et sauvegarde simultanément l'image dans une autre propriété (inutile). Lorsqu'elle est rappelée, la commande replace les images sauvegardées dans la displaypropriété.

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

C'est le gars qui fait la sauvegarde et la restauration partout. Le code de propriété du texte n'est pas terriblement facile à lire, mais je pense que cette fonction est suffisamment courte pour être explicite.

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

Veuillez me faire savoir si cela fonctionne! Je ne l'ai testé que sur des pages Web très simples.


1
Magnifique, cela fonctionne très bien pour moi.
Boccaperta-IT

Je l'ai beaucoup utilisé et je me demande comment masquer l'image en ligne et afficher le texte par défaut?
yi.tang.uni

7

Depuis Emacs 25.1, vous pouvez passer un argument eww-reloadà charger à partir du cache plutôt que du réseau. J'utilise les éléments suivants:

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

Cela désactive les images et les polices proportionnelles par défaut. Le basculement de police est lié Fpar défaut, donc j'utilise Ipour basculer les images. (Cela remplace une liaison par défaut pour shr-insert-image, mais je ne l'ai jamais utilisée.)


Y a-t-il une différence entre utiliser le defvar shr-inhibit-imageset le defcustom shr-blocked-images?
Basil

Je ne pense pas. inhibitest un booléen et blockedest une expression régulière, vous pouvez donc utiliser l'expression régulière pour toujours bloquer certaines URL tout en utilisant inhabit pour activer et désactiver tout le reste.
glucas

@glucas Merci pour cela! Je veux savoir ce que eww-link-keymapc'est; la lecture *Help*n'a pas aidé;) Pourriez-vous s'il vous plaît expliquer ce que c'est et pourquoi ajouter une liaison de clé à cela aussi?
legends2k

1
@ legends2k Cette image clé s'applique lorsque le point se trouve sur un lien dans un tampon eww. Cette liaison supplémentaire n'est probablement pas réellement nécessaire car Emacs reviendra de toute façon à la carte de mode.
glucas

1
@ legends2k Désolé, je me trompais tout à l'heure. La liaison supplémentaire est nécessaire car eww a «I» lié à shr-insert-image dans la carte de clé eww-link par défaut, donc je remplace cette liaison. Si vous utilisez une clé différente qui n'entre pas en conflit avec les valeurs par défaut eww, vous n'aurez qu'à l'ajouter à la carte de mode.
glucas
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.