manateelazycat / lsp-bridge

A blazingly fast LSP client for Emacs
GNU General Public License v3.0
1.42k stars 205 forks source link

提供选中区域格式化的功能 #916

Closed zijianyue closed 5 months ago

zijianyue commented 5 months ago

能否提供一个支持选中区域格式化的功能,目前只找到lsp-bridge-code-format,会对整个文件格式化,局部格式化一是更快,二是有时候不想改动其他位置的格式,以免代码差异过多,不便查看修改记录

manateelazycat commented 5 months ago

我看了看 LSP 的协议 https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#formattingOptions

目前 LSP 协议还不支持指定区域格式化, 因为格式化的调整有可能会调整换行的情况, 目前也没法通过对比LSP Server返回的信息, 在Elisp端精确控制格式化区域。

manateelazycat commented 5 months ago

https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_rangeFormatting

manateelazycat commented 5 months ago

Range Format 协议已经支持

https://github.com/manateelazycat/lsp-bridge/commit/977d344e2e930f3680990014f84ca94877d6eebf

请更新测试, 有任何问题欢迎反馈。

zijianyue commented 5 months ago

我用的后端是clangd 18.1,选中区域执行 lsp-bridge-code-format,报错 [LSP-Bridge] Current server not support range format

manateelazycat commented 5 months ago

那就是clangd lsp server不支持局部格式化这个功能

zijianyue commented 5 months ago

通过lsp-mode的诊断来看clangd应该是有这个功能的

image
manateelazycat commented 5 months ago

lsp-mode可以支持区域格式化,能否帮忙确认下? 谢谢

manateelazycat commented 5 months ago

我推送了 https://github.com/manateelazycat/lsp-bridge/commit/dd700106341012e9858d9d764b5f49327df91433

这是补丁解决不同LSP Server range format返回格式不一致的问题, pyright/ruff 返回的是 documentRangeFormattingProvider/rangesSupport, clangd 返回的是 documentRangeFormattingProvider

zijianyue commented 5 months ago

太好了,现在正常工作了