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

参考 Python virtualenv@seraphlive 大佬的回复,让 ChatGPT 糊了一个:

  1. 使用 conda.el 在 Emacs 中调用 conda 环境。
  • 可以使用命令 M-x package-install conda 安装这个包
  1. 打开 .py 文件后执行命令 M-x conda-env-activate 切换到指定环境

以下是配置

(add-to-list 'load-path "~/.emacs.d/lsp-bridge/")
(require 'lsp-bridge)
(global-lsp-bridge-mode)

;; 开启 org-mode 补全
(setq lsp-bridge-enable-org-babe t)

;;; 虚拟环境支持 @ https://github.com/manateelazycat/lsp-bridge/wiki/Python-virtualenv
(setq lsp-bridge-python-command "/usr/bin/python")               ;; specify environment to run epc
(require 'conda)                                                 ;; M-x package-install conda
(conda-env-initialize-interactive-shells)                        ;; support interactive shell
(conda-env-initialize-eshell)                                    ;; support eshell
(conda-env-autoactivate-mode t)                                  ;; auto-activation
(custom-set-variables '(conda-anaconda-home "~/miniconda/"))     ;; specify installation directory
(add-hook 'conda-post-activate-hook                              ;; restart lsp-bridge
          (lambda ()
            (lsp-bridge-restart-process)))

但是 eaf 后院起火了

Process *eaf* exited abnormally with code 1
Traceback (most recent call last):
  File "/home/mawen/.emacs.d/site-lisp/emacs-application-framework/eaf.py", line 25, in <module>
    from PyQt6 import QtWebEngineWidgets as NeverUsed # noqa
ModuleNotFoundError: No module named 'PyQt6'
  1. 重启 Emacs 不 work
  2. 重启机器后直接开 eaf-open-rss-reader 不报错。若执行 conda-env-activate 命令,则上述问题可复现
  3. 经过排查,需要在执行 conda-env-activate 命令后使用 conda-env-deactivate 命令,否则会出现上述问题
  4. 这一套流程用起来很奇怪… 环境时常不能正确加载

目前使用 pyvenv 插件可以与 lsp-bridge 配合,能够切换到虚拟环境并使用 lsp-bridge补全了。

但是会导致 eaf 不能用,报错如下

Traceback (most recent call last):
  File "/home/ententent/.emacs.d/site-lisp/emacs-application-framework/eaf.py", line 25, in <module>
    from PyQt6 import QtWebEngineWidgets as NeverUsed # noqa
ModuleNotFoundError: No module named 'PyQt6'

Process *eaf* exited abnormally with code 1

这个问题触发时,有时重启 Emacs 也不能解决。 配置如下:

(use-package pyvenv
  :ensure t
  :config
  (setenv "WORKON_HOME" (expand-file-name "~/miniconda3/envs"))
  (pyvenv-mode t)
  (add-hook 'python-mode-hook
            (lambda () (pyvenv-workon "dev")))
)

(defun local/lsp-bridge-get-single-lang-server-by-project (project-path filepath)
  (let* ((json-object-type 'plist)
         (custom-dir (expand-file-name ".cache/lsp-bridge/pyright" user-emacs-directory))
         (custom-config (expand-file-name "pyright.json" custom-dir))
         (default-config (json-read-file (expand-file-name "lsp-bridge/langserver/pyright.json" user-emacs-directory)))
         (settings (plist-get default-config :settings))
         )
    (plist-put settings :pythonPath (executable-find "python"))
    (make-directory (file-name-directory custom-config) t)
    (with-temp-file custom-config (insert (json-encode default-config)))
    custom-config))

(add-hook 'python-mode-hook
          (lambda ()
            (setq-local lsp-bridge-get-single-lang-server-by-project
                        'local/lsp-bridge-get-single-lang-server-by-project)))

(add-hook 'pyvenv-post-activate-hooks
          (lambda ()
            (lsp-bridge-restart-process)))

求大佬指点

1 个赞

pyvenv 切完虚拟环境后,eaf-python-command 默认找到的 python 是虚拟环境的那个,肯定是没有 eaf 依赖的。配置一下 eaf-python-command,指向的是你装的 eaf 依赖的那个 python 环境。或者干脆开个新的虚拟环境专门给 eaf 用,装完 eaf 依赖把 eaf-python-command 配置成新建的虚拟环境 python 可执行文件就好了

1 个赞

有用,谢谢大佬!

有心贡献,能力不够,elisp水平不行,我用advice-add 复写了acm-markdown-render-content这个函数,换成了与acm-terminal版本对应(lsp-bridge 81cc2fc)的函数修复了这个错误

我经常要同时工作在几个项目拷贝中,每一个拷贝对应一个新功能。感觉lsp-bridge是不是不支持这种模式?

没看懂,啥意思?

有一个项目foo, 有多个本地拷贝,foo_1, foo_2, foo_3,同时使用. 感觉经常没办法跳转到函数定义,需要重启lsp-bridge (lsp-bridge-restart-workspace). 不知道是不是lsp-bridge不支持这种用法。

你这个 foo_1 foo_2 foo_3 之间有关联吗? 还是这三个是独立的三个项目? 还有这些项目都是什么语言?

lsp-bridge 能用dap-mode吗,一直提示找不到lsp-mode

1 个赞

用过一阵 lsp-bridge ,最后是要用 dap-mode 长期在用 lsp-mode

@manateelazycat 有没兴趣研究一下 dap-mode ?写单元测试配合编辑器断点调试提升开发体验相当哇塞。

他们是同一个项目,不同分支。使用VHDL语言

(global-lsp-bridge-mode)

这个打开新 buffer 时并不生效,需要手动用 lsp-bridge-mode 才能开启 mode,不知道如何排查问题。望大佬能指点一二。

解决了,是我自己的 prog-mode-hook 中的函数出了问题。插件很好用,曾经的 vscoder 表示除了 ipynb,vscode 已经可以被 emacs 替代了。 :smile:

1 个赞

考虑用 git worktree 为分支创建单独的目录?

如果你有一个 git 项目有多个子目录, 你需要定制 lsp-bridge-get-single-lang-server-by-project , 让 lsp-bridge 子目录来返回 project_name。

这样 lsp-bridge 就忽略 git 而用 lsp-bridge-get-single-lang-server-by-project 规则来查找项目的 root path.

今年时间够呛, 主要我平常都用目测来写代码, 很少用调试器, 除非是别人的项目。

动力严重不足, 但是 dap 的协议类似 lsp, 用 lsp-bridge 应该是完全可以做到的, 而且实现后性能要强很多。

ipynb 是啥?

lsp-bridge 主要就是对标性能, VSCode有多快, lsp-bridge就有多快。

就是 jupyter notebook,现在也有 emacs 插件,不过界面和 vim 模式的支持暂时没有 vscode 里面的好用。

jupyter 可以在 Web 上运行吗? 可以的话, 可以考虑结合 EAF 来用。

1 个赞