在日常开发中,很多人选择 Emacs 不只是因为它历史悠久,更是因为它的可定制性极强。当你写 Python、JavaScript 或 Go 时,如果能像现代 IDE 那样自动补全、跳转定义、查看引用,效率会高不少。这时候,LSP(Language Server Protocol)就成了关键。
什么是 LSP?
LSP 是一种通用协议,让编辑器和语言服务器通信。服务器知道语法结构,编辑器负责展示结果。Emacs 通过插件接入 LSP 后,就能实现智能提示、错误检查、函数签名提示等功能。
安装 lsp-mode
最常用的 Emacs LSP 客户端是 lsp-mode。用 package.el 或 straight.el 安装都很方便。如果使用默认包管理器,在 init.el 中加入:
(use-package lsp-mode
:ensure t
:commands (lsp lsp-deferred)
:hook ((python-mode . lsp)
(js-mode . lsp)
(go-mode . lsp)))
这样,打开支持的语言文件时就会自动启用 LSP。
搭配自动补全体验更好
单独的 LSP 只提供数据,显示还得靠补全框架。推荐搭配 company-mode 和 lsp-ui。前者负责下拉提示,后者展示文档浮动框、代码大纲等。
(use-package company
:ensure t
:config
(global-company-mode))
(use-package lsp-ui
:ensure t
:commands lsp-ui-mode)
加上这些后,输入函数名时会自动弹出选项,鼠标悬停还能看类型和说明,就像 VS Code 一样顺手。
安装对应的语言服务器
每个语言需要独立的语言服务器。比如:
- Python:用
pylsp或pyright,可通过 pip 安装 - JavaScript/TypeScript:推荐
typescript-language-server,用 npm 装 - Go:官方有
gopls,直接下载即可
以 Python 为例,终端运行:
pip install python-lsp-server[all]
Emacs 的 lsp-mode 通常能自动检测到,不需要额外配置路径。
性能优化小技巧
刚启用 LSP 时可能会觉得卡顿,尤其是大项目。可以设置延迟加载:
(use-package lsp-mode
:hook (python-mode . lsp-deferred))
用 lsp-deferred 替代 lsp,等文件打开后再初始化,避免启动卡住。
还可以限制索引范围,比如忽略 node_modules 或 __pycache__,在项目根目录加 .lspignore 文件即可。
实际效果举例
假设你在写一个 Flask 应用,输入 request. 后,立刻看到 args、json 等属性提示;点击函数能跳转到定义;按 C-c C-d 查看文档。这些不再是 IDE 专属,Emacs 也能做到。
调试接口时,LSP 还能标出拼错的字段或未定义的变量,提前发现问题。