🙆

nvimでinit.luaを編集する環境をまあまあ調べた

2025/01/18に公開

indent

とりあえず .editorconfig 置いた

editorconfig
root = true

[*]
indent_style = space
indent_size = 2
tab_width = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

[*.lua]
quote_type = single

シンタックスハイライト

カラースキームを変更した

require('lazy').setup({
  {
    'folke/tokyonight.nvim',
    lazy = false,
    priority = 1000,
    config = function()
      vim.cmd.colorscheme("tokyonight")
    end,
  },
})

この時点で大体色が付いとるな。これ最低限編集できればいいってノリだとこれ以上は必要ないか。

formatter

StyLuaを使う

ここでは
https://zenn.dev/catatsumuri/articles/24c98cb054f63c
で書いた通りnull-ls(none-ls)を設定していく

init.lua
~/.config/nvim/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({
  {
    'folke/tokyonight.nvim',
    lazy = false,
    priority = 1000,
    config = function()
      vim.cmd.colorscheme('tokyonight')
    end,
  },

  {
    'williamboman/mason.nvim',
    dependencies = {
      'WhoIsSethDaniel/mason-tool-installer.nvim',
      'jayp0521/mason-null-ls.nvim',
    },
    config = function()
      require('mason').setup({})

      require('mason-tool-installer').setup({
        ensure_installed = {
          'stylua',
        },
        auto_update = true,
        run_on_start = true,
      })

      -- mason-null-ls
      require('mason-null-ls').setup({
        ensure_installed = { 'stylua' },
        automatic_installation = true,
      })
    end,
  },

  -- none-ls.nvim
  {
    'nvimtools/none-ls.nvim',
    dependencies = { 'nvim-lua/plenary.nvim', 'williamboman/mason.nvim' },
    config = function()
      local null_ls = require('null-ls')

      null_ls.setup({
        sources = {
          null_ls.builtins.formatting.stylua.with({
            filetypes = { 'lua' },
          }),
        },
      })

      -- Auto format on save
      vim.api.nvim_create_autocmd('BufWritePre', {
        callback = function(args)
          vim.lsp.buf.format({
            bufnr = args.buf,
          })
        end,
      })
    end,
  },
})

lsp

lua-language-serverを導入する。

  {
    'williamboman/mason.nvim',
    dependencies = {
      'WhoIsSethDaniel/mason-tool-installer.nvim',
      'jayp0521/mason-null-ls.nvim',
    },
    config = function()
      require('mason').setup({})

      require('mason-tool-installer').setup({
        ensure_installed = {
          'stylua',
          'lua-language-server', -- <---------------------------追加
        },
        auto_update = true,
        run_on_start = true,
      })

      -- mason-null-ls
      require('mason-null-ls').setup({
        ensure_installed = { 'stylua' },
        automatic_installation = true,
      })
    end,
  },
lua-language-server: successfully installed

になったら成功。次の設定

neovim/nvim-lspconfig

  -- lua-language-server configuration
  {
    'neovim/nvim-lspconfig',
    config = function()
      require('lspconfig').lua_ls.setup({})
    end,
  },

とかすると

エラーまみれになる

lazydev.nvim

https://github.com/folke/lazydev.nvim

 -- lua-language-server configuration
  {
    'neovim/nvim-lspconfig',
    dependencies = {
      {
        'folke/lazydev.nvim',
        ft = 'lua', -- only load on lua files
        opts = {
          library = {
            -- See the configuration section for more details
            -- Load luvit types when the `vim.uv` word is found
            { path = '${3rd}/luv/library', words = { 'vim%.uv' } },
          },
        },
      },
    },
    config = function()
      require('lspconfig').lua_ls.setup({})
    end,
  },

こんな感じでlazydevを依存に書いておくといいらしい、よく調べきれてない。
いずれにせよ、これでエラーはなくなった。

以下、ここまでinit.lua

init.lua
~/.config/nvim/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({
  {
    'folke/tokyonight.nvim',
    lazy = false,
    priority = 1000,
    config = function()
      vim.cmd.colorscheme('tokyonight')
    end,
  },

  {
    'williamboman/mason.nvim',
    dependencies = {
      'WhoIsSethDaniel/mason-tool-installer.nvim',
      'jayp0521/mason-null-ls.nvim',
    },
    config = function()
      require('mason').setup({})

      require('mason-tool-installer').setup({
        ensure_installed = {
          'stylua',
          'lua-language-server',
        },
        auto_update = true,
        run_on_start = true,
      })

      -- mason-null-ls
      require('mason-null-ls').setup({
        ensure_installed = { 'stylua' },
        automatic_installation = true,
      })
    end,
  },

  -- none-ls.nvim
  {
    'nvimtools/none-ls.nvim',
    dependencies = { 'nvim-lua/plenary.nvim', 'williamboman/mason.nvim' },
    config = function()
      local null_ls = require('null-ls')

      null_ls.setup({
        sources = {
          null_ls.builtins.formatting.stylua.with({
            filetypes = { 'lua' },
          }),
        },
      })

      -- Auto format on save
      vim.api.nvim_create_autocmd('BufWritePre', {
        callback = function(args)
          vim.lsp.buf.format({
            bufnr = args.buf,
          })
        end,
      })
    end,
  },

  -- lua-language-server configuration
  {
    'neovim/nvim-lspconfig',
    dependencies = {
      {
        'folke/lazydev.nvim',
        ft = 'lua', -- only load on lua files
        opts = {
          library = {
            -- See the configuration section for more details
            -- Load luvit types when the `vim.uv` word is found
            { path = '${3rd}/luv/library', words = { 'vim%.uv' } },
          },
        },
      },
    },
    config = function()
      require('lspconfig').lua_ls.setup({})
    end,
  },
})

lspのテスト

こんなのを適当に書いた。まあwarningが出とる。変数2度も宣言するなよみたいな。これは正しい。ここで「lazypath」を検索する。これは「lazypath」にカーソルをあわせて*

ただ、ここでやりたいのはlazypathをかたっぱしから検索することではなく、printしている参照先に移動できればよいとした場合、この時Ctrl + ]とかCtrl + tとかするとジャンプできる

また

:lua vim.lsp.buf.rename()

すると

変数の一括置換とか出来るっぽい。キーマップした方が明らかに良さそうだけど。まあここではluaの編集の本題では無いので、一応

telescope lazyでプラグイン一覧を見えるようにしといた

まあこのソースは後ほど

telescopeも含めてあれば何となく便利だろうと思う。

live grepでプラグインの場所を探知

Pluginとか書いておけば便利なのかな...すごいローテクだが...

ソース

とり急ぎこれで十分かな...

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({
  -- Plugin: folke/tokyonight.nvim
  {
    'folke/tokyonight.nvim',
    lazy = false,
    priority = 1000,
    config = function()
      vim.cmd.colorscheme('tokyonight')
    end,
  },
  -- Plugin: williamboman/mason.nvim
  {
    'williamboman/mason.nvim',
    dependencies = {
      'WhoIsSethDaniel/mason-tool-installer.nvim',
      'jayp0521/mason-null-ls.nvim',
    },
    config = function()
      require('mason').setup({})

      require('mason-tool-installer').setup({
        ensure_installed = {
          'stylua',
          'lua-language-server',
        },
        auto_update = true,
        run_on_start = true,
      })

      -- mason-null-ls
      require('mason-null-ls').setup({
        ensure_installed = { 'stylua' },
        automatic_installation = true,
      })
    end,
  },
  -- Plugin: none-ls.nvim
  {
    'nvimtools/none-ls.nvim',
    dependencies = { 'nvim-lua/plenary.nvim', 'williamboman/mason.nvim' },
    config = function()
      local null_ls = require('null-ls')

      null_ls.setup({
        sources = {
          null_ls.builtins.formatting.stylua.with({
            filetypes = { 'lua' },
          }),
        },
      })

      -- Auto format on save
      vim.api.nvim_create_autocmd('BufWritePre', {
        callback = function(args)
          vim.lsp.buf.format({
            bufnr = args.buf,
          })
        end,
      })
    end,
  },

  -- Plugin: lua-language-server configuration
  {
    'neovim/nvim-lspconfig',
    dependencies = {
      {
        'folke/lazydev.nvim',
        ft = 'lua', -- only load on lua files
        opts = {
          library = {
            -- See the configuration section for more details
            -- Load luvit types when the `vim.uv` word is found
            { path = '${3rd}/luv/library', words = { 'vim%.uv' } },
          },
        },
      },
    },
    config = function()
      require('lspconfig').lua_ls.setup({})
    end,
  },

  -- Plugin: nvim-telescope/telescope.nvim
  {
    'nvim-telescope/telescope.nvim',
    tag = '0.1.8',
    dependencies = {
      'nvim-lua/plenary.nvim',
    },
    keys = {
      -- ファイル検索
      {
        '<leader>ff',
        function()
          require('telescope.builtin').find_files()
        end,
        desc = 'Telescope: ファイルを検索',
      },
      -- ライブ検索
      {
        '<leader>fg',
        function()
          require('telescope.builtin').live_grep()
        end,
        desc = 'Telescope: ライブ検索',
      },
      -- バッファ検索
      {
        '<leader>fb',
        function()
          require('telescope.builtin').buffers()
        end,
        desc = 'Telescope: バッファを検索',
      },
      -- ヘルプタグ検索
      {
        '<leader>fh',
        function()
          require('telescope.builtin').help_tags()
        end,
        desc = 'Telescope: ヘルプタグを検索',
      },
      -- カスタム文字列検索
      {
        '<leader>fs',
        function()
          require('telescope.builtin').grep_string({
            search = vim.fn.input('Search > '),
          })
        end,
        desc = 'Telescope: カスタム検索文字列で検索',
      },
    },
  },

  -- Plugin: telescope-lazy.nvim
  {
    'tsakirist/telescope-lazy.nvim',
    dependencies = { 'nvim-telescope/telescope.nvim' },
    config = function()
      require('telescope').load_extension('lazy')
    end,
  },
})

Discussion