페이지를 새로 고치지 않고 eww에서 이미지 표시를 전환하는 방법은 무엇입니까?


18

eww를 사용하여 인터넷을 탐색하고 이미지를로드하지 않으려는 경우보다 자주 eww에 내장 된 사용자 정의 항목이 많지 않고 이미지를 다루지 않습니다.

현재 eww에서 이미지 표시를 시작하고 중지 할 수있는 시스템 설정이 있지만 페이지를 새로 고친 후에 만 ​​원하는 것은 페이지를 새로 고치지 않고 이미지를 켜고 끄는 방법 입니다.

여기에 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))

또한 '이미지가 보이지 않지만 작동하지 않는'보이지 않는 텍스트 속성을 토글하려고했습니다.

답변:


13

배경

다른 많은 패키지와 마찬가지로 Eww는 displaytext 속성을 사용하여 이미지를 표시합니다. 따라서 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 2009

나는 그것을 많이 사용했고 기본적으로 인라인 이미지를 숨기고 텍스트를 표시하는 방법을 궁금해합니까?
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-imagesdefcustom shr-blocked-images?를 사용하는 것의 차이점 은 무엇입니까?
바질

나는 그렇게 생각하지 않습니다. inhibit는 부울이고 blocked정규 표현식이므로 정규 표현식을 사용하여 항상 특정 URL을 차단하면서도 거주를 사용하여 다른 모든 것을 켜고 끌 수 있습니다.
glucas

@glucas 감사합니다! 나는 무엇인지 알고 싶다 eww-link-keymap; 독서 *Help*는 도움이되지 않았다;) 그것이 무엇인지 설명하고 키 바인딩을 추가하는 이유를 설명해 주시겠습니까?
legends2k

1
@ legends2k이 키맵은 포인트가 eww 버퍼의 링크에있을 때 적용됩니다. Emacs가 어쨌든 모드 맵으로 대체되므로 추가 바인딩은 실제로 필요하지 않을 것입니다.
glucas

1
@ legends2k 죄송합니다. 지금은 잘못되었습니다. eww가 기본적으로 eww-link-keymap의 shr-insert-image에 바인딩 된 "I"를 가지고 있기 때문에 추가 바인딩이 필요하므로 해당 바인딩을 대체합니다. eww 기본값과 충돌하지 않는 다른 키를 사용하는 경우 해당 키를 모드 맵에 추가하기 만하면됩니다.
glucas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.