neovim lsp でrust-analyzerの診断エラーの下線が消えない問題を無理やり対処した

2025/02/28に公開

rust-analyzerの診断エラーの下線が消えない。なぜだ。

  • item2
  • neovim v0.10.4

lspconfigの設定でunderline=falseに設定した。lua_lsでは確かに下線が消えているが、rust_analyzerでは消えない。

なぜ消したいかというとunderlineが大量に表示された状態でのカーソル移動が遅すぎる。これもまた原因がよくわからない。調査能力不足。
とりあえず。下線がなければカーソル移動が通常とかわらないことはわかった。

on_attachでunderlineをオフにする。

rust_analyzerのon_attachで設定すれば効くことがわかったのでこれでとりあえず対処。

vim.diagnostic.config({ underline = false })
  {
    "neovim/nvim-lspconfig",
    config = function()
      -- エラー文言などを画面に直接出さない
      vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with(vim.lsp.diagnostic.on_publish_diagnostics, {
        underline = false,
        virtual_text = false,
        signs = true,
        update_in_insert = false,
      })
      ---- キーマップの設定
      local opts = { noremap = true, silent = true }
      ---- 定義
      vim.api.nvim_set_keymap("n", "gd", "<cmd>lua vim.lsp.buf.definition()<CR>", opts)
      ---- 参照
      vim.api.nvim_set_keymap("n", "gr", "<cmd>lua vim.lsp.buf.references()<CR>", opts)
    end,
  },

mason-lspconfigでの設定抜粋

local function setup_lua_ls(config)
  -- lua_ls固有の設定を追加
  config.settings = {
    Lua = {
      runtime = { version = "LuaJIT", path = vim.split(package.path, ";") },
      diagnostics = { globals = { "vim" } },
      -- vimのライブラリを読み込めるようにする
      workspace = { library = vim.api.nvim_get_runtime_file("", true) },
      telemetry = { enable = false },
    },
  }
end

local function setup_rust(config)
  config.on_attach = function(client, bufnr)
    ---- diagnostic 下線を非表示。nvim-lspconfigの設定が効かないのでここで設定
    vim.diagnostic.config({ underline = false })

    -- フォーマッター
    if client.server_capabilities.documentFormattingProvider then
      vim.api.nvim_buf_set_keymap(
        bufnr,
        "n",
        "<leader>f",
        ":lua vim.lsp.buf.format({ async = true })<CR>",
        { noremap = true, silent = true }
      )
    end
  end
end

local server_configs = {
  lua_ls = setup_lua_ls,
  rust_analyzer = setup_rust,
}

require("mason-lspconfig").setup_handlers({
  function(server_name)
    local config = {
      capabilities = vim.tbl_deep_extend(
        "force",
        vim.lsp.protocol.make_client_capabilities(),
        require("cmp_nvim_lsp").default_capabilities()
      ),
    }
    config.capabilities.workspace.didChangeWatchedFiles.dynamicRegistration = false

    -- 言語サーバーごとの設定関数を呼び出す
    if server_configs[server_name] then
      server_configs[server_name](config)
    else
      setup_default(config)
    end

    require("lspconfig")[server_name].setup(config)
  end,
})

Discussion