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

lsp-bridge-restart-process

看输出的日志,有Failed to find compilation database,是打开了一个子目录里面的cc文件。这种情况会往上层目录找compilation database吗

完整的日志有吗? 你配置了 compile_commands.json 吗?

可能是由于我工作的目录是个symbol link,然后往上找是按实际目录找的,我改成了把源代码复制过来就没问题了

1 个赞

补丁合并后, 支持 lsp-bridge-enable-with-tramp 选项

  • lsp-bridge-enable-with-tramp: 打开这个选项后, lsp-bridge 会对 tramp 打开的文件提供远程补全支持, 需要提前在服务端安装并启动 lsp_bridge.py, 注意的是这个选项只是用 tramp 打开文件, 并不会用 tramp 技术来实现补全, 因为 tramp 的实现原理有严重的性能问题

意味着, 现在可以用 dired + tramp 类似的插件远程浏览服务器文件, 当用 tramp 打开文件后, lsp-bridge 会用自己的技术实现高性能代码补全。

8 个赞

前几天有社区朋友提醒我, 其实 lsp-bridge 内置的很多非LSP补全后端都很好用, 能否在LSP Command命令找不到的时候, 依然可以对非LSP Buffer提供TabNine, Words, Path等后端的补全。

刚刚写了一个补丁 Fix issue #733, just disable lsp feature if lsp server command not fo… · manateelazycat/lsp-bridge@64f3ad3 · GitHub

当 lsp-bridge 发现LSP Server Command不存在的时候, 并不会禁用 lsp-bridge-mode, 只是禁用LSP补全, 其他后端依然可以使用。

这样的好处是, lsp-bridge在主要提供LSP补全的同时, 可以让所有内置的非LSP后端补全应用于任何Buffer, 更符合Emacser的使用习惯。

6 个赞

猫大,我看你这个是bash-mode,第一个选项是“Search Word”。是不是这个必须有个语言模式才能触发补全。 若是普通的一个文本文件,譬如txt,markdown文件,能不能也是弹出可选项,这些可选项是“Search Word”? 换句话说,若不属于啥语言模式的文本文件,lsp-bridge找不到对应的语言服务器,就使用最近本的“Search Word” 来补全。

需要自己加hook,因为全部打开的话,不是每个人都喜欢补全的。

1 个赞

因为 org-src-lang-modes 内置的语言太少了, 如果只依赖 org-src-lang-modes 会导致很多常用的语言在 org-mode src block 无法补全。

今天推送了一个补丁, 当 org-mode src block 的语言无法在 org-src-lang-modes 找到时, 就回滚到 src block 写的语言名称去尝试补全, 解决一些常用语言默认无法补全的问题, 比如 python 和 java.

大佬修的真快,昨晚提的,立马修好了。 但是有个问题,如果需要在org文件里补全的话,那就org文件也需要用lsp-bridge-mode,但是用org-roam时候基于[[]] 的标题补全就没了,这个是用的capf补全org-roam标题的。是否可以改为在 org-edit-special 的弹窗里补全?

肯定是可以的,但是我平常用org模式比较少.

建议找现在的后端,按照acm的要求重新写一个补全后端就好了

大佬我在项目下的 main.go 中 M-x lsp-bridge-mode,显示 [LSP-Bridge] Start LSP server (gopls) for /home/gray/p/dae with ’project’ mode, enjoy hacking!

但是我打开项目下其他 .go 文件的时候没有自动启动 lsp-bridge-mode

