lsp-mode + gopls cpu使用过高

终于找到一个有人气的emacs社区! 求教各位高手们,谁有稳定的lsp-modo开发golang的可靠的配置吗? 目前我用lsp-mode,flycheck, company,用gopls做backend language server,这也是现在vscode go mode用的标准server。极度痛苦的配置过程,现在基本搞定了所有行为,只是发现在修改import package的时候,emacs本身和背后gopls狂吃cpu,风扇开始狂转。 VScode同样的code修改cpu也会上升,但是vscode驱动的gopls峰值也就是emacs gopls的一半。

log看到每次修改import list, gopls都会go list all —deps 什么的,非常耗资源。 感觉肯定有参数可以控制这种行为,另外降低一下语法检测频率。但是还没发现是什么。

这两天被这玩意搞的强迫症犯都犯了,这么多年每次要往emacs里鼓捣点新东西都挣扎在放弃的边缘,但最后都搞定了,深信相信 “没有其它editor有而emacs没有的功能,如果有,只是还没人的空写几行lisp”;稳定性上几个成熟大插件也基本没问题;但是性能问题上,vscode出来后,对emacs真没那么强的信心了。

1 个赞

补充,我用的是 emacs for macos 26.3。 其它package全是最新版本,gopls是0.2.2,当前最新。

学习大神,放弃语义相关插件,全面强化文本能力。

1 个赞

关键是,LSP出来的目的不就是让各种编辑器在语法能力上都在同一起跑线了吗,现在vscode能做到,emacs却不行,不甘心啊。

咦?gopls 应该不会调用 Shell 命令

背后用的应该还是标准的go tools。你可以随便找个package试试这个 gopls -rpc.trace -v check ./main.go

首先emacs的异步不如vscode那种从出生就有的,另外就是emacs的elisp的速度好像没有js快,加上lsp-mode可能不是太完善。。。。所以应该用起来体验达不到一个水准吧。

感觉还行啊,没有你说的这么卡

这几天感觉master分支上最新的commit编译出来的gopls非常吃cpu。看k8s的代码,第一次打开cpu会直接到100%,至少1分钟才会降下来。win10上的emacs的lsp-mode,直接不能用,不知道lsp-mode是怎么找package的,随便跳到某个文件,很容易就报什么找不到package。neovim用coc.nvim和最新的gopls虽然也是很吃cpu,但是可以正常使用。显示函数的package name。

我的2019年8月1日编译的gopls就没这么吃cpu,几秒钟cpu就降到正常水平。

虚机里跑linux,x11的emacs各种正常,我都服气了,偶尔看看go的代码,起个虚机有点麻烦,copy paste、中文输入到x11的emacs有点不舒服。凑合着用neovim又不甘心。win10上的emacs+lsp-mode对付go,基本没法用。纠结。

没怎么了解过 lsp 协议,不过看过 eglot 和 lsp–mode 作者的论战,某种意义上谈不上同一起跑线,虽然 lsp 大家都可以用,但毕竟其是基于 vscode 的产物,其他编辑器或多或少需要做些妥协。

换 Linux 吧

用emacs27

Emacs 27 大佬是怎么安装的?

①git clone --depth 1 GitHub - emacs-mirror/emacs: Mirror of GNU Emacs

②cd emacs

③./autogen.sh all

④./configure --with-xwidgets --with-x --with-x-toolkit=gtk3 --with-modules

⑤make

⑥sudo make install

我这样编译安装的,版本号已经是28.0.50了。

checkout emacs27 branch

喜大普奔,我做了一些尝试,目前cpu使用率已经降到vscode同等水平,甚至比vscode略好(而且vscode个流氓要起一堆的CodeHelper辅助程序)。

emacs27 有根本的效率提升,感谢 @seagle0128 大神。略微了解一下,应该是emacs27在json parsing上有比较大的性能提升,而lsp的通讯全是用json。

** The new configure option '--with-json' adds support for JSON using
the Jansson library.  It is on by default; use 'configure
--with-json=no' to build without Jansson support.  The new JSON
functions 'json-serialize', 'json-insert', 'json-parse-string', and
'json-parse-buffer' are typically much faster than their Lisp
counterparts from json.el.

我是用emacs-plus安装的,因为在尝试使用doom-emacs,emacs-plus是doom的base。当前latest版本号前面朋友也说过,已经是:28.0.50,跨越了。

brew tap d12frosted/emacs-plus
brew install emacs-plus
brew link --overwrite emacs-plus

昨天在绝望之际,尝试去扒拉了一下几个framework的代码,其中doom的配置有一条async是我之前没有的,感觉有一丢丢的帮助(也许是心理作用):

  (set-lookup-handlers! 'lsp-mode :async t
 .....

;; This is the explanation from code:
(defun lsp--send-request-async (body callback)
  "Send BODY as a request to the language server, and call CALLBACK with
the response recevied from the server asynchronously."
   ...

总之,最后结果是好的。另外,昨天尝试了一下doom-emacs,之前实在对evil不感兴趣,也用了好多年vim,感觉emacs上套接vim同时玷污了这俩好东西。但昨天翻看了一下doom的FAQ,读到这个问题,看到hlissner的回答,突然内牛满面,联想到这一周来被lsp反复摩擦的经历,决定试试doom。

Why should I use Doom instead of rolling my own config?

If you care about personalizing the software you use on a daily basis, even half as much as I do, then you probably need professional help, but you also know it is time consuming. Emacs out-of-the-box is a barren wasteland with archaic defaults. Building anything out here and getting a feel for it will take a lot of time. Time that I’ve already wasted and can never get back.

Time you could otherwise spend attending your daughter’s dance recitals, that baseball game your son’s team almost won last Thursday, or answering the court summons to fight for custody of your kids.

Also, Doom’s fast yo.

3 个赞

用linux一堆的办公软件搞不定。不如win10来得方便。

doom-emacs不错。学习了很多doom的配置。emacs上没有evil,对于一个用了n年vim的,都不知道该怎么用emacs。一直适应不了emacs的默认按键,按久了手痛。

听起来升级emacs的版本好像很有用的样子,我也赶快升级一下。

Emacs27应该不久后就会出stable版本了吧。 我这里gopls经常error,不停重启,不过我觉得Emacs还好,起码会提示报错自动重启。vs code那个东西,不仅不会自动重启,而且在我发issue请求解决问题后,它还把报错提示给隐藏了(假装解决了问题),,相比之下Emacs虽然本身不算很好,但开发者都挺负责的。。 听说Emacs27用c重新弄了个json,应该会好点。。

1 个赞