最近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/*")))
)
是不是界面刷新太快了,在我补全的那一刻正好有新的东西过来,而界面还没刷新但是实际的补全列表已经刷了,所以旧的没补出来,直接补的新的列表?
你看我前面录制的视频能感觉到闪烁吗?
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-}”.
有可能,最好给一段最小复现代码出来。
我的代理出问题了,现在还看不到你发的视频。
请问 lsp-bridge 的 code format 里 对于 tabSize 以及 insertSpaces 的设置能否给个用户选项,或者像lsp-mode 那样沿用用户设定 和 major-mode 设定
有这个计划,帮忙提交个补丁?
gmail右上角云盘图标点开,然后左上角菜单里有Google画图这个菜单项,打开就可以画。
一般要想好怎么画,注意配色。
提示很明显啊,你要装rust的lsp服务器,在readme都写的有
看着还好哇,不是那么闪呀
搞定了 Add lsp-bridge--formatting-indent-alist option. · manateelazycat/lsp-bridge@d8ce12d · GitHub
和 lsp-mode 的处理一致。
的确不算是什么大问题。
等代码差不多定型之后,我看有没有可能魔改一个终端的版本。目前的 acm 略复杂,而且跟 lsp-bridge 深度绑定,想改有点无从下手。
不过从长远来看魔改的方式终究难以为继,像 corfu 到 corfu-terminal 虽然只改了 3 个函数,但 corfu-doc 到 corfu-doc-terminal 几乎重写了。corfu-doc 的某一次提交直接让 corfu-doc-terminal 不能用了,后来是 corfu-doc 回滚了修改,暂时迁就了后者:
终端的UI不好弄,太麻烦了