最小配置,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 , 看看呢?
或者尝试设置一下 (setq make-backup-files nil)
在上面的最小配置下增加了下面两行
(require 'auto-save)
(auto-save-enable)
还是上面的问题,会被保存为 foo.py~
如果使用上面的设置,就没有问题了。
使用 auto-save 后,不把 make-backup-files 设置成 nil ,还是会出问题。
那么,只能设置 make-backup-files 为 nil 解决问题了吗?这样就不能进行文件的恢复了吧?
今天写了一个新的补丁
committed 12:07PM - 28 May 22 UTC
这个补丁的原理是:
lsp-bridge获取诊断信息以后,缓存到 Python 进程
Emacs idle 1秒以后,向Python进程请求诊断信息
根据Python进程最新的诊断信息在Emacs Buffer绘制诊断波浪线
因为lsp-bridge会在Python进程做缓存,LSP Server 实时大流量的诊断信息不会冲击Emacs导致卡顿, 只会在指头停顿1秒中才会请求当前 Buffer 的诊断信息,这样可以兼顾流畅的编码性能和实时的诊断信息。
大家更新到最新版以后,使用命令 lsp-bridge-jump-to-next-diagnostic
和 lsp-bridge-jump-to-prev-diagnostic
在诊断信息之间快速跳转。
lsp-bridge的诊断信息不需要安装 flycheck 或 flymake, 只要 LSP Server 能够提供补全功能,就可以实现诊断,不需要额外的设置。
就使用 auto-save 配合 git 进行版本管理就好了, Emacs内置的备份功能只会让很多问题变得非常复杂,而且还没解决任何问题。
manateelazycat:
make-backup-files
我已经默认禁用文件备份了
已提交 12:30PM - 28 May 22 UTC
请用 auto-save 以及 git 配合 lsp-bridge 来使用。
这个补丁主要解决什么问题? 有稳定重现的问题可以测试吗?
就是那个 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 无法判断准确。