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ć
相关产品推荐
相关产品推荐

