---
title: "Neovim+LSPをなるべく簡単な設定で構築する ~ Lazy.nvim編 ~"
pubDate: 2023-05-17T00:00:00+09:00
published: true
tags: ["vim駅伝"]
---

この記事は[Vim駅伝](https://vim-jp.org/ekiden/)2023年05月17日の記事です。

## はじめに

現在、私はNeovimの設定ファイルを吹き飛ばして一からプラグインの選定、設定を行っています。そしてLSP周りのプラグインの選定や設定を探していたところこのような記事を見つけました。

https://zenn.dev/botamotch/articles/21073d78bc68bf

全く短くする必要性はありませんが、[lazy.nvim](https://github.com/folke/lazy.nvim)を使用することでプラグインマネージャーの導入から、実際に補完が動作するまでをもうすこし短いコードで書けるのではないかと思いこの記事を書くことにしました。

変更点としてはプラグインマネージャーが`packer.nvim` -> `lazy.nvim`に、補完プラグインが`nvim-cmp` -> `mini.completion`になっています。

- [lazy.nvim](https://github.com/folke/lazy.nvim) (プラグインマネージャー)
- [echasnovski/mini.completion](https://github.com/echasnovski/mini.completion) (補完)

### 変数情報の表示

![変数情報の表示](/images/blog/2023-05-17-vim-ekiden/img01.png)

### エラー検出

![変数情報の表示](/images/blog/2023-05-17-vim-ekiden/img02.png)

### 変数ハイライト

なし

### 補完

![補完](/images/blog/2023-05-17-vim-ekiden/img03.png)

NVIM v0.10.0

Windows 11

```lua
-- init.lua

local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
  vim.fn.system({
    "git",
    "clone",
    "--filter=blob:none",
    "https://github.com/folke/lazy.nvim.git",
    "--branch=stable",
    lazypath,
  })
end
vim.opt.rtp:prepend(lazypath)

require("lazy").setup( {
  {
    "williamboman/mason.nvim",
    build = ":MasonUpdate",
    opts = {},
  },
  {
    "williamboman/mason-lspconfig.nvim",
    dependencies = {
      { "williamboman/mason.nvim" },
      { "neovim/nvim-lspconfig" },
      { "echasnovski/mini.completion", version = false },
    },
    config = function()
      local lspconfig = require("lspconfig")
      require('mini.completion').setup({})
      require("mason-lspconfig").setup_handlers({
        function(server_name)
          lspconfig[server_name].setup(opts)
        end,
        ["vtsls"] = function()
          lspconfig["vtsls"].setup({})
        end,
      })

      vim.api.nvim_create_autocmd("LspAttach", {
        callback = function(_)
          vim.keymap.set('n', 'K',  '<cmd>lua vim.lsp.buf.hover()<CR>')
          vim.keymap.set('n', 'gf', '<cmd>lua vim.lsp.buf.formatting()<CR>')
          vim.keymap.set('n', 'gr', '<cmd>lua vim.lsp.buf.references()<CR>')
          vim.keymap.set('n', 'gd', '<cmd>lua vim.lsp.buf.definition()<CR>')
          vim.keymap.set('n', 'gD', '<cmd>lua vim.lsp.buf.declaration()<CR>')
          vim.keymap.set('n', 'gi', '<cmd>lua vim.lsp.buf.implementation()<CR>')
          vim.keymap.set('n', 'gt', '<cmd>lua vim.lsp.buf.type_definition()<CR>')
          vim.keymap.set('n', 'gn', '<cmd>lua vim.lsp.buf.rename()<CR>')
          vim.keymap.set('n', 'ga', '<cmd>lua vim.lsp.buf.code_action()<CR>')
          vim.keymap.set('n', 'ge', '<cmd>lua vim.diagnostic.open_float()<CR>')
          vim.keymap.set('n', 'g]', '<cmd>lua vim.diagnostic.goto_next()<CR>')
          vim.keymap.set('n', 'g[', '<cmd>lua vim.diagnostic.goto_prev()<CR>')
        end
      })

      vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with(
      vim.lsp.diagnostic.on_publish_diagnostics, { virtual_text = false }
      )
    end
  }
})
```

### おわりに

短い行数で動いて満足です。

ちなみに、自分はnvim-cmpを使います。
