Как включить или отключить отображение изображений в 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свойство text для отображения изображений. Вот почему переключение 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))))))

Пожалуйста, дайте мне знать, если это работает! Я проверял это только на очень простых веб-страницах.

Malabarba
источник
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, но я никогда не использовал это.)

glucas
источник
Есть ли разница между использованием defvar shr-inhibit-imagesи defcustom shr-blocked-images?
Василий
Я так не думаю. inhibitявляется логическим значением и blockedявляется регулярным выражением, так что вы можете использовать регулярное выражение, чтобы всегда блокировать определенные URL-адреса, в то же время используя привычку для включения и выключения всего остального.
glucas
@glucas Спасибо за это! Я хочу знать, что eww-link-keymapесть; чтение *Help*не помогло;) Не могли бы вы объяснить, что это такое и зачем добавлять к нему привязку ключей?
legends2k
1
@ legends2k Эта раскладка применяется, когда точка находится на ссылке в буфере eww. Это дополнительное связывание, вероятно, на самом деле не нужно, поскольку Emacs все равно будет использовать там карту режимов.
glucas
1
@ legends2k Извините, я ошибался только сейчас. Дополнительная привязка необходима, потому что eww имеет привязку «I» к shr-insert-image в eww-link-keymap по умолчанию, поэтому я заменяю эту привязку. Если вы используете другой ключ, который не конфликтует с какими-либо значениями по умолчанию, вам нужно всего лишь добавить его на карту режимов.
glucas