下面我将为你提供一个详细、分步的指南,帮助你设置一个功能完善的 Python 开发环境,包括代码补全、静态检查、格式化和交互式开发。
核心思想:使用 lsp 层 + python 层
现代 Spacemacs 配置 Python 的最佳实践是结合使用 lsp(Language Server Protocol)层和 python 层。
lsp层:作为语言服务器的客户端,它负责与后台的语言服务器通信,提供代码补全、跳转定义、查找引用、实时错误检查等高级功能。python层:提供 Python 的基础支持,如代码运行、REPL 交互、虚拟环境管理等,它也会选择一个后端(如 Jedi)用于基础的补全,但我们会将其替换为更强大的 LSP。
第一步:安装和配置必要的层
你需要确保在你的 .spacemacs 文件中正确配置了 lsp 和 python 层。
-
打开你的
.spacemacs配置文件 在 Spacemacs 中,按下SPC f e d。 -
配置
dotspacemacs-configuration-layers在该列表中,确保包含lsp和python,推荐将lsp放在python之前。dotspacemacs-configuration-layers '( ;; 其他层... (lsp :variables lsp-enable-snippet nil ; 可选:禁用代码片段,有时会和 company 冲突 lsp-ui-sideline-enable t ; 显示侧边栏信息 lsp-ui-sideline-show-hover t ; 显示悬停信息 lsp-ui-sideline-show-diagnostics t ; 显示诊断信息 lsp-ui-sideline-show-symbol t ; 显示符号信息 ) python ;; 其他层... )- 重要提示:
lsp层有很多可配置的变量,上面的variables部分是一些常用的优化配置,你可以先复制过去。
- 重要提示:
第二步:选择 Python 语言服务器
LSP 功能的强大与否,完全取决于你选择的语言服务器,对于 Python,目前有两个主流选择:
- pylsp: Python Language Server,这是一个较新的、由社区驱动的服务器,轻量且快速。
- pyright: 由微软开发,功能非常强大,类型检查能力尤其出色,特别适合使用现代 Python 类型提示的项目。
推荐选择 pyright,因为它在类型推断和错误检查方面表现更出色。
如何配置 pyright?
你需要在你的 dotspacemacs/user-config 函数中手动安装和配置它。
-
打开
.spacemacs文件,找到dotspacemacs/user-config部分。 -
添加以下代码:
;; 在 dotspacemacs/user-config 中添加 (defun dotspacemacs/user-config () "Configuration for user code: This function is called at the very end of Spacemacs startup, after layer configuration. Put your configuration code here, except for variables that should be set before packages are loaded." ;; 设置默认的 Python 语言服务器为 pyright (setq lsp-pyls-plugins-pylsp-black-enabled nil) ; 禁用 pylsp 自带的 black 格式化,避免冲突 (setq lsp-pyls-plugins-pylsp-isort-enabled nil) ; 禁用 pylsp 自带的 isort,避免冲突 ;; 安装 pyright 语言服务器 (unless (assoc 'pyright lsp-clients) (lsp-clients-install-server 'pyright nil)) (add-to-list 'lsp-language-id-configuration '(python-mode . "python")) (lsp-deferred)) ; 确保在 python-mode 中启动 LSP- 代码解释:
- 我们禁用了
pylsp自带的格式化工具(black和isort),因为我们将在后面使用更独立的工具,这样可以避免配置冲突。 (lsp-clients-install-server 'pyright nil)这行代码会自动下载并安装pyright服务器,你只需要运行一次,它会把它安装在 Spacemacs 的专用目录下。(lsp-deferred)确保当你打开一个.py文件时,LSP 会自动启动。
- 我们禁用了
- 代码解释:
第三步:配置代码补全引擎(Company)
Spacemacs 默认使用 company 作为代码补全的 UI(就是你看到那个弹出的小窗口)。lsp 层会自动配置 company 使用 LSP 作为其后端。
你不需要做太多配置,但可以了解一下如何使用它:
- 触发补全:在输入代码时,
company会自动弹出,你也可以手动按TAB或SPC /来触发。 - 选择候选项:
- 使用
C-n/C-p(或j/k在evil-mode下) 上下选择。 - 按
RET(回车) 或SPC i确认选择。 - 按
ESC取消。
- 使用
第四步:配置静态检查和格式化(可选但强烈推荐)
一个完整的开发环境还需要代码风格检查和自动格式化。
安装必要的 Python 工具
在你的终端(或 Spacemacs 内置的终端 SPC ')中,使用 pip 安装以下工具:
# 代码格式化工具 pip install black isort # 类型检查工具 (如果你使用 pyright,这个不是必须的,但 pyright 会用它) pip install mypy # 代码质量检查工具 pip install flake8
在 Spacemacs 中配置
将这些工具集成到 Spacemacs 的 python 层中,在你的 .spacemacs 的 dotspacemacs/user-config 中添加:
;; 在 dotspacemacs/user-config 中继续添加 ;; 配置 python 层使用的工具 (setq python-shell-interpreter "python" ; 确保解释器路径正确 lsp-pyls-plugins-pylsp-black-enabled t ; 启用 black 格式化 lsp-pyls-plugins-pylsp-isort-enabled t ; 启用 isort 排序 lsp-pyls-plugins-pylsp-flake8-enabled t ; 启用 flake8 检查 )
第五步:配置虚拟环境
在 Python 开发中,使用虚拟环境是最佳实践。
使用 pyvenv(推荐)
pyvenv 是一个轻量级的虚拟环境管理工具。
-
安装:在你的终端中安装
pyvenv:pip install pyvenv
-
在 Spacemacs 中使用:
- 打开你的 Python 项目。
- 在 Spacemacs 中运行命令:
SPC : pyvenv-activate。 - 它会提示你输入虚拟环境的路径(
~/.virtualenvs/my-project)。 - 激活后,Spacemacs 的状态栏会显示当前激活的虚拟环境名称。
- 重要:务必在启动 LSP 之前激活虚拟环境,这样 LSP 就会使用虚拟环境中的包来进行补全和检查,一个简单的做法是:先在终端激活虚拟环境,然后再用
emacs或spacemacs打开项目。
使用 conda
如果你使用 conda,conda.el 是一个更好的选择,你可以在 dotspacemacs-configuration-layers 中添加 (conda :variables conda-anaconda-home "/path/to/your/anaconda")。
第六步:使用和验证
所有配置都已完成,让我们来验证一下:
- 重启 Spacemacs,或者,你可以先
SPC f e d保存配置,SPC q r重启。 - 打开一个 Python 文件(
test.py)。 - 确保虚拟环境已激活(如果需要的话)。
- 等待 LSP 启动,状态栏会显示类似 "LSP: pyright" 或 "LSP: pylsp" 的字样,并可能有一个加载的动画。
- 开始测试:
- 补全:输入
import dat,你应该能看到datetime的自动补全建议。 - 静态检查:故意写一行有错误的代码,
print(x),x未定义,你应该会在代码下方看到红色的波浪线,并将鼠标悬停在上面会看到 "Undefined name 'x'" 的错误提示。 - 跳转定义:将光标放在一个函数或变量名上(如
datetime),然后按gd(go to definition),你应该能跳转到其定义所在的文件。
- 补全:输入
常用快捷键总结
| 功能 | 快捷键 | 描述 |
|---|---|---|
| 代码补全 | SPC / |
手动触发代码补全 |
TAB |
在补全列表中选择 | |
| LSP 核心功能 | gd |
跳转到定义 |
gr |
查找引用 | |
gD |
跳转到声明 | |
gi |
查看实现 | |
gh |
显示悬停文档 | |
gR |
重命名符号 | |
ga |
代码操作(如提取变量) | |
| 错误检查 | gl |
显示当前行的错误/警告列表 |
SPC e ! |
在分屏中显示 LSP 的日志 | |
| Python 特定 | SPC m s i |
运行当前文件 |
SPC m s b |
在当前缓冲区中运行 Python | |
SPC m s l |
启动 Python REPL | |
SPC m v v |
激活/切换 pyvenv 环境 |
故障排除
- 补全不工作:
- 检查状态栏,确认 LSP 已经启动(没有启动的话,可能是网络问题或服务器下载失败,可以尝试手动重启 LSP:
SPC m s l)。 - 检查是否在正确的虚拟环境中。
- 检查
lsp-clients是否正确识别了pyright(M-x lsp-describe-session)。
- 检查状态栏,确认 LSP 已经启动(没有启动的话,可能是网络问题或服务器下载失败,可以尝试手动重启 LSP:
- 提示 "LSP server not found":
- 很可能是因为
lsp-clients-install-server没有成功运行,手动在dotspacemacs/user-config中运行一次M-x lsp-clients-install-server,选择pyright。
- 很可能是因为
- 性能问题:
- 对于非常大的项目,LSP 可能会变慢,可以尝试在
dotspacemacs/user-config中设置(setq lsp-enable-on-type-feedback nil)来禁用实时反馈,只在按SPC c c时进行检查。
- 对于非常大的项目,LSP 可能会变慢,可以尝试在
遵循以上步骤,你就可以在 Spacemacs 中拥有一个功能强大、响应迅速的 Python 开发环境了。
