ฉันจะสลับการแสดงรูปภาพเป็น eww โดยไม่ต้องรีเฟรชหน้าเว็บได้อย่างไร


18

ฉันใช้ eww เพื่อเบราส์อินเทอร์เน็ตและบ่อยกว่าที่ฉันไม่ต้องการให้โหลดรูปภาพดูเหมือนจะไม่ค่อยมีอะไรในแง่ของการปรับแต่งในตัวสำหรับ eww และไม่มีการจัดการกับรูปภาพ

ขณะนี้ฉันมีการติดตั้งระบบที่ช่วยให้ผมที่จะเริ่มต้นและหยุดการแสดงภาพใน eww แต่หลังจากรีเฟรชหน้าสิ่งที่ฉันต้องการเป็นวิธีที่จะสลับภาพและปิดโดยไม่ต้องรีเฟรชหน้าเว็บ

นี่คือวิธีการปัจจุบันของฉันซึ่งใช้ประโยชน์จาก internals 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เป็น regex ดังนั้นคุณอาจใช้ regex เพื่อบล็อก URL บางอย่างในขณะที่ยังคงใช้ hab เพื่อสลับทุกอย่างในและนอก
ลูกัส

@glucas ขอบคุณสำหรับสิ่งนี้! ฉันอยากรู้ว่าอะไรeww-link-keymapคือ; การอ่าน*Help*ไม่ได้ช่วย;) คุณช่วยอธิบายได้ว่ามันคืออะไรและทำไมจึงเพิ่มรหัสที่มีผลผูกพันกับมันด้วย?
legends2k

1
@ legends2k คีย์แมปนั้นนำไปใช้เมื่อจุดอยู่บนลิงก์ในบัฟเฟอร์ eww การผูกพันเพิ่มเติมนั้นอาจไม่จำเป็นจริง ๆ เพราะ Emacs จะถอยกลับไปที่แผนผังโหมดที่นั่นอยู่แล้ว
ลูกัส

1
@ legends2k ขออภัยฉันผิดตอนนี้ จำเป็นต้องใช้การโยงเพิ่มเติมเนื่องจาก eww มี "I" ที่ผูกไว้กับ shr-insert-image ใน eww-link-keymap ตามค่าเริ่มต้นดังนั้นฉันจึงแทนที่การโยงนั้น หากคุณใช้รหัสอื่นที่ไม่ขัดแย้งกับค่าเริ่มต้น eww ใด ๆ คุณจะต้องเพิ่มลงในแผนผังโหมดเท่านั้น
ลูกัส
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.