我 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 文件时没被问道,我如何能查看当前这个啥根目录设的值,以及是否可以修改或添加。
多谢指点!
我用 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/ ?
看具体 lsp 服务的实现,有的 ls(language server) 只支持某种项目结构才能正确解析项目,所以 session root 就是告诉 ls,项目从哪里算起。
git clone 下来的项目有可能包含多个子项目,这个时候就需要分别按 ls 的要求指定多个 session root。
workspace 在不同的语境下有不同的含义
guyuming76:
打开文件后还是有红线
重点不是有没有红线,重点是为什么有红线,你看看报啥错,把错误发出来
我看了一遍各个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 后,红线还在:
BlindingDark:
红线应该是有错误,鼠标悬浮上去,可以看具体错误
这个我这里貌似也不行,鼠标停在breadcrumb红线上没反应
这个 setq 我认识,是设置变量值, 我猜你是要我把 breadcrumb-enable-diagnostics 给关了,但我如何查看这个变量当前的值是多少呢?
island
2021 年1 月 28 日 04:30
12
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 代码的,我就另开一个帖子吧。
我运行 global-flycheck-mode 命令,如果enable 的话,rtpool.c 窗口里好多红线,莫名奇妙,disable 了以后,红线就消失了(但 breadcrumb 下红线还在)。 lsp-mode 下的 find reference 功能一直是好的。
这个 flycheck 功能和 lsp-mode 啥关系?互补,冲突,重复?
island
2021 年1 月 30 日 06:47
16
它们的关系取决于你使用的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 怎么会找不到?
yyjjl
2021 年1 月 30 日 10:56
18
你运行一下 M-x flycheck-verify-setup
看看当前起作用的是哪个 checker
这个返回的就是上图中上小窗的结果啊。我尝试了一些其它 flycheck 命令,一时不明所以。这个 flycheck 貌似暂时对我也不重要。
注意到上图左上代码窗里面我光标停在标识符 p 上了吗?图片最右边有一个弹出框提示了这个 p 是 para, 这个功能我觉得挺有用,是不是就是 lsp-ui 啥的?虽然这个弹出框位置显然不对,显示到别的小窗里了。
但奇怪的是,我如果把光标移到代码下一行的 p 上,弹出框去不会出现(如下图):
再往下移到 if 后面的 p 上, 提示又出现了。
yyjjl
2021 年1 月 30 日 12:41
20
那个弹出框是 lsp-ui
的功能.
;; 在光标处显示, 文档窗口
(setq lsp-ui-doc-position 'at-point)
1 个赞
把这句加到 ~/.emacs 末尾果然 lsp-ui 提示框不会跑到别的窗口里了,多谢!
但并不解决 上图光标停在参数 p 上提示框不出现的问题。