lsp-mode新接口lsp.el

这个不是什么大问题,只不过我比较奇怪为什么不自动加载lsp-clients。如果用户想要别的client可以手动覆盖的吧?

我觉得可以 (require 'lsp-clients) 。这只会自动注册,并不会启动,还得加入-mode-hook。当然,如果能自动检测并自动加载就更好了。eglot, flycheck都不需要额外的多余配置。如果愿意你也可以自行配置。

我提交了一个 issue 在这里:[Enhancement] Automatic client detection · Issue #512 · emacs-lsp/lsp-mode · GitHub.

所以现在的问题是什么?我感觉自动检测的逻辑挺直接的啊。 搞一个类似

((major-mode . (candidate1 candidate2))
 (major-mode . (cadidate1)))

的alist,启动的时候从candidate1开始试,在exec-path里找可执行文件(或者后端定义的时候说明了可执行文件路径?或者别的什么更精细的函数?我不清楚lsp具体是怎么搞的),找得到就用,找不到就试下一个,都没有就说没有。

vscode关键优势的就在于用的是js, electron, 本身这个社区就比较活跃,插件数就很多,而且很多web-based的软件可以直接移植到vscode里,比方说jupyter,在vscode里就跟打开个浏览器页面没差。

不过有一句说一句,搜索功能做的是真辣鸡。也没有人给它做个好点的搜索section。

这个package确实挺新颖的,功能也很强大。但不得不说,缺失的功能还很多,而且考虑到freeze问题,估计我2,3年内不会碰这个东西。

另外注意到這個有趣的issue Gripes about lsp-mode/elgot comparison · Issue #180 · joaotavora/eglot · GitHub Comparison lsp-mode/elgot is out-of-date/wrong/irrelevant “joaotavora大戰yyoncho (笑)” 吸引眼球的話要用個有趣的描述~

我也是这么建议的,类似flycheck一样。可能内部实现需要先重构才行。目前作少量配置也能工作了,好不错。

嗯,肯定还不成熟不完善,不过基本功能已经可用了,应该不用等两三年。有时间可以一起参与的。

我居然看完了所有内容!似乎两边吵起来了呀😄其实是设计思路不同吧。eglot作者比较推崇不依赖于其他包的简洁设计,缺点是功能相对弱些,至少UI不讨喜。想想看内置的flymake不如flycheck应该也是类似原因吧。多年前我还用flymake,自从flycheck诞生就放弃了。

刚又都试用了下,eglot也不好用啊,比不上vim的lsp客户端,更不用说vscode了。互相借鉴下发展一个成熟稳定的吧。

我比较赞同 eglot 的理念, Elisp 大多数插件都是单个文件的.

只不过 eglot 也是一卡一卡的

是的,设计理念是不错。不过要完成比较复杂的功能,单个文件还是有些吃力。这两天用 lsp 还算可以,毕竟项目不算太大。总感觉是不是 JSON 解析之类的比较慢,比 VIM 和 VSC 上要卡一些,慢慢改进吧。

JSON这一块我建议直接调用个C库, 然后封装成接口给 Elisp 用.

还真有

我认为 lsp-mode 的问题不在于是否“开箱即用”,再复杂的配置,抄一份不就得了,天下配置一大抄不是吗。

真正需要改进的是可靠度,不要在使用过程中掉链子,以及可读性更高的错误提示。

还有测试的方便性,不仅有助于开发者编写测试用例,更有利于用户报错。比如使用 jedi 的时侯,普通用户很容易用一段代码复现错误。

1 个赞

哦?能说得具体点么?禁用 font-lock LSP 的性能就提高了?

It seems an issue of ccls, while not lsp?

截图是禁用 font-lock 前(右)后(左)对比?

If overlays have good performance ((setq ccls-sem-highlight-method 'overlay)) i’d be excited to try disabling font-lock.

Another area worth exploring is how to improve when/how to request textDocument/codeLens. I may take some inspiration from flymake.

$ccls/publishSemanticHighlight transfers less data compared with $cquery/publishSemanticHighlighting:

{"jsonrpc":"2.0","method":"$ccls/publishSemanticHighlight","params":{"uri":"file:///home/ray/musl/src/string/bcmp.c",
"symbols":[{"id":118,"parentKind":0,"kind":12,"storage":0,"ranges":[{"L":66,"R":70}],"lsRanges":[]},
{"id":18602,"parentKind":12,"kind":253,"storage":0,"ranges":[{"L":99,"R":101},{"L":134,"R":136}],"lsRanges":[]},
{"id":18601,"parentKind":12,"kind":253,"storage":0,"ranges":[{"L":110,"R":111},{"L":138,"R":139}],"lsRanges":[]},
{"id":0,"parentKind":0,"kind":252,"storage":0,"ranges":[{"L":103,"R":109}],"lsRanges":[]},
{"id":6315,"parentKind":1,"kind":255,"storage":0,"ranges":[{"L":8,"R":19}],"lsRanges":[]},
{"id":18600,"parentKind":12,"kind":253,"storage":0,"ranges":[{"L":83,"R":85},{"L":130,"R":132}],"lsRanges":[]},
{"id":94,"parentKind":0,"kind":12,"storage":0,"ranges":[{"L":123,"R":129}],"lsRanges":[]}]}}

Instead of {"L":99,"R":101}, cquery uses interface Range which is rather long.

1 个赞

求问怎么解决的? 哪个文档?

谢谢, 单独配置搞定了,
但是spacemacs

(c-c++ :variables
            c-c++-adopt-subprojects t
            c-c++-default-mode-for-headers 'c++-mode
            c-c++-backend 'lsp-ccls
            c-c++-enable-clang-support t)           

无解吗?

1 个赞