adding mapping on md files

This commit is contained in:
Carlos Gutierrez
2025-08-12 06:48:18 -04:00
parent 0b689bfbd4
commit b774da0743

View File

@@ -17,3 +17,74 @@ keymap.set("n", "x", '"_x', opts) -- Delete character without copying into regis
-- Save and quit (additional)
keymap.set("n", "<leader>Q", ":qa!<CR>", { desc = "Quit all" })
-- Put this in your init.lua
local vault_path = "/Users/carlos/Nextcloud/ObsidianVault"
local function follow_obsidian_link()
-- grab the token under cursor, clean obsidian syntax
local raw = vim.fn.expand("<cWORD>")
raw = raw:gsub("^!%[%[", "[[") -- strip leading ! from embeds
local link = raw:gsub("%[%[", ""):gsub("%]%]", "")
-- split off alias and heading
local base, alias = link:match("^(.-)|(.+)$")
link = base or link
local fname, heading = link:match("^(.-)#(.+)$")
link = fname or link
-- normalize spaces
link = link:gsub("\\ ", " "):gsub("^%s+", ""):gsub("%s+$", "")
local function goto_heading(h)
if not h or h == "" then
return
end
-- crude jump: search for markdown heading or block that contains it
vim.cmd("keepjumps normal! gg")
local pat = "^%s*#+%s*" .. vim.pesc(h)
if vim.fn.search(pat) == 0 then
-- fallback: plain search
vim.fn.search(vim.pesc(h))
end
end
-- if link contains a '/', treat it as a relative path inside the vault
if link:find("/") then
local target = vault_path .. "/" .. link .. ".md"
vim.cmd.edit(target)
goto_heading(heading)
return
end
-- otherwise search recursively for basename match anywhere in the vault
local pattern = "**/" .. link .. ".md"
local matches = vim.fn.globpath(vault_path, pattern, false, true) -- list
if #matches == 1 then
vim.cmd.edit(matches[1])
goto_heading(heading)
elseif #matches > 1 then
vim.ui.select(matches, { prompt = "Multiple matches for " .. link .. ":" }, function(choice)
if choice then
vim.cmd.edit(choice)
goto_heading(heading)
end
end)
else
-- not found: offer to create at vault root
local target = vault_path .. "/" .. link .. ".md"
vim.ui.input({ prompt = "Create " .. target .. " ? (y/N) " }, function(ans)
if ans and ans:lower():sub(1, 1) == "y" then
vim.cmd.edit(target)
-- optional: insert a title
if vim.fn.line("$") == 1 and vim.fn.getline(1) == "" then
vim.api.nvim_buf_set_lines(0, 0, 0, false, { "# " .. (alias or link), "" })
end
goto_heading(heading)
end
end)
end
end
vim.keymap.set("n", "<leader>o", follow_obsidian_link, { noremap = true, silent = true })