t0vim/ftplugin/markdown.lua

53 lines
1.5 KiB
Lua

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", "<leader>fdh", fzf_lua_markdown_headings, { desc = "Grep: Markdown headings" })