🔖

Neovim0.11でLua LSの「undefined global vim」警告を解消する

に公開

Lua Language Serverを入れてNeovim設定ファイルを編集すると undefined global vim な警告が出るのでなんとかする。

前提とする環境

  • Neovim v0.11.1
  • Lazy.nvim
  • nvim-lspconfig

設定はnvim-lspconfigのconfig関数に書く前提です。

{
    "neovim/nvim-lspconfig",
    config = function()
        -- ここに書く
    end
}

ただ消す

ただ警告を消すだけならダイレクトにvimをグローバル変数として登録しておく。

vim.lsp.config("lua_ls", {
     settings = {
         Lua = {
             diagnostics = {
                  globals = { "vim" }
             }
         }
     }
})

Neovim設定ファイルの編集に特化したLS設定をする

nvim-lspconfigのlua_ls設定のコメントにいい感じの設定が載っているのでコピペして持ってくる。

以下ほぼコピペだが、'${3rd}/luv/library' の読み込み部分だけ追加した。
(これを追加しないとvim.uv以下にアクセスするコードで Undefined field fs_stat とかの警告が出る)

-- Neovim編集に特化した設定
-- from https://github.com/neovim/nvim-lspconfig/blob/master/lsp/lua_ls.lua
vim.lsp.config('lua_ls', {
    on_init = function(client)
        -- ここでNeovim設定ファイルの編集かどうかを判定して
        -- 違ったら特別な設定は行わない、という意図だと思われる
        if client.workspace_folders then
            local path = client.workspace_folders[1].name
            if
                path ~= vim.fn.stdpath('config')
                and (vim.uv.fs_stat(path .. '/.luarc.json') or vim.uv.fs_stat(path .. '/.luarc.jsonc'))
            then
                return
            end
        end

        -- ここからNeovim設定ファイル編集特化の設定を行う
        client.config.settings.Lua = vim.tbl_deep_extend('force', client.config.settings.Lua, {
            runtime = {
                version = 'LuaJIT',
                path = {
                    'lua/?.lua',
                    'lua/?/init.lua',
                },
            },
            workspace = {
                checkThirdParty = false,
                library = {
                    vim.env.VIMRUNTIME,
                    -- vim.uv. 以下のAPIへのアクセスでwarningが出るのを防ぐため追加
                    '${3rd}/luv/library'
                }
            }
        })
    end,
    settings = {
        Lua = {}
    }
})

いい感じにしてくれるプラグインを入れる

lazydev.nvimというプラグインを入れるとLua LSをNeovim編集特化に設定してくれるようだ。これを入れれば警告も消えるはず(試してないけど)。

私にとってはちょっとオーバースペックというか、あまりわかってないままプラグインを入れたくない気分なので一旦保留。もっと問題が出てきたら入れるかも。

参考:

Discussion