Come posso attivare o disattivare la visualizzazione delle immagini in eww senza un aggiornamento della pagina?


18

Uso eww per navigare in Internet e il più delle volte non voglio caricare le immagini, non sembra esserci molto in termini di personalizzazioni integrate per eww e nessuna delle immagini.

Attualmente ho una configurazione di sistema che mi consente di iniziare e interrompere la visualizzazione delle immagini in eww ma solo dopo un aggiornamento della pagina, quello che voglio è un modo per attivare e disattivare le immagini senza aggiornare la pagina .

Ecco il mio metodo attuale che sfrutta i vantaggi interni di 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))

Ho anche provato a cambiare la proprietà del testo invisibile in cui le immagini sono ma che sembra non funzionare.

Risposte:


13

sfondo

Eww, come molti altri pacchetti, utilizza la displayproprietà text per visualizzare le immagini. Ecco perché attivare o disattivare la invisibleproprietà text. Stai rendendo il testo stesso invisibile ma la display proprietà viene ancora mostrata.

In effetti, questo è qualcosa di così comune che il codice seguente dovrebbe funzionare su qualsiasi buffer che visualizza immagini (non solo eww).

Soluzione

La soluzione più semplice è rimuovere la displayproprietà dall'intero buffer. Ma questa è un'azione irreversibile, non saresti in grado di riattivare le immagini senza aggiornare la pagina.

La soluzione più solida, presentata di seguito, rimuove le display proprietà nel buffer e contemporaneamente esegue il backup dell'immagine su un'altra proprietà (inutile). Quando viene chiamato di nuovo, il comando sposta le immagini di backup nella displayproprietà.

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

Questo è il tipo che esegue il backup e il ripristino ovunque. Il codice della proprietà del testo non è tremendamente facile da leggere, ma penso che questa funzione sia abbastanza breve da essere autoesplicativa.

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

Per favore fatemi sapere se funziona! L'ho provato solo su pagine Web molto semplici.


1
Bello, funziona molto bene per me.
Boccaperta-IT,

L'ho usato molto e mi chiedo come posso nascondere l'immagine in linea e mostrare il testo per impostazione predefinita?
yi.tang.uni,

7

A partire da Emacs 25.1 è possibile passare un argomento eww-reloadda caricare dalla cache anziché dalla rete. Sto usando il seguente:

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

Ciò disabilita immagini e caratteri proporzionali per impostazione predefinita. La commutazione dei caratteri è vincolata per Fimpostazione predefinita, quindi sto usando Iper alternare le immagini. (Questo sostituisce un'associazione predefinita per shr-insert-image, ma non l'ho mai usato.)


Qualche differenza tra usare il defvar shr-inhibit-imagese il defcustom shr-blocked-images?
Basil

Io non la penso così. inhibitè un valore booleano ed blockedè una regex, quindi è possibile utilizzare la regex per bloccare sempre determinati URL mentre si utilizza la modalità abitativa per attivare e disattivare tutto il resto.
glucas,

@glucas Grazie per questo! Voglio sapere cos'è eww-link-keymap; la lettura *Help*non ha aiutato;) Potresti spiegare di cosa si tratta e perché aggiungere un legame chiave anche a quello?
legends2k

1
@ legends2k Tale keymap si applica quando point si trova su un collegamento in un buffer eww. Tale associazione aggiuntiva probabilmente non è effettivamente necessaria poiché Emacs tornerà comunque alla mappa delle modalità lì.
glucas,

1
@ legends2k Siamo spiacenti, ho sbagliato proprio ora. L'associazione aggiuntiva è necessaria perché eww ha "I" associato a shr-insert-image nella mappa chiave eww-link per impostazione predefinita, quindi sto sostituendo tale associazione. Se si utilizza una chiave diversa che non è in conflitto con le impostazioni predefinite di eww, sarà sufficiente aggiungerla alla mappa della modalità.
glucas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.