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

这个要在 LSP 语言里查找才行, 不要在 elisp 里面看。

C-h v 找不到, 但是在eval里面看到了,好奇怪

Eval expression:

(buffer-local-value 'acm-backend-lsp-server-names (current-buffer))
;; => ("tailwindcss" "typescript-ls" "emmet-ls")

我现在方法是:

  (defun my/bridge-server-setup ()
    (when (bound-and-true-p acm-backend-lsp-server-names)
      (with-current-buffer (current-buffer)
        (let ((servers (buffer-local-value 'acm-backend-lsp-server-names (current-buffer))))
          ;; enable : in emmet completion
          (when (member "emmet-ls" servers)
            (setq-local lsp-bridge-completion-hide-characters
                        (delete ":" lsp-bridge-completion-hide-characters)))
          ;; enable - in tailwindcss completion
          (when (member "tailwindcss" servers)
            (modify-syntax-entry ?- "w"))))))

  (add-hook 'lsp-bridge-mode-hook
            (lambda ()
              (run-with-timer 3 nil #'my/bridge-server-setup)))


我加了一个判断逻辑, 如果 acm-backend-lsp-server-names 这个局部变量存在就直接返回 acm-backend-lsp-server-names 的值, 这样不管是用户自定义配置、还是按照扩展名和mode规则,一旦LSP server启动了, 就按照 acm-backend-lsp-server-names 的值来返回。

不知道能不能解决你的问题, 至少加上去, 确实会让这部分代码执行更快, 因为 lsp-bridge 在各个功能都用了 lsp-bridge-has-lsp-server-p 这个检查函数。

好的,我已经用上了, 最终解决方案

  (defun my/bridge-server-setup ()
    (with-current-buffer (current-buffer)
      (when (bound-and-true-p acm-backend-lsp-server-names)
        (let ((servers acm-backend-lsp-server-names))
          ;; enable : in emmet completion
          (when (member "emmet-ls" servers)
            (setq-local lsp-bridge-completion-hide-characters
                        (delete ":" lsp-bridge-completion-hide-characters)))
          ;; enable - in tailwindcss completion
          (when (member "tailwindcss" servers)
            (modify-syntax-entry ?- "w"))))))

  (add-hook 'lsp-bridge-mode-hook
            (lambda ()
              (run-with-timer 3 nil #'my/bridge-server-setup)))

传统上has-server返回的是一个json文件名, 而names返回的是一个列表,感觉返回值不怎么一致, 确定代码其他用到的地方没问题?

我直接用那个 server-names变量, 不用has-server-p来判断了,你这个也可以改回去,要不然的话可能其他地方出问题,毕竟返回值变了

应该没事, 跑一段时间吧, 加了感觉更快。

@manateelazycat 大佬,今天 pull 了最新代码后出现一个问题,您有时间的话可以看一下。js-ts-mode 中使用 lsp-bridge,选中候选项然后回车会报错,无法补全,我确认了下是最新的 commit 有关,回退上一个没有这个问题。另外 python (pyright) 没有问题

commit:1f47c8fbf4b145e4f8b42dc1aebf096e4cd159f9

server:typescript-language-server

mac emacs-plus 30.0.50

帮我提一个issue嘛,我晚上看一下

已提,麻烦啦 :grin:

最新的 commit 已经 revert 了, 看来 capabilites 配置还是要一点点微调, 不能大范围改。

好嘞,麻烦啦 :grin:

将org升级到org-9.7.4在补全python代码时出现如下的提示:

Send textDocument/signatureHelp request (2977) to 'pyright' for project test.org
Recv message (error):
{
   "jsonrpc": "2.0",
   "id": 2977,
   "error": {
      "code": -32603,
      "message": "Request textDocument/signatureHelp failed with message: index is out of range"
   }
}

在org-9.6.29 下没有问题。mac, emacs-plus@29

我很少用 org , 欢迎发送测试文档, 要不不知道怎么解决。

发现一个小bug, lsp-bridge-popup-documentation 命令弹出的acm-frame 背景色异常.

我必须先激活一次 acm的补全frame, 之后popup documentation的背景色才正常,如果直接popup的话,背景色会不正常.

录屏2024-06-26 10.53.10 (1)

怎么重现的?

就是正常启动啊, 我还排除了主题因素. 正常启动直接call lsp-bridge-popup-documentation和 先激活补全acm一次,之后再启动 popup.我感觉是初始化的问题,可能有些东西要acm补全才能激活.

我昨晚试了, 直接启动就调用文档弹出, 没有这个问题。

我建议你 emacs -Q 排查一下配置。

今天推送了新的补丁, lsp-bridge Python 默认 LSP Server 改成了 basedpyright, basedpyright 默认把微软在闭源 pylance 里藏的功能都暴露出来了。

具体的特性可以查看 basedpyright 的官网: BasedPyright

6 个赞

今天晚上一口气给 GitHub - manateelazycat/lsp-bridge: A blazingly fast LSP client for Emacs 加了很多语言的LSP支持, 包括 basedpyright, Ada, marksman, Perl, Futhark, PureScript, Mint, lua-lsp.

截止 2024-07-06, lsp-bridge 已经支持 92 种 LSP 语言服务器, 代码提交超过 2506 个补丁, 合并529个社区补丁, 全世界开发人员超过124位。

21 个赞