Enhance FFAP lookup backend

gf (+lookup/file) has been changed to:

+ Use the active selection instead of the filename-at-point when
  searching for a file (as requested in #4942).
+ Pre-fill the FFAP prompt with the thing at point if no obvious
  filepath can be guessed from it (via ffap-alist).
+ Offer to search the current project for the thing-at-point (if
  counsel-file-jump is available).
+ Fall back to a standard ffap prompt if all else fails.

I've also reversed te order of file lookup backends so that our FFAP
backend is treated as a never-failing last resort (also because the
bug-reference backend is known to fail gracefully, so we can trust it to
run first).

Closes #4942
This commit is contained in:
Henrik Lissner 2021-04-29 14:30:17 -04:00
parent 3a4024e790
commit 259cf83ef1
2 changed files with 22 additions and 15 deletions

View file

@ -258,11 +258,25 @@ current buffer."
(not (and (>= pt beg) (not (and (>= pt beg)
(< pt end)))))))) (< pt end))))))))
(defun +lookup-ffap-backend-fn (_identifier) (defun +lookup-ffap-backend-fn (identifier)
"Uses `find-file-at-point' to read file at point." "Tries to locate the file at point (or in active selection).
(require 'ffap) Uses find-in-project functionality (provided by ivy, helm, or project),
(when (ffap-guesser) otherwise falling back to ffap.el (find-file-at-point)."
(find-file-at-point) (let ((guess
(cond (identifier)
((doom-region-active-p)
(buffer-substring-no-properties
(doom-region-beginning)
(doom-region-end)))
((if (require 'ffap) (ffap-guesser)))
((thing-at-point 'filename t)))))
(cond ((and (stringp guess)
(file-exists-p guess))
(find-file-at-point guess))
((and (featurep! :completion ivy)
(doom-project-p))
(counsel-file-jump guess (doom-project-root)))
((find-file-at-point (ffap-prompter guess))))
t)) t))
(defun +lookup-bug-reference-backend-fn (_identifier) (defun +lookup-bug-reference-backend-fn (_identifier)
@ -351,7 +365,6 @@ for the current mode/buffer (if any), then falls back to the backends in
(cond ((+lookup--jump-to :documentation identifier #'pop-to-buffer arg)) (cond ((+lookup--jump-to :documentation identifier #'pop-to-buffer arg))
((user-error "Couldn't find documentation for %S" identifier)))) ((user-error "Couldn't find documentation for %S" identifier))))
(defvar ffap-file-finder)
;;;###autoload ;;;###autoload
(defun +lookup/file (&optional path) (defun +lookup/file (&optional path)
"Figure out PATH from whatever is at point and open it. "Figure out PATH from whatever is at point and open it.
@ -368,13 +381,7 @@ Otherwise, falls back on `find-file-at-point'."
((+lookup--jump-to :file path)) ((+lookup--jump-to :file path))
((stringp path) (find-file-at-point path)) ((user-error "Couldn't find any files here"))))
((featurep! :completion ivy)
(counsel-file-jump (thing-at-point 'filename t)
(doom-project-root)))
((ffap-prompter (thing-at-point 'filename t)))))
;; ;;

View file

@ -99,8 +99,8 @@ argument: the identifier at point. See `set-lookup-handlers!' about adding to
this list.") this list.")
(defvar +lookup-file-functions (defvar +lookup-file-functions
'(+lookup-ffap-backend-fn '(+lookup-bug-reference-backend-fn
+lookup-bug-reference-backend-fn) +lookup-ffap-backend-fn)
"Function for `+lookup/file' to try, before restoring to `find-file-at-point'. "Function for `+lookup/file' to try, before restoring to `find-file-at-point'.
Stops at the first function to return non-nil or change the current Stops at the first function to return non-nil or change the current
window/point. window/point.