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

最小配置,emacs -Q 启动如下:

(add-to-list 'load-path "~/.emacs.d/packages/lsp-bridge/")
(add-to-list 'load-path "~/.emacs.d/packages/orderless/")
(add-to-list 'load-path "~/.emacs.d/packages/corfu")
(add-to-list 'load-path "~/.emacs.d/packages/markdown-mode/")
(add-to-list 'load-path "~/.emacs.d/packages/posframe/")

(require 'orderless)
(require 'corfu)
(require 'lsp-bridge)
(require 'lsp-bridge-orderless) ;; make lsp-bridge support fuzzy match, optional
(setq lsp-bridge-completion-provider 'corfu)
(dolist (hook (list 'python-mode-hook))
  (add-hook hook (lambda ()
		   (setq-local lsp-bridge-ui-auto t)
		   (lsp-bridge-mode 1))))
(corfu-mode)
(add-hook 'prog-mode-hook 'global-lsp-bridge-mode)

打开一个Python 文件如 foo.py ,编辑保存后,文件会被保存为 foo.py~.多了个后缀 ~foo.py 没有了。

Emacs-version: GNU Emacs 28.1 (build 1, aarch64-apple-darwin21.3.0, NS appkit-2113.30 Version 12.2.1 (Build 21D62)) of 2022-05-12

lsp-bridge version: a7ec9aa.

大佬 @manateelazycat , 看看呢?

这个是 Emacs 内置的保存机制呀,太恶心了。

直接用我写的 auto-save 吧。

或者尝试设置一下 (setq make-backup-files nil)

在上面的最小配置下增加了下面两行

(require 'auto-save)
(auto-save-enable)

还是上面的问题,会被保存为 foo.py~

如果使用上面的设置,就没有问题了。

使用 auto-save 后,不把 make-backup-files 设置成 nil ,还是会出问题。

那么,只能设置 make-backup-files 为 nil 解决问题了吗?这样就不能进行文件的恢复了吧?

今天写了一个新的补丁

这个补丁的原理是:

  1. lsp-bridge获取诊断信息以后,缓存到 Python 进程
  2. Emacs idle 1秒以后,向Python进程请求诊断信息
  3. 根据Python进程最新的诊断信息在Emacs Buffer绘制诊断波浪线

因为lsp-bridge会在Python进程做缓存,LSP Server 实时大流量的诊断信息不会冲击Emacs导致卡顿, 只会在指头停顿1秒中才会请求当前 Buffer 的诊断信息,这样可以兼顾流畅的编码性能和实时的诊断信息。

大家更新到最新版以后,使用命令 lsp-bridge-jump-to-next-diagnosticlsp-bridge-jump-to-prev-diagnostic 在诊断信息之间快速跳转。

lsp-bridge的诊断信息不需要安装 flycheck 或 flymake, 只要 LSP Server 能够提供补全功能,就可以实现诊断,不需要额外的设置。

就使用 auto-save 配合 git 进行版本管理就好了, Emacs内置的备份功能只会让很多问题变得非常复杂,而且还没解决任何问题。

我已经默认禁用文件备份了

请用 auto-save 以及 git 配合 lsp-bridge 来使用。

你试试我的分支? 改了下这个多余的 “>” 或引号的问题

GitHub - smallzhan/lsp-bridge: Fastest LSP client for Emacs fix-character 分支

fix-character

这个补丁主要解决什么问题? 有稳定重现的问题可以测试吗?

就是那个 c 文件里面 #include <|> 补全会多一个 “>” 的问题。

原理是是什么呢? 能详细说一下吗?

有没有其他副作用?

现在不太清楚有没有副作用。原理是 “#include <|>” 补全时候,log 发现 server 返回时候的 range end 实际上已经包含了 “>” 的位置了,这个判断的依据是:completion 请求的 position 位置小于回复回来的 range end 位置,所以在 :exit-fuction 里面计算 deletion region 的时候,把对应的位置加回去。

测试了下,有的有问题,看了下,好像 lsp server 里面有些不返回 textEdit 的?

{
            "label": "pyqtSignal",
            "kind": 7,
            "data": {
               "workspacePath": "/Volumes/Data/Projects/RPadDoctor",
               "filePath": "/Volumes/Data/Projects/RPadDoctor/qtcvideo.py",
               "position": {
                  "line": 20,
                  "character": 22
               },
               "symbolLabel": "pyqtSignal"
            },
            "sortText": "09.9999.pyqtSignal"
         },
         {
            "label": "property",
            "kind": 7,
            "data": {
               "workspacePath": "/Volumes/Data/Projects/RPadDoctor",
               "filePath": "/Volumes/Data/Projects/RPadDoctor/qtcvideo.py",
               "position": {
                  "line": 20,
                  "character": 22
               },
               "symbolLabel": "property"
            },
            "sortText": "09.9999.property"
         },

对,不是所有的 lsp server 都会返回 textEdit

@Jousimies 说的问题应该能通过 backup-by-copying 方式解决,而且这也不是 lsp-bridge 的问题。emacs 自带的备份功能还是挺好用的,虽然大部分时候有 git,我还是全局配置了每次保存文件时进行备份,直接禁用掉是不是不太友好,虽然可以自定义

我加选项吧,默认打开,避免很多新手搞不懂,高手就禁用吧。

我看 lsp-mode 里面好像是删除操作后又把补全的前缀插入回来,这样文件内容就恢复到了原来的样子,然后才再 server 返回的 range 中插入选项的。不知道是不是这样。

加了一个选项 lsp-bridge-disable-backup , 大佬不喜欢就把这个选项禁用吧。

1 个赞

lsp-bridge 之前也这样做的,但是这样是不对的,prefix 这种逻辑对于 Java 那种 label 是 foo - args - args 的形式, prefix 无法判断准确。