lsp-mode 下,顶部breadcrumb 中文件名下的红线是啥意思?

我 emacs 新手,刚刚学会用 lsp-mode 浏览 c 项目代码 https://blog.csdn.net/weixin_42417818/article/details/113076926#comments_14763188

我进入从git 上clone 的pulseaudio源码目录,执行本地 make 的 emacs (还没有make install):

guyuming@gymDesktop:~/pulseaudio-13.99.1$ ~/emacs-27.1/src/emacs-27.1.1

在 speedbar 里可以看到源码目录,但打开一个 .c 文件后,发现如图顶部导航上的文件名和标识符(rtpoll.c > pa_rtpoll_item)下显示红线,这是为啥?我简单检查了下,find reference 功能是可以用的

我在 lsp-mode 里打开文件,有时会被问到添加一个啥根目录的问题,回答 i, I, n 等啥的,这起啥作用,这次打开这个rtpoll.c 文件时没被问道,我如何能查看当前这个啥根目录设的值,以及是否可以修改或添加。

应该是表示当前workspace有错误吧

  1. 红线应该是有错误,鼠标悬浮上去,可以看具体错误
  2. 添加目录是告诉 lsp 项目根目录是啥,然后扫描这个目录下的代码。这些信息默认保存在 .emacs.d/.lsp-session-v1 这个文件里面。想修改直接修改这个文件就好。

多谢指点! 我用 lsp-decribe-session 命令列了一下,发现有 /home/guyuming/pulseaudio-13.99.1/src/pulsecore /home/guyuming/pulseaudio-13.99.1/pulseaudio-module-xrdp_emacs 两个目录。

然后用 lsp-workspace-folders-add 命令加上 /home/guyuming/pulseaudio-13.99.1/ 目录。 退出 emacs,重新进入,打开文件后再 lsp-describe-session, 就变成下图的样子:

这里 ~/pulseaudio-13.99.1/ 是 git clone 的 pulseaudio 项目; ~/pulseaudio-13.99.1/pulseaudio-module-xrdp_emacs 是git clone 的另一个项目 pulseaudio-module-xrdp, 编译会引用前一个项目里的头文件; 最先我是用emacs 浏览 pulseaudio-module-xrdp 项目的,所以加入了 /home/guyuming/pulseaudio-13.99.1/pulseaudio-module-xrdp_emacs 目录; 在浏览 pulseaudio-module-xrdp 项目过程中,点开了引用的 pulseaudio 项目头文件,被提问加入root,所以就加了 /home/guyuming/pulseaudio-13.99.1/src/pulsecore 目录;

但我现在想浏览完整的 pulseaudio 项目了,所以就出现了本问题情况。

这个 session root 到底是啥概念?和 git clone 下来的项目有啥关系?有时叫 workspace, 是不是一回事?

最重要的问题是,图片里 rtpoll.c 文件为啥会被归入 /home/guyuming/pulseaudio-13.99.1/src/pulsecore 这个 root 下面?是不是我把这个 root 删掉就好了? 是不是当时在浏览 pulseaudio-module-xrdp 项目,打开引用文件,提示我加入新 root 的时候就不应该加这个,而是应该加 /home/guyuming/pulseaudio-13.99.1/ ?

  1. 看具体 lsp 服务的实现,有的 ls(language server) 只支持某种项目结构才能正确解析项目,所以 session root 就是告诉 ls,项目从哪里算起。
  2. git clone 下来的项目有可能包含多个子项目,这个时候就需要分别按 ls 的要求指定多个 session root。
  3. workspace 在不同的语境下有不同的含义

重点不是有没有红线,重点是为什么有红线,你看看报啥错,把错误发出来

(setq lsp-headerline-breadcrumb-enable-diagnostics nil)

不知道为什么有这样的傻x默认值。

我看了一遍各个buffer, 先是看到 “Company backend ‘company-clang’ could not be initialized: Company found no executable” 我 sudo apt install clang ,重启emacs, 错误消失了。但红线还在。 挺好奇,前面一直有clangd, 但没有 clang, 也没注意到有啥不对。

接着又发现 “Cannot find compile database” 错,原来忘了运行 bear make. 修复重启 emacs 后,红线还在:

这个我这里貌似也不行,鼠标停在breadcrumb红线上没反应

这个 setq 我认识,是设置变量值, 我猜你是要我把 breadcrumb-enable-diagnostics 给关了,但我如何查看这个变量当前的值是多少呢?

C-h v lsp-headerline-breadcrumb-enable-diagnostics RET

多谢,我这边当前值是 t, 按提示 toggle, Apply and save 之后的确红线就消失了;

但我理解这只是关了这个功能啊,为啥显示红线,它到底 diagnose 出了啥问题我还是不知道啊;有办法找出来吗?如果很麻烦就暂且算了,我目前主要也就是需要浏览和调试 c 项目,还不想花太多时间在 emacs 上;

事实上,我还没能搞定 attach 到运行中的进程上调试,这个对我更重要,我在 https://blog.csdn.net/weixin_42417818/article/details/113076926#comments_14763188 里有描述,是 emacs dap-mode 这方面还没实现呢还是我这边的问题?如果 emacs dap-mode 里是可以 attach 到现有进程上调试 c 代码的,我就另开一个帖子吧。

你装了flycheck 并启用,lsp就会显示了

我运行 global-flycheck-mode 命令,如果enable 的话,rtpool.c 窗口里好多红线,莫名奇妙,disable 了以后,红线就消失了(但 breadcrumb 下红线还在)。 lsp-mode 下的 find reference 功能一直是好的。

这个 flycheck 功能和 lsp-mode 啥关系?互补,冲突,重复?

它们的关系取决于你使用的checker。如果你使用的是lsp的checker,那么诊断信息由server返回;如果你使用的不是lsp的checker,那么由对应的工具返回信息(这种情况通常需要配置好对的工具的xxxrc文件),例如:clang/cppcheck。使用M-x flycheck-list-errors可以看到每条信息是哪个checker返回的。至于顶部的,我一直禁用,太丑了,没研究过。

问题就是这个项目是可以make 通过的(gcc version 9.3.0),怎么会 flycheck 出这么多错, 比如 pulsecore/poll.h 怎么会找不到?

你运行一下 M-x flycheck-verify-setup 看看当前起作用的是哪个 checker

这个返回的就是上图中上小窗的结果啊。我尝试了一些其它 flycheck 命令,一时不明所以。这个 flycheck 貌似暂时对我也不重要。

注意到上图左上代码窗里面我光标停在标识符 p 上了吗?图片最右边有一个弹出框提示了这个 p 是 para, 这个功能我觉得挺有用,是不是就是 lsp-ui 啥的?虽然这个弹出框位置显然不对,显示到别的小窗里了。

但奇怪的是,我如果把光标移到代码下一行的 p 上,弹出框去不会出现(如下图):

再往下移到 if 后面的 p 上, 提示又出现了。

那个弹出框是 lsp-ui 的功能.

;; 在光标处显示, 文档窗口
(setq lsp-ui-doc-position 'at-point)
1 个赞

把这句加到 ~/.emacs 末尾果然 lsp-ui 提示框不会跑到别的窗口里了,多谢!

但并不解决 上图光标停在参数 p 上提示框不出现的问题。