128 lines
4.9 KiB
EmacsLisp
128 lines
4.9 KiB
EmacsLisp
;;; emacs/eww/autoload.el -*- lexical-binding: t; -*-
|
|
|
|
;; NOTE: Many of these functions were adapted from Protesilaos Stavrou's
|
|
;; dotfiles. See https://protesilaos.com/codelog/2021-03-25-emacs-eww
|
|
|
|
;; Adapted from `prot-eww-jump-to-url-on-page'
|
|
(defun eww--capture-url-on-page (&optional position)
|
|
"Capture all the links on the current web page.
|
|
|
|
Return a list of strings. Strings are in the form LABEL @ URL.
|
|
When optional argument POSITION is non-nil, include position info in the strings
|
|
too, so strings take the form: LABEL @ URL ~ POSITION."
|
|
(let (links match)
|
|
(save-excursion
|
|
(goto-char (point-max))
|
|
;; NOTE 2021-07-25: The first clause in the `or' is meant to address a bug
|
|
;; where if a URL is in `point-min' it does not get captured.
|
|
(while (setq match (text-property-search-backward 'shr-url))
|
|
(let* ((raw-url (prop-match-value match))
|
|
(start-point-prop (prop-match-beginning match))
|
|
(end-point-prop (prop-match-end match))
|
|
(url (when (stringp raw-url)
|
|
(propertize raw-url 'face 'link)))
|
|
(label (replace-regexp-in-string
|
|
"\n" " " ; NOTE 2021-07-25: newlines break completion
|
|
(buffer-substring-no-properties
|
|
start-point-prop end-point-prop)))
|
|
(point start-point-prop)
|
|
(line (line-number-at-pos point t))
|
|
(column (save-excursion (goto-char point) (current-column)))
|
|
(coordinates (propertize
|
|
(format "%d,%d (%d)" line column point)
|
|
'face 'shadow)))
|
|
(when url
|
|
(push (if position
|
|
(format "%-15s ~ %s @ %s" coordinates label url)
|
|
(format "%s @ %s" label url))
|
|
links)))))
|
|
links))
|
|
|
|
;; Adapted from `prot-eww--rename-buffer'
|
|
(defun +eww-page-title-or-url (&rest _)
|
|
(let ((prop (if (string-empty-p (plist-get eww-data :title)) :url :title)))
|
|
(format "*%s # eww*" (plist-get eww-data prop))))
|
|
|
|
|
|
;;
|
|
;;; Commands
|
|
|
|
;; Adapted from `prot-eww-quit'
|
|
;;;###autoload
|
|
(defun +eww/quit ()
|
|
"Quit eww and kill all its buffers."
|
|
(interactive nil 'eww-mode)
|
|
(when (yes-or-no-p "Are you sure you want to quit eww?")
|
|
(save-match-data
|
|
(cl-loop with case-fold-search = t
|
|
for buf in (doom-buffer-list)
|
|
if (with-current-buffer buf
|
|
(or (eq major-mode 'eww-mode)
|
|
(and (derived-mode-p 'special-mode)
|
|
(string-match "\\*.*eww.*\\*" (buffer-name)))))
|
|
do (kill-buffer buf)))))
|
|
|
|
;; Adapted from `prot-eww-jump-to-url-on-page'
|
|
;;;###autoload
|
|
(defun +eww/jump-to-url-on-page (&optional arg)
|
|
"Jump to URL position on the page using completion.
|
|
|
|
When called without ARG (\\[universal-argument]) get URLs only
|
|
from the visible portion of the buffer. But when ARG is provided
|
|
consider whole buffer."
|
|
(interactive "P" 'eww-mode)
|
|
(unless (derived-mode-p 'eww-mode)
|
|
(user-error "Not in an eww buffer!"))
|
|
(let* ((links
|
|
(if arg
|
|
(eww--capture-url-on-page t)
|
|
(save-restriction
|
|
(if (use-region-p)
|
|
(narrow-to-region (region-beginning) (region-end))
|
|
(narrow-to-region (window-start) (window-end)))
|
|
(eww--capture-url-on-page t))))
|
|
(prompt-scope (if arg
|
|
(propertize "URL on the page" 'face 'warning)
|
|
"visible URL"))
|
|
(prompt (format "Jump to %s: " prompt-scope))
|
|
(selection (completing-read prompt links nil t))
|
|
(position (replace-regexp-in-string "^.*(\\([0-9]+\\))[\s\t]+~" "\\1" selection))
|
|
(point (string-to-number position)))
|
|
(goto-char point)
|
|
(recenter)))
|
|
|
|
;; Adapted from `prot-eww-open-in-other-window'
|
|
;;;###autoload
|
|
(defun +eww/open-in-other-window ()
|
|
"Use `eww-open-in-new-buffer' in another window."
|
|
(interactive nil 'ewe-mode)
|
|
(other-window-prefix)
|
|
(eww-open-in-new-buffer))
|
|
|
|
;;;###autoload
|
|
(defun +eww/copy-current-url ()
|
|
"Copy the open page's URL to the kill ring."
|
|
(interactive nil 'eww-mode)
|
|
(let ((url (eww-current-url)))
|
|
(kill-new url)
|
|
(message url)))
|
|
|
|
;;;###autoload
|
|
(defun +eww/increase-font-size ()
|
|
"Increase the font size in `eww-mode'."
|
|
(interactive nil 'eww-mode)
|
|
(if shr-use-fonts
|
|
(let* ((cur (face-attribute 'shr-text :height nil))
|
|
(cur (if (floatp cur) cur 1.0)))
|
|
(set-face-attribute 'shr-text nil :height (+ cur 0.1)))
|
|
(text-scale-increase 0.5)))
|
|
|
|
;;;###autoload
|
|
(defun +eww/decrease-font-size ()
|
|
"Decrease the font size in `eww-mode'."
|
|
(interactive nil 'eww-mode)
|
|
(if shr-use-fonts
|
|
(let* ((cur (face-attribute 'shr-text :height nil))
|
|
(cur (if (floatp cur) cur 1.0)))
|
|
(set-face-attribute 'shr-text nil :height (- cur 0.1)))
|
|
(text-scale-decrease 0.5)))
|