[News] Eglot 作者发了新包 breadcrumb

Eglot 的作者最近开发了个独立的包,支持 breadcrumb 功能。喜欢这功能的可以试用了。
(提示:这个 breadcrumb 并不依赖 eglot,所有用户都能用。)

作者João Távora分享的效果图:

10 个赞

我比较习惯在 modeline 显示当前函数,可以把他集成到我的 nerd-line 里面。

在 modeline 显示也是一种不错的方式,breadcrumb 还要多占一行 header-line。

不过我用下来感觉 breadcrumb 除了在 header-line 显示信息以外,还有个好处:
它为 imenu 也提供了信息,需要时可以通过 imenu 进行转。

不过 imenu.el 问题比较多(例如截图中的 c++ 例子 imenu 就无法识别),project.el 又略嫌重。

确实,目前 breadcrumb 是依赖 project.el 的。

建议楼主的标题是否可以去掉Eglot,这个包本身的作用看起来和Eglot 是独立的,只是作者是Eglot的作者,题目的名字让人误以为eglot本身有了额外更新。

1 个赞

我认为这个功能就是和 eglot 有关的,Eglot 的很多功能都是依赖其他的内置包才能工作的,比如错误信息是通过 flymake-mode,识别项目通过 project.el,跳转通过 xref。

而 breadcrumb 也是从 eglot 这个项目发起的,这个 breadcrumb 开始就是要给 eglot用的,因为功能是独立的,所以作者才单独发包。

具体讨论见这:Breadcrumb feature (can eglot support headerline like lsp-mode does?) · joaotavora/eglot · Discussion #988 · GitHub

这也是为什么我会说 eglot 也有了 breadcrumb。(在一楼也有提示,这个独立的包)

为了不引起误解,我修改了标题。

4 个赞

多谢你的解释!你的介绍让我对这个包有了很好的理解!

  1. 我觉得你这段完全可以添加到一楼对这个包的描述,让大家理解这个来龙去脉。
  2. 标题因为比较短,所以容易有误解。目前这个标题就非常简单易懂!

发现有个 bug,同时开启 auto-save-visited-modews-butler eglot 时,会自动 ws-butler 的虚空格就不起作用了,保存 buffer 时会自动清除当前行的尾行空格。

不知道如何修复?

找到问题了,是因为设置的自动保存时间为 1s,太短了,修改auto-save-visited-interval为1.1s,就没问题了。

是不是eglot和breadcrumb包还没有完全相互调用?我单独开启breadcrumb-mode,有些文件格式解析非常简单,比如yaml,感觉信息就是which function mode的内容;打开eglot后似乎breadcrumb并未得到增强。lsp-mode的breadcrumb模式,yaml信息丰富很多,显然是用yaml-server来进行了补充。 还是eglot需要开启什么选项才能增强breadcrumb?

通过imenu实现的。 对eglot没有依赖

不知道eglot会不会更新imenu。

为啥不跟eglot集成在一起呢?多装一个包,很麻烦。

我今天在 Windows 上写 python, 开了 breadcromb 和 eglot + pyright, 感觉卡卡的,关了就很流畅。

因为 breadcrumb 不在 lsp protocol 里。

而且这个包不用装,等写好了, Emacs 自带:emacs.git - Emacs source repository

3 个赞

那得等到,emacs30了吧

只通过imenu来进行breadcrumb生成,其实就是一个tag系统,这东西和which-func-mode差异不大。只有使用lsp优化过的imenu才更加准确。所以还是继续用lsp-mode吧。

1 个赞

如果我没理解错,imenu只是个buffer索引框架,包含显示名称以及buffer位置。breadcrumb只是个imenu前端,eglot构建imenu索引时用的就是lsp server提供的信息,对于其它buffer,只要建了索引,breadcrumb也能利用上这个imenu信息罢了,信息的准确度其实由后端提供。

modeline显示当前函数,这个感觉不错呀。随时知道当前处在什么函数中对我来说感觉挺有必要,不知道其它人怎样。但之前一直没想到怎么实现比较好。听到你这个想法,眼前一亮。你这个想法太神奇了。本来之前还想着怎么在头文件里头,也加一个这样的命令,可以查看当前在哪个类里头。因为有一些代码会放多个类,多个类里头又会有类似的成员。如果这多个类比较大,那时间久了,你可能就忘了自己在哪个类里头,在这之前我都是滚动到类最开始的地方再滚回来,这样也是没办法的事。还想着写一个命令来触发。可是现在有你的这个mode-line显示函数名和类名的骚操作,哈哈哈。那效率一下子提升不少,也省去一个手动触发的步骤。简直完美!

这个。。。 which-function 好多年以前就实现了。。。