From: Spencer Baugh Date: Sat, 21 Oct 2023 18:35:53 +0000 (-0400) Subject: Teach ffap to look for relative file names under project-root X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=1eae0e7edf485bdaa9fb76b905275cf08a1910e2;p=emacs.git Teach ffap to look for relative file names under project-root Now file-name-at-point-functions, which runs ffap-guess-file-name-at-point, will pick up on a file name at point if that file name is a relative file name which exists when looked up from the root of the project. For example, in test/lisp/progmodes/eglot-tests.el there is the string lisp/progmodes/eglot.el; if you put point on that and C-x C-f, lisp/progmodes/eglot.el under the root of the Emacs repo will now be part of future history. * lisp/ffap.el (ffap-alist): Add entry for ffap-in-project. (ffap-in-project): Add. (bug#66668) --- diff --git a/lisp/ffap.el b/lisp/ffap.el index 942e218bf23..530e3da182e 100644 --- a/lisp/ffap.el +++ b/lisp/ffap.el @@ -730,6 +730,7 @@ This uses `ffap-file-exists-string', which may try adding suffixes from (defvar ffap-alist '( ("" . ffap-completable) ; completion, slow on some systems + ("" . ffap-in-project) ; maybe in the root of the project ("\\.info\\'" . ffap-info) ; gzip.info ("\\`info/" . ffap-info-2) ; info/emacs ("\\`[-[:lower:]]+\\'" . ffap-info-3) ; (emacs)Top [only in the parentheses] @@ -793,6 +794,11 @@ to extract substrings.") (cmp (file-name-completion (file-name-nondirectory name) dir))) (and cmp (concat dir cmp)))) +(declare-function project-root "project" (project)) +(defun ffap-in-project (name) + (when-let (project (project-current)) + (file-name-concat (project-root project) name))) + (defun ffap-home (name) (ffap-locate-file name t '("~"))) (defun ffap-info (name)