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

emmmm, 我用最小化配置试了下没问题

:joy: 你们反馈问题之前, 建议都 emacs -Q 一下。

哈哈哈抱歉,还有一些其他问题不过都不是主要的

等我好好准备能完整复现一下再来问:sneezing_face::sneezing_face::sneezing_face:

@manateelazycat 我发现另外一个问题: acm好像只能显示固定的十个选项,没法滚动。我输入 lsp-bridge- 这候选项肯定超过十个啊, 你们确定能滚动吗?

emacs -Q 测试过吗?补全插件肯定可以滚动呀

我测过了,是真的。。

  1. emacs -Q
  2. 在 scrath buffer 里面执行:
(push "~/.config/emacs/lib/posframe/" load-path)
(push "~/.config/emacs/lib/markdown-mode/" load-path)
(push "~/.config/emacs/lib/yasnippet/" load-path)
(push "~/.config/emacs/lib/lsp-bridge/" load-path)

(require 'lsp-bridge)

(lsp-bridge-mode 1)

确实不能滚动, 你试一试,我是v29.0.50 mac, 不知道你的行不行

我不用emacs29

哦,我试试其他的版本。

大佬我有个问题,我手动 M-x lsp-bridge-mode 运行之后显示项目已经被它接管,但是打开同项目下另一个文件之后 lsp-bridge-mode 是关闭的状态。

PS:没有用 hook 因为同一个语言有个项目是不开 lsp,所以现在只想通过手动开启 lsp-bridge-mode

使用这个配置可以复现,打开项目下的文件 M-x lsp-bridge-mode 然后打开同项目另一个文件后 C-h v lsp-bridge-mode 的值是 nil

(setq straight-check-for-modifications '(check-on-save find-when-checking))
(setq straight-vc-git-default-clone-depth 1)

(defvar bootstrap-version)
(let ((bootstrap-file
       (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
      (bootstrap-version 5))
  (unless (file-exists-p bootstrap-file)
    (with-current-buffer
        (url-retrieve-synchronously
         "https://raw.githubusercontent.com/raxod502/straight.el/develop/install.el"
         'silent 'inhibit-cookies)
      (goto-char (point-max))
      (eval-print-last-sexp)))
  (load bootstrap-file nil 'nomessage))

(straight-use-package '(lsp-bridge
                        :type git
                        :host github
                        :repo "manateelazycat/lsp-bridge"
                        :files ("*")))

我不用包管理器,没时间调研包管理器自己的问题 抱歉。

你在当前 buffer 开启 lsp-bridge-mode,这是 local 的,只能对当前 buffer 生效,项目地址只是发送给 lsp server 分析及标记当前 server 的,你切到其它文件,lsp-bridge-mode 相对该文件肯定是 nil。这是所有 minor-mode 的 feature,只要不是 global 启用的 ,都是这个表现。你想要的效果,应该能通过 .dir-locals.el 来实现

(你描述的项目已经被接管,只是这个文件及项目根目录被发送给了 lsp server,至于项目中其它的文件,主动帮你开启 lsp-bridge-mode 并不是 lsp-bridge 的职责,这是正常 mode 通用的表现)

谢谢懒猫,我遇到一个小 bug,提了一个 PR :vulcan_salute:

跟包管理器没关系吧,我这样一样有这个问题

(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)

我不知道为啥你要手动启动lsp-bridge, 能说一下你的目的吗?我看不懂你描述的问题,什么叫接管了?

确实有这个问题,已经合并,感谢补丁。

1 个赞

对于手动启动:

  1. 多语言有很多语言我没有装 lsp server,也不需要,因为只是偶尔需要看一下
  2. 单语言不同项目基本只有 1-2 个会开,而且有的时候代码在服务器上,用 tramp 查看的时候如果全局开了 lsp-bridge 也会报错

所说的接管了是指 lsp-bridge 输出的信息表示运行在 project mode,所以我认为如果打开这个项目其他文件的时候 lsp-bridge-mode 也应该是开启的(但现在是关闭的,只有一开始手动开启的那个文件的 lsp-bridge-mode 是开启的)

那正确的做法是全局依然要开启,如果文件符合tramp路径就不开启呀。

这样弄最简单。

vue代码会有如下报错


--- Send (notification): workspace/didChangeConfiguration

--- Send (notification): textDocument/didOpen

--- Send (34865): textDocument/signatureHelp
Traceback (most recent call last):
  File "/Users/liyuan/elisp/lsp-bridge/lsp_bridge.py", line 110, in event_dispatcher
    getattr(self, func_name)(*func_args)
  File "/Users/liyuan/elisp/lsp-bridge/lsp_bridge.py", line 247, in _do
    action.call(name, *args)
  File "/Users/liyuan/elisp/lsp-bridge/core/fileaction.py", line 111, in call
    return self.send_server_request(self.single_lsp_server, method, *args, **kwargs)
  File "/Users/liyuan/elisp/lsp-bridge/core/fileaction.py", line 220, in send_server_request
    handler: Handler = self.method_handlers[lsp_server.server_info["name"]][handler_name]
AttributeError: 'NoneType' object has no attribute 'server_info'

vue现在默认是volar和emmet-ls两个服务器,你的lsp server没安装全吧?

我去检查了一下,本地的server是安装全的。

我记得我之前vue用的了vls,不过本地项目是用的vue2,不清楚会不会和这个有关系,之前修改了volar.json中的command值为vue-language-servervls,不过不影响使用,因为我用了vls的后端服务,这次发布了多服务的功能后,修改回去后调用lsp-bridge-find-def会报以上错误