मैं बिना पेज को रिफ्रेश किए eww में इमेजेज को कैसे टॉगल कर सकता हूं?


18

मैं इंटरनेट ब्राउज़ करने के लिए eww का उपयोग करता हूं और अधिक बार नहीं कि मैं छवियों को लोड नहीं करना चाहता हूं, eww के लिए बनाए गए अनुकूलन और छवियों से निपटने के मामले में बहुत कुछ प्रतीत नहीं होता है।

वर्तमान में मेरे पास एक सिस्टम सेटअप है जो मुझे eww में छवियों को दिखाना और शुरू करना बंद करने की अनुमति देता है, लेकिन केवल एक पृष्ठ ताज़ा करने के बाद, जो मैं चाहता हूं वह पृष्ठ को ताज़ा किए बिना छवियों को चालू और बंद करने का एक तरीका है ।

यहाँ मेरी वर्तमान पद्धति है shr-put-imageजो ईवा के आंतरिक उपयोग का लाभ उठाती है ।

(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 संपत्ति अभी भी दिखाई जा रही है।

वास्तव में, यह कुछ इतना सामान्य है कि नीचे दिए गए कोड को किसी भी बफर पर काम करना चाहिए जो छवियों को प्रदर्शित करता है (केवल ईएवी नहीं)।

समाधान

सबसे आसान उपाय सिर्फ 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
सुंदर, यह मेरे लिए बहुत अच्छा काम करता है।
बोक्कापार्टा-आईटी

मैंने इसका बहुत उपयोग किया और आश्चर्य किया कि मैं इनलाइन छवि को कैसे छिपा सकता हूं और डिफ़ॉल्ट रूप से पाठ दिखा सकता हूं?
yi.tang.uni

7

25.1 Emacs के रूप में, आप 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डिफ़ॉल्ट रूप से बाध्य है , इसलिए मैं Itoggling छवियों का उपयोग कर रहा हूं । (यह एक डिफ़ॉल्ट बाइंडिंग की जगह लेता है shr-insert-image, लेकिन मैंने कभी इसका उपयोग नहीं किया है।)


defvar shr-inhibit-imagesऔर का उपयोग करने के बीच कोई अंतर defcustom shr-blocked-images?
तुलसी

मुझे ऐसा नहीं लगता। inhibitएक बूलियन है और blockedएक रेगेक्स है, इसलिए आप रेगेक्स का उपयोग हमेशा कुछ URL को ब्लॉक करने के लिए कर सकते हैं, जबकि अभी भी सब कुछ चालू और बंद करने के लिए निवासियों का उपयोग कर रहे हैं।
ग्लूकोज

@ इसके लिए धन्यवाद! मैं जानना चाहता हूं कि क्या eww-link-keymapहै; पढ़ना *Help*मदद नहीं करता था;) क्या आप बता सकते हैं कि यह क्या है और इसके लिए एक महत्वपूर्ण बंधन क्यों जोड़ा जाए?
लीजेंड 2k

1
@ legends2k वह कीमैप लागू होता है जब बिंदु एक eww बफर में लिंक पर होता है। अतिरिक्त बंधन शायद वास्तव में आवश्यक नहीं है क्योंकि Emacs वैसे भी मोड मैप पर वापस आ जाएंगे।
ग्लूकोज

1
@ legends2k क्षमा करें, मैं अभी गलत था। अतिरिक्त बाध्यकारी की आवश्यकता है क्योंकि eww में डिफ़ॉल्ट रूप से eww-link-keymap में shr-insert-image के लिए "I" है, इसलिए मैं उस बंधन को प्रतिस्थापित कर रहा हूं। यदि आप एक अलग कुंजी का उपयोग करते हैं जो किसी ईवा चूक के साथ संघर्ष नहीं करता है, तो आपको केवल इसे मोड मैप में जोड़ना होगा।
ग्लूकोज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.