local M = {} M.config = { notes_dir = vim.fn.expand('~/.nvimwiki') } function M.setup(opts) M.config = vim.tbl_extend('force', M.config, opts or {}) end function M.follow_link() local line = vim.api.nvim_get_current_line() local wiki_link = line:match('%[%[([^%]]+)%]%]') local md_link = line:match('%[.-%]%(([^%)])%)') local link = wiki_link or md_link if not link then return end if not link:match('%.md$') then link = link .. '.md' end if not link:match('^/') and not link:match('^%.') then local current_dir = vim.fn.expand('%:p:h') local relative_path = current_dir .. '/' .. link -- if file exists, edit it in the buffer if vim.fn.filereadable(realative_path) then vim.cmd('edit' .. relative_path) return end -- need to create file target_path = M.config.notes_dir .. '/' .. link else target_path = link end local parent_dir = vim.fn.fnamemodify(target_path, ':h') if vim.fn.isdirectory(parent_dir) == 0 then vim.fn.mkdir(parent_dir, 'p') end vim.cmd('edit' .. link) end function M.smart_link() local line = vim.api.nvim_get_current_line() local col = vim.api.nvim_win_get_cursor(0)[2] local before = line:sub(1, col + 1) local after = line:sub(col + 1) local in_wiki_link = before:match('%[%[[^%]]*$') and after:match('^[^%]]*%]%]') local in_md_link = before:match('%([^%)]*$') and after:match('^[^%)]*%)') if in_wiki_link or in_md_link then M.follow_link() else local word = vim.fn.expand('') word = word:match('[%w_/%-]+') if word and word ~= '' then vim.cmd('normal! ciW[[' .. word .. ']]') vim.cmd('normal! F[') M.follow_link() end end end function M.setup_keymaps() vim.keymap.set('n', '', M.smart_link, { buffer = true, desc = "follow link"}) vim.keymap.set('n', '', '', { buffer = true, desc = "go back"}) end return M