VSCode 我连续用了一个月, 也折腾了上百个插件, VSCode从通用性上已经可以秒杀所有IDE了, 主要界面也好看.
但是 VSCode 最终我没有坚持的主要有几点:
- 快捷键配置太麻烦, 每个插件的快捷键都不一样, 很多时候还要我鼠标点击, 最不能忍
- 项目全局替换效率太低, 这也是我自己写 color-rg.el 的原因
- 分屏和文件管理功能做的太差
- 每次重新加载配置文件要闪烁一下界面 (浏览器的先天缺陷)
但是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具体是怎么搞的),找得到就用,找不到就试下一个,都没有就说没有。
ztlevi
31
vscode关键优势的就在于用的是js, electron, 本身这个社区就比较活跃,插件数就很多,而且很多web-based的软件可以直接移植到vscode里,比方说jupyter,在vscode里就跟打开个浏览器页面没差。
不过有一句说一句,搜索功能做的是真辣鸡。也没有人给它做个好点的搜索section。
ztlevi
32
这个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 用.