NeoVimByLua-格式化代码
NeoVim By Lua 格式化代码的问题
不折腾枉少年
格式化代码遇见的问题
你通常会在 vim 命令行模式下,或设置 Vim 自动执行命令的模式执行这些命令,没有产生任何效果:
:lua vim.lsp.buf.formatting()
" or
:lua vim.lsp.buf.formatting_seq_sync()
" or
:lua vim.lsp.buf.formatting_sync()
原因
这种命令模式往往需要当前语言的 L(lao)S(se)P(pi) 支持 format 才可以生效,但是大多数语言 lsp 不提供 format 功能,例如:
- sumneko_lua
- gopls
解决方式:
可以采用插件调用格式化工具的模式:
一些语言格式化工具:
- Golang
- gofmt
- goimports
- lua
- stylua
- luafmt # 这个好像暂时无法使用
- python
- autopep8
- vue.js
- prettier
在你的 NeoVim 加入这个插件
paker.startup({
...
use("mhartington/formatter.nvim")
...
})
这是我的一些配置,插件的作者提供支持的语言的配置方式 mhartington/formatter.nvim/config:
local status, formatter = pcall(require, "formatter")
if not status then
vim.notify("not fond formatter plugin")
return
end
formatter.setup({
filetype = {
lua = {
function()
return {
exe = "stylua",
args = {
"-f $HOME/.config/nvim/.stylua.toml",
"-",
},
stdin = true,
}
end,
},
javascript = {
-- prettier
function()
return {
exe = "prettier",
args = { "--stdin-filepath", vim.fn.fnameescape(vim.api.nvim_buf_get_name(0)), "--single-quote" },
stdin = true,
}
end,
},
json = {
function()
return {
exe = "prettier",
args = { "--stdin-filepath", vim.fn.fnameescape(vim.api.nvim_buf_get_name(0)), "--double-quote" },
stdin = true,
}
end,
},
python = {
-- Configuration for psf/black
function()
return {
exe = "python3 -m autopep8", -- this should be available on your $PATH
args = {
"--in-place --aggressive --aggressive",
vim.fn.fnameescape(vim.api.nvim_buf_get_name(0)),
},
stdin = false,
}
end,
},
go = {
function()
return {
exe = "goimports",
args = {
"-w",
vim.fn.fnameescape(vim.api.nvim_buf_get_name(0)),
},
stdin = false,
}
end,
},
},
})
vim.api.nvim_exec(
[[
augroup FormatAutogroup
autocmd!
autocmd BufWritePost *.go,*.lua,*.py,*.vue,*.json,*.js FormatWrite
augroup END
]],
true
)
针对 Golang 我还有些话要说!
我们为了确认缩进是否正确通常会将 vim 的 set list
打开,并且设置 set listchars="spcae:·"
这种方式,看见的效果如下:
但是这种方式到了 Golang 这里你会看见如下效果:
What happend? What fuck!
问题原因:
gofmt
和 goimport
在格式化文档的时候会将缩进以制表符(tab)形式替代,Vim/NeoVim 在显示制表符的时候会以 ^I^I
显示,所以你就看见了上图的效果。
这个时候,我们可以在 golang
的 LSP 配置文件中设置 set list=false
或 在全局配置中 set listchars="space:·;tab:··"
,我们再次进入 Vim 中看见的效果就正常了。