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

修复了,给的clangd默认启动参数不对,我修正了一下

有个bug,retina屏水果笔记本上,是缩放的,lbcf.el里面的(window-absolute-pixel-position) 取到的当前cursor的x和y坐标值不能直接用。

company-mode 是好的吗?

各位千万别忘了还有Vue项目没有支持啊
@jadestrong

是的,lsp-mode + company的如图:

@zerol 大佬在移植 company-box 到 lsp-bridge , 稍等一下。

看到 3ee3c 的commit已经加了 company-box相关的代码,后面又revert了。是不是要把整个company-box代码搬过来。

那个补丁还有点小问题,准备把 company-box 搬过来以后只留 lsp-bridge 需要的代码,其他删除,然后继续优化。

好的,看了一下company-box的代码,里面有根据frame大小来判断应该在什么position显示frame的代码。这样就不用自己再处理了。

对,要稍微等 @zerol 大佬一下,上午我试了一下,80%代码可以工作了。

我一直在试验 corfu, 但是没成功。我感觉原理是没问题的,昨天看 lbcf 也是在 push 的回调里面直接 lbcf-show 的。corfu 这边思路是这样,帮看看是不是有不合理。

  1. 取消 corfu-auto, 这样 corfu 就不会主动去调用 completion 了,纯需要手动触发 (使用 M-x completion-at-point 或对应快捷键)
  2. 在 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)))
1 个赞

大佬,这段代码好用呀,我这边设置了 (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)))
1 个赞

你太棒了,我测试一下没问题就推送对 corfu 的支持,这样我就不用重新写一个类似 corfu 的功能了。

现在直接用 corfu 来补全 lsp-bridge 代码了 Use corfu as completion ui. · manateelazycat/lsp-bridge@baac749 · GitHub

感谢大佬补丁。

4 个赞

corfu 体验贼棒,本周要出一个视频来安利下这个大杀器。

6 个赞