Emacs configuration and packages
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

7.2 KiB

Web browsing using eww

Integration with browse-url and afio

  (defun jao-eww-browse-url (url &rest r)
    "Browse URL using eww."
    (if (derived-mode-p 'eww-mode)
        (eww url)
      (select-window (frame-first-window))
      (let* ((url (url-encode-url url))
             (bf (seq-find `(lambda (b)
                              (with-current-buffer b
                                (string= ,url
                                         (url-encode-url (eww-current-url)))))
        (cond (bf (switch-to-buffer bf))
              ((string-match-p url "^file://") (eww-open-file url))
              (t (eww url 4))))))

  (setq jao-browse-url-function #'jao-eww-browse-url)
  (setq eww-use-browse-url "^\\(gemini\\|gopher\\):")

Opening URLs

  (defun jao-eww-copy-link ()
    (when-let (lnk (or (car (eww-links-at-point)) (eww-current-url)))
      (message "%s" lnk)
      (kill-new lnk)))

  (defun jao-eww-browse (arg)
      (interactive "P" eww-mode)
      (setq eww-prompt-history
            (cl-remove-duplicates eww-prompt-history :test #'string=))
      (let ((url (completing-read (if arg "eww in new buffer: " "eww: ")
                                  eww-prompt-history nil nil nil
                                  'eww-prompt-history (eww-current-url))))
        (eww url (when arg 4))))

  (defun jao-eww-browse-new ()
    (interactive nil eww-mode)
    (jao-eww-browse t))

  (defun jao-eww-reload (images)
      (interactive "P" eww-mode)
      (if images
          (let ((shr-blocked-images nil))
            (eww-reload t))
        (call-interactively 'eww-reload)))

Consult narrowing

  (with-eval-after-load "consult"
    (defvar jao-eww-consult-history nil)
    (defvar jao-eww-buffer-source
      (list :name "eww buffer"
            :category 'eww-buffer
            :hidden t
            :narrow (cons ?e "eww")
            :annotate (lambda (c) (get-text-property 0 'url c))
            :history 'jao-eww-consult-history
            :action (lambda (b)
                      (switch-to-buffer (get-text-property 0 'buffer b)))
            (lambda ()
              (seq-map (lambda (b)
                         (with-current-buffer b
                           (let ((tl (or (plist-get eww-data :title) ""))
                                 (url (or (eww-current-url) (buffer-name))))
                             (propertize (if (string-blank-p tl) url tl)
                                         'buffer b 'url url))))
                       (seq-filter #'jao-www--buffer-p (buffer-list))))))
    (jao-consult-add-buffer-source 'jao-eww-buffer-source "Web" ?e))


  (defun jao-eww-next-image ()
    (interactive nil eww-mode)
    (when-let (p (text-property-search-forward 'image-displayer nil nil t))
      (goto-char (prop-match-beginning p))))

Close page and reopen

  (defvar jao-eww--closed-urls ())

  (defun jao-eww-close ()
    (interactive nil eww-mode)
    (when-let (current (eww-current-url))
      (add-to-list 'jao-eww--closed-urls current))
    (let ((nxt (car (jao-eww-session-invisible-buffers))))
      (when nxt (switch-to-buffer nxt nil t))))

  (defun jao-eww-reopen (arg)
    (interactive "P")
    (if (> (length jao-eww--closed-urls) 0)
        (let ((url (completing-read "URL: " jao-eww--closed-urls)))
          (setq jao-eww--closed-urls (remove url jao-eww--closed-urls))
          (eww url (when arg 4)))
      (message "No previously closed URLs.")))

  (defun jao-eww-reopen-new ()
    (jao-eww-reopen t))


  (use-package jao-eww-session
    :custom ((jao-eww-session-file "~/.emacs.d/cache/eww-session.eld")))


  (use-package shr
    :custom ((shr-width nil)
             (shr-use-colors t)
             (shr-use-fonts t)
             (shr-max-width 130)
             (shr-blocked-images nil)
             (shr-inhibit-images t)
             (shr-max-image-proportion 1.0)
             (shr-hr-line ?―)))

  (use-package eww
    :demand t
    :custom ((eww-browse-url-new-window-is-tab nil)
             (eww-download-directory jao-sink-dir)
             (eww-header-line-format " %u")
             (eww-form-checkbox-selected-symbol "☒")
             (eww-buffer-name-length 180))

    (with-eval-after-load "org" (require 'ol-eww nil t))

    (defun jao-eww-buffer-name ()
      (when-let ((s (or (plist-get eww-data :title)
                        (plist-get eww-data :url))))
        (when (not (string-blank-p s)) (format "%s" s))))
    (setq eww-auto-rename-buffer #'jao-eww-buffer-name)

    :bind (:map eww-mode-map (("b" . eww-back-url)
                              ("B" . eww-forward-url)
                              ("d" . jao-download)
                              ("f" . link-hint-open-link)
                              ("F" . embark-on-link)
                              ("L" . eww-forward-url)
                              ("N" . jao-eww-next-image)
                              ("o" . jao-eww-browse)
                              ("O" . jao-eww-browse-new)
                              ("r" . jao-eww-reload)
                              ("s" . eww-search-words)
                              ("S" . jao-eww-browse-new)
                              ("u" . jao-eww-reopen)
                              ("U" . jao-eww-reopen-new)
                              ("w" . org-eww-copy-for-org-mode)
                              ("q" . jao-eww-close)
                              ("x" . jao-rss-subscribe)
                              ("y" . jao-eww-copy-link)
                              ("\\" . eww-view-source)
                              ("C-c C-w" . jao-eww-close)
                              ("M-i" . eww-toggle-images))))

Fixes for shr image rendering

  (require 'shr)

  (defun jao-shr--kill-nl (p)
      (goto-char p)
      (when (looking-at-p "\n") (delete-char 1))))

  (defun jao-shr-tag-img (fn &rest args)
    (let ((p (point)))
      (prog1 (apply fn args)
        (when (> (point) p) (jao-shr--kill-nl p)))))

  (defun jao-shr-insert (fn &rest args)
    (let ((p (when (and (not (bolp))
                        (get-text-property (1- (point)) 'image-url))
      (prog1 (apply fn args)
        (when (and p (> (point) p)) (jao-shr--kill-nl p)))))

  (advice-add 'shr-tag-img :around #'jao-shr-tag-img)
  (advice-add 'shr-insert :around #'jao-shr-insert)