mirror of
https://github.com/doomemacs/doomemacs
synced 2025-08-03 12:27:26 -05:00
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.
96 lines
3.6 KiB
EmacsLisp
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))))
|