Sayfa yenilemeden görüntüleri eww olarak nasıl değiştirebilirim?


18

İnternette gezinmek için eww kullanıyorum ve çoğu zaman görüntülerin yüklenmesini istemiyorum, eww için yerleşik olan özelleştirmeler açısından çok fazla görünmüyor ve görüntülerle ilgilenmiyor.

Şu anda bana başlayıp Eww içinde ama sadece sayfa yenileme sonrasında görüntüleri gösteriminin durdurulmasına olanak sağlayan bir sistem kurulum var, istediğim açık ve kapalı görüntülere geçiş için bir yoldur Sayfayı yenilemeden .

İşte benim shr-put-imageeww kullanan içlerinden yararlanan mevcut yöntem .

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

Ayrıca görüntülerin olduğu görünmez metin özelliğini değiştirmeye çalıştım ama bu işe yaramıyor gibi görünüyor.

Yanıtlar:


13

Arka fon

Diğer pek çok paket gibi, displaygörüntüleri görüntülemek için text özelliğini kullanır . Bu nedenle invisibletext özelliğini değiştirmek yardımcı olmadı. Metnin kendisini görünmez yapıyorsunuz, ancak display mülk hala gösteriliyor.

Aslında, bu çok yaygın bir şeydir, aşağıdaki kod görüntüleri görüntüleyen herhangi bir arabellek üzerinde çalışmalıdır (sadece eww değil).

Çözüm

En kolay çözüm displayözelliği tüm tampondan kaldırmaktır . Ancak bu geri döndürülemez bir işlemdir, sayfayı yenilemeden görüntüleri tekrar açamazsınız.

Aşağıda sunulan daha sağlam çözüm, display arabellekteki özellikleri kaldırır ve aynı anda görüntüyü başka (işe yaramaz) özelliğe yedekler. Tekrar çağrıldığında, komut yedeklenen görüntüleri tekrar displayözelliğe taşır .

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

Bu, her yerde yedeklemeyi ve geri yüklemeyi yapan adam. Metin özellik kodu okumak çok kolay değil, ancak bu işlevin kendini açıklayıcı olacak kadar kısa olduğunu düşünüyorum.

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

Lütfen işe yarayıp yaramadığını bana bildirin! Sadece çok basit web sayfalarında test ettim.


1
Güzel, benim için çok iyi çalışıyor.
Boccaperta-IT

Çok kullandım ve satır içi görüntüyü nasıl gizleyebilirim ve metni varsayılan olarak nasıl gösterebilirim?
yi.tang.uni

7

Emacs 25.1'den eww-reloaditibaren ağ yerine önbellekten yüklenecek bir argüman iletebilirsiniz . Aşağıdakileri kullanıyorum:

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

Bu, varsayılan olarak görüntüleri ve orantılı yazı tiplerini devre dışı bırakır. Yazı tipi geçişi Fvarsayılan olarak bağlıdır , bu yüzden Igörüntüleri değiştirmek için kullanıyorum . (Bu, varsayılan bağlamanın yerini alır shr-insert-image, ancak bunu hiç kullanmadım.)


Kullanarak arasındaki fark defvar shr-inhibit-imagesve defcustom shr-blocked-images?
Fesleğen

Ben öyle düşünmüyorum. inhibitbir boolean ve blockedbir normal ifade olduğundan, diğer URL'leri her zaman açıp kapamak için hala oturma halini kullanırken belirli URL'leri her zaman engellemek için normal ifadeyi kullanabilirsiniz.
glucas

@glucas Bunun için teşekkürler! Ne olduğunu bilmek istiyorum eww-link-keymap; okuma *Help*yardımcı olmadı;) Bunun ne olduğunu ve neden buna bir anahtar bağlama eklediğini açıklar mısınız?
legends2k

1
@ legends2k Bu tuş haritası, eww arabelleğindeki bir bağlantı üzerindeyken uygulanır. Emacs yine de mod haritasına geri döneceğinden, bu ek bağlama muhtemelen gerekli değildir.
glucas

1
@ legends2k Üzgünüm, şimdi yanılmışım. Eww, varsayılan olarak eww-link-keymap'te shr-insert-image komutuna bağlı "I" işaretine sahip olduğundan ek ciltleme gereklidir, bu yüzden bu ciltlemeyi değiştiriyorum. Eww varsayılanlarıyla çelişmeyen farklı bir anahtar kullanırsanız, bunu yalnızca mod haritasına eklemeniz gerekir.
glucas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.