求助:lsp-bridge pyright配置问题

本人Emacs新人,debug功底薄弱,最近配置lsp-bridge(目前主要是用pyright)遇到了一些问题无法解决,来社区请教各位大佬。

目前已经基本排除跟别的package冲突的可能(只保留straight、pyvenv和yasnippet、markdown-mode和lsp-bridge依然存在问题)。lsp-bridge配置如下(pyvenv直接copy的wiki里的):

(use-package lsp-bridge
  :straight '(lsp-bridge :type git :host github :repo "manateelazycat/lsp-bridge"
            :files (:defaults "*.el" "*.py" "acm" "core" "langserver" "multiserver" "resources")
            :build (:not compile))
  :ensure t
  :init
  (global-lsp-bridge-mode)
  :config
  ;; (setq lsp-bridge-python-lsp-server 'pyright)
  (setq lsp-bridge-enable-log t)
  (setq lsp-bridge-python-command (expand-file-name "~/Documents/venv/lsp-bridge/bin/python3"))
  (setq acm-enable-copilot t))

目前的问题是(我按照操作顺序及相应的lsp-bridge message描述): 0. ~/Documents/venv/lsp-bridge/bin/python3已经装了README中的要求的依赖,工作目录下的虚拟环境仅装了pyright

  1. 打开一个py文件:Eval in Emacs: (message '"[LSP-Bridge] Error: can't find command 'pyright-langserver' to start LSP server pyright (/path/to/myfile.py), disable LSP feature.")(minibuffer也会回显)ps ux | rg pyright发现没有pyright-langserver启动
  2. M-x pyvenv-activate选择工作目录下的虚拟环境(配置了pyvenv-post-activate-hooks会执行lsp-bridge-restart-process):没有报错(当然这是因为LSP feature已经被关闭了)
  3. 打开一个新的py文件(因为我不知道怎么手动打开LSP feature所以选择另打开一个文件来测试):没有报错(Message为Eval in Emacs: (message '"[LSP-Bridge] Active file 'listcomp_speed.py', enjoy hacking!")),ps ux | rg pyright发现有工作目录虚拟环境下的pyright-langserver(和node相应组件)运行。

自己翻资料配两天了,从刚开始各种报错mode line都是红色到现在copilot可以用,pyright这个实在搞不懂了,麻烦各位大佬帮帮忙,有什么需要的信息我一定及时补充。

感谢作者的回复!

不好意思,可能我的描述不太清楚,目前的情况是在virtual venv中是可以正常使用pyright的,但是在activate venv之前是不能正常启动pyright。

我的venv的配置就是参考(复制)您发的wiki里的代码修改了pyright.json路径。

虚拟环境一般都是找不到python或者找不到lsp server引起的,请看中文readme底部调试方法,知道报错内容就知道怎么折腾环境了。

1 个赞

感谢回复! 确实是我没仔细阅读,误用了lsp-bridge-enable-log进行调试。

简单查看似乎确实是找不到python,不知道是不是跟虚拟环境使用symbolic link有关。我去折腾一下。

谢谢作者的指点! 顺带一提,虽然emacs新人,但也用过一些别的lsp client了,当时发现lsp-bridge就是为了找一个更快不卡手的,lsp-bridge也确实做到了,十分感谢!也希望之后自己有能力为社区做贡献吧。

提前祝作者和各位emacser新年快乐!:slight_smile:

1 个赞

lsp-bridge的目标就是代码补全完全不卡手,很高兴你喜欢,新年快乐。

3 个赞

新年快乐各位emacser!

在补充一点吧。我之前对lsp-bridge的配置认知应该是一点偏差,误认为pyright和lsp-bridge的python环境是一致的,昨晚突然想到两个环境是(可以)不同的(不然也不会出现我之前换到虚拟环境之后可以正常运行的情况),所以我在我的相关init文件中配置了一个基础虚拟环境(类似于conda中的base?对conda也不是很熟),这样就可以流畅的使用lsp-bridge和pyright了。

1 个赞

感谢 @MirageTurtle 提供的思路, 我在 wsl2-ubuntu22.04 下使用以下配置是可行的:

;; 令 basedpyright 可以被找到
(let ((venv-bin (expand-file-name ".venv/bin" user-emacs-directory)))
  (setenv "PATH" (concat venv-bin path-separator (getenv "PATH")))
  (setq exec-path (cons venv-bin exec-path)))

;; 解决 tui 下 lsp-bridge 的补全菜单问题, 不过好像 tty-child-frames 更好?
(use-package popon)
(add-to-list 'load-path (expand-file-name "site-lisp/acm-terminal" user-emacs-directory))
(unless (display-graphic-p)
  (with-eval-after-load 'acm
    (require 'acm-terminal)))

;; 指定 lsp-bridge-python-command 到 .emacs.d 目录下创建的 uv 虚拟环境即可
;; 在 uv 虚拟环境中安装好 lsp-bridge 的依赖
(add-to-list 'load-path (expand-file-name "site-lisp/lsp-bridge" user-emacs-directory))
(require 'lsp-bridge)
(global-lsp-bridge-mode)
(setq acm-enable-doc t)
(setq acm-enable-copilot nil)
(setq lsp-bridge-enable-hover-diagnostic t)
(setq lsp-bridge-enable-completion-in-string t)
(setq lsp-bridge-enable-completion-in-minibuffer t)
(setq lsp-bridge-enable-with-tramp t)
(setq lsp-bridge-python-lsp-server "basedpyright")
(setq lsp-bridge-python-multi-lsp-server "basedpyright_ruff")
(setq lsp-bridge-tex-lsp-server "texlab")
(setq lsp-bridge-python-command (expand-file-name ".venv/bin/python3" user-emacs-directory))

p.s. 我的 pyproject.toml 文件:

[project]
name = "dotemacs"
version = "0.1.0"
description = "Emacs configuration"
readme = "README.md"
requires-python = ">=3.10"
dependencies = [
    "basedpyright>=1.31.3",
    "epc>=0.0.5",
    "orjson>=3.11.2",
    "packaging>=25.0",
    "paramiko>=4.0.0",
    "rapidfuzz>=3.13.0",
    "ruff>=0.12.9",
    "setuptools>=80.9.0",
    "sexpdata>=1.0.2",
    "six>=1.17.0",
    "watchdog>=6.0.0",
]

[dependency-groups]
dev = []

另外感谢坛友大佬 @twlz0ne 实现的 acm-terminal, 不过现在 tty-child-frames 配合 lsp-bridge 已经完美开箱即用了吗?