2017-06-08 11:47:56 +02:00
|
|
|
;;; feature/jump/autoload.el -*- lexical-binding: t; -*-
|
2017-03-15 22:44:42 -04:00
|
|
|
|
2017-05-21 12:16:25 +02:00
|
|
|
(defvar +jump--rg-installed-p (executable-find "rg"))
|
|
|
|
(defvar +jump--ag-installed-p (executable-find "ag"))
|
|
|
|
|
2017-06-19 00:25:49 +02:00
|
|
|
(defun +jump-to (prop identifier &optional other-window)
|
|
|
|
(with-selected-window
|
|
|
|
(if other-window
|
|
|
|
(save-excursion (other-window) (selected-window))
|
|
|
|
(selected-window))
|
|
|
|
(let ((fn (plist-get +jump-current-functions prop)))
|
|
|
|
(if (commandp fn)
|
|
|
|
(call-interactively fn)
|
|
|
|
(funcall fn identifier)))))
|
|
|
|
|
2017-03-15 22:44:42 -04:00
|
|
|
;;;###autoload
|
2017-06-19 00:25:49 +02:00
|
|
|
(defun +jump/definition (identifier &optional other-window)
|
2017-05-21 15:06:15 +02:00
|
|
|
"Jump to the definition of the symbol at point.
|
2017-05-21 12:16:25 +02:00
|
|
|
|
2017-05-21 15:06:15 +02:00
|
|
|
Tries xref and falls back to `dumb-jump', then rg/ag, then
|
|
|
|
`evil-goto-definition' (if evil is active)."
|
2017-06-19 00:25:49 +02:00
|
|
|
(interactive
|
|
|
|
(list (thing-at-point 'symbol t)
|
|
|
|
current-prefix-arg))
|
|
|
|
(cond ((null identifier)
|
|
|
|
(user-error "Nothing under point"))
|
|
|
|
|
|
|
|
((plist-member +jump-current-functions :definition)
|
|
|
|
(+jump-to :definition identifier))
|
|
|
|
|
|
|
|
((ignore-errors (if other-window
|
|
|
|
(xref-find-definitions-other-window identifier)
|
|
|
|
(xref-find-definitions identifier))
|
|
|
|
t))
|
|
|
|
|
|
|
|
((and (fboundp 'dumb-jump-go)
|
|
|
|
;; dumb-jump doesn't tell us if it succeeded or not
|
|
|
|
(let (successful)
|
2017-05-21 12:16:25 +02:00
|
|
|
(cl-letf (((symbol-function 'dumb-jump-result-follow)
|
|
|
|
`(lambda (result &optional use-tooltip proj)
|
|
|
|
(setq successful t)
|
|
|
|
(,(symbol-function 'dumb-jump-result-follow)
|
|
|
|
result use-tooltip proj))))
|
|
|
|
(if other-window
|
|
|
|
(dumb-jump-go-other-window)
|
|
|
|
(dumb-jump-go))
|
2017-06-19 00:25:49 +02:00
|
|
|
successful))))
|
|
|
|
|
|
|
|
((and identifier
|
|
|
|
(featurep 'counsel)
|
|
|
|
(let ((regex (rxt-quote-pcre identifier)))
|
|
|
|
(or (and +jump--rg-installed-p
|
|
|
|
(counsel-rg regex (doom-project-root)))
|
|
|
|
(and +jump--ag-installed-p
|
|
|
|
(counsel-ag regex (doom-project-root)))))))
|
|
|
|
|
|
|
|
((and (featurep 'evil)
|
|
|
|
evil-mode
|
2017-06-25 02:04:50 +02:00
|
|
|
(cl-destructuring-bind (beg end)
|
2017-06-19 00:25:49 +02:00
|
|
|
(bounds-of-thing-at-point 'symbol)
|
|
|
|
(evil-goto-definition)
|
|
|
|
(let ((pt (point)))
|
|
|
|
(not (and (>= pt beg)
|
|
|
|
(< pt end)))))))
|
|
|
|
|
|
|
|
(t (user-error "Couldn't find '%s'" identifier))))
|
2017-03-15 22:44:42 -04:00
|
|
|
|
|
|
|
;;;###autoload
|
2017-06-19 00:25:49 +02:00
|
|
|
(defun +jump/references (identifier)
|
2017-05-21 15:06:15 +02:00
|
|
|
"Show a list of references to the symbol at point.
|
|
|
|
|
|
|
|
Tries `xref-find-references' and falls back to rg/ag."
|
2017-06-19 00:25:49 +02:00
|
|
|
(interactive (list (thing-at-point 'symbol t)))
|
|
|
|
(cond ((plist-member +jump-current-functions :references)
|
|
|
|
(+jump-to :references identifier))
|
2017-03-15 22:44:42 -04:00
|
|
|
|
2017-06-19 00:25:49 +02:00
|
|
|
((ignore-errors (xref-find-references identifier)
|
|
|
|
t))
|
2017-03-15 22:44:42 -04:00
|
|
|
|
2017-06-19 00:25:49 +02:00
|
|
|
((and identifier
|
|
|
|
(featurep 'counsel)
|
|
|
|
(let ((regex (rxt-quote-pcre identifier)))
|
|
|
|
(or (and (executable-find "rg")
|
|
|
|
(counsel-rg regex (doom-project-root)))
|
|
|
|
(and (executable-find "ag")
|
|
|
|
(counsel-ag regex (doom-project-root)))))))
|
2017-03-15 22:44:42 -04:00
|
|
|
|
2017-06-19 00:25:49 +02:00
|
|
|
(t (error "Couldn't find '%s'" identifier))))
|
2017-05-21 15:06:15 +02:00
|
|
|
|
2017-06-19 00:25:49 +02:00
|
|
|
;;;###autoload
|
|
|
|
(defun +jump/documentation (identifier)
|
|
|
|
"Show documentation for the symbol at point, if available."
|
|
|
|
(interactive (list (thing-at-point 'symbol t)))
|
|
|
|
(cond ((plist-member +jump-current-functions :documentation)
|
|
|
|
(+jump-to :documentation identifier))
|
|
|
|
(t
|
|
|
|
(+jump/online (caar +jump-search-url-alist) identifier))))
|
|
|
|
|
|
|
|
(defvar +jump--online-last nil)
|
2017-03-15 22:44:42 -04:00
|
|
|
;;;###autoload
|
2017-05-21 15:06:15 +02:00
|
|
|
(defun +jump/online (where search)
|
|
|
|
"Looks up SEARCH online, in you browser, as dictated by WHERE.
|
|
|
|
|
|
|
|
Interactively, you are prompted to choose a source from
|
|
|
|
`+jump-search-url-alist'."
|
2017-03-15 22:44:42 -04:00
|
|
|
(interactive
|
2017-05-21 15:08:20 +02:00
|
|
|
(list (or (and (not current-prefix-arg)
|
|
|
|
+jump--online-last)
|
|
|
|
(completing-read (format "Search on (%s): " (thing-at-point 'symbol t))
|
|
|
|
(mapcar #'car +jump-search-url-alist)
|
|
|
|
nil t))
|
|
|
|
(thing-at-point 'symbol t)))
|
2017-06-08 11:47:56 +02:00
|
|
|
(condition-case _ex
|
2017-05-21 15:08:20 +02:00
|
|
|
(let ((url (cdr (assoc where +jump-search-url-alist))))
|
|
|
|
(unless url
|
|
|
|
(error "'%s' is an invalid search engine" where))
|
|
|
|
(when (or (functionp url) (symbolp url))
|
|
|
|
(setq url (funcall url)))
|
|
|
|
(cl-assert (and (stringp url) (not (string-empty-p url))))
|
|
|
|
(when (string-empty-p search)
|
|
|
|
(user-error "The search query is empty"))
|
|
|
|
(setq +jump--online-last where)
|
|
|
|
(browse-url (format url (url-encode-url search))))
|
|
|
|
('error (setq +jump--online-last nil))))
|
2017-03-15 22:44:42 -04:00
|
|
|
|