I recently learnt about the Emacs package project.el
, which is used to figure
out which files and directories belong to the same project. This is used under
the covers by
Eglot
,
for example.
In practice, a project is recognized by looking for Git repositories, which is a decent first approximation that often just works.
But what if the detection fails? For example, maybe you want to anchor your project-based commands in a parent directory that contains multiple Git repositories.
Luckily, we can provide our own entry to the project-find-functions
hook, and
look for a .project.el
file in the parent directories:
;; Returns the parent directory containing a .project.el file, if any,
;; to override the standard project.el detection logic when needed.
(defun zkj-project-override (dir)
(let ((override (locate-dominating-file dir ".project.el")))
(if override
(cons 'vc override)
nil)))
(use-package project
;; Cannot use :hook because 'project-find-functions does not end in -hook
;; Cannot use :init (must use :config) because otherwise
;; project-find-functions is not yet initialized.
:config
(add-hook 'project-find-functions #'zkj-project-override))
Now, we can use touch .project.el
in any directory to make project.el
recognize the directory as project root!
By the way, in case you are unfamiliar, the configuration above uses
use-package
, which is a great way
to (lazily, i.e. quickly!) load and configure Emacs packages.
I run a blog since 2005, spreading knowledge and experience for almost 20 years! :)
If you want to support my work, you can buy me a coffee.
Thank you for your support! ❤️