emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Eglot, project.el, and python virtual environments


From: Eric Abrahamsen
Subject: Re: Eglot, project.el, and python virtual environments
Date: Wed, 16 Nov 2022 14:53:39 -0800
User-agent: Gnus/5.13 (Gnus v5.13)

Danny Freeman <danny@dfreeman.email> writes:

> Eric Abrahamsen <eric@ericabrahamsen.net> writes:
>

[...]

>> Now I'm trying to move to Eglot, and there is tighter integration
>> between Eglot and project.el. Turning on Eglot in one lambda starts the
>> server for all Python libraries in the whole project, not just the
>> current environment. I looked into constructing my own version of the
>> call to `eglot', but it is tightly tied to a project, all the way down.
>>
>> Is anyone else handling this situation? Any suggestions how to make it
>> work?
>>
>> Thanks,
>> Eric
>
>
> I have NOT been in this situation, but it sounds like you want to keep
> using project.el as is, but override eglot's usage of project.el to
> identify root directory to start a lsp server in.
>
> I think the place to start looking would be the function
> `eglot--current-project`. 
>
> It uses a var called `eglot-lsp-context` which is `t` when eglot is
> searching for a project. 
>
> Knowing this, there is another var called `project-find-functions` that
> project.el uses when searching for project roots, which can be used for
> finding custom project roots. I have one that looks for a file named
> ".project.el". If that file exists then that directory is identified as
> a project. It's really useful when you have a project not in source
> control. 
>
> See:
>
> ```
> (defun project-find-project.el (dir)
>   "Returns a `manual-project' instance if the project of the current
> DIR has a .project.el file in its root directory."
>   (let ((root (locate-dominating-file dir ".project.el")))
>     (when root
>       (cons 'transient root))))
>
> (add-hook 'project-find-functions #'project-find-project.el)
> ```
>
>
> Now, I am not a python programmer, but lets pretend that python
> virtualenviroment depends on a file located in the directory you want to
> activate one of these virtual environments, say `.virtualenv`.
>
> You can write a project-find-functions implementation that looks for
> these virutalenv files ONLY when eglot-lsp-context is active.
>
> ```
> (defun project-find-virtualenv-for-eglot (dir)
>   (when eglot-lsp-context
>     (let ((root (locate-dominating-file dir ".virtualenv")))
>       (when root
>         (cons 'transient root)))))
>
> (add-hook 'project-find-functions #'project-find-virtualenv-for-eglot)
> ```
>
> I did not test this, but I think it should send you down the right path.
> Eglot should see your aws lambda folders as the project root, and
> project.el should see the parent.
>
> If python virtual environments do not have any kind of file marker in
> the filesystem, you could use a dummy file in those directories like
> `.eglot-project` or something.
>
> Hope this helps,

Thank you very much, that does help indeed! I started off down this path
and had gotten as far as eglot-lsp-context. Then I realized I couldn't
just return a directory, it had to be a project object, and that's when
I decided someone else must have a better approach. But it's great to
see all this laid out, and knowing about `(cons 'transient root)' is
very helpful, as well.

I'll play around with this a bit. It seems like a not-outlandish
situation, and I wonder if it might not be useful to provide some
standardized method of helping Eglot find an alternate project.

Thanks again,
Eric




reply via email to

[Prev in Thread] Current Thread [Next in Thread]