;;; acdw-browse-url.el -*- lexical-binding: t; coding: utf-8-unix -*- ;; ;; Add-ons to `browse-url'. (defvar browse-url-mpv-arguments nil "Arguments to pass to mpv in `browse-url-mpv'.") (defun browse-url-mpv (url &optional new-window) "Play URL in mpv." (interactive (browse-url-interactive-arg "Video URL: ")) (ignore new-window) ;; mpv always opens a new window (let* ((url (browse-url-encode-url url)) (process-environment (browse-url-process-environment))) (message "Playing %s in mpv..." url) (apply #'start-process (concat "mpv " url) nil "mpv" (append browse-url-mpv-arguments (list url))))) (defvar browse-url-feh-arguments '("--auto-zoom" "--geometry" "800x600") "Arguments to pass to feh in `browse-url-feh'.") (defun browse-url-feh (url &optional new-window) "Open `URL' in feh." (interactive (browse-url-interactive-arg "Video URL: ")) (ignore new-window) ;; mpv always opens a new window (let* ((url (browse-url-encode-url url)) (process-environment (browse-url-process-environment))) (message "Opening %s in feh..." url) (apply #'start-process (concat "feh " url) nil "feh" (append browse-url-feh-arguments (list url))))) (defun acdw/browse-url-set-handlers (handlers) "Set handlers for `browse-url'. If Emacs' version is 28 or higher, set `browse-url-handlers'. Else, set `browse-url-browser-function'; it's deprecated in 28+." (set-default (if (version< emacs-version "28") #'browse-url-browser-function #'browse-url-handlers) handlers)) ;;; URL regexp ;; really, I just want to add gemini:// protocol, but I'm going to do some ;; reverse-engineering here. (defvar acdw/button-protocols '("http" "https" "shttp" "shttps" "ftp" "file" "gopher" "nntp" "news" "telnet" "wais" "mailto" "info") "The list of protocols to splice into `browse-url-button-regexp'.") (defun acdw/build-button-url-regexp () "Build `browse-url-button-regexp' from `acdw/button-protocols'. I used `xr' (not included in Emacs) to get the RX form of the default, so I can easily splice the list into it. THIS IS BRITTLE AF!!!" (rx-to-string ; thanks wgreenhouse! `(seq word-boundary (group (group (or "www." (seq (group (or ,@acdw/button-protocols)) ":"))) (opt (group "//" (one-or-more (any "0-9a-z" "._-")) ":" (zero-or-more (any "0-9")))) (or (seq (one-or-more (any "0-9a-z" "!#$%&*+,./:;=?@\\_~-" word)) "(" (one-or-more (any "0-9a-z" "!#$%&*+,./:;=?@\\_~-" word)) (zero-or-more (any "0-9a-z" "#$%&*+/=@\\_~-" word)) ")" (opt (one-or-more (any "0-9a-z" "!#$%&*+,./:;=?@\\_~-" word)) (any "0-9a-z" "#$%&*+/=@\\_~-" word))) (seq (one-or-more (any "0-9a-z" "!#$%&*+,./:;=?@\\_~-" word)) (any "0-9a-z" "#$%&*+/=@\\_~-" word))))))) (defun acdw/add-button-url-regexp-protocol (proto) "Add PROTO to `browse-url-button-regexp' First, add PROTO to `acdw/button-protocols'. Then, build `browse-url-button-regexp' with the new protocol." (add-to-list 'acdw/button-protocols proto) (setq-default browse-url-button-regexp (acdw/build-button-url-regexp))) ;;; Browse-URL tweaks ;; convert reddit.com to teddit (defun acdw/eww-browse-reddit-url (url &rest args) "Browse a Reddit.com URL using Teddit." (let* ((teddit "teddit.com") (url (replace-regexp-in-string "reddit\\.com" teddit url))) (eww-browse-url url args))) ;; convert twitter.com to nitter (defun acdw/eww-browse-twitter-url (url &rest args) "Browse a Twitter.com URL using Nitter." (let* ((nitter "nitter.snopyta.org") (url (replace-regexp-in-string "twitter\\.com" nitter url))) (eww-browse-url url args))) (provide 'acdw-browse-url)