You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Neovim中nvim-jdtls与treesitter文档渲染间隙问题求助

解决Neovim中LSP文档Markdown渲染间隙问题

问题描述

  • 从VSCode切换至Neovim,已完成Java编辑环境搭建(依赖mason、nvim-jdtls、lspconfig、blink自动补全)
  • 使用treesitter时,LSP提供的Markdown文档渲染存在异常:内容渲染正确,但原Markdown标记代码的位置留下大量空白间隙,严重影响可读性;点击渲染后的内容时,间隙会被原Markdown代码填充
  • 当前treesitter配置如下:
{
    "nvim-treesitter/nvim-treesitter",
    build = ":TSUpdate",
    opts = {
      highlight = {
        enable = true,
        additional_vim_regex_highlighting = false,
      },
      indent = {
        enable = true,
      },
      ensure_installed = {
        "java",
        "python",
        "html",
        "css",
        "bash",
        "javascript",
        "vue",
        "json",
        "lua",
        "markdown",
        "markdown_inline",
        "regex",
      },
      incremental_selection = {
        enable = true,
      },
      auto_install = true,
    },
    config = function(_, opts)
      require("nvim-treesitter.configs").setup(opts)
    end,
  },

解决方案

1. 调整treesitter配置消除间隙

这个问题本质是treesitter对Markdown标记的解析与LSP浮动窗口的渲染逻辑冲突,可通过启用折叠或针对性禁用treesitter高亮解决:

{
    "nvim-treesitter/nvim-treesitter",
    build = ":TSUpdate",
    opts = {
      highlight = {
        enable = true,
        additional_vim_regex_highlighting = false,
        -- 在LSP浮动窗口中禁用treesitter的markdown高亮,避免冲突
        disable = function(lang, buf)
          local win_config = vim.api.nvim_win_get_config(0)
          return lang == "markdown" and win_config.relative ~= ""
        end
      },
      indent = {
        enable = true,
      },
      -- 启用treesitter折叠,自动隐藏Markdown标记所在的冗余行
      fold = {
        enable = true,
        fold_method = "expr",
        fold_expr = "nvim_treesitter#foldexpr()"
      },
      ensure_installed = {
        "java",
        "python",
        "html",
        "css",
        "bash",
        "javascript",
        "vue",
        "json",
        "lua",
        "markdown",
        "markdown_inline",
        "regex",
      },
      incremental_selection = {
        enable = true,
      },
      auto_install = true,
    },
    config = function(_, opts)
      require("nvim-treesitter.configs").setup(opts)
    end,
  },

2. 替换默认LSP hover窗口(更彻底的方案)

使用专门的LSP增强插件(如lspsaga.nvim)替换Neovim默认的hover窗口,这类插件会直接渲染干净的Markdown内容,自动隐藏原标记代码:

  • 安装并配置lspsaga(以lazy.nvim为例):
{
  "nvimdev/lspsaga.nvim",
  dependencies = {
    "nvim-treesitter/nvim-treesitter",
    "nvim-tree/nvim-web-devicons"
  },
  config = function()
    require("lspsaga").setup({
      hover = {
        max_width = 0.9,
        max_height = 0.8,
      }
    })
  end
}
  • 绑定lspsaga的hover快捷键替换默认LSP hover:
vim.keymap.set('n', 'K', '<cmd>Lspsaga hover_doc<CR>', {silent = true})

3. 自定义treesitter高亮钩子优化渲染

若想通过treesitter钩子调整,可通过自动命令隐藏Markdown标记的高亮或设置行折叠:

vim.api.nvim_create_autocmd("FileType", {
  pattern = "markdown",
  callback = function()
    -- 将Markdown标记的高亮设为与背景色一致,实现隐藏(替换为你的终端背景色)
    vim.cmd("highlight markdownH1 guifg=#1e1e2e guibg=#1e1e2e")
    vim.cmd("highlight markdownH2 guifg=#1e1e2e guibg=#1e1e2e")
    vim.cmd("highlight markdownItalic guifg=#1e1e2e guibg=#1e1e2e")
    -- 启用折叠
    vim.wo.foldenable = true
    vim.wo.foldmethod = "expr"
    vim.wo.foldexpr = "nvim_treesitter#foldexpr()"
  end
})

内容的提问来源于stack exchange,提问作者Saša Marković

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 20:27:03