Loading

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 功能,例如:

解决方式:

可以采用插件调用格式化工具的模式:

一些语言格式化工具:

  • 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:·" 这种方式,看见的效果如下:

img

但是这种方式到了 Golang 这里你会看见如下效果:

img

What happend? What fuck!

问题原因:

gofmtgoimport 在格式化文档的时候会将缩进以制表符(tab)形式替代,Vim/NeoVim 在显示制表符的时候会以 ^I^I 显示,所以你就看见了上图的效果。

这个时候,我们可以在 golang 的 LSP 配置文件中设置 set list=false 或 在全局配置中 set listchars="space:·;tab:··" ,我们再次进入 Vim 中看见的效果就正常了。

如果你想 NeoVim By Lua 这里推荐两个学习文档

这里可以找到一些 PluginsByLua

posted @ 2022-04-13 10:40  尚墨  阅读(923)  评论(0编辑  收藏  举报