杰瑞科技汇

spacemacs补全python

下面我将为你提供一个详细、分步的指南,帮助你设置一个功能完善的 Python 开发环境,包括代码补全、静态检查、格式化和交互式开发。

核心思想:使用 lsp 层 + python

现代 Spacemacs 配置 Python 的最佳实践是结合使用 lsp(Language Server Protocol)层和 python 层。

  • lsp:作为语言服务器的客户端,它负责与后台的语言服务器通信,提供代码补全、跳转定义、查找引用、实时错误检查等高级功能。
  • python:提供 Python 的基础支持,如代码运行、REPL 交互、虚拟环境管理等,它也会选择一个后端(如 Jedi)用于基础的补全,但我们会将其替换为更强大的 LSP。

第一步:安装和配置必要的层

你需要确保在你的 .spacemacs 文件中正确配置了 lsppython 层。

  1. 打开你的 .spacemacs 配置文件 在 Spacemacs 中,按下 SPC f e d

  2. 配置 dotspacemacs-configuration-layers 在该列表中,确保包含 lsppython,推荐将 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,目前有两个主流选择:

  1. pylsp: Python Language Server,这是一个较新的、由社区驱动的服务器,轻量且快速。
  2. pyright: 由微软开发,功能非常强大,类型检查能力尤其出色,特别适合使用现代 Python 类型提示的项目。

推荐选择 pyright,因为它在类型推断和错误检查方面表现更出色。

如何配置 pyright

你需要在你的 dotspacemacs/user-config 函数中手动安装和配置它。

  1. 打开 .spacemacs 文件,找到 dotspacemacs/user-config 部分。

  2. 添加以下代码

    ;; 在 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 自带的格式化工具(blackisort),因为我们将在后面使用更独立的工具,这样可以避免配置冲突。
      • (lsp-clients-install-server 'pyright nil) 这行代码会自动下载并安装 pyright 服务器,你只需要运行一次,它会把它安装在 Spacemacs 的专用目录下。
      • (lsp-deferred) 确保当你打开一个 .py 文件时,LSP 会自动启动。

第三步:配置代码补全引擎(Company)

Spacemacs 默认使用 company 作为代码补全的 UI(就是你看到那个弹出的小窗口)。lsp 层会自动配置 company 使用 LSP 作为其后端。

你不需要做太多配置,但可以了解一下如何使用它:

  • 触发补全:在输入代码时,company 会自动弹出,你也可以手动按 TABSPC / 来触发。
  • 选择候选项
    • 使用 C-n / C-p (或 j / kevil-mode 下) 上下选择。
    • RET (回车) 或 SPC i 确认选择。
    • ESC 取消。

第四步:配置静态检查和格式化(可选但强烈推荐)

一个完整的开发环境还需要代码风格检查和自动格式化。

安装必要的 Python 工具

在你的终端(或 Spacemacs 内置的终端 SPC ')中,使用 pip 安装以下工具:

# 代码格式化工具
pip install black isort
# 类型检查工具 (如果你使用 pyright,这个不是必须的,但 pyright 会用它)
pip install mypy
# 代码质量检查工具
pip install flake8

在 Spacemacs 中配置

将这些工具集成到 Spacemacs 的 python 层中,在你的 .spacemacsdotspacemacs/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 是一个轻量级的虚拟环境管理工具。

  1. 安装:在你的终端中安装 pyvenv

    pip install pyvenv
  2. 在 Spacemacs 中使用

    • 打开你的 Python 项目。
    • 在 Spacemacs 中运行命令:SPC : pyvenv-activate
    • 它会提示你输入虚拟环境的路径(~/.virtualenvs/my-project)。
    • 激活后,Spacemacs 的状态栏会显示当前激活的虚拟环境名称。
    • 重要务必在启动 LSP 之前激活虚拟环境,这样 LSP 就会使用虚拟环境中的包来进行补全和检查,一个简单的做法是:先在终端激活虚拟环境,然后再用 emacsspacemacs 打开项目。

使用 conda

如果你使用 condaconda.el 是一个更好的选择,你可以在 dotspacemacs-configuration-layers 中添加 (conda :variables conda-anaconda-home "/path/to/your/anaconda")


第六步:使用和验证

所有配置都已完成,让我们来验证一下:

  1. 重启 Spacemacs,或者,你可以先 SPC f e d 保存配置,SPC q r 重启。
  2. 打开一个 Python 文件(test.py)。
  3. 确保虚拟环境已激活(如果需要的话)。
  4. 等待 LSP 启动,状态栏会显示类似 "LSP: pyright" 或 "LSP: pylsp" 的字样,并可能有一个加载的动画。
  5. 开始测试
    • 补全:输入 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 环境

故障排除

  • 补全不工作
    1. 检查状态栏,确认 LSP 已经启动(没有启动的话,可能是网络问题或服务器下载失败,可以尝试手动重启 LSP:SPC m s l)。
    2. 检查是否在正确的虚拟环境中。
    3. 检查 lsp-clients 是否正确识别了 pyright (M-x lsp-describe-session)。
  • 提示 "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 时进行检查。

遵循以上步骤,你就可以在 Spacemacs 中拥有一个功能强大、响应迅速的 Python 开发环境了。

分享:
扫描分享到社交APP
上一篇
下一篇