讨论: 在 Emacs 上配置一个更好的 IDE? (目前示例使用 Python)

(1) 本人发帖主要有以下考虑:

  1. 我在紧张的实习工作时期是来不及折腾 Emacs 的, 现在上学了可以安心的配置一个更适合自己的 Python 开发环境了.

  2. 我使用的是 PyCharm 专业版, 一般有的新功能我都尽量去尝鲜, 包括 GitHub Copilot 和 VS Code (+ Copilot X) 这些都是日常使用的生产力工具.

  3. 现在如果吸收上面工具的优点, 是否可以配置出一个更优秀的 IDE?

(2) 如果让个人评分, 下面是一个基于个人体验的表格:

功能 评分 (PyCharm) 评分 (Visual Studio Code)
补全能力 (基于项目) 5 3
补全性能 (基于代码片段) 4 5
项目整体分析 (包括 JetBrains AI 或 Copilot X) 5 3
整体性能 3 5
可靠性 (评分较低是因为有 Vim 和 Emacs 为参照) 3 4
代码规范性检查 (基于 Python Black) 5 3

(3) 关于本人目前的 Emacs 设计 (面向 Python 编程):

  • conda.el 提供了 JetBrains 那样底层的 Python 环境配置、切换, 同时有着不输 VS Code 的性能.
  • blacken 提供了基于 Python Black 的代码格式检查 (和格式化).
  • copilot.el 提供了体验类似 JetBrains (目前可能没有 VS Code 的 Copilot X 那样高性能) 的基于数据分析的代码补全.
  • eglot 提供了类似 VS Code 体验的语言服务器, 但目前我不知道在分析整个项目中如何正确配置它, 所以体验还是比 JetBrains 差的.

(本人目前 Python 相关的 Emacs 配置: init-eglot.el)


综上, 欢迎大家交流讨论~

1 个赞

其实一个 lsp-bridge 就可以满足你所有的需求, 而且性能比 eglot/lsp-mode 快很多。

lsp-bridge自带代码补全, copilot, format, 而且默认是组合 pyright 和 ruff 多服务器的, pyright 提供代码补全, ruff 提供代码诊断服务。

3 个赞

除了 anaconda 还可以试试 pdm,不过目前好像还没有 emacs 集成

之前花了一点时间读了读 python.el 的实现,python 虚拟环境的配置我直接使用了 .dir-local.el:

((python-base-mode . ((eval . (setq-local python-shell-virtualenv-root
					  (file-name-concat
					   (project-root (project-current))
					   ".venv")))
		              (eval . (setq-local python-shell-extra-pythonpaths
					  nil))
		              (eval . (setq-local python-shell-process-environment
					  nil))
		      )))

但这也说不上什么好办法,而且这只针对 emacs 内通过 run-python 打开的 python 解释器。

项目内文件的项目相关环境变量设置除了通过 directory-local variable 外还有其他外部工具可用,比如 direnv 和 shadowenv,但目前还没试过。简单试了下,还挺好用的:

在 Emacs 中进行分离式项目环境变量管理 – direnv

1 个赞

pycharm的调试能力,pycharm pro对cython的调试能力,基本上独一档

1 个赞

Python lsp可以偷偷用pylance(这个速度快,效果也不错,甚至有inlay hint

3 个赞

偷偷用pylance什么意思,pylance不是只能在vscode用吗

调试我觉得问题比较大,不知道咋解决。

https://emacs-china.org/t/gud-pdb-realgud-pdb/25667

这是法律问题,不是技术问题

为什么不进elpa?

(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))
  :init
  (global-lsp-bridge-mode))