语言服务器协议(LSP)服务器插入文本时如何确定正确换行序列?
LSP中文档插入文本时换行符(LF/CRLF)的处理方案
LSP原生支持情况
LSP本身没有明确规定用于确定换行符风格的标准化方法。关于3.16版本新增的normalizesLineEndings客户端能力,这里明确下它的作用:它是告知服务器,客户端会把所有发送给服务器的文档内容换行符统一规范化为LF(\n),不管用户编辑器实际用的是哪种换行风格。
- 但这个能力只针对客户端发给服务器的内容(比如打开文档时的文本同步),不会自动处理服务器返回的WorkspaceEdit里的换行符。所以服务器不能靠这个能力自动适配客户端的换行偏好,还是得自己处理插入文本的换行符。
公认的标准处理方法
行业里常用的靠谱方案按优先级来:
- 优先匹配文档现有换行风格
- 扫一遍已打开的文档内容,只要发现有
\r\n(CRLF)就用CRLF,没有的话就用LF。这是最贴合当前文档已有格式的做法,也是大部分LSP实现的默认逻辑。
- 扫一遍已打开的文档内容,只要发现有
- 回退到合理默认配置
- 碰到空文档或者文档里没有换行符的情况:
- 别直接猜系统默认,先看看客户端有没有通过非标准的文档元数据(比如
didOpen/didChange的附加信息)传递换行偏好; - 如果没有客户端配置,再用系统默认(Windows用CRLF,其他系统用LF)。
- 别直接猜系统默认,先看看客户端有没有通过非标准的文档元数据(比如
- 碰到空文档或者文档里没有换行符的情况:
- 可选补充.editorconfig支持
- 如果对格式一致性要求高,可以实现.editorconfig解析:读取当前文档所在目录及父目录的
.editorconfig文件,提取end_of_line的配置值(lf/crlf/unset),按规则应用就行。这算是前两种方案的增强项,不用搞太复杂。
- 如果对格式一致性要求高,可以实现.editorconfig解析:读取当前文档所在目录及父目录的
总结下来,LSP没有原生的标准化解决方案,最稳妥的流程是:先检测文档现有换行风格 → 没有的话尝试读取客户端隐含配置 → 再回退到系统默认 → 可选叠加.editorconfig支持。
内容的提问来源于stack exchange,提问作者Ross Bencina
相关产品推荐
相关产品推荐

