• 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

  • 相关阅读:
    随笔—邀请赛前训— Codeforces Round #330 (Div. 2) B题
    随笔—邀请赛前训— Codeforces Round #330 (Div. 2) Vitaly and Night
    General Problem Solving Techniques [Examples]~C
    General Problem Solving Techniques [Examples]~A
    General Problem Solving Techniques [Beginner-1]~B
    General Problem Solving Techniques [Beginner-1]~A
    General Problem Solving Techniques [Beginner-1]~E
    General Problem Solving Techniques [Beginner-1]~F
    2015 HUAS Summer Contest#5~C
    2015 HUAS Summer Contest#5~B
  • 原文地址:https://www.cnblogs.com/shangmo/p/16139098.html
Copyright © 2020-2023  润新知