Jak mogę przełączać wyświetlanie obrazów w eww bez odświeżania strony?


18

Używam eww do przeglądania Internetu i najczęściej nie chcę, aby obrazy były ładowane, wydaje się, że nie ma wiele pod względem dostosowań wbudowanych w eww i nie dotyczy to obrazów.

Obecnie mam konfigurację systemu, która pozwala mi uruchamiać i zatrzymywać wyświetlanie obrazów w eww, ale dopiero po odświeżeniu strony, chcę, aby włączać i wyłączać obrazy bez odświeżania strony .

Oto moja obecna metoda, która wykorzystuje elementy wewnętrzne, z shr-put-imagektórych korzysta 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))

Próbowałem także przełączać „niewidoczną właściwość tekstu, w której znajdują się obrazy, ale wydaje się, że to nie działa.

Odpowiedzi:


13

tło

Eww, podobnie jak wiele innych pakietów, używa displaywłaściwości text do wyświetlania obrazów. Dlatego przełączanie invisiblewłaściwości text nie pomogło. Sprawiasz, że sam tekst jest niewidoczny, ale display właściwość wciąż jest wyświetlana.

W rzeczywistości jest to coś tak powszechnego, że poniższy kod powinien działać na każdym buforze wyświetlającym obrazy (nie tylko eww).

Rozwiązanie

Najłatwiejszym rozwiązaniem jest usunięcie displaywłaściwości z całego bufora. Ale to nieodwracalne działanie, nie można ponownie włączyć obrazów bez odświeżania strony.

Bardziej niezawodne rozwiązanie, przedstawione poniżej, usuwa display właściwości z bufora i jednocześnie tworzy kopię zapasową obrazu z inną (bezużyteczną) właściwością. Po ponownym wywołaniu polecenie przenosi kopie zapasowe obrazów z powrotem do displaywłaściwości.

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

To facet, który wykonuje kopie zapasowe i przywraca je wszędzie. Kod właściwości tekstu nie jest strasznie łatwy do odczytania, ale myślę, że ta funkcja jest wystarczająco krótka, aby można było ją wyjaśnić.

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

Daj mi znać, jeśli to działa! Testowałem to tylko na bardzo prostych stronach internetowych.


1
Piękne, działa dla mnie bardzo dobrze.
Boccaperta-IT

Często go używałem i zastanawiam się, jak mogę ukryć obraz wbudowany i domyślnie wyświetlać tekst?
yi.tang.uni

7

Począwszy od Emacsa 25.1 możesz przekazać argument eww-reloaddo załadowania z pamięci podręcznej zamiast z sieci. Używam następujących:

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

Domyślnie wyłącza to obrazy i czcionki proporcjonalne. Przełączanie czcionek jest Fdomyślnie powiązane , więc używam Ido przełączania obrazów. (Zastępuje to domyślne wiązanie shr-insert-image, ale nigdy tego nie użyłem).


Jakaś różnica między używaniem defvar shr-inhibit-imagesa defcustom shr-blocked-images?
Basil

Nie wydaje mi się inhibitjest wartością logiczną i blockedjest wyrażeniem regularnym, więc możesz użyć wyrażenia regularnego, aby zawsze blokować określone adresy URL, a jednocześnie używać opcji zamieszkania do włączania i wyłączania wszystkich innych elementów.
glucas,

@glucas Dzięki za to! Chcę wiedzieć, co eww-link-keymapjest; czytanie *Help*nie pomogło;) Czy mógłbyś wyjaśnić, co to jest i dlaczego dodać do tego również wiążący klucz?
legends2k

1
@ legends2k Ta mapa klawiszy ma zastosowanie, gdy punkt znajduje się na łączu w buforze eww. To dodatkowe wiązanie prawdopodobnie nie jest tak naprawdę potrzebne, ponieważ Emacs i tak wróci do mapy trybów.
glucas

1
@ legends2k Niestety, właśnie się myliłem. Dodatkowe powiązanie jest potrzebne, ponieważ eww domyślnie „I” jest powiązane z obrazkiem shr-insert-image w mapie klawiszy eww-link, więc zastępuję to powiązanie. Jeśli użyjesz innego klucza, który nie powoduje konfliktu z żadnymi ustawieniami domyślnymi eww, wystarczy dodać go do mapy trybów.
glucas
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.