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

我这边找到一个能够准确复现的c++库 cstring :rofl:

image

1 个赞

大佬厉害呀,已经可以了?

我以为只有我有这个问题呢,我是ccls时会出现。我绑了个快捷键自动删了再敲的workaround,我是删一个字符就管用

我是先退回lsp-mode, 等这个问题有人解决了再切回lsp-bridge :rofl:

同,我也碰到了,输入太快候选项就不会更新。

给个测试代码吧

@manateelazycat 大佬看看能否复现,我单元测试了,不是每次必现,有概率,可能和敲的快慢有关。

content of test.el

(let ((d (expand-file-name "~/.emacs.d.spacemacs/elpa/28.1/develop/")))
  (when (file-directory-p (expand-file-name d))
    (setq package-user-dir d)))
(require 'package)
(package-initialize)
(add-to-list 'load-path "/data/terrytsao/software/elisp/lsp-bridge/")
(require 'lsp-bridge)
(find-file "/tmp/test.cpp")
(lsp-bridge-mode 1)

我这样运行

$ emacs -Q --load /path/to/test.el

环境:

emacs 28.1自己编的
arch linux

其它还有需要麻烦@我提供


我比较容易复现图片里的方式是删到 #include < 开始快速敲 str

1 个赞

大佬有空看一下吧,谢谢。

PS:我的单元测试里是clangd的single file mode的结果,还没测ccls。

#include <str 这个我试验了很多遍快速输入, 每次都是正常的。

删到小于号后, 慢敲 cs 能复现上图吗? :joy: 我这儿复现很稳

1 个赞

更新这个补丁吧, 我直接把 lsp-bridge 检查是否应该发送 textDocument/completion 请求的判断代码给删除了, 只要文件发生变化就一直给 LSP Server 发送补全请求。

之前是因为某个 LSP Server 开发者说可以在某些情况下不发送补全请求, 所以加了一些判断。

现在看来不用判断, 一直发就好了, lsp-bridge 足够快+多线程设计, 一直发LSP请求不会导致任何卡顿, 删除这些没用代码也彻底解决你们反馈的问题。 @Jerry @TerryTsao @Peter-Chou @zhscn

5 个赞

感谢大佬,简直给力。

修复就好,产品需要大家多测试,才能进化到最佳实践的状态,才好用。

2 个赞

大佬有个问题,server 返回 snippet 的时候(例如填写函数参数),如果填写参数的时候 acm 弹出补全项再按 tab 就不是补全而是跳到下一个参数的位置

我觉得是不是应该在有补全项的时候按 tab 进行补全,没有补全项的时候按 tab 跳转到 snippet 的下一个位置,之前用 corfu 的时候也有这个问题,不过可以自定义函数解决

  (defun eat/yas-next-field-or-maybe-expand ()
    "Try complete current cond or `yas-next-field-or-maybe-expand'.

Sometime lsp client return a snippet and complete didn't work(TAB will jump to next field),
so try complete filst, if there nothing to complete then try to jump to next field or expand."
    (interactive)
    (or (corfu-insert) ;; NOTE this works
        ;; (acm-insert-common) ;; TODO this will break yas status and still try to complete even there's no cond
        (yas-next-field-or-maybe-expand)))
  (define-key yas-keymap (kbd "<tab>") 'eat/yas-next-field-or-maybe-expand)
  (define-key yas-keymap (kbd "TAB") 'eat/yas-next-field-or-maybe-expand)

最小话配置即可复现

(add-to-list 'load-path "~/.config/emacs/posframe")
(add-to-list 'load-path "~/.config/emacs/lsp-bridge")
(add-to-list 'load-path "~/.config/emacs/markdown-mode")
(add-to-list 'load-path "~/.config/emacs/yasnippet")

(require 'yasnippet)
(yas-global-mode 1)

(require 'lsp-bridge)
(global-lsp-bridge-mode)

你可以尝试

(if (and (boundp 'acm-frame) (acm-frame-visible-p acm-frame))
    (acm-complete)
  (yas-next-field-or-maybe-expand))

不知道, 这个代码是否满足你的需要?

我试了下好像没有效果

(add-to-list 'load-path "~/.config/emacs/posframe")
(add-to-list 'load-path "~/.config/emacs/lsp-bridge")
(add-to-list 'load-path "~/.config/emacs/markdown-mode")
(add-to-list 'load-path "~/.config/emacs/yasnippet")

(defun eat/yas-next-field-or-maybe-expand ()
  (interactive)
  (if (and (boundp 'acm-frame) (acm-frame-visible-p acm-frame))
      (acm-complete)
    (yas-next-field-or-maybe-expand)))

(require 'yasnippet)
(yas-global-mode 1)
(define-key yas-keymap (kbd "<tab>") 'eat/yas-next-field-or-maybe-expand)
(define-key yas-keymap (kbd "TAB") 'eat/yas-next-field-or-maybe-expand)

(require 'lsp-bridge)
(global-lsp-bridge-mode)

我是用这个文件测试的, keyd/keyboard.c at master · rvaiya/keyd · GitHub 补全 cache_set 函数参数的时候

emacs-acm-yas-test

是 acm-continue-commands 的原因, 我推送了一个新的补丁 Do complete or expand yasnippet, you need binding this funtion to `<t… · manateelazycat/lsp-bridge@39bfa3b · GitHub

你试一下

(define-key yas-keymap (kbd "<tab>") 'acm-complete-or-expand-yas-snippet)

可以在 snippet 状态下补全了,不过没法跳到下个 field,好像 acm 一直在弹出补全项(后面是一直在按 tab)

2

需要继续完善 acm-complete-or-expand-yas-snippet 函数, 自己尝试研究一下吧, 欢迎发送补丁。