lsp-mode新接口lsp.el

VSCode 我连续用了一个月, 也折腾了上百个插件, VSCode从通用性上已经可以秒杀所有IDE了, 主要界面也好看.

但是 VSCode 最终我没有坚持的主要有几点:

  1. 快捷键配置太麻烦, 每个插件的快捷键都不一样, 很多时候还要我鼠标点击, 最不能忍
  2. 项目全局替换效率太低, 这也是我自己写 color-rg.el 的原因
  3. 分屏和文件管理功能做的太差
  4. 每次重新加载配置文件要闪烁一下界面 (浏览器的先天缺陷)

但是VSCode的LSP做的真的好, 真的好, 真的好, 说三遍, 体验Emacs这种渣渣 LSP 体验就想摔键盘.

1 个赞

flymake 的代码是写死的, 估计 eglot 和 flymake 都是同一个作者, 感情在那里, 不会删除的.

我写了一段代码可以解决你说的问题:

(dolist (hook (list
               'js-mode-hook
               'ruby-mode-hook
               'python-mode-hook
               'go-mode-hook
               ))
  (add-hook hook '(lambda ()
                    (run-with-timer "5sec" nil (lambda () (flymake-mode -1)))
                    (eglot-ensure)
                    )))

毕竟 LSP 就是微软搞出来的,做 IDE 也是微软的强项。想想 Visual Studio 雄霸宇宙第一开发环境多少年了,至今无法超越。

这里要赞一赞lsp-mode的开发者 yyoncho 了, 最近有过一些交流,他也跟我提过一些需求,当然大多数是我提issue 或者idea给他。对问题反馈及时,而且有不少新的 idea,个人也在积极推进(比如跟我和 treemacs 的作者沟通加入支持 lsp 的功能)。他的目标之一就是打造一个接近于 VSCode 体验的 Emacs IDE,也有漂亮的 UI 和鼠标操作吸引到更多的开发者。你可以到这里去提交你想要的功能 https://github.com/emacs-lsp/lsp-mode/issues/515

这是他的一些 todo list:

  • lsp-ui for UI sugar
  • Flycheck/Flymake for listing buffer errors
  • treemacs for project browser (check Alexander-Miller/treemacs#263 @Alexander-Miller was very helpful)
  • helm/ido/ivy for management of errors/folders/workspace symbols and so on.
  • dap-mode for debugger
  • modeline

其中最后一项,我主要是集成到doom-modeline。目前基本功能已经完工,以后有新的 API 会逐步增强。效果如下:

个人对于他的新作品 dap-mode 很感兴趣,这是除了 lsp之外,Microsoft VSCode 团队的又一大贡献,也是 Emacs 最缺失的功能之一:好用的debug。目前在lsp-java 中已经可用,如果稳定下来,相信其他语言也能很快跟进。

我主要吐槽代码质量和用户体验, 不管目标多么远大, 每个版本都要保证流程的可用性, 这样用户才会越来越支持.

当然, 我现在也没时间去做的更好了, 没有资格站着说话不腰疼.

我现在就忍了吧, 期待 lsp-mode 的作者做的更好吧.

2 个赞

确实是的,lsp-mode 和company-lsp 的配合使用体验还是差了一些,nvim 上的话,coc.nvim或者ncm2 和lsp 的配合真是比emacs好太多了,用过之后再来体验emacs 的lsp 感觉差距还是比较大的

看了看lsp,离开箱即用还有距离,比如没有自动(require 'lsp-client),这个很奇怪,有什么原因吗?

看下這樣行不行?

(use-package lsp-mode
  :commands lsp
  :init
  (setq lsp-auto-guess-root t)    ; 我習慣自動選project root
  ;; (setq lsp-prefer-flymake t)  ; 預設t。flymake替代flycheck
  :config
  (require 'lsp-clients)          ; ocaml,css,python,bash,...
  )

我不認爲需要做到完全開箱即用(比如*-mode-hook是侵入式的,需要顯式指明)。有些用戶可能根本不想用某些language servers,(require 'lsp-clients)可能會註冊一堆用不着的。

这个不是什么大问题,只不过我比较奇怪为什么不自动加载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 用.

还真有