修复了,给的clangd默认启动参数不对,我修正了一下
company-mode 是好的吗?
看到 3ee3c
的commit已经加了 company-box相关的代码,后面又revert了。是不是要把整个company-box代码搬过来。
那个补丁还有点小问题,准备把 company-box 搬过来以后只留 lsp-bridge 需要的代码,其他删除,然后继续优化。
好的,看了一下company-box的代码,里面有根据frame大小来判断应该在什么position显示frame的代码。这样就不用自己再处理了。
我一直在试验 corfu, 但是没成功。我感觉原理是没问题的,昨天看 lbcf 也是在 push 的回调里面直接 lbcf-show 的。corfu 这边思路是这样,帮看看是不是有不合理。
- 取消 corfu-auto, 这样 corfu 就不会主动去调用 completion 了,纯需要手动触发 (使用 M-x completion-at-point 或对应快捷键)
- 在 push 的处理里面,lsp-bridge-completion-items 赋值之后,直接触发 completion-at-point 来激活 corfu 显示。这样 corfu 实际只用负责展示 completion-items, 不需要管什么时候触发,触发逻辑全靠 lsp-bridge.
不过这个方案没成功,push 那里直接写 (completion-at-point) 无法调出,但是手动调用是可以的。不知道是不是哪里用得不对。
corfu 有只移动 frame 但是不要隐藏 frame 的接口吗? 因为 lsp-bridge 的设计是,不轻易关闭 completion-ui 避免闪烁。
corfu 我试了一下,要把 1101 行注释掉 completion-at-point 才能正常工作,但是出现了新的敲打字符后会自动插入多余字符的问题。
看来 lsp-bridge 这种主动 push 的设计还是有点和 corfu 预期的场景不太一样。
corfu 好像可以,我把 corfu-auto 触发补全的函数抄过来,替换 lbcf-show,实测可以出现补全项
(setq corfu-auto nil)
(defun lsp-bridge-record-completion-items (filepath prefix common items)
(dolist (buffer (buffer-list))
(when (string-equal (buffer-file-name buffer) filepath)
(setq-local lsp-bridge-completion-items items)
(setq-local lsp-bridge-completion-prefix prefix)
(setq-local lsp-bridge-completion-common common)
;; (message "*** '%s' '%s' '%s'" prefix common items)
(cond
;; Hide completion frame if only blank before cursor.
((and (not (split-string (buffer-substring-no-properties (line-beginning-position) (point))))
(string-equal prefix ""))
(lbcf-hide))
;; Show completion frame when receive completion items.
((and (>= (length items) 1) ; items is more than one
(not (string-equal (car items) ""))) ; not empty items list
;; (lbcf-show lsp-bridge-completion-items)
(pcase (while-no-input ;; Interruptible capf query
(run-hook-wrapped 'completion-at-point-functions #'corfu--capf-wrapper))
(`(,fun ,beg ,end ,table . ,plist)
(let ((completion-in-region-mode-predicate
(lambda () (eq beg (car-safe (funcall fun)))))
(completion-extra-properties plist))
(setq completion-in-region--data
(list (if (markerp beg) beg (copy-marker beg))
(copy-marker end t)
table
(plist-get plist :predicate)))
(corfu--setup)
(corfu--update))))
)
;; Otherwise hide completion frame.
(t
(lbcf-hide))))))
(defun lsp-bridge-capf ()
(let (
(bounds (bounds-of-thing-at-point 'symbol)))
(list (car bounds) (cdr bounds)
lsp-bridge-completion-items
:exclusive 'no)))
大佬,这段代码好用呀,我这边设置了 (setq corfu-auto-prefix 0) 为啥打 os.path. 后面的不补全呀? 要在点以后打一个字符才补全
应该是 lsp-bridge-capf 的原因
这个是 bounds-of-thing-at-point
拿不到东西,改一下应该可以
(defun lsp-bridge-capf ()
(let (
(bounds (bounds-of-thing-at-point 'symbol)))
(list (or (car bounds) (point))
(or (cdr bounds) (point))
lsp-bridge-completion-items
:exclusive 'no)))
你太棒了,我测试一下没问题就推送对 corfu 的支持,这样我就不用重新写一个类似 corfu 的功能了。
现在直接用 corfu 来补全 lsp-bridge 代码了 Use corfu as completion ui. · manateelazycat/lsp-bridge@baac749 · GitHub
感谢大佬补丁。
corfu 体验贼棒,本周要出一个视频来安利下这个大杀器。