Làm cách nào tôi có thể chuyển đổi hiển thị hình ảnh trong eww mà không cần làm mới trang?


18

Tôi sử dụng eww để duyệt internet và thường xuyên hơn là tôi không muốn tải hình ảnh, dường như không có nhiều điều chỉnh về các tùy chỉnh được tích hợp cho eww và không xử lý hình ảnh.

Hiện tại tôi có thiết lập hệ thống cho phép tôi bắt đầu và dừng hiển thị hình ảnh trong eww nhưng chỉ sau khi làm mới trang, điều tôi muốn là cách bật và tắt hình ảnh mà không cần làm mới trang .

Đây là phương pháp hiện tại của tôi, tận dụng lợi thế của phần bên trong shr-put-imagemà eww sử dụng.

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

Tôi cũng đã cố gắng chuyển đổi 'thuộc tính văn bản vô hình có hình ảnh nhưng dường như nó không hoạt động.

Câu trả lời:


13

Lý lịch

Eww, như nhiều gói khác, sử dụng thuộc tính displayvăn bản để hiển thị hình ảnh. Đó là lý do tại sao việc chuyển đổi thuộc tính invisiblevăn bản không giúp được. Bạn đang làm cho văn bản trở nên vô hình nhưng display tài sản vẫn đang được hiển thị.

Trong thực tế, đây là một cái gì đó phổ biến đến mức mã dưới đây sẽ hoạt động trên bất kỳ bộ đệm nào hiển thị hình ảnh (không chỉ eww).

Giải pháp

Giải pháp đơn giản nhất là chỉ cần loại bỏ thuộc displaytính khỏi toàn bộ bộ đệm. Nhưng đó là một hành động không thể đảo ngược, bạn sẽ không thể bật lại hình ảnh mà không làm mới trang.

Giải pháp mạnh mẽ hơn, được trình bày dưới đây, loại bỏ display các thuộc tính trong bộ đệm và đồng thời sao lưu hình ảnh sang thuộc tính khác (vô dụng). Khi được gọi lại, lệnh di chuyển các hình ảnh được sao lưu trở lại vào thuộc displaytính.

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

Đây là anh chàng thực hiện sao lưu và khôi phục ở mọi nơi. Mã thuộc tính văn bản không dễ đọc lắm, nhưng tôi nghĩ chức năng này đủ ngắn để tự giải thích.

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

Xin vui lòng cho tôi biết nếu nó hoạt động! Tôi chỉ thử nghiệm nó trên các trang web rất đơn giản.


1
Đẹp, nó hoạt động rất tốt cho tôi.
Boccaperta-IT

Tôi đã sử dụng nó rất nhiều và tự hỏi làm thế nào tôi có thể ẩn hình ảnh nội tuyến và hiển thị văn bản theo mặc định?
yi.tang.uni

7

Kể từ Emacs 25.1, bạn có thể truyền một đối số eww-reloadđể tải từ bộ đệm thay vì mạng. Tôi đang sử dụng như sau:

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

Điều này vô hiệu hóa hình ảnh và phông chữ tỷ lệ theo mặc định. Chuyển đổi phông chữ bị ràng buộc Ftheo mặc định, vì vậy tôi đang sử dụng Iđể chuyển đổi hình ảnh. (Điều này thay thế một ràng buộc mặc định cho shr-insert-image, nhưng tôi chưa bao giờ sử dụng nó.)


Bất kỳ sự khác biệt giữa việc sử dụng defvar shr-inhibit-imagesdefcustom shr-blocked-images?
Basil

Tôi không nghĩ vậy. inhibitlà một boolean và blockedlà một regex, vì vậy bạn có thể sử dụng regex để luôn chặn một số URL nhất định trong khi vẫn sử dụng hab để bật và tắt mọi thứ khác.
glucas

@glucas Cảm ơn vì điều này! Tôi muốn biết nó eww-link-keymaplà gì ; đọc *Help*không giúp được gì;) Bạn có thể giải thích nó là gì không và tại sao lại thêm một ràng buộc chính cho điều đó?
huyền thoại2k

1
@ legends2k Sơ đồ bàn phím đó áp dụng khi điểm nằm trên một liên kết trong bộ đệm eww. Sự ràng buộc bổ sung đó có lẽ không thực sự cần thiết vì Emacs sẽ quay trở lại bản đồ chế độ ở đó.
glucas

1
@ legends2k Xin lỗi, tôi vừa mới nhầm. Liên kết bổ sung là cần thiết vì eww có "I" bị ràng buộc với hình ảnh thu nhỏ trong sơ đồ bàn phím eww-link-key, vì vậy tôi sẽ thay thế liên kết đó. Nếu bạn sử dụng một khóa khác không xung đột với bất kỳ mặc định eww nào, bạn chỉ cần thêm nó vào bản đồ chế độ.
glucas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.