dotfiles/nvim/.config/nvim/after/ftplugin/markdown.lua
Marty Oehme c26ef032d2
nvim: Add mapping to insert todo item into markdown
Use <C-x> when in insert mode and it will prepend the line with an empty
todo item.
2025-07-16 17:53:59 +02:00

75 lines
2.7 KiB
Lua

local map = vim.keymap.set
vim.opt.tabstop = 2
vim.opt.shiftwidth = 2
vim.opt.softtabstop = 2
if require("core.util").is_available("which-key") then
require("which-key").add({
{ "<localleader>c", group = "codecells" },
{ "<localleader>e", group = "criticmarkup" },
})
end
-- add tasks w/ <C-x>
map({ "i" }, "<C-x>", function()
local line = vim.api.nvim_get_current_line()
local cursor = vim.api.nvim_win_get_cursor(0)
-- remove existing prefixes if any
-- TODO: Improved matching for e.g. '- [ ]' already on line, or indented '-'
-- and add task on line below if line is already populated
local updated_line = line:gsub("^%s*[-*]%s*", "", 1)
vim.api.nvim_set_current_line(updated_line)
vim.api.nvim_win_set_cursor(0, { cursor[1], #updated_line })
vim.api.nvim_put({ "- [ ] " }, "c", true, true)
end)
if require("core.util").is_available("zk") and require("zk.util").notebook_root(vim.fn.expand("%:p")) ~= nil then
map("n", "<CR>", "<cmd>lua vim.lsp.buf.definition()<cr>", { silent = true })
end
if require("core.util").is_available("mdeval") then
-- execute code cells
if vim.fn.mapcheck("<localleader>cc") == "" then
map("n", "<localleader>cc", require("mdeval").eval_code_block, { silent = true, desc = "evaluate code block" })
end
if vim.fn.mapcheck("<localleader>cx") == "" then
map(
"n",
"<localleader>cx",
require("mdeval").eval_clean_results,
{ silent = true, desc = "clear code results" }
)
end
end
-- jump to beginning of previous/ next cell code
map("n", "]c", "/^```<cr>}:nohl<cr>", { desc = "next code cell" })
map("n", "[c", "?^```<cr>n}:nohl<cr>", { desc = "previous code cell" })
-- insert cell header above/below
map("n", "<localleader>co", "o```python<cr><cr>```<esc>k", { desc = "Insert code cell below" })
map("n", "<localleader>cO", "O```python<cr><cr>```<esc>k", { desc = "Insert code cell above" })
if require("core.util").is_available("which-key") then
require("which-key").add({ "<localleader>p", group = "prose" })
end
-- show nice md preview in browser (auto-syncs scrolling)
local peek_key = "<localleader>po"
if require("core.util").is_available("peek") then
map("n", peek_key, function()
local peek = require("peek")
if peek.is_open() then
peek.close()
else
peek.open()
end
end, { desc = "show md preview" })
elseif vim.fn.exists(":MarkdownPreviewToggle") > 0 then
map("n", peek_key, "<Plug>MarkdownPreviewToggle", { desc = "show md preview" })
end
-- create mindmaps directly from markdown! requires external executable
if vim.fn.executable("markmap") then
map("n", "<leader>pm", "<cmd>MarkmapOpen<cr>", { desc = "open md mindmap" })
map("n", "<leader>pM", "<cmd>MarkmapWatch<cr>", { desc = "watch for md mindmap" })
end