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

最近go下面会遇到显示的补全项和真实补全出来的不一样,很奇怪。

Mine

(use-package lsp-bridge
  :hook (prog-mode . lsp-bridge-mode)
  :quelpa ( lsp-bridge :fetcher github :repo "manateelazycat/lsp-bridge"
            :files ("*.el" "*.py" "*.json"
                    ("acm" "acm/*")
                    ("core" "core/*") ("langserver" "langserver/*")))
)
1 个赞

是不是界面刷新太快了,在我补全的那一刻正好有新的东西过来,而界面还没刷新但是实际的补全列表已经刷了,所以旧的没补出来,直接补的新的列表?

你看我前面录制的视频能感觉到闪烁吗?

debug 了一下,发现我前面判断不完全准确。

  • 当候选列表不变时,(erase-buffer) 之后的确 frame 大小没有伸缩,但是会出现短暂的空白,这应该是闪烁的主要来源。

  • 如果候选列表发生变化,空白+尺寸伸缩叠加,闪烁就更明显一些。

除了提升硬件,我看目前在 Emacs 上应该是没办法解决了,除非专门搞一个双缓冲的底层update 接口。

你的视频我确实看到在闪。。是有点难受

比较简单粗暴。就是把对应的 snippet 里面的 ${0:xxx} 之类的替换成 tempel 语法。没考虑嵌套以及其他带有 regexp 的复杂情况,基本没发现这些复杂的 lsp snippet。。。目前看 clangd 有点问题,展开后再删除会挂。没空仔细研究,给 tempel 提 bug 了。

(defun acm-backend-lsp-snippet-expansion-fn ()
    'tempel-expand-lsp-snippet)
  
  (defun tempel-expand-lsp-snippet (snippet)
    (message snippet)
    (let* ((placeholder-re 
            "\\${[0-9]+:\\([_a-zA-Z][-_a-zA-Z0-9 *.,]*\\)}\\|\\${?[0-9]+}?") 
           (positions (s-matched-positions-all placeholder-re snippet))
           (matches (s-match-strings-all placeholder-re snippet))
           (template '())
           (last-match 0))
          (when positions
            (dolist (i (number-sequence 0 (- (length positions) 1)))
              (let ((pos (nth i positions))
                    (match (nth i matches)))
               (setq now-match (car pos))
               (if (> now-match last-match)
                   (push (substring snippet last-match now-match) template)) 
               (setq field-name (cadr match))
               (if field-name 
                   (push `(p ,field-name) template)
                (push 'p template))
               (setq last-match (cdr pos)))))
          (when (< last-match (length snippet))
           (push  (substring snippet last-match) template)
         
           (tempel-insert (reverse template))))))

tempel 里面最好配置下把 TAB 绑定到 tempel-next. 他默认是 “M-}”.

1 个赞

有可能,最好给一段最小复现代码出来。

我的代理出问题了,现在还看不到你发的视频。

请问 lsp-bridge 的 code format 里 对于 tabSize 以及 insertSpaces 的设置能否给个用户选项,或者像lsp-mode 那样沿用用户设定major-mode 设定

有这个计划,帮忙提交个补丁?

gmail右上角云盘图标点开,然后左上角菜单里有Google画图这个菜单项,打开就可以画。

一般要想好怎么画,注意配色。

在看大佬推荐的 rust 语言圣经,提示如上。用的是这个话题下面的配置,使用的是 doom。

提示很明显啊,你要装rust的lsp服务器,在readme都写的有

看着还好哇,不是那么闪呀

谢谢,解决了,说到闪烁,我好像也有,但我的是第一次输入的时候会有白色块闪烁,以后就不会有了。https://imgur.com/a/2U4HSwv

搞定了 Add lsp-bridge--formatting-indent-alist option. · manateelazycat/lsp-bridge@d8ce12d · GitHub

和 lsp-mode 的处理一致。

2 个赞

的确不算是什么大问题。

等代码差不多定型之后,我看有没有可能魔改一个终端的版本。目前的 acm 略复杂,而且跟 lsp-bridge 深度绑定,想改有点无从下手。

不过从长远来看魔改的方式终究难以为继,像 corfu 到 corfu-terminal 虽然只改了 3 个函数,但 corfu-doc 到 corfu-doc-terminal 几乎重写了。corfu-doc 的某一次提交直接让 corfu-doc-terminal 不能用了,后来是 corfu-doc 回滚了修改,暂时迁就了后者:

终端的UI不好弄,太麻烦了

@LuciusChen @twlz0ne 我感觉你们的闪烁是不是 macOS 工作区导致的问题啊?

在 Linux 下不可能这么闪烁的。

我在MacOS M1上使用不闪。


这个 border 怎么那么宽。