eglot 如何像 lsp-mode 一样手动指定 workspace?

problem

rt,最近在写 CS61B 的作业,在这个项目里面只有最顶上是包含了 .git 的文件,但是里面单个的子文件才是一次的作业,每次 eglot 都把最顶上的文件夹当成 workspace,导致 lsp 功能无法正常使用。

more information

CS61B-Assignments-spring-2021 on  master [!]
❯ tree -L 1
.
├── disc01
├── lab1
├── lab2
├── lab2setup
├── lab3
├── lab4
├── lab5
├── lab6
├── lab7
├── lab8
├── library-sp21
├── proj0
├── proj1
├── proj1ec
├── proj2
├── proj3
└── README.org

17 directories, 1 file

已有的尝试

问了 AI,eglot 会找 ‘.project’,但事实并非如此。

我尝试了在子文件夹里面新建 .git, 但是仍然 reconnect 最顶上的文件夹

看你是用的java, 用maven 嘛,把子文件夹做成maven子 模块,lsp 服务器会认

我已尝试不知道为什么还是无效,

父文件夹

<packaging>pom</packaging>

<modules>
    <module>lab3</module>
</modules>

子文件夹下

//....
    <parent>
        <groupId>CS61B</groupId>
        <artifactId>61BMasterPom</artifactId>
        <version>1.0-SNAPSHOT</version>
        <!-- <relativePath>../library-sp21/javalib/masterpom.xml</relativePath> -->
        <relativePath>../pom.xml</relativePath>
    </parent>

    <repositories>
      <repository>
        <id>cs61b-repo</id>
        <url>file://${project.basedir}/../library-sp21/javalib</url>
      </repository>
    </repositories>

    <groupId>CS61B</groupId>
    <artifactId>lab3</artifactId>
    <version>1.0-SNAPSHOT</version>
//....

详情可以查看 here

你先在父目录运行一下,mvn install, 看一看每个子目录下是否正常编译,确保你的Maven多模块配置没有问题。配置好了是肯定可以工作的

(use-package eglot
  :config
  (defun rc/find-root-for-eglot-for-clj
      (dir)
    (when (bound-and-true-p eglot-lsp-context)
      (let ((root (locate-dominating-file dir ".eglot-root")))
	(when root (cons 'transient root)))))
  (add-hook 'project-find-functions #'rc/find-root-for-eglot-for-clj))

这是我自己用的配置,用法就是在子目录里创建一个 .eglot-root 文件,然后eglot就会把这个子目录当project-root

1 个赞

我发现如果使用 mvn install 会出现大量的报错,而我现在还不太会解决hhh。

感谢大佬

感觉设置这个变量就可以了:project-vc-extra-root-markers

spring 真别折磨自己了,idea 社区版很香。。。。jdtls本身就卡,还有各种问题,体验差太多了

设置这个变量,会导致 consult-ripgrep 这类grep cmd搜索的时候固定在这个extra-root下吧。 比如是个大repo,希望eglot处理各自子project,但是grep的时候还是搜索整个大repo

原来如此