lsp-bridge -- 速度最快的语法补全插件

好久没更新,今天更新后,发现 python 无法补全了。

只有在 emacs -Q 启动后,加载最简配置,python 才能正常补全。



哪怕 ~/.emacs.d/init.el 内容为空,加载最简配置后,其他语言比如 elisp ,c ,c++ 都正常。
唯有 python 不出现补全提示窗口。
python 版本 3.11.2
系统: linux , debian 12.5
所需 pyright 也正常安装
不知道是什么问题!

刚刚找到原因了,是 nodejs 20 和 python 3.11 不融合!换成 nodejs 18 就好了!

通过社区热心开发者的调查, Tailwindcss 的作者回复, languageId 要根据文件名动态发送, Tailwindcss LSP server 才能正常返回代码补全。

感谢社区开发者的帮助 I found how to fix Tailwindcss · Issue #907 · manateelazycat/lsp-bridge · GitHub

lsp-bridge 现在已经正式支持 Tailwindcss 语法补全了。

1 个赞

用 lsp-bridge 编写代码的时候, 偶尔会遇到诊断信息清理不干净的情况。

社区也有同学反馈。

今天盯了半个小时的日志, 终于修复了。

原因是 lsp-bridge 的诊断功能开发的很早, 后续又给 lsp-bridge 增加了 “混合多个LSP服务器” 的功能, 当多个服务器共享一个 ticker 的时候, 会因为多个服务器同时返回诊断响应时相互冲突, 最终导致某些 LSP Server 返回的诊断信息被误认为是临时诊断信息而丢弃。

新的补丁针对多服务器的情况分开检测 ticker 后, 这个问题修复了。

用 lsp-bridge 的同学请更新到最新版。

10 个赞

目前,个人已通过 lsp-bridge + font-lock-add-keywords 的方式完整实现 pythyon 自定义代码补全+语法高亮。

添加 pth 路径的方式扩展自定义补全词库。
依靠 lsp-bridge 的速度,实现了在 emacs 中开心写 python 代码的愿望。
用 font-lock-add-keywords 的方式给 python-mode 加 hook,完全实现了 ~ 自定义快速补全 + 语法高亮。

目前这一套体验下来也是非常舒适!



我平时虽然只使用 lsp-bridge 强大功能的一小部分,但这也足够成为我使用 emacs 写 python 代码的理由。

在研究这一组合过程中,也得到了 @LdBeth @wcq062821 @manateelazycat 三位提供的思路和帮助。让我这个不太懂 elisp 的 emacs 玩家也能通过配置,实现想要的 emacs 扩展功能。很感谢三位的帮助与解惑。

这也让我在以后写相关代码时,不用再在 vim、sublime、emacs 之间跳来跳去了,只用 emacs 一个就行了! :blush:

6 个赞

今天我发布了一个新的补丁,修复了LSP Server返回过多补全项时,ACM菜单无法显示候选词的问题。

问题的原因在于,之前有用户不希望lsp-bridge在Python端过滤候选词,但完全不过滤会导致Emacs因创建过多的对象而触发GC,最终导致卡顿。因此,我加入了acm-backend-lsp-candidates-max-number选项,以限制LSP Server返回的候选词数量,从而避免GC。

然而,这种设计也有问题。如果LSP Server返回的候选词远远超过acm-backend-lsp-candidates-max-number的设定(例如Tailwindcss LSP Server),lsp-bridge只会发送范围内的候选词,而这些候选词与用户的输入可能毫无关系。

新补丁的设计总是会在Python端进行候选词过滤,同时允许用户配置acm-backend-lsp-match-mode匹配模式。这样可以解决当LSP Server返回过多候选词时,ACM无法显示补全候选词的bug。

建议所有用户都更新到最新版。

8 个赞

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

提给issue吧, 公司太忙了, 我最近晚上回家给你弄。

1 个赞

已提ISSUE

1 个赞

好的,晚上回家看。

我看了看 LSP 的协议 Specification

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

是否可以参考一下LSP-MODE的方法?

(defun lsp-format-region (s e)
  "Ask the server to format the region, or if none is selected, the current line."
  (interactive "r")
  (let ((edits (lsp-request
                "textDocument/rangeFormatting"
                (lsp--make-document-range-formatting-params s e))))
    (if (seq-empty-p edits)
        (lsp--info "No formatting changes provided")
      (lsp--apply-text-edits edits 'format))))

这个章节应该是区域格式化吧。 textDocument_rangeFormatting

FormattingOptions 里面的参数可能导致返回不好处理吧。

好, 我这周加一下

这个要server声明自己是个documentRangeFormattingProvider才行

不是每一个server都实现了这个功能

Range Format 协议已经支持

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

这个功能会根据 region 是否激活来调用 formatting 还是 rangeFormatting 协议, 但不是每个 LSP server 都支持 rangeFormatting.

1 个赞

今天刚开始尝试 lsp-bridge,有个问题不太理解:为什么 lsp-bridge 一定依赖 yasnippet 呀?是因为 LSP 后端返回的可能是类似于 snippet 的东西,需要借助 yasnippet 来进行多个 placehold 之间的跳转吗?

另外是一个自己使用上的问题(不知道是不是我没看到什么快捷键)。我在配置好 lsp-bridge 后,就被 acm 的美观界面和极快的速度震惊到了!但是我打开 Go 文件,启动 lsp-bridge-mode 后

image

这个时候按下 TAB 会变成

image

这个样子,请问这是 Bug 还是我的问题?

yasnippet 和 lsp-bridge 的配置我都没动过(除了指定了一下 python 路径)。

因为目前来看, LSP服务器返回的 snippet 只有 yasnippet 才能比较好的展开, 其他的库都没法做到。

我测试了一下 Tab, 可以正常工作, 应该是你的 yasnippet 没有配置好。

lsp-bridge 的速度已经达到了 VSCode 的水平。

我去,感谢大佬回复,速度太快了 :joy:

的确,不好意思,我忘记开 yas-global-mode 了,十分感谢!

1 个赞

今天更新了 Range Formatting 协议的解析代码, 我发现不同的 LSP Server 返回同一个协议的内容是不一样的。

pyright/ruff 返回的 Range Formatting 能力, 要通过解析 documentRangeFormattingProvider/rangesSupport 这个字段才能判定, 而 clangd 只用判定 documentRangeFormattingProvider 这个字段就好了。

需要局部格式化功能的朋友, 需要更新到最新版。 (最新版合并和社区大牛的补丁, 又增强了远程编辑的很多功能)。

3 个赞