Wie kann ich die Anzeige von Bildern in eww umschalten, ohne die Seite zu aktualisieren?


18

Ich benutze eww, um im Internet zu surfen, und oft möchte ich nicht, dass Bilder geladen werden. Es scheint nicht viel an Anpassungen zu geben, die für eww eingebaut sind, und keine, die sich mit Bildern befassen.

Derzeit habe ich ein System-Setup, mit dem ich Bilder in eww starten und stoppen kann, aber erst nach einer Seitenaktualisierung möchte ich, dass Bilder ein- und ausgeschaltet werden, ohne die Seite zu aktualisieren .

Hier ist meine aktuelle Methode, die die Interna shr-put-imagenutzt, die eww verwendet.

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

Ich habe auch versucht, die unsichtbare Texteigenschaft umzuschalten, wo Bilder sind, aber das scheint nicht zu funktionieren.

Antworten:


13

Hintergrund

Eww verwendet wie viele andere Pakete die displayEigenschaft text, um Bilder anzuzeigen. Aus diesem Grund hat das Umschalten der Texteigenschaft invisiblenicht geholfen. Sie machen den Text selbst unsichtbar, aber die display Eigenschaft wird weiterhin angezeigt.

Tatsächlich ist dies so verbreitet, dass der folgende Code auf jedem Puffer funktionieren sollte, der Bilder anzeigt (nicht nur eww).

Lösung

Die einfachste Lösung besteht darin, die displayEigenschaft einfach aus dem gesamten Puffer zu entfernen . Aber das ist eine irreversible Aktion. Sie könnten Bilder nicht wieder einschalten, ohne die Seite zu aktualisieren.

Die robustere Lösung, die im Folgenden vorgestellt wird, entfernt display Eigenschaften im Puffer und sichert das Image gleichzeitig in einer anderen (unbrauchbaren) Eigenschaft. Bei erneutem Aufruf verschiebt der Befehl die gesicherten Bilder zurück in die displayEigenschaft.

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

Dies ist der Typ, der überall die Sicherung und Wiederherstellung vornimmt. Texteigenschaftscode ist nicht besonders einfach zu lesen, aber ich denke, diese Funktion ist kurz genug, um selbsterklärend zu sein.

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

Bitte lassen Sie mich wissen, ob es funktioniert! Ich habe es nur auf sehr einfachen Webseiten getestet.


1
Schön, es funktioniert sehr gut für mich.
Boccaperta-IT

Ich habe es oft benutzt und mich gefragt, wie ich das Inline-Bild ausblenden und den Text standardmäßig anzeigen kann.
yi.tang.uni

7

Ab Emacs 25.1 können Sie ein Argument übergeben eww-reload, um aus dem Cache anstatt aus dem Netzwerk zu laden. Ich benutze die folgenden:

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

Dadurch werden Bilder und proportionale Schriftarten standardmäßig deaktiviert. Das Umschalten zwischen Schriftarten ist Fstandardmäßig gebunden , daher verwende ich das IUmschalten zwischen Bildern. (Dies ersetzt eine Standardbindung für shr-insert-image, aber das habe ich noch nie verwendet.)


Gibt es einen Unterschied zwischen dem defvar shr-inhibit-imagesund dem defcustom shr-blocked-images?
Basil

Ich glaube nicht inhibitist ein Boolescher Wert und blockedein regulärer Ausdruck, daher können Sie den regulären Ausdruck verwenden, um immer bestimmte URLs zu blockieren, während Sie mit residit weiterhin alles andere ein- und ausschalten.
Glucas

@glucas Danke dafür! Ich möchte wissen, was eww-link-keymapist; Lesen *Help*hat nicht geholfen;) Könnten Sie bitte erklären, was es ist und warum auch eine Schlüsselbindung hinzufügen?
Legends2k

1
@ legends2k Diese Keymap wird angewendet, wenn sich der Punkt auf einem Link in einem EWW-Puffer befindet. Diese zusätzliche Bindung wird wahrscheinlich nicht benötigt, da Emacs ohnehin auf die Modenkarte zurückgreifen wird.
Glucas

1
@ legends2k Sorry, ich habe mich gerade geirrt. Die zusätzliche Bindung wird benötigt, da eww standardmäßig "I" an shr-insert-image in der eww-link-keymap gebunden hat, sodass ich diese Bindung ersetze. Wenn Sie einen anderen Schlüssel verwenden, der nicht mit den Standardeinstellungen von eww in Konflikt steht, müssen Sie ihn nur der Modusübersicht hinzufügen.
Glucas
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.