Files
doomemacs/modules/tools/lookup/autoload/online.el
Henrik Lissner dac6e05b87 refactor: deprecate appendq!, prependq!, & delq! macros
In the interest of slimming down Doom's core (as we near v3), I've
deprecated these macros. They doesn't really need to exist. Sure, the
alternatives aren't as ergonomic or elegant, but they're good enough
that we don't need these trivial wrappers. Their local uses have been
refactored out as well.
2025-03-25 14:16:56 -04:00

96 lines
3.6 KiB
EmacsLisp

;;; tools/lookup/autoload/online.el -*- lexical-binding: t; -*-
(defvar +lookup--last-provider nil)
(defun +lookup--online-provider (&optional force-p namespace)
(let ((key (or namespace major-mode)))
(or (and (not force-p)
(cdr (assq key +lookup--last-provider)))
(when-let (provider
(completing-read
"Search on: "
(mapcar #'car +lookup-provider-url-alist)
nil t))
(setf (alist-get key +lookup--last-provider) provider)
provider))))
;;;###autoload
(defun +lookup-online-backend-fn (identifier)
"Open the browser and search for IDENTIFIER online.
When called for the first time, or with a non-nil prefix argument, prompt for
the search engine to use."
(+lookup/online
identifier
(+lookup--online-provider (not current-prefix-arg))))
;;;###autoload
(defun +lookup/online (query provider)
"Look up QUERY in the browser using PROVIDER.
When called interactively, prompt for a query and, when called for the first
time, the provider from `+lookup-provider-url-alist'. In subsequent calls, reuse
the previous provider. With a non-nil prefix argument, always prompt for the
provider.
QUERY must be a string, and PROVIDER must be a key of
`+lookup-provider-url-alist'."
(interactive
(list (if (use-region-p) (doom-thing-at-point-or-region))
(+lookup--online-provider current-prefix-arg)))
(let ((backends (cdr (assoc provider +lookup-provider-url-alist))))
(unless backends
(user-error "No available online lookup backend for %S provider"
provider))
(catch 'done
(dolist (backend backends)
(cl-check-type backend (or string function))
(cond ((stringp backend)
(funcall +lookup-open-url-fn
(format backend
(url-encode-url
(or query
(read-string (format "Search for (on %s): " provider)
(thing-at-point 'symbol t)))))))
((condition-case-unless-debug e
(and (fboundp backend)
(funcall backend query))
(error
(setf (alist-get major-mode +lookup--last-provider nil t) nil)
(signal (car e) (cdr e))))
(throw 'done t)))))))
;;;###autoload
(defun +lookup/online-select ()
"Run `+lookup/online', but always prompt for the provider to use."
(interactive)
(let ((current-prefix-arg t))
(call-interactively #'+lookup/online)))
;;
;;; Special provider frontends
(defvar ivy-initial-inputs-alist)
(defvar counsel-search-engine)
;;;###autoload
(defun +lookup--online-backend-google (query)
"Search Google, starting with QUERY, with live autocompletion."
(cond ((and (bound-and-true-p ivy-mode) (fboundp 'counsel-search))
(let ((ivy-initial-inputs-alist `((t . ,query)))
(counsel-search-engine 'google))
(call-interactively #'counsel-search)
t))
((and (bound-and-true-p helm-mode) (require 'helm-net nil t))
(helm :sources 'helm-source-google-suggest
:buffer "*helm google*"
:input query)
t)))
;;;###autoload
(defun +lookup--online-backend-duckduckgo (query)
"Search DuckDuckGo, starting with QUERY, with live autocompletion."
(cond ((and (bound-and-true-p ivy-mode) (fboundp 'counsel-search))
(let ((ivy-initial-inputs-alist `((t . ,query)))
(counsel-search-engine 'ddg))
(call-interactively #'counsel-search)
t))))