Bagaimana saya bisa beralih menampilkan gambar di eww tanpa refresh halaman?

18

Saya menggunakan eww untuk menjelajah internet dan lebih sering daripada tidak saya tidak ingin gambar dimuat, sepertinya tidak ada banyak dalam hal kustomisasi yang dibangun untuk eww dan tidak ada yang berurusan dengan gambar.

Saat ini saya memiliki pengaturan sistem yang memungkinkan saya untuk memulai dan berhenti menampilkan gambar di eww tetapi hanya setelah refresh halaman, yang saya inginkan adalah cara untuk mengaktifkan dan menonaktifkan gambar tanpa menyegarkan halaman .

Berikut adalah metode saya saat ini yang mengambil keuntungan dari internal shr-put-imageyang saya gunakan baru.

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

Saya juga mencoba mengubah properti teks 'tak terlihat di mana gambar berada tetapi itu tampaknya tidak berfungsi.

Jordon Biondo
sumber

Jawaban:

13

Latar Belakang

Eww, seperti banyak paket lainnya, menggunakan displayproperti teks untuk menampilkan gambar. Itu sebabnya mengubah invisibleproperti teks tidak membantu. Anda membuat teks itu sendiri tidak terlihat tetapi display properti masih ditampilkan.

Sebenarnya, ini adalah sesuatu yang sangat umum sehingga kode di bawah ini harus berfungsi pada buffer apa pun yang menampilkan gambar (bukan hanya eww).

Larutan

Solusi termudah adalah dengan hanya menghapus displayproperti dari seluruh buffer. Tapi itu tindakan yang tidak dapat diubah, Anda tidak akan dapat menghidupkan kembali gambar tanpa menyegarkan halaman.

Solusi yang lebih kuat, yang disajikan di bawah ini, menghilangkan display properti di buffer dan secara bersamaan membuat cadangan gambar ke properti lain (tidak berguna). Ketika dipanggil lagi, perintah memindahkan gambar yang dicadangkan kembali ke displayproperti.

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

Ini adalah orang yang melakukan pencadangan dan pengembalian di mana-mana. Kode properti teks tidak terlalu mudah dibaca, tapi saya pikir fungsi ini cukup singkat untuk menjelaskannya sendiri.

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

Tolong beri tahu saya jika berhasil! Saya hanya mengujinya di halaman web yang sangat sederhana.

Malabarba
sumber
1
Cantik, ini bekerja sangat baik untuk saya.
Boccaperta-IT
Saya sering menggunakannya dan bertanya-tanya bagaimana cara menyembunyikan gambar sebaris dan menampilkan teks secara default?
yi.tang.uni
7

Pada Emacs 25.1 Anda bisa memberikan argumen eww-reloaduntuk memuat dari cache daripada jaringan. Saya menggunakan yang berikut ini:

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

Ini menonaktifkan gambar dan font proporsional secara default. Beralih font terikat Fsecara default, jadi saya menggunakan Iuntuk beralih gambar. (Ini menggantikan pengikatan default untuk shr-insert-image, tetapi saya belum pernah menggunakannya.)

glukas
sumber
Adakah perbedaan antara menggunakan defvar shr-inhibit-imagesdan defcustom shr-blocked-images?
Basil
Saya kira tidak. inhibitadalah boolean dan blockedadalah regex, sehingga Anda mungkin menggunakan regex untuk selalu memblokir URL tertentu sementara masih menggunakan mendiami untuk beralih segala sesuatu yang lain dan mematikan.
glukas
@glucas Terima kasih untuk ini! Saya ingin tahu apa eww-link-keymapitu; membaca *Help*tidak membantu;) Bisakah Anda menjelaskan apa itu dan mengapa menambahkan kunci yang mengikat juga?
legends2k
1
@ legends2k Keymap itu berlaku saat titik ada pada tautan di buffer eww. Ikatan tambahan itu mungkin sebenarnya tidak diperlukan karena Emacs akan kembali ke mode peta di sana.
glucas
1
@ legends2k Maaf, saya salah tadi. Penjilidan tambahan diperlukan karena eww memiliki "I" yang terikat pada shr-insert-image di eww-link-keymap secara default, jadi saya mengganti ikatan itu. Jika Anda menggunakan kunci berbeda yang tidak bertentangan dengan standar baru, Anda hanya perlu menambahkannya ke peta mode.
glucas