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

补丁已经合并,感谢大佬支持!

依然还是没有影响!

我又对比了一下 company+lsp 与 corfu + lsp-bridge 触发候选~输入的方式

:point_down:这是我感受到的 company+lsp 的触发输入方式:按 tab 循环候选,但不会立刻输入选定的项目,而是在按回车键后才输入选定内容。



:point_down:这是我感受到的 corfu + lsp-bridge 的触发输入方式:按 tab 循环候选,同时,就直接输入了选定项目。



或许多出一个 > 与 lsp-bridge 的触发输入方式有关?
或许,可以通过设置 corfu 解决?我之前没有用过 corfu,对其配置还不太了解 :stuck_out_tongue_closed_eyes:

问题是,不管corfu上不上屏,你都不应该有两个>

你真的试了 emacs -Q 只加载lsp-bridge,不要加载任何其他插件的对比测试了吗?

emacs -Q的时候也不要定制corfu ,最小配置对比下。

我觉得是你的配置在干扰。

似乎是 electric-pair 之类的东西,在你敲 < 的时候就自动补了一个 >, 然后 clangd 看见 < 给你也补全了头文件的 >, 然后一起加上就这样了。

2 个赞

我也遇到了同样地问题,暂时还没解决

1 个赞

我没有用 emacs -Q 的方式。但是我的 init.el 配置只写了 lsp-bridge 设置,没有任何其它设置。问题依然存在。
不知道这和 emacs -Q 的方式是否有区别?

;;; init.el | only use lsp-bridge
(add-to-list 'load-path (concat user-emacs-directory "/lsp-bridge" ))
(require 'lsp-bridge)

(require 'yasnippet)
(yas-global-mode 1)
(require 'corfu)
(global-corfu-mode)

(setq lsp-bridge-completion-provider 'corfu)
(require 'orderless)
(require 'markdown-mode)
(require 'corfu-info)
(require 'corfu-history)
(require 'lsp-bridge-icon)        ;; 显示图标在补全菜单中,可选
(require 'lsp-bridge-orderless)   ;; 支持模糊搜索,可选
(corfu-history-mode t)
(global-lsp-bridge-mode)
(when (> (frame-pixel-width) 3000) (custom-set-faces '(corfu-default ((t (:height 1.3))))))  ;; 让corfu适应高分屏

;; For Xref support
(add-hook 'lsp-bridge-mode-hook (lambda ()
								  (add-hook 'xref-backend-functions #'lsp-bridge-xref-backend nil t)))

;;; for evil
;;; way-1
(add-to-list 'lsp-bridge-enable-popup-predicates
             '((lambda ()
                 (and
                  (< corfu--index 0) ; not select a candidate
                  (or (not (featurep 'evil)) (evil-insert-state-p))))))

(custom-set-variables
 ;; custom-set-variables was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 )
(custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 )

嗯嗯,感觉是的!

怎么过滤空格补全问题?我补全完后 空格又弹补全,字符加上空格不生效

详细带截图说,没看懂,请不要只抛出问题,详细的告诉我你正在编辑的文件内容,空格的场景,问题的截图。

你就说一句话,我不可能猜到你说的啥意思。

;;; init.el | only use lsp-bridge
(add-to-list 'load-path (concat user-emacs-directory "/lsp-bridge" ))
(require 'lsp-bridge)

(require 'yasnippet)
(yas-global-mode 1)
(require 'corfu)
(global-corfu-mode)

(setq lsp-bridge-completion-provider 'corfu)
(require 'orderless)
(require 'markdown-mode)
(require 'corfu-info)
(require 'corfu-history)
(require 'lsp-bridge-icon)    
(corfu-history-mode t)
(global-lsp-bridge-mode)
(when (> (frame-pixel-width) 3000) (custom-set-faces '(corfu-default ((t (:height 1.3))))))  ;; 让corfu适应高分屏

这应该是最小配置,但是我说的是你应该 emacs -Q 启动后,只加载你的这个 init.el 文件。

按照你 init.el 的内容看,你还有其他配置文件,而你的其他配置文件会干扰 lsp-bridge ,产生你现在遇到的 bug.

emacs -Q的目的是让你只加载 lsp-bridge 和它的依赖,而不是 lsp-bridge 的配置文件只有这些内容,要完全排除其他插件的影响。

同时每次测试的事情,请先更新到最新版,避免已经修复的问题反复出现。

就是随便敲个空格就弹窗补全,希望没有输入字符的情况下不要弹窗。

使用过程中,发现补全有时候是大小写敏感的。

另外问下,怎么在结构体内像lsp-mode一样自动补全填充结构体字段。

比如这个,想要把所有字段自动补全。

你说的第一个问题我昨天已经推送补丁修复了呀

更新最新版后,如果还有问题, 在你认为的空格处, 执行一下 (lsp-bridge-not-only-blank-around-cursor) 看看返回什么?

自动展开结构体的问题,我不知道。

1 个赞

空格的问题解决了。 补全大小写敏感么?必须正确输入大小写才提示补全

要支持语法检查了吗,我看见TODO里面已经有cache 诊断信息的计划了

先提issue吧,每次提交问题的时候,建议先更新到最新版先看看是不是已经修复了

只是计划,最近太忙了,不会那么快的实现。

想要快点的话,可以自己尝试写补丁。

目前的计划是,诊断信息过来以后,先暂时存储在 lsp-bridge python 这一端, 用户 idle 1~2秒以后才从 python 端 Pull 最新的诊断信息,然后对接到 flycheck 或者 flymake 的接口去显示错误或警告。

不会像 lsp-mode/eglot 那样实时显示诊断信息,第一编写代码过程中没有必要看,第二实时解析诊断信息会卡手,停下敲键盘 1 ~ 2 秒去获取一下足矣。

我看了一下 flycheck 代码 1.2万 行,如果只是简单的错误显示和跳转,用 overlay 估计100行以内就搞定了。

最近太忙没时间,大佬感兴趣的可以按照我上面的思路去实现。

支持Pull diagnostic 的 lsp server好像都没见到(3.17的标准最近才发布吧)。用lsp-bridge暂存确实可以。lsp-bridge确实挺快的。

用3.16就可以,因为lsp-bridge天然可以帮emacs做缓存。

3.17五一的时候才发布,3.17的pull机制要长链接,估计只有很少编辑器能支持的了长链接。

基于3.16用lsp-bridge来缓存就挺好的。