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

如果跳转了那就是clangd或者是别的lsp告诉你要跳转到那头文件。这不是lsp客户端的问题

你把compilation_commands.json弄出来了吗?

明白了。没玩过compilation_commands.json。我先研究一下。

1 个赞

lsp-bridge如果发现LSP Server返回的文档是Markdown时, 会调用 markdown-mode 去渲染, 当 markdown-mode 渲染文档或代码时, 会创建很多临时 buffer , 这些临时buffer如果匹配 lsp-bridge-default-mode-hooks 里面的 mode 类型时, 就会导致这些临时 buffer 误调用 lsp-bridge-monitor-before-changelsp-bridge-monitor-after-change函数。

这些临时的Buffer会干扰 lsp-bridge 发送错误的 textDocument/didChange 消息给 LSP Server, 从而导致几个严重的错误:

  1. 诊断误报: 即使代码是对的, LSP Server也返回诊断
  2. 代码补全: 补全偶尔会失效, 补一补的就没反应了
  3. 其他依赖光标位置的功能

今天看了一晚上日志, 终于通过补丁 When user do `delete' operation, `length' is bigger than 0, and the … · manateelazycat/lsp-bridge@e13ba84 · GitHub 修复了。

这个bug估计从 lsp-bridge 弹出API文档支持 Markdown 渲染就有了, 强烈建议大家更新到最新版。

11 个赞

整明白了。按照lsp-bridge文档,做了两件事,现在看代码非常丝滑,比source insight还要爽

1,实现一函数lsp-bridge-set-project-path,来设置lsp-bridge-get-project-path-by-filepath为当前目录

  (defun lsp-bridge-set-project-path ()
	(interactive)
	(setq lsp-bridge-get-project-path-by-filepath
		  (lambda (filepath)
			(save-match-data
			  (and (string-match default-directory filepath)
				   (match-string 0 filepath))))))

2,很多代码只是用来看的,本地无法编译,就写了个脚本造一个 compilation_commands.json,内容就是

  {
    "arguments": [
      "/usr/bin/gcc",
      "-c",
      "-Wall"
    ],
    "directory": "/Users/lula/work/src/src/C/ffmpeg-1.0.10",
    "file": "/Users/lula/work/src/src/C/ffmpeg-1.0.10/ffplay.c"
	}
1 个赞

lsp-bridge解决了补全提示,一键编译/运行、调试有什么插件推荐呢?列举几个常用语言,如c、python、shell等,特别是不和lsp-bridge冲突。

1 个赞

一键编译/运行 推荐 @xiyang 大佬开发的 maple-run

调试同求

1 个赞

编译用 emacs 自带的 compile, 运行用 shell-command ,调试用 dap-mode

1 个赞

dap-mode 似乎是依赖于 lsp-mode 的,是不是会影响 lsp-bridge 的使用?

确实依赖 lsp-mode, 但是可以在不启动 lsp-mode 的情况下使用 dap-debug

3 个赞

不知道有没有用web-mode的小伙伴, 我这里补全时会有很高的几率吃掉一些字符,比如吃掉换行符,后面的行会跑上来, 常见于 script 内, 已经精减了emacs配置, 只留lsp-bridge, 依然能够重现.

Peek 2023-07-03 09-07

可以发一下最小稳定重现的压缩包吗?

lsp-brdige能和dap-mode配合调试吗?如果能,需要怎么安装和配置?

需要安装lsp-mode但又不启动 lsp-mode,这种方案丑陋又怪异

我不用dap-mode,不知道怎么弄

把 lsp-mode 当成 dap-mode 的依赖库就行了。

这种方式确实不太优雅,不过对我来说能用就行,没有时间去实现一个独立的 dap

我是直接开启了lsp-mode和lsp-bridge,然后禁用掉lsp-mode的补全等一些功能,这样就是内存可能用多了,然后有点怪,但是可以使用dap-mode。相关配置如下:

(use-package lsp-mode
  :init
  ;; set prefix for lsp-command-keymap (few alternatives - "C-l", "C-c l")
  (setq lsp-keymap-prefix "C-c l")
  ;; (setq lsp-completion-enable nil)
  (setq lsp-headerline-breadcrumb-enable nil)
  (setq lsp-completion-provider :none)
  (setq lsp-modeline-diagnostics-enable nil)
  (setq lsp-modeline-code-actions-enable nil)
  (setq lsp-lens-enable nil)

  :hook (;; replace XXX-mode with concrete major-mode(e. g. python-mode)
         (dart-mode . lsp)
         (haskell-mode . lsp)
         ;; if you want which-key integration
         (lsp-mode . lsp-enable-which-key-integration))
  :commands (lsp lsp-deferred))

;; Debug
(use-package dap-mode)
;; UI
(use-package lsp-ui :commands lsp-ui-mode)
1 个赞

大家可以说一下都用 dap-mode 的哪些功能? 还有都在哪些语言用 dap-mode ?

也许我下半年有空的时候可以用 lsp-bridge 类似的技术开发一个完全异步的调试框架。

以前之所以没有弄, 主要是公司的事情太多了, 下班修复 EAF lsp-bridge 的issue基本上把我业余时间全部占满了。 还有一个原因跟我自己的坏习惯有关, 我调试代码除非是崩溃的代码, 日常逻辑代码都用目测。 :sweat_smile:

2 个赞

其实 dap-mode 的效果和 emacs 的 gdb-many-windows 效果差不多,但是支持的语言远超 gdb。它可以为所有 dap 协议支持的语言提供一个统一的、美观的调试方法,能把调试信息可视化(省的再去敲命令了)

1 个赞

我平常写代码比看代码多,所以调试器用的少。

2 个赞

是我犯了个低级错误, 我机器上有两版web-mode, 以为加载的是新版, 实际加载的是, 14.*, 改为加载17.*后问题解决. 顺便赞一下大神的作品, 以前试过多种方案补全, 都放弃了, 只有 lsp-bridge 甚至造越了期望值!!!

1 个赞