Як можна перемикати відображення зображень у eww без оновлення сторінки?


18

Я використовую eww для перегляду Інтернету, і частіше за все я не хочу завантажувати зображення, здається, не так багато в плані налаштувань, вбудованих для eww, і жодної справи із зображеннями.

В даний час у мене є система налаштування, яка дозволяє мені запускати та припиняти показ зображень у eww, але лише після оновлення сторінки, те, що я хочу, - це спосіб вмикати та вимикати зображення, не оновлюючи сторінку .

Ось мій сучасний метод, який використовує внутрішні shr-put-imageресурси, якими користується 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))

Я також спробував увімкнути "невидимий властивість тексту, де є зображення, але це, здається, не працює.

Відповіді:


13

Фон

Eww, як і багато інших пакунків, використовує displayвластивість тексту для відображення зображень. Ось чому перемикання invisibleвластивості тексту не допомогло. Ви робите сам текст невидимим, але display властивість все ще відображається.

Насправді це щось настільки поширене, що наведений нижче код повинен працювати на будь-якому буфері, який відображає зображення (не лише eww).

Рішення

Найпростіше рішення - просто видалити displayвластивість з усього буфера. Але це незворотна дія, ви б не змогли повернути зображення, не оновивши сторінку.

Більш надійне рішення, представлене нижче, видаляє display властивості в буфері і одночасно створює резервну копію зображення в іншій (непотрібній) властивості. Після повторного виклику команда повертає резервні копії зображень назад у displayвластивість.

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

Це хлопець, який робить резервне копіювання та відновлення скрізь. Код властивості тексту не дуже легко читати, але я думаю, що ця функція є достатньо короткою, щоб бути зрозумілою.

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

Будь ласка, дайте мені знати, чи працює це! Я тестував його лише на дуже простих веб-сторінках.


1
Красиво, це дуже добре працює для мене.
Boccaperta-IT

Я його багато використовував і цікаво, як я можу приховати вбудоване зображення і показати текст за замовчуванням?
yi.tang.uni

7

Станом на Emacs 25.1 ви можете передавати аргумент eww-reloadдля завантаження з кеша, а не з мережі. Я використовую наступне:

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

Це вимикає зображення та пропорційні шрифти за замовчуванням. Змінення шрифту Fза замовчуванням прив’язане , тому я використовую Iдля перемикання зображень. (Це замінює прив'язку за замовчуванням для shr-insert-image, але я ніколи цього не використовував.)


Будь-яка різниця між використанням defvar shr-inhibit-imagesта defcustom shr-blocked-images?
Василь

Я не думаю, що так. inhibitє булевим і blockedявляє собою регулярний вираз, тому ви можете використовувати регулярний вираз, щоб завжди блокувати певні URL-адреси, в той час як все ще використовуєте поселення, щоб увімкнути та вимкнути все інше.
глюкас

@glucas Дякую за це! Я хочу знати, що eww-link-keymapтаке; читання *Help*не допомогло;) Чи не могли б ви пояснити, що це таке, і чому до цього також додавати прив'язку ключа?
legends2k

1
@ legends2k Ця клавішна карта застосовується, коли точка знаходиться на посиланні в буфері eww. Це додаткове прив'язування, мабуть, насправді не потрібно, оскільки Emacs все одно повернеться до карти режимів.
глюкас

1
@ legends2k Вибачте, я помилився саме зараз. Додаткове прив'язування необхідне, оскільки eww за замовчуванням прив’язаний до shr-insert-image у eww-link-keymap, тому я замінюю це прив'язку. Якщо ви використовуєте інший ключ, який не суперечить жодним за замовчуванням eww, вам потрібно буде лише додати його до карти режимів.
глюкас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.