purcell/envrc

Janky interaction with lsp-mode

Ralith opened this issue · 6 comments

Configured with

(use-package envrc
  :after (lsp-mode flycheck)
  :init (envrc-global-mode))

envrc works for the first file I open in a workspace, but when I open another file in the same workspace, lsp-mode complains that the configured language-server command is not present on the path. Is there a way I can get this working?

Is this for any specific language server?

I'm using rust-analyzer, though I'd assume the "try to run a binary" code isn't terribly specific to it.

Yeah, I started to have a poke around lsp-mode to investigate. I think this is more of an lsp-mode issue tbh, but I'd at least like to be able to point at the upstream code that should be fixed up.

Some other things might have changed since this issue was open, but I found that using (lsp-deferred) to activate LSP instead of (lsp) works well with envrc. LSP can find the language server binary even if's loaded into $PATH using Nix + direnv, i.e. use nix -p gopls

lsp-deferred works fine for starting rust-analyzer provided by direnv, but there's another problem: when I navigate to source of library I use, the files are in ~/.cargo/registry/, which is outside the project directory and its .envrc, so lsp-mode is not finding proper rust-analyzer.

It looks like the problem is caused by envrc working exactly as intended and it will be tricky to solve. Maybe I can convince cargo to download sources inside project? This will cause some duplication, but it will be covered by the .envrc at least.

Edited to add: the following .envrc line seems to be a good workaround to my problem for Rust/Cargo:

export CARGO_HOME="$(dirname "$(realpath "${BASH_SOURCE[0]}")")/target/.cargo"

The issue with envrc applying env after lsp-mode is indeed solved by lsp-deferred for me too.