好久没更新,今天更新后,发现 python 无法补全了。
只有在 emacs -Q 启动后,加载最简配置,python 才能正常补全。
哪怕 ~/.emacs.d/init.el 内容为空,加载最简配置后,其他语言比如 elisp ,c ,c++ 都正常。
唯有 python 不出现补全提示窗口。
python 版本 3.11.2
系统: linux , debian 12.5
所需 pyright 也正常安装
不知道是什么问题!
好久没更新,今天更新后,发现 python 无法补全了。
只有在 emacs -Q 启动后,加载最简配置,python 才能正常补全。
刚刚找到原因了,是 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 语法补全了。
用 lsp-bridge 编写代码的时候, 偶尔会遇到诊断信息清理不干净的情况。
社区也有同学反馈。
今天盯了半个小时的日志, 终于修复了。
原因是 lsp-bridge 的诊断功能开发的很早, 后续又给 lsp-bridge 增加了 “混合多个LSP服务器” 的功能, 当多个服务器共享一个 ticker 的时候, 会因为多个服务器同时返回诊断响应时相互冲突, 最终导致某些 LSP Server 返回的诊断信息被误认为是临时诊断信息而丢弃。
新的补丁针对多服务器的情况分开检测 ticker 后, 这个问题修复了。
用 lsp-bridge 的同学请更新到最新版。
目前,个人已通过 lsp-bridge + font-lock-add-keywords 的方式完整实现 pythyon 自定义代码补全+语法高亮。
添加 pth 路径的方式扩展自定义补全词库。
依靠 lsp-bridge 的速度,实现了在 emacs 中开心写 python 代码的愿望。
用 font-lock-add-keywords 的方式给 python-mode 加 hook,完全实现了 ~
自定义快速补全 + 语法高亮。
目前这一套体验下来也是非常舒适!
今天我发布了一个新的补丁,修复了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。
建议所有用户都更新到最新版。
大佬能否提供一个支持选中区域格式化的功能,目前只找到lsp-bridge-code-format,会对整个文件格式化,局部格式化一是更快,二是有时候不想改动其他位置的格式,以免代码差异过多,不便查看修改记录
提给issue吧, 公司太忙了, 我最近晚上回家给你弄。
已提ISSUE
好的,晚上回家看。
我看了看 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))))
好, 我这周加一下
这个要server声明自己是个documentRangeFormattingProvider才行
不是每一个server都实现了这个功能
Range Format 协议已经支持
请更新测试, 有任何问题欢迎反馈。
这个功能会根据 region 是否激活来调用 formatting 还是 rangeFormatting 协议, 但不是每个 LSP server 都支持 rangeFormatting.
今天刚开始尝试 lsp-bridge,有个问题不太理解:为什么 lsp-bridge 一定依赖 yasnippet 呀?是因为 LSP 后端返回的可能是类似于 snippet 的东西,需要借助 yasnippet 来进行多个 placehold 之间的跳转吗?
另外是一个自己使用上的问题(不知道是不是我没看到什么快捷键)。我在配置好 lsp-bridge 后,就被 acm 的美观界面和极快的速度震惊到了!但是我打开 Go 文件,启动 lsp-bridge-mode 后
这个时候按下 TAB 会变成
这个样子,请问这是 Bug 还是我的问题?
yasnippet 和 lsp-bridge 的配置我都没动过(除了指定了一下 python 路径)。
因为目前来看, LSP服务器返回的 snippet 只有 yasnippet 才能比较好的展开, 其他的库都没法做到。
我测试了一下 Tab, 可以正常工作, 应该是你的 yasnippet 没有配置好。
lsp-bridge 的速度已经达到了 VSCode 的水平。
我去,感谢大佬回复,速度太快了
的确,不好意思,我忘记开 yas-global-mode
了,十分感谢!
今天更新了 Range Formatting 协议的解析代码, 我发现不同的 LSP Server 返回同一个协议的内容是不一样的。
pyright/ruff 返回的 Range Formatting 能力, 要通过解析 documentRangeFormattingProvider/rangesSupport 这个字段才能判定, 而 clangd 只用判定 documentRangeFormattingProvider 这个字段就好了。
需要局部格式化功能的朋友, 需要更新到最新版。 (最新版合并和社区大牛的补丁, 又增强了远程编辑的很多功能)。