首页
/ emacs-lsp/lsp-mode 中 Ruff 语言服务器的诊断问题分析与解决

emacs-lsp/lsp-mode 中 Ruff 语言服务器的诊断问题分析与解决

2025-06-10 23:09:16作者:幸俭卉

在 emacs-lsp/lsp-mode 项目中,用户报告了一个关于 Ruff 语言服务器的诊断问题:当代码被修改后,旧的语法错误仍然会显示,即使这些错误已经不再存在。这个问题在用户保存文件后尤为明显,只有通过 revert-buffer 才能清除这些过时的错误信息。

经过深入分析,我们发现问题的根源在于 UTF-32 编码处理上的一个 bug。当 emacs-lsp/lsp-mode 与 Ruff 服务器通信时,默认使用了 UTF-32 编码,而 Ruff 服务器在处理这种编码时存在缺陷,导致了诊断信息的不正确更新。

技术细节上,UTF-32 是一种固定长度的 Unicode 编码方案,每个字符都使用 4 个字节表示。虽然这种编码在某些情况下处理起来更简单,但在 Ruff 服务器的实现中,对 UTF-32 的位置计算出现了错误,导致了诊断信息与实际代码位置不匹配的问题。

一个有效的临时解决方案是强制使用 UTF-16 编码。通过修改 lsp--client-capabilities 函数,将 positionEncodings 设置为仅包含 "utf-16",可以暂时规避这个问题。不过,这只是一个临时措施,因为它会影响所有语言服务器的编码设置。

最终,Ruff 团队在最新版本中修复了这个 UTF-32 编码处理的问题。更新到最新版本的 Ruff 后,诊断信息能够正确反映代码的当前状态,不再出现过时的错误提示。

这个问题展示了语言服务器协议实现中编码处理的重要性,特别是在支持多种编码方案时,需要确保每种编码都能被正确处理。对于开发者来说,这也提醒我们在遇到类似诊断信息不更新的问题时,可以考虑编码方案可能带来的影响。

登录后查看全文
热门项目推荐
相关项目推荐