53 lines
1.5 KiB
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" })
|