如何在Telescope预览缓冲区启用完整的JSON Treesitter语法高亮
解决Telescope预览缓冲区JSON Treesitter高亮不全问题
问题核心是你用vim.inspect生成的是Lua表的字符串表示,并非标准JSON格式,Treesitter的JSON解析器无法正确识别这种非标准结构,导致高亮效果残缺。按以下方式修改代码即可解决:
修改要点
- 用
vim.json.encode替代vim.inspect,将Lua表转换为标准JSON字符串 - 给预览缓冲区设置
filetype=json,让Neovim识别这是JSON文件 - 强制Treesitter重新解析缓冲区内容,确保高亮生效
修改后的完整代码片段
local function pick_board(json_data) local opts = {} pickers .new(opts, { prompt_title = "Boards", finder = finders.new_table({ results = json_data, entry_maker = opts.entry_maker or boardentry_maker(opts), }), attach_mappings = function(prompt_bufnr, _) actions.select_default:replace(function() actions.close(prompt_bufnr) local selection = action_state.get_selected_entry() pick_framework(selection["value"]["data"]) end) return true end, previewer = previewers.new_buffer_previewer({ title = "Board Info", define_preview = function(self, entry, _) -- 生成标准JSON字符串,替代Lua表格式的输出 local json_str = vim.json.encode(entry["value"]["data"]) -- 将JSON字符串拆分为行(若需要单行展示可省略此步) local json = vim.split(json_str, "\n") local bufnr = self.state.bufnr vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, json) vim.defer_fn(function() vim.api.nvim_buf_set_option(bufnr, 'wrap', true) vim.api.nvim_buf_set_option(bufnr, 'linebreak', true) vim.api.nvim_buf_set_option(bufnr, 'wrapmargin', 2) -- 设置缓冲区文件类型为JSON vim.api.nvim_buf_set_option(bufnr, 'filetype', 'json') -- 启动Treesitter并强制重新解析内容 local parser = vim.treesitter.get_parser(bufnr, 'json') parser:parse() end, 0) end, }), sorter = conf.generic_sorter(opts), }) :find() end
额外说明
- 若需要格式化后的多行JSON(更易读),可以引入第三方库如
dkjson来生成带缩进的JSON字符串(Neovim原生vim.json.encode暂不支持格式化) - 设置
filetype=json后,预览缓冲区会自动应用和普通JSON文件一致的语法高亮、缩进规则,完全匹配你的预期效果
内容的提问来源于stack exchange,提问作者Anurag Kumar Singh
相关产品推荐
相关产品推荐