我理解如果是在 project mode 的时候是不是应该在打开当前项目下文件的时候都开启lsp-bridge-mode 吗(在不用 hook 或 global mode 的情况下

emacs -Q测试过吗?

我在 emacs -q 下测试了,这是配置

(add-to-list 'load-path "/Users/liubo/p/testemacs/lsp-bridge")

(package-install 'go-mode)
(package-install 'markdown-mode)
(package-install 'yasnippet)

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


(require 'lsp-bridge)

分别用一个 go 的项目和一个 c 的项目测试的

在 main.go 中 M-x lsp-bridge-mode 会显示 lsp-bridge-mode 在当前 buffer 开启,没有说 lsp-bridge-mode 运行在 project mode 下,并且没有 lsp 的补全(我已经安装了 gopls),只有 search word 和 tabnine

在 src/config.c 下运行会显示 lsp-bridge 在 keyd 这个项目下以 project mode 运行,并且也有 lsp 的补全,但是切换到 ipc.c 之后就没有开启 lsp-bridge-mode 了,只能再手动 M-x lsp-bridge-mode

最好给点日志吧,因为这个不看日志,不知道你这个情况是什么情况?

这个没问题,得等一会之后才会有补全

这是编辑 main.go 时的日志 https://pastebin.mozilla.org/dXohujTw

切换到 common/debug.go 之后就没有日志输出了,在 c 的项目下同样,只有第一个开启 lsp-bridge-mode 的 buffer 才有

设置 lsp-bridge-enable-debug 为 t 之后在 main.go M-x lsp-bridge-mode

main.go has auto save data; consider M-x recover-this-file
Lsp-Bridge mode enabled in current buffer
You can run the command ‘lsp-bridge-mode’ with M-x ls-mo
Lsp-Bridge mode enabled in current buffer
or: Wrong type argument: lsp-bridge-epc-manager, nil

lsp-bridge buffer 的内容

Unable to find Mach task port for process-id 71754: (os/kern) failure (0x5).
 (please check gdb is codesigned - see taskgated(8))
No stack.

Process *lsp-bridge* exited abnormally with code 1
Unable to find Mach task port for process-id 71756: (os/kern) failure (0x5).
 (please check gdb is codesigned - see taskgated(8))
No stack.
Unable to find Mach task port for process-id 71770: (os/kern) failure (0x5).
 (please check gdb is codesigned - see taskgated(8))
No stack.

所以 lsp-bridge 的 project mode 是指会分析项目下的代码而不是在编辑项目中的文件时会自动启用 lsp-bridge?

那就只能 hook 或者 global 使用了吗

不是这样的, lsp-bridge 会自动打开文件的时候启动的, single-file 还是 project 模式只是传递给 lsp server 的路径不一样。

project 模式会多个文件公用一个 lsp server, 单文件是一个文件用一个 lsp server.

我说的日志是需要打开 lsp-bridge-enable-log 选项, 这样才能知道详细的 lsp server 返回日志。

好的,这是开启 log 之后编辑 go 项目的日志

Eval in Emacs: (lsp-bridge-diagnostic--render '"/Users/liubo/p/dae/main.go" '"" '((:range (:start (:line 7 :character 8) :end (:line 7 :character 12)) :severity 2 :source "go list" :message "This file is within module \".\", which is not included in your workspace.\nTo fix this problem, you can add a go.work file that uses this directory.\nSee the documentation for more information on setting up your workspace:\nhttps://github.com/golang/tools/blob/master/gopls/doc/workspace.md." :data (:Fixes ((:title "Add a go.work file using this module" :kind "quickfix" :command (:title "Run `go work init && go work use`" :command "gopls.run_go_work_command" :arguments ((:ViewID "3" :InitFirst t :Args ("use" "."))))) (:title "Add a go.work file using all modules in your workspace" :kind "quickfix" :command (:title "Run `go work init && go work use -r`" :command "gopls.run_go_work_command" :arguments ((:ViewID "3" :InitFirst t :Args ("use" "-r" "."))))))) :server-name "gopls")))

--- [09:57:48.377080] Recv window/logMessage notification from 'gopls' for project dae
{
   "jsonrpc": "2.0",
   "method": "window/logMessage",
   "params": {
      "type": 3,
      "message": "2023/11/02 09:57:48 background imports cache refresh starting\n"
   }
}

--- [09:57:48.477183] Recv window/logMessage notification from 'gopls' for project dae
{
   "jsonrpc": "2.0",
   "method": "window/logMessage",
   "params": {
      "type": 3,
      "message": "2023/11/02 09:57:48 background refresh finished after 100.789064ms\n"
   }
}

日志太多了,我只拿了切换文件之前的,因为我从 main.go 切换到项目下其他 go 文件后就没有日志输出了, lsp-bridge-mode 也没有在那个文件自动开启

这是编辑 src/config.c 时的日志 --- [10:05:07.326456] Send textDocument/signatureHelp request (25081) to 'ccls' - Pastebin.com 一样在切换到项目下的其他 c 文件时就没有日志了

方便的话,弄一个最小项目文件,发到github上吧,我晚上下班以后看