From dc7b26268398cc72eb7fad17acc4adc07fd6f55e Mon Sep 17 00:00:00 2001 From: Case Duckworth Date: Tue, 15 Nov 2022 19:51:16 -0600 Subject: Customize browse-url --- init.el | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) (limited to 'init.el') diff --git a/init.el b/init.el index f7dcd7e..0bd11d4 100644 --- a/init.el +++ b/init.el @@ -17,6 +17,7 @@ read-file-name-completion-ignore-case t comment-auto-fill-only-comments t password-cache t + eww-use-browse-url "." ; use `browse-url' in every link password-cache-expiry (* 60 60) initial-buffer-choice (defun +initial-buffer-choose () (cond @@ -904,3 +905,77 @@ CAPES defaults to `+capes'. CAPF will be made un-exclusive." (spinner "https://github.com/Malabarba/spinner.el") (sesman "https://github.com/vspinu/sesman")) :when (executable-find "clojure")) + +(yoke browse-url + (require '+browse-url) + (setf browse-url-browser-function #'eww-browse-url + browse-url-chrome-program (seq-some #'executable-find + '("chromium" "chrome" "google-chrome-stable")) + browse-url-firefox-program (seq-some #'executable-find + '("firefox" "firefox-esr")) + browse-url-generic-program (or browse-url-firefox-program + browse-url-chrome-program) + browse-url-firefox-new-window-is-tab t + browse-url-firefox-arguments "-new-tab" + browse-url-handlers `((video-url-p . +browse-url-with-mpv) + (music-url-p . +browse-url-with-mpv) + (image-url-p . +browse-image-with-mpv) + (blobp . +browse-url-download) + (external-url-p . ,browse-url-secondary-browser-function))) + (+browse-url-make-external-viewer-handler "mpv" '("--cache-pause-wait=30" + "--cache-pause-initial=yes") + "Video URL: " + :fallback browse-url-secondary-browser-function) + (+browse-url-make-external-viewer-handler "mpv" '("--image-display-duration=inf") + "Image URL: " + :name +browse-image-with-mpv) + (defun video-url-p (url) "Is URL a video?" + (string-match-p (rx (or "youtube.com" "youtu.be" "invidious" "yewtu.be" + (seq "." (or "mp4" "gif" "mov" "MOV" "webm") eos))) + url)) + (defun music-url-p (url) "Is URL music?" + (string-match-p (rx "soundcloud.com" "bandcamp.com" + (seq "." (or "ogg" "mp3" "opus" "m4a") eos)) + url)) + (defun image-url-p (url) "Is URL an image?" + (string-match-p (rx "." (or "jpeg" "jpg" "png" "bmp" "webp") eos) + url)) + (defun external-url-p (url) "Should URL open in an external browser?" + (string-match-p (rx (or "github.com" "gitlab.com" "codeberg.org" + "tildegit.org" "git.tilde.town" "google.com" + "imgur.com" "twitch.tv" "pixelfed" "instagram.com" + "bibliogram.art" "reddit.com" "teddit.net" + "twitter.com" "nitter" "t.co" + "streamable.com" "spotify.com" + "hetzner.cloud" "melpa.org")) + url)) + (defun blobp (url) "Is URL some other blob that can't open in Emacs?" + (string-match-p (rx (or (: (or ".tar.gz" ".pdf") + eos))) + url)) + (eval-after chd + (add-to-list 'browse-url-handlers (cons chd/url-regexps #'browse-url-chrome))) + (require 'browse-url-transform) + (setf browse-url-transform-alist `(("twitter\\.com" . "nitter.net") + ("\\(?:\\(?:old\\.\\)?reddit\\.com\\)" + . "libreddit.de") + ("medium\\.com" . "scribe.rip") + ("www\\.npr\\.org" . "text.npr.org"))) + (browse-url-transform-mode)) + +(yoke eww + (defun +eww-browse-with-external-browser (&optional url) + "Browse URL with an external browser and close eww." + (interactive nil eww-mode) + (condition-case e + ;; This is wrapped in a `condition-case' so that the eww window won't + ;; close if there's an error calling the browser. + (funcall browse-url-secondary-browser-function + (or url (plist-get eww-data :url))) + (:success + (when (null url) ; interactive + (quit-window))) + (t (signal (car e) (cdr e))))) + (define-key* eww-mode-map + "&" #'+eww-browse-with-external-browser)) + -- cgit 1.4.1-21-gabe81