local keymap = vim.keymap -- FZF lua headings picker local picker = require("fzf-lua") local function fzf_lua_markdown_headings() local bufnr = vim.api.nvim_get_current_buf() local headings = {} -- Check if treesitter parser is available local ok, parser = pcall(vim.treesitter.get_parser, bufnr, 'markdown') if not ok or not parser then vim.notify("Treesitter markdown parser not available", vim.log.levels.ERROR) return end local query = vim.treesitter.query.parse('markdown', [[ (atx_heading (atx_h1_marker)) @heading ]]) local tree = parser:parse()[1] local root = tree:root() for id, node in query:iter_captures(root, bufnr, 0, -1) do local start_row, start_col, end_row, end_col = node:range() local lnum = start_row + 1 -- Treesitter is 0-indexed, Vim is 1-indexed local text = vim.treesitter.get_node_text(node, bufnr) table.insert(headings, { lnum = lnum, text = text, display = string.format("%4d: %s", lnum, text) }) end picker.fzf_exec(function(fzf_cb) for _, heading in ipairs(headings) do fzf_cb(heading.display) end fzf_cb() -- EOF end, { prompt = "Markdown headings> ", actions = { ['default'] = function(selected) local line_num = tonumber(selected[1]:match("%d+")) vim.api.nvim_win_set_cursor(0, { line_num, 0 }) end } }) end keymap.set("n", "fdh", fzf_lua_markdown_headings, { desc = "Grep: Markdown headings" })