用 Emacs 写代码,光靠语法高亮和自动补全已经不够用了。现在写 Python、JavaScript 或者 Rust,谁不想在函数调用时直接跳转定义,变量改名一键全局替换?这些功能,靠 LSP(Language Server Protocol)就能实现。而 Emacs 通过 lsp-mode 插件,完全可以变成一个现代 IDE。
安装 lsp-mode 和依赖
打开 Emacs,先确保你的包管理器用的是 package.el 或 use-package。如果还没装过 lsp-mode,可以直接在 init.el 里加一行:
(use-package lsp-mode
:ensure t
:commands (lsp lsp-deferred))
保存后重启 Emacs 或手动执行 M-x package-refresh-contents,再安装即可。
配合编程语言使用
比如你主要写 Python,可以搭配 pyright 作为语言服务器。先用 npm 安装:
npm install -g pyright
然后在 Emacs 配置中加入:
(use-package python
:mode ("\.py\\'" . python-mode)
:hook (python-mode . lsp-deferred))
这样每次打开 .py 文件,就会自动启动 LSP 服务。你会发现光标停在函数上能显示文档,按 F3 跳转定义,改名重构也变得顺手。
提升体验的小技巧
默认的 lsp-mode 功能完整但略显笨重。可以加上 lsp-ui 看实时文档浮动窗口:
(use-package lsp-ui
:ensure t
:after lsp-mode
:config
(setq lsp-ui-sideline-enable t
lsp-ui-doc-enable t))
如果你用的是 Doom Emacs,本身已经集成了 LSP 支持,只需要在 packages.el 中确认启用了对应模块,比如 :lang python 就自带 Pyright 配置。
处理卡顿问题
有时候打开大项目会卡住,多半是 LSP 扫描文件太多。可以在项目根目录加个 .dir-locals.el 文件,限制作用范围:
((nil . ((lsp-workspace-folders-ignore . ("/build" "/dist" "/node_modules")))))
这样 LSP 就不会去扫描编译输出或依赖目录,响应速度立马变快。
实际工作中,我写一个 Django 应用时,模型字段一改,所有相关视图里的引用都能被识别出来,再也不用手动搜索了。这种流畅感,正是 LSP 带来的核心价值。