LSP 是什么?

LSP 全称是 Language Server protocol, 是由 Microsoft 主持开发的通用语言分析器协议. 最初是为 Visual Studio Code 开发的, 现在是一个开放的标准1. 它是一个 JSON-RPC-based 的协议2, 用于编辑器或 IDE 与提供语言分析补全等功能的服务的通信, 编辑器 / IDE 和语言服务甚至可以在不同的机器上1. 理查德·斯托曼也支持该协议3.

准备

Python 环境端

Python Language Server 就是 Python 语言服务的实现, 遵从了 LSP 协议. 使用 jedi 提供了诸如补全等功能.

使用 pipenv 管理 Python 环境

cd project_floder
pipenv install python-language-server[all]
# pipenv install python-language-server[all] --skip-lock

Emacs 编辑器端

需要安装以下几个包, 如果使用 elpa 管理包, 添加 melpa 源后 M-x package-install 安装即可

Python 和 Emacs 准备阶段结束.

Emacs 配置

使用以下配置需要安装 use-package

(use-package lsp-mode
:config

(add-hook 'python-mode-hook(lambda ()(lsp-python-enable)));; 调用 pyls 既上边安装的 Python Language Server;; 不需要安装 lsp-python, 以下几行提供与 lsp-python 相同的功能(lsp-define-stdio-client lsp-python "python"(lsp-make-traverser #'(lambda (dir)

(directory-files
dir
nil
"\\(__init__\\|setup\\)\\.py\\|Pipfile")))

'("pyls")))(use-package lsp-imenu:init;; 启用 lsp-imenu 集成(add-hook 'lsp-after-open-hook 'lsp-enable-imenu))(use-package lsp-ui:init;; 启用 lsp-ui(add-hook 'lsp-mode-hook 'lsp-ui-mode);; 启用 flycheck(add-hook 'python-mode-hook 'flycheck-mode))(use-package company-lsp:config;; 设置 company-lsp 为后端(push 'company-lsp company-backends))

其它

Python Language Server 可以不必在每个环境中都安装, 以 pipenv 为例, 安装 Python Language Server 到全局 Python 中, 然后在每个环境下 pipenv shell 进入环境即可补全该环境下的包.

(lsp-define-stdio-client lsp-python "python"
(lsp-make-traverser #'(lambda (dir)
(directory-files
dir
nil
"\\(__init__\\|setup\\)\\.py\\|Pipfile")))
'("pyls"))
这段配置说

明了需要在目录下能找到 __init__.py 等文件后将其作为 project root 使用, 如果没找到相应文件, 则会抛出找不到项目根目录的 Warning, 并且是以 *Warnings* buffer 的形式显示的, 在 lsp-mode 的 :config 后加入下面一句, 就可以用 Message 而不是 buffer 的形式显示 Warning.

(setq lsp-message-project-root-warning t)