local zettel = os.getenv('HOME') .. '/zettel' local function render_template(template_path, vars) local lines = vim.fn.readfile(template_path) local text = table.concat(lines, '\n') for key, value in pairs(vars) do text = text:gsub('{{' .. key .. '}}', value) end return vim.split(text, '\n', { plain = true }) end local function open_review(kind, filename, template, vars) local path = zettel .. '/journal/' .. kind .. '/' .. filename .. '.md' vim.fn.mkdir(vim.fn.fnamemodify(path, ':h'), 'p') vim.cmd('edit ' .. vim.fn.fnameescape(path)) if vim.fn.filereadable(path) == 0 or vim.fn.getfsize(path) == 0 then local lines = render_template(zettel .. '/templates/' .. template, vars) vim.api.nvim_buf_set_lines(0, 0, -1, false, lines) vim.cmd('write') end end local function tk(cmd) vim.cmd('Telekasten ' .. cmd) vim.schedule(function() vim.cmd('filetype detect') if vim.bo.filetype == '' and vim.fn.expand('%:e') == 'md' then vim.bo.filetype = 'markdown' end vim.schedule(function() vim.cmd('edit') -- vim.cmd('doautocmd FileType markdown') vim.cmd('redraw!') end) end) end vim.api.nvim_create_autocmd('BufEnter', { callback = function(args) local file = vim.api.nvim_buf_get_name(args.buf) if vim.startswith(file, zettel .. '/') and file:match('%.md$') then vim.keymap.set('i', '[[', function() vim.cmd('stopinsert') vim.cmd('Telekasten insert_link') end, { buffer = args.buf, desc = 'Telekasten insert note link', }) end end, }) return { 'renerocksai/telekasten.nvim', dependencies = { 'nvim-telescope/telescope.nvim', 'nvim-telekasten/calendar-vim', }, event = 'VeryLazy', cmd = 'Telekasten', opts = { -- default vault (notebook) home = zettel, dailies = 'journal/daily', weeklies = 'journal/weekly', templates = 'templates', -- default templates template_new_note = zettel .. '/templates/zettel.md', template_new_daily = zettel .. '/templates/journal-entry.md', template_new_weekly = zettel .. '/templates/weekly-review.md', image_subdir = '_resources', image_link_style = 'wiki', media_previewer = 'telescope-media-files', journal_auto_open = true, -- skips telescope prompt for goto_today and goto_thisweek install_syntax = true, tag_notation = '#tag', -- '#tag', '@tag', ':tag:', 'yaml-bare' subdirs_in_links = false, extension = '.md', auto_set_filetype = false, new_note_filename = 'uuid-title', -- possible choices 'title', 'uuid', 'uuid-title', 'title-uuid' uuid_type = '%Y%m%d%H%M%S', -- uuid_sep = ' ', filename_small_case = true, filename_space_subst = '-', sort = 'filename', -- or 'modified' or 'created' command_palette_theme = 'dropdown', show_tags_theme = 'ivy', rename_update_links = true, follow_creates_nonexisting = true, dailies_create_nonexisting = true, weeklies_create_nonexisting = true, -- enter any additional vaults here vaults = { blog = { home = os.getenv('HOME') .. '/code/projects/blog-danesi.dev/content/posts', dailies = nil, weeklies = nil, templates = vim.fn.expand('~/Templates/blog/'), template_new_note = vim.fn.expand('~/Templates/blog/blog-post.md'), new_note_filename = 'title', filename_small_case = true, filename_space_subst = '-', sort = 'filename', show_tags_theme = 'ivy', tag_notation = 'yaml-bare', auto_set_filetype = false, install_syntax = false, }, }, media_extensions = { '.svg', '.png', '.jpg', '.bmp', '.gif', '.pdf', '.mp4', '.webm', '.webp', }, plug_into_calendar = true, calendar_opts = { weeknm = 1, calendar_monday = 1, calendar_mark = 'left-fit', }, }, vim.keymap.set('n', 'zP', 'Telekasten panel', { desc = 'Open Zettlekasten command palette' }), vim.keymap.set('n', 'zV', 'Telekasten switch_vault', { desc = 'Vault picker' }), vim.keymap.set('n', 'zf', 'Telekasten find_notes', { desc = 'Find notes by title' }), vim.keymap.set('n', 'zD', 'Telekasten find_daily_notes', { desc = 'Find daily notes' }), vim.keymap.set('n', 'zw', 'Telekasten find_weekly_notes', { desc = 'Find weekly notes' }), vim.keymap.set( 'n', 'zF', 'Telekasten find_friends', { desc = 'Find notes linking to note under the cursor' } ), vim.keymap.set('n', 'zs', 'Telekasten search_notes', { desc = 'Search in notes' }), -- vim.keymap.set('n', 'zT', 'Telekasten goto_today', { desc = "Open today's daily note" }), vim.keymap.set('n', 'zT', function() tk('goto_today') end, { desc = "Open today's daily note" }), vim.keymap.set( 'n', 'zW', 'Telekasten goto_thisweek', { desc = 'Open weekly note for the current week' } ), vim.keymap.set('n', 'zg', 'Telekasten follow_link', { desc = 'Follow the link under cursor' }), vim.keymap.set('n', 'zy', 'Telekasten yank_notelink', { desc = 'Yank link to current note' }), vim.keymap.set('n', 'zn', 'Telekasten new_note', { desc = 'Create a new note' }), vim.keymap.set( 'n', 'zr', 'Telekasten rename_note', { desc = 'Rename note and links pointing to it' } ), vim.keymap.set('n', '#', 'Telekasten show_tags', { desc = 'Show tag list' }), vim.keymap.set( 'n', 'zN', 'Telekasten new_templated_note', { desc = 'Create a note using a template' } ), vim.keymap.set('n', 'zc', 'Telekasten show_calendar', { desc = 'Show the calendar' }), vim.keymap.set('n', 'zC', 'CalendarT', { desc = 'Show the calendar (fill window)' }), vim.keymap.set('n', 'zb', 'Telekasten show_backlinks', { desc = 'Show backlinks to this note' }), vim.keymap.set('n', 'zI', 'Telekasten insert_img_link', { desc = 'Insert link to selected image' }), vim.keymap.set('n', 'zp', 'Telekasten preview_img', { desc = 'Preview image' }), vim.keymap.set('n', 'zm', 'Telekasten browse_media', { desc = 'Media browser' }), vim.keymap.set( 'n', 'zi', 'Telekasten paste_img_and_link', { desc = 'Paste an image from clipboard and link to it' } ), vim.keymap.set({ 'n', 'v' }, 'zt', 'Telekasten toggle_todo', { desc = 'Toggle todo' }), vim.keymap.set('n', 'zl', 'Telekasten insert_link', { desc = 'Link to a note' }), -- vim.keymap.set('i', '[[', 'Telekasten insert_link', { desc = 'Link to a note' }), vim.keymap.set('n', 'zM', function() local y = os.date('%Y') local m = os.date('%m') open_review('monthly', y .. '-' .. m, 'monthly-review.md', { title = os.date('%B %Y'), date = os.date('%Y-%m-%d'), year = y, month = m, }) end, { desc = 'Open monthly review' }), vim.keymap.set('n', 'zQ', function() local y = os.date('%Y') local m = tonumber(os.date('%m')) local q = tostring(math.floor((m - 1) / 3) + 1) open_review('quarterly', y .. '-Q' .. q, 'quarterly-review.md', { title = y .. ' Q' .. q, date = os.date('%Y-%m-%d'), year = y, quarter = q, }) end, { desc = 'Open quarterly review' }), vim.keymap.set('n', 'zY', function() local y = os.date('%Y') open_review('yearly', y, 'yearly-review.md', { title = y .. ' Yearly Review', date = os.date('%Y-%m-%d'), year = y, }) end, { desc = 'Open yearly review' }), }