gopls未装好或版本不兼容是lsp-mode连不上主因;需终端运行gopls version验证,用go install安装最新版;emacs中用lsp-describe-session核对路径;dlv-dap卡住则需dlv v1.21.0+并设dap-dlv-go-dlv-command;补全慢应禁用lsp-go-analyze-tests等耗cpu项;改go.mod后须手动lsp-go-reload-project。

lsp-mode 连不上 gopls?先确认 gopls 是否能独立运行
很多配置失败的根本原因不是 Emacs 配置错了,而是 gopls 本身没装好或版本不兼容。LSP 客户端(lsp-mode)只是个管道,真正干活的是 gopls 进程。
- 在终端里直接运行
gopls version,必须有输出且不报错;若提示 command not found,说明没装或不在$PATH里 - Go 1.21+ 自带
gopls,但默认不安装:执行go install golang.org/x/tools/gopls@latest - 避免用 Homebrew 或第三方包管理器装
gopls,容易路径混乱或版本滞后 - Emacs 启动后,用
M-x lsp-describe-session看实际连接的gopls路径,和终端里which gopls对不上就肯定出问题
dap-mode 启动调试时卡在 “Starting dlv-dap”
这不是 dap-mode 配置的问题,而是 dlv-dap(Delve 的 DAP 实现)没准备好。当前 dlv 主干已合并 dap 支持,但很多人还卡在旧版 dlv 上。
- 必须用
dlvv1.21.0+,且编译时启用了 DAP(新版默认开启):运行dlv version,输出里要有Build Type: Static和DAP Support: true - 别用
go get github.com/go-delve/delve/cmd/dlv—— 这装的是旧分支;改用go install github.com/go-delve/delve/cmd/dlv@latest -
dap-mode默认找dlv-dap这个可执行名,但新版dlv只提供dlv一个二进制。需在 Emacs 配置里显式指定:(setq dap-dlv-go-dlv-command "dlv") - 调试前确保当前 buffer 是
.go文件、且项目根目录下有go.mod——dap-mode依赖go mod推导构建参数,裸文件会静默失败
lsp-mode 补全慢、跳转卡顿?关掉 go-language-server 的语义分析开关
gopls 默认开启 full semantic analysis(包括类型推导、跨文件引用索引),对小项目是秒级响应,但中大型模块一开就卡。这不是 Emacs 性能问题,而是 gopls 自身资源策略。
- 在
lsp-register-client或lsp-go-enable后加配置:(setq lsp-go-analyze-tests nil)和(setq lsp-go-staticcheck nil),这两项最吃 CPU - 禁用
gopls的自动 vendor 支持(如果你不用vendor/):(setq lsp-go-gopath nil),否则它会在整个 GOPATH 扫描 - 补全延迟明显时,用
M-x lsp-describe-session查看 “Server State” 是否长期卡在 “Indexing…” —— 是的话,上面两项就是元凶 - 不要盲目加大
lsp-idle-delay,那只是掩盖问题;真正要减负的是gopls的工作量
修改 go.mod 后 lsp-mode 不刷新依赖?手动触发 module reload 很关键
gopls 不监听 go.mod 文件变化,也不会自动重载 module graph。你加了新依赖,lsp-mode 还在用旧缓存,导致 import 提示红色波浪线、跳转失败。
立即学习“go语言免费学习笔记(深入)”;
- 改完
go.mod后,必须手动执行M-x lsp-go-reload-project(注意不是lsp-workspace-restart) - 这个命令本质是发
gopls的didChangeConfiguration事件,触发内部 module reload,比杀进程重启快得多 - 如果常用
go get命令更新依赖,可以加 hook:(add-hook 'shell-command-finish-hook (lambda (_) (when (string-match-p "go\s+get" shell-command-input) (lsp-go-reload-project)))) - 别依赖
lsp-auto-restart—— 它只响应服务器崩溃,不响应配置变更
最难调的永远不是配置写法,而是搞不清哪一层在出问题:Emacs?lsp-mode?gopls?还是 dlv?每次卡住,先用对应命令行工具单独验证,再回 Emacs 查 session 状态。路径、版本、权限这三样,漏查一个,后面所有配置都是白忙。










