Neovim Go 注释格式化指南:gq 没反应时,如何用 gw 快速恢复
【免费下载链接】neovimVim-fork focused on extensibility and usability项目地址: https://gitcode.com/GitHub_Trending/ne/neovim
当你在 Neovim 里写 Go,选中注释按 gq 却毫无反应。原因是 Go filetype 插件默认把 formatprg 指向 gofmt。本文讲清现象与分工,给出处理路径:注释用 gw 换行、代码交给 gofmt/LSP,也可覆盖 formatprg 让 gq 恢复默认。
先判断现象:Neovim gq 为什么没反应
典型表现:在.go文件里用V选中一段多行//注释,按gq,文本纹丝不动;切到.txt或 README 里,同样的gq却正常折行。这时很容易怀疑 Neovim 的 gq 坏了。
其实 gq 在正常工作。只是 Go 文件的 formatprg 指向了 gofmt,gq 会把选中内容交给 gofmt 处理,而 gofmt 对注释内容基本原样输出,所以你看到的就是"没反应"。
背后的分工:formatprg、gofmt、gq 与 gw
- gq:把当前段落或可视范围当作"文本"格式化,按 textwidth 重新折行;一旦 formatprg 有值,内容会交给该外部程序。
- Go filetype 的 formatprg:Neovim 的 Go filetype plugin(见
runtime/ftplugin/go.vim)默认将 formatprg 设为 gofmt,等于规定"Go 文件里的 gq 走 gofmt"。 - gofmt:Go 官方代码格式化工具,管的是缩进、空格和代码结构,并不会像文本换行工具那样整理注释措辞。
冲突点在于:一个 formatprg 同时承担了"代码格式化"和"注释换行"两种期望,而 gofmt 只做前者。
推荐处理方式
Go 文件注释如何换行:交给 Neovim gw
gw 是 Neovim 自带的文本格式化命令,与 gq 的关键区别是它不走 formatprg 流程,直接按 textwidth 对范围做文本折行。想整理 Go 文件里的注释,选中范围执行 gw 即可,效果立竿见影,也和 gofmt 的职责互不干扰。注释整理优先用 gw,这是更稳妥的默认选择。
代码格式化交给 gofmt、goimports、LSP/null-ls
代码的格式统一交给工具:手动在保存前跑 gofmt 或 goimports,或配置 LSP(gopls)、null-ls 在保存时自动格式化。规则只有一份,手动折行和自动格式化各管各的,就不会互相"打架"。用 gq 去碰代码,反而可能做出 gofmt 下次就改掉的格式。
想保留 gq:覆盖 formatprg 的兼容设置
如果你习惯 gq,可以覆盖 Go ftplugin 的默认设置:新建after/ftplugin/go.vim,加一行——
set formatprg=
after/ftplugin 目录在内置 filetype plugin 之后加载,这个空值会清掉 gofmt 配置,gq 恢复为普通文本格式化。代价也要清楚:Go 文件里 gq 从此不再调用 gofmt,代码格式化得继续靠外部工具,这是体验与习惯之间的取舍。
快速自查
- 要折行的是注释、gq 没变化?先改用 gw。
- 查看
:set formatprg?,值是 gofmt 就说明 gq 走的是 gofmt。 - 代码格式化是否已由 LSP 或 null-ls 接管?避免手动 gq/gw 与保存时格式化互相覆盖。
【免费下载链接】neovimVim-fork focused on extensibility and usability项目地址: https://gitcode.com/GitHub_Trending/ne/neovim
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考