ページを更新せずにewwで画像の表示を切り替えるにはどうすればよいですか?


18

私はewwを使用してインターネットを閲覧しますが、画像をロードしたくない場合が多いのですが、ewwに組み込まれたカスタマイズに関してはあまり多くないようで、画像を処理しません。

現在、ewwで画像の表示を開始および停止できるシステムセットアップがありますが、ページの更新後にのみ、ページを更新せずに画像のオンとオフを切り替える方法が必要です。

以下は、shr-put-imageewwが使用する内部構造を利用する現在の方法です。

(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は、他の多くのパッケージと同様に、displaytextプロパティを使用して画像を表示します。それが、invisibletextプロパティの切り替えが役に立たなかった理由です。テキスト自体を非表示にしますが、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))))))

機能するかどうかをお知らせください!非常に単純なWebページでのみテストしました。


1
美しい、それは私にとって非常にうまく機能します。
ボッカペルタ-IT 14年

私はそれを頻繁に使用しましたが、デフォルトでインライン画像を非表示にしてテキストを表示するにはどうすればよいですか?
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-imagesdefcustom shr-blocked-images
バジル

そうは思いません。inhibitはブール値でblockedあり、正規表現であるため、inhabitを使用して他のすべてのオンとオフを切り替える一方で、正規表現を使用して特定のURLを常にブロックすることができます。
グルーカス

@glucasこれをありがとう!私eww-link-keymapは何が知りたいです。読む*Help*ことは助けになりませんでした;)それが何であるのか、そしてなぜそれにもキーバインディングを追加するのか説明してもらえますか?
legends2k

1
@ legends2kそのキーマップは、ポイントがewwバッファー内のリンク上にあるときに適用されます。Emacsはいずれにせよそこのモードマップにフォールバックするので、追加のバインディングはおそらく実際には必要ありません。
グルカ

1
@ legends2k申し訳ありませんが、私は今間違っていました。ewwにはデフォルトでeww-link-keymapのshr-insert-imageにバインドされた「I」があるため、追加のバインディングが必要です。したがって、このバインディングを置き換えています。ewwのデフォルトと競合しない別のキーを使用する場合は、モードマップに追加するだけです。
グルーカス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.