想新写一个LSP Mode

今年过年好早,准备等公司放假了,想重新写一个LSP Mode, 满足以下几个目标:

  1. 零配置,就像TabNine那样,打开文件就可以补全,自动识别Project项目和Python这种单文件,不要让用户吭哧吭哧的配置,lsp-mode那样复杂的配置好烦;
  2. 极致的速度,准备用Rust撸一个中转桥动态模块,专门用于和LSP Server进行通讯,解析LSP Server返回的协议内容,Rust中转桥只和 Emacs的Company Mode沟通,这样性能应该是足够流畅的;
  3. 专注于键盘操作,那些花哨的档眼睛的UI控件不要有,太花哨而且做的不好用,eldoc文档提示和yasnippet参数模板补全的配合可以有
  4. 稳定,如果有一些补全高级功能没法做稳定,宁愿不要提供也不要有bug, 不稳定太烦人了

公司最近好忙,最近肯定没时间的,可以先和大家吹吹牛讨论下,等我闲的时候写,就像半年前写Snails 的节奏,先讨论需求,需求讨论清楚好撸代码。

感兴趣的Emacs Hacker欢迎一起讨论或者发邮件给我 [email protected]

33 个赞

我也有这样的想法,用Rust和子进程交流,这样就跳过Emacs原生的process机制。Rust解析JSON后返回给Emacs一个opaque object表示事件,用特定的accessor获取值,免去反复在Rust线程和lisp VM交换值的开销。

现在想法是先写一个这样的后端换到Eglot上(eglot模块化做得很好,lsp-mode太过复杂),作为概念验证。

3 个赞

可以借助Snails的设计理念,Rust作为中转桥,把所有协议解析和性能分析的事情都做了,Emacs只用告诉Rust现在的Project目录和Input Ticker, Rust根据Input Ticker来决定是否要吐补全内容不?

没有的话,Emacs就一直输入,有就补全,这样就不会因为Emacs的多进程管理和JSON解析卡住了。

lsp-mode 有太多我不喜欢的功能了,而且代码写的太复杂。

1 个赞

理论上能行,不过我还没实践过,这个我先做一点原型来试试吧 :sweat_smile:

1 个赞

用 Rust 作为模块肯定会快很多。不过要支持 LSP 的协议,最后写出来应该也不会太简单。考虑到一些用户体验性的问题还会加不少周边代码。eglot看起来精简,但用起来体验也并不好,就想 flymake 一样,怎么用都没 flycheck 爽。lsp-mode比较繁杂(最近好像重构了不少),功能倒是挺多,可以自己控制 UI。JSON 解析确实是个大问题,27 上好很多,但对于大项目还是有点吃力。 总之,用 Rust 作为中转,这个方案还是有兴趣。希望这个项目可以发布到melpa。

2 个赞

我觉得 java 的体验确实不好,还有别的吗?

c++ 的rapidjson 和simdjson 一个用sse4.2一个用vax2 的simd指令 如果用动态模块做个包装速度就超级快乐

性能问题是Lisp VM和原生线程间数据传递的开销,和JSON解析开销关系不大。

抛开性能问题,我觉得 lsp-ui 体验不好,感觉大家平时都默认把 lsp-ui 关掉。

6 个赞

非常支持, 这个是一两年来使用emacs的一个痛点了, 一个是配置麻烦, 一个是性能不理想.

如果工作量大的话, 可以拆分成多个小任务或模块, 让有兴趣的人来参与.

  1. lsp-mode感觉现在配置不怎么复杂,我两三个月前进行配置的时候发现一些比如doom的代码里写的必需的hack,已经加到lsp-mode/lsp-ui本身里面了
  2. 看需求吧,lsp-ui的大号文档child frame这种东西,干活的时候肯定不需要,但是学习新的语言比如rust的时候感觉很好用。

lsp 现在使用在spacemacs上感觉已经很方便了; 但是lsp-ui 就有点喧宾夺主,干扰写代码。

哈哈 搞起来 希望可以多提几个PR

加强修炼,做到没有lsp也可以愉快的写代码...

lsp-java似乎还行?

lsp-ui可以关掉,或者部分关掉。其实我猜测你说的主要是lsp-ui-sideline

受教了,这个有什么测试数据吗?如果用 Rust module 能避免?

我也不喜欢lsp-mode,乱七八糟的东西太多,每次从一个新位置打开文件都要停下来问你是否要导入项目,超级烦。

现在又用回eglot了。比较欣赏eglot的极简哲学,只提供必要的lsp协议集成,其他的东西都尽量留给现有的Emacs设施: xref, flymake, eldoc等,从来不问没必要的问题。

其实我希望楼主能够帮助改进eglot,因为毕竟有很大一部分工作eglot已经做了,再重做一遍感觉比较浪费。当然楼主100%有权决定自己的时间要花到哪里,如果能很快超过eglot的完成度的话,我也很乐意改用。

1 个赞

我是针对你说 eglot 体验不好说的。

一个月前lsp-mode作者和eglot作者在r站上对骂起来了,这混水不好蹚啊 :sweat_smile:

1 个赞