Nested projects in Eglot

Figuring out how to make Eglot work with nested projects in Emacs. Updated on May 24, 2025 to steer people towards project-vc-extra-root-markers instead.

I have been using Eglot since it has been in core Emacs and I am generally very happy with it for the C and Go projects I have been working on. But I recently started looking at a Go project that has nested modules (directories with a go.mod file):

cert-manager
├── go.mod
└── cmd
    ├── acmesolver
    │   └── go.mod
    ├── cainjector
    │   └── go.mod
    ├── controller
    │   └── go.mod
    └── webhook
        └── go.mod

When I open a file in one of these sub-modules, I get the following warning message and related imports are also broken:

warning  go list: This file is within module "cmd/controller", which is not included in your workspace.
error    compiler [BrokenImport]: could not import github.com/cert-manager/cert-manager/controller-binary/app (current file is not included in a workspace module)

After a bit of investigation, I found that Eglot uses the builtin project.el to discover the project root directory. It does this by evaluating (project-current) which returns (vc Git "/opt/cert-manager/") in our example. project.el in turn uses the project-find-functions hook which, by default, looks for the version control root and uses that.

project-find-functions is a variable defined in ‘project.el’.

Its value is (project-try-vc)

Special hook to find the project containing a given directory.
...

Looking at project.el I don't see any alternatives to project-try-vc so I went looking through Melpa and found project-rootfile offers an alternative based on rootfile detection.

With the following added to my .emacs, I now have nested projects working very smoothly in Eglot:

(add-to-list 'project-find-functions #'project-rootfile-try-detect)

Hopefully there are no downsides to this setup with any of my existing projects.

It feels to me like project-rootfile should be part of the core project.el functionality to improve the out-of-the-box ergonomics of Eglot.

Update

As I described in a followup post, please ignore this advice and instead use project-vc-extra-root-markers which is native functionality in project.el. I'm not sure how I missed it first time around, to the point of suggesting that this feature needed to be part of the core project.el functionality. Shrug. Web searches don't always lead to optimal outcomes, I guess.

emacs  eglot