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

大小写看一下corfu得orderless怎么配置吧

(require 'lsp-bridge-orderless)

应该是 require 这个就好了。

像 flycheck 那样在 mode-enable 或者是 save 的时候进行诊断或许也不错?

对,不要实时都还好,只是最近时间不多,慢慢进化吧。

太着急我的睡眠就会不足。

1 个赞

按照大佬所说的,我先更新了最新 lsp-bridge。复制了大佬提供的这份init.el。
用 emacs -Q 启动
然后在 emacs 中 执行了

package-initialize
load-file
~/.emacs.d/init.el

问题依然存在!

那我真的不懂了,确实无法复现

嗯嗯。那就先放一放吧!大佬注意休息!别太劳累啦!这个问题,以后能解决更好!如果找不到原因,最多我改变一下使用习惯,多按一下退格键删除多出来的 > 就好啦! :grin:

你可以给corfu-insert 和 corfu-complete 做advice, 发现行尾有两个 > 的时候自动删除一下多余的 >

好的!我试试! :ok_hand:

我才写了一个补丁,避免每敲一个字符都发送补全请求

现在只有满足下面三个条件之一才会发送补全请求:

  1. 光标前的字符是 trigger characters 发送补全请求
  2. 补全窗口没显示发送补全请求
  3. 最后一次补全列表是空

这样可以保障 os.path.xxx 敲 xxx 的过程中不再发送补全请求,同时也完整支持 corfu 的所有高级功能,比如 orderless 和 separator 。

这个补丁应该可以提高 volar 这种 LSP Server 的补全性能。

是不是敲 “<” 的时候已经自动补 “>” 了?录个屏幕看看?我这敲 “<” 不会补全 “>” 所以没啥问题。

单纯敲 < 不会补全 >
在 <> 内部敲 stdio.h 才会多补一个 >
目前已经通过一个简单的 advice-add 简单粗暴得实现了想要的效果,自动删除掉多余的 > 了! :blush:

(advice-add 'corfu-insert
			:after (lambda()
					 (when (or
							(string-equal (file-name-extension buffer-file-name) "c")
							(string-equal (file-name-extension buffer-file-name) "cpp")
							(string-equal (file-name-extension buffer-file-name) "h")
							)
					   (delete-char -1)
					   )
					 )
			)

你这个。。。。会把其他补全也都删除最后一个的吧。需要判断一下 “>”

目前自己使用这个简单粗暴的方式,实现了删除多余的 > :blush:

;;; add-hook 的方式有问题,本来是想只对 c/cpp-mode生效,
;;; 但在先打开c/c++文件后,再编辑其它类型文件比如python文件,
;;; 也会对python文件生效
;;; 因为对 hook、advice 了解还比较浅薄
;;; 所以暂时等社区大佬或道友给出正确 hook
;; (add-hook 'c-mode-hook #'(lambda()
;; 						 (advice-add 'corfu-insert
;; 									 :after (lambda()
;;											  (delete-char -1)
;; 											  )
;; 									 )))

;;; 目前通过以下简单粗暴的方式实现了想要的效果
;;; 因为是自己用,就没有加上对前后字符 > 的判断
;;; 其实说实话,我是不会
(advice-add 'corfu-insert
			:after (lambda()
					 (when (or
							(string-equal (file-name-extension buffer-file-name) "c")
							(string-equal (file-name-extension buffer-file-name) "cpp")
							(string-equal (file-name-extension buffer-file-name) "h")
							)
					   (delete-char -1)
					   )
					 )
			)

是的,目前我不会写判断 :sweat_smile:望赐教!

基于你的这个描述,干嘛要先敲 <> 再补全。。。 直接敲 < 去自动补全不就好了。

因为,在敲 #include 时,按tab键就自动输入了

#include <|>

并且光标停留在了<>内部,这时再输入 std 就会出现候选,并且每个候选尾部都带一个 >,类似这样的形式

stdio.h>

那么加上之前的 #include<> 就变成了

#include <stdio.h>>

整个过程是不用敲 < 或 >的

因为是给 corfu-insert加的advice。所以目前我这边是按 回车键 才会生效,删除多余的>。根据我个人的使用情况,没有出现误删 :blush:下一步是想研究一下判断光标前后字符是否都为 ’>’,再决定执行。

光标前用 before-char 光标后用 after-char

字符转字符串应该是 char-to-string

我手机打的字,API名字不一定记得准。