From efccf421c811d50f1c108364871abb57e4ebaa9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ensar=20Saraj=C4=8Di=C4=87?= Date: Sat, 6 Mar 2021 22:23:05 +0100 Subject: [PATCH] Automatically generate vimwiki reviews index --- symlinks/config/nvim/init.lua | 4 - .../config/nvim/lua/fugitive_extensions.lua | 10 +- symlinks/config/nvim/lua/vimwiki_reviews.lua | 182 +++++++++++++++++- 3 files changed, 177 insertions(+), 19 deletions(-) diff --git a/symlinks/config/nvim/init.lua b/symlinks/config/nvim/init.lua index 3a2132f..9bb4255 100644 --- a/symlinks/config/nvim/init.lua +++ b/symlinks/config/nvim/init.lua @@ -36,9 +36,5 @@ vim.api.nvim_set_keymap('n', 'c', ':ccl lcl', {noremap = true} -- Allow recursive searches vim.cmd('set path+=**') --- Save whenever switching windows or leaving vim. This is useful when running --- the tests inside vim without having to save all files first. -vim.cmd('autocmd FocusLost,WinLeave * :silent! wa') - -- automatically rebalance windows on vim resize vim.cmd('autocmd VimResized * :wincmd =') diff --git a/symlinks/config/nvim/lua/fugitive_extensions.lua b/symlinks/config/nvim/lua/fugitive_extensions.lua index 2cfec45..bb4f5eb 100644 --- a/symlinks/config/nvim/lua/fugitive_extensions.lua +++ b/symlinks/config/nvim/lua/fugitive_extensions.lua @@ -53,29 +53,29 @@ local M = {} -- Prints current branches PR url (not saved to :messages) -- Makes it easy to use terminal for opening url on click -M.print_pr_url = function(...) +function M.print_pr_url(...) vim.cmd('echo "' .. get_pr_url(...) .. '"') end -- Copies current branches PR url to system clipboard -M.copy_pr_url = function(...) +function M.copy_pr_url(...) vim.cmd('let @+ = "' .. get_pr_url(...) .. '"') end -- Opens current banches PR url in default browser -- Utilizes netrw browse, meaning it should behave same as netrw -M.open_new_pr = function(...) +function M.open_new_pr(...) vim.fn['netrw#BrowseX'](get_pr_url(...), 0) end -- Creates new branch and checks out to it -- Similar to `gcb` in fish config -M.create_branch = function(branch) +function M.create_branch(branch) vim.cmd('Git checkout -b ' .. branch) end -- Switches to branch -M.checkout_branch = function(branch) +function M.checkout_branch(branch) vim.cmd('Git checkout ' .. branch) end diff --git a/symlinks/config/nvim/lua/vimwiki_reviews.lua b/symlinks/config/nvim/lua/vimwiki_reviews.lua index c6e41d7..c76a9fc 100644 --- a/symlinks/config/nvim/lua/vimwiki_reviews.lua +++ b/symlinks/config/nvim/lua/vimwiki_reviews.lua @@ -2,6 +2,9 @@ -- - Vimwiki reviews extension library - ------------------------------------------------------------------------------- +local Path = require('plenary.path') +local scandir = require('plenary.scandir') + -- Gets path to reviews dir of provided vimwiki (by index) local function get_reviews_dir(...) local vimwiki = {} @@ -34,6 +37,7 @@ local function read_review_template_into_buffer(vimwiki_reviews_path, review_typ if (vim.fn.filereadable(vim.fn.glob(template_path))) then vim.cmd('read ' .. template_path) + vim.cmd('0d') else if (review_type == 'week') then @@ -48,25 +52,36 @@ local function read_review_template_into_buffer(vimwiki_reviews_path, review_typ end end +local function file_exists_or_open(file_name) + local exists = Path:new(Path:new(file_name):expand()):exists() + local open = vim.fn.bufwinnr(file_name) > 0 + return exists or open +end + +local function get_filename_from_path(path) + local _, filename, _ = string.match(path, "(.-)([^\\/]-%.?([^%.\\/]*))$") + return filename +end + ------------------------------------------------------------------------------- -- - Public API - ------------------------------------------------------------------------------- local M = {} -- Edits weekly review template -M.open_review_weekly_template = function(...) +function M.open_review_weekly_template(...) local reviews_dir = get_reviews_dir(...) vim.cmd('edit ' .. get_review_template_path(reviews_dir, 'week')) end -- Edits monthly review template -M.open_review_monthly_template = function(...) +function M.open_review_monthly_template(...) local reviews_dir = get_reviews_dir(...) vim.cmd('edit ' .. get_review_template_path(reviews_dir, 'month')) end -- Edits yearly review template -M.open_review_yearly_template = function(...) +function M.open_review_yearly_template(...) local reviews_dir = get_reviews_dir(...) vim.cmd('edit ' .. get_review_template_path(reviews_dir, 'year')) end @@ -74,12 +89,12 @@ end -- Open current week weekly review file -- Created buffer is dated to Sunday of current week -- Opens current week because Sunday is good time to do this review -M.vimwiki_weekly_review = function(...) +function M.vimwiki_weekly_review(...) local reviews_dir = get_reviews_dir(...) local days_to_sunday = 7 - tonumber(os.date('%u')) local week_date = os.date('%Y-%m-%d', os.time() + days_to_sunday * 24 * 60 * 60) local file_name = reviews_dir .. week_date .. '-week.md' - local exists = vim.fn.filereadable(vim.fn.glob(file_name)) == 1 + local exists = file_exists_or_open(file_name) vim.cmd('edit ' .. file_name) if (exists == false) then @@ -93,12 +108,12 @@ end -- Created buffer is dated to previous month -- Previous month is calculated in an erroneous way -- 28 days are subtracted from current time to get previous month -M.vimwiki_monthly_review = function(...) +function M.vimwiki_monthly_review(...) local reviews_dir = get_reviews_dir(...) local month_time = os.time() - 28 * 24 * 60 * 60 local month_date = os.date('%Y-%m', month_time) local file_name = reviews_dir .. month_date .. '-month.md' - local exists = vim.fn.filereadable(vim.fn.glob(file_name)) == 1 + local exists = file_exists_or_open(file_name) vim.cmd('edit ' .. file_name) if (exists == false) then @@ -109,11 +124,11 @@ end -- Open past year yearly review file -- Created buffer is dated to previous year -M.vimwiki_yearly_review = function(...) +function M.vimwiki_yearly_review(...) local reviews_dir = get_reviews_dir(...) local year_date = (tonumber(os.date('%Y')) - 1) local file_name = reviews_dir .. year_date .. '-year.md' - local exists = vim.fn.filereadable(vim.fn.glob(file_name)) == 1 + local exists = file_exists_or_open(file_name) vim.cmd('edit ' .. file_name) if (exists == false) then @@ -122,10 +137,157 @@ M.vimwiki_yearly_review = function(...) end end +-- Generates review index table +-- Takes arguments similar to all vimwiki calls +-- (no args, or 1 arg representing vimwiki index) +function M.get_review_index(...) + local reviews_dir = get_reviews_dir(...) + local reviews_path = Path:new(reviews_dir):expand() + + local entries = scandir.scan_dir( + reviews_path, + { + hidden = false, + add_dirs = false, + respect_gitignore = true, + depth = 1 + }) + + local index = {} + -- TODO better default values handling + for _,entry in pairs(entries) do + local filename = get_filename_from_path(entry) + if (string.match(filename, '^%d*-year.md$')) + then + local year = string.match(filename, '(%d*)-year') + if (index[year] == nil) + then + index[year] = { + months = {} + } + end + index[year].year = filename + elseif (string.match(filename, '^%d*-%d*-month.md$')) + then + local year = string.match(filename, '(%d*)-%d*-month') + local month = string.match(filename, '(%d*)-month') + if (index[year] == nil) + then + index[year] = { + months = {} + } + end + if (index[year].months[month] == nil) + then + index[year].months[month] = { + weeks = {} + } + end + index[year].months[month].month = filename + elseif (string.match(filename, '^%d*-%d*-%d*-week.md$')) + then + local year = string.match(filename, '(%d*)-%d*-%d*-week') + local month = string.match(filename, '(%d*)-%d*-week') + local week = string.match(filename, '(%d*)-week') + if (index[year] == nil) + then + index[year] = { + months = {} + } + end + if (index[year].months[month] == nil) + then + index[year].months[month] = { + weeks = {} + } + end + index[year].months[month].weeks[week] = filename + end + end + + return index +end + -- Open reviews index file -M.vimwiki_review_index = function(...) +function M.vimwiki_review_index(...) local reviews_dir = get_reviews_dir(...) vim.cmd('edit ' .. reviews_dir .. 'reviews.md') + + local index = M.get_review_index(...) + + local lines = { + '# Reviews', + '', + } + + local month_names = { + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December' + } + + -- Sort index by year + local years = {} + for k in pairs(index) do table.insert(years, k) end + table.sort(years, function(a, b) return a > b end) + + local tablelength = function(T) + local count = 0 + for _ in pairs(T) do count = count + 1 end + return count + end + + -- Add years + for _, year in pairs(years) do + table.insert(lines, '## ' .. year) + table.insert(lines, '') + if (index[year].year) + then + table.insert(lines, '- [Yearly review](' .. index[year].year .. ')') + table.insert(lines, '') + end + + -- Sort months + local months = {} + for k in pairs(index[year].months) do table.insert(months, k) end + table.sort(months, function(a, b) return a > b end) + + -- Add months + for _, month in pairs(months) do + table.insert(lines, '### ' .. month_names[tonumber(month)]) + table.insert(lines, '') + if (index[year].months[month].month) + then + table.insert(lines, '- [Monthly review](' .. index[year].months[month].month .. ')') + end + + -- Sort weeks + local weeks = index[year].months[month].weeks + table.sort(weeks, function(a, b) return a > b end) + + -- Add weeks + local count = tablelength(weeks) + for _, week in pairs(weeks) do + table.insert(lines, '- [Week #' .. count .. ' Review](' .. week .. ')') + count = count - 1 + end + + table.insert(lines, '') + end + end + + local buf = vim.api.nvim_get_current_buf() + vim.api.nvim_buf_set_lines(buf, 0, -1, false, {}) -- Clear out + vim.api.nvim_buf_set_lines(buf, 0, 0, false, lines) -- Put new contents end return M