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
7.2 KiB
Web browsing using eww
- Integration with browse-url and afio
- Opening URLs
- Consult narrowing
- Images
- Close page and reopen
- Sessions
- Package
- Fixes for shr image rendering
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)
(jao-afio--goto-www)
(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)))))
(jao-eww-session--list-buffers))))
(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 ()
(interactive)
(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)
(jao-afio--goto-www)
(switch-to-buffer (get-text-property 0 'buffer b)))
:items
(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))
Images
(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))))
(kill-current-buffer)
(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)))
(jao-afio--goto-www)
(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 ()
(interactive)
(jao-eww-reopen t))
Sessions
(use-package jao-eww-session
:custom ((jao-eww-session-file "~/.emacs.d/cache/eww-session.eld")))
Package
(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))
:config
(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)
(save-excursion
(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))
(point))))
(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)