Eglot出现奇怪的括号匹配,与electric-pair-mode冲突

大家好,我在使用emacs 30.0.5和eglot 1.16,我发现当eglot完成初始化以后,会出现一个神奇的括号自动匹配功能,当我在函数参数的一侧输入括号时,另一个括号会自动在函数参数的另一侧生成。就比如说(假设|是我的光标所在位置):

self.vec.push(|aa, bb)

此时我敲一个左括号(,会变成这样:

self.vec.push((|aa), bb)

那个右括号在aa的右侧生成了。 我完全没在eglot的文档里找到这个神奇括号匹配行为的说明。但是只要eglot-shutdown以后,这个行为就会不见了。此时如果还是像上面那样敲一个左括号,就会是这种正常的行为:

self.vec.push((|)aa, bb)

我因为有同时在使用electric-pair-mode,所以习惯当我需要把某个东西用括号包起来的时候,就先选中这些东西,然后按一个左括号就完事了。但是当我同时使用eglot的时候,这两个行为就会打架,给我生成两个右括号来。 求问大家知道eglot里这个括号的行为是正常的嘛?有没有选项可以关闭它?多谢!

我解决了

问题出在Rust的LSP,不是emacs或者eglot的锅。eglot的log buffer显示是rust analyzer返回了那个额外的括号插入命令:

[jsonrpc] e[17:16:16.575] --> textDocument/onTypeFormatting[20] {"jsonrpc":"2.0","id":20,"method":"textDocument/onTypeFormatting","params":{"textDocument":{"uri":"*****/lib.rs"},"options":{"tabSize":2,"insertSpaces":true,"insertFinalNewline":true,"trimFinalNewlines":true},"position":{"line":323,"character":19},"ch":"("}}
[jsonrpc] e[17:16:16.579]   <-- textDocument/onTypeFormatting[20] {"jsonrpc":"2.0","id":20,"result":[{"range":{"start":{"line":323,"character":23},"end":{"line":323,"character":23}},"newText":")"}]}

我的解决方法是把:documentOnTypeFormattingProvider加入eglot-ignored-server-capabilities即可。

2 个赞