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

要是把 3. 让 lsp-bridge 支持远程部署 做完了,怕不是成 Emacs 大杀器了,现在 Tramp 的体验实在难受,lsp 配套也跟不上,公司环境还有 ssh 限制,要实现远程开发太难了

等明年吧,今年太忙了。

即使农历年,距离明年也就一个月了 :laughing:

肯定不会那么快的,不要期待过高。

哈哈,就是开个玩笑,Tramp 的问题难了这么多年了,也不期待几个月能解决这个问题,只是看到 lsp-bridge 的设计和你的计划,感觉有盼头了

有人在用lsp-bridge时遇到这个问题么,epc error search_elisp_symbols_update

更新最新版后需要重启emacs

1 个赞

多谢大佬,终于在doom emacs里用上了

可以用下面的代码跟gd命令整合

(set-lookup-handlers! 'rustic-mode :async t
    :definition #'lsp-bridge-find-def
    :implementations #'lsp-bridge-find-impl)

这个 --cancellationReceive 选项加了, pyright 就不会吐出诊断信息了, 奇怪, 我研究一下。

引入这个选项会导致不发送诊断信息, 我 copy 了一个 pyright-background-analysis.json, 大佬在意性能, 可以把 lsp-bridge-python-lsp-server 设置成 pyright-background-analysis 就可以了。

当然正确的做法是微软应该去掉这种私货选项, pyright 的一些高级功能已经违背了微软自己建立的 LSP 标准。

3 个赞

懒猫是否方便给一个 lsp-bridge-get-project-path-by-filepath 的例子,Emacs lisp 水平有限,写来写去总碰壁,要不就不好使

主要就是给一个路径列表,然后匹配到这个路径的文件就用这个路径当 project root

这个函数很好写啊, 它就只有一个参数 filepath, lsp-bridge 打开 filepath 这个文件的时候就传递给 lsp-bridge-get-project-path-by-filepath

(defun get-project-path (filepath)
   "/home/user/project")

就这么简答, 只不过你要自己写上面函数的逻辑, 匹配的就返回一个字符串, 不匹配就返回 nil 就好了。

lsp-bridge 发现 lsp-bridge-get-project-path-by-filepath 返回 nil 的时候就会继续查找 git 命令的查询结果。

1 个赞
(setq lsp-bridge-get-project-path-by-filepath
        (lambda (filepath)
          (save-match-data
            (and (string-match "/home/xinyifly/git/foo/\\([^/]*\\)" filepath)
                 (match-string 0 filepath)))))

我的场景是 monorepo,匹配到 foo 之后用 foo 里面的一级子目录作为 lsp-bridge 的项目目录。

需要注意的是 defcustomdefun 的名称空间不同。

1 个赞

有个关键的问题没弄懂,怎么跳出循环呢?

我是直接给出一个预期的路径列表,匹配了就返回,一开始用 dolist 执行的,但是一直不知道怎么在匹配之后不执行后面的迭代,后来改成 while,特别丑陋。。。

(setq lsp-bridge-get-project-path-by-filepath
      (lambda (path)
        (let ((found nil)
              (whitelist '("/path1"
                           "/path2")))
          (while (and (not found)
                      whitelist)
            (setq project (car whitelist))
            (setq whitelist (cdr whitelist))
            (if (string-prefix-p project path)
                (setq found t)))
          (if found
              project
            nil))))

cl-return

1 个赞

改成 cl-dolist 和 cl-return 可以了,之前试过 cl-return,没注意要用 cl-dolist 才行

今天提送了一个补丁, 使得 TypeScript 的补全耗时从 300ms ~ 5000ms 降低到 30ms ~ 1000ms , 补全性能提升 5~10倍, 感谢 @vritser 大佬的反馈。

4 个赞

这好像有个小bug,调用了 cl-return 所以这是不是需要改成 cl-dolist? 现在调用这个函数会报错

我用手机打了个补丁,应该没问题。

感谢反馈。

1 个赞

感谢!遇到另外一个问题。当buffer里有2个diagnostic error,使用lsp-bridge-diagnostic-jump-next只能跳到第一个error。原因是我用了这个hydra插件,当我按 , 或 SPC 呼出hydra menu的时候就会触发lsp-bridge-monitor-post-command,进而调用lsp-bridge-hide-diagnostic-tooltip函数,这导致lsp-bridge-in-diagnostic-overlay-area-p总返回nil(因为lsp-bridge-diagnostic-frame总是nil

请问有什么workaround吗?