From 01baea7b446ca1ceba20eebcd23d051c55ac1132 Mon Sep 17 00:00:00 2001 From: Yigit Sever Date: Tue, 19 Oct 2021 11:10:31 +0300 Subject: nvim: add stale --- .config/nvim/init.lua | 3 + .config/nvim/lua/stale.lua | 159 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 162 insertions(+) create mode 100644 .config/nvim/lua/stale.lua diff --git a/.config/nvim/init.lua b/.config/nvim/init.lua index 071711d..4644f60 100644 --- a/.config/nvim/init.lua +++ b/.config/nvim/init.lua @@ -20,3 +20,6 @@ require('settings') require('plugin_settings') require('mappings') require('autocmds') + +-- personal plugins lol +require('stale').setup{} diff --git a/.config/nvim/lua/stale.lua b/.config/nvim/lua/stale.lua new file mode 100644 index 0000000..0c79884 --- /dev/null +++ b/.config/nvim/lua/stale.lua @@ -0,0 +1,159 @@ +local M = {} +_VT_NS = vim.api.nvim_create_namespace("lsp_signature") + +local prescript +local prescript_hi +local due_hi +local ft +local future +local future_hi +local date_hi +local pattern_start +local pattern_end + +local use_clock_time +local default_due_time + +-- local date_pattern +local datetime_pattern +local datetime_pattern_match + +local function parseDue(due) + local year = 31556926 + local month = 2629743 + local week = 604800 + local day = 86400 + local hour = 3600 + local minute = 60 + local res = '' + + if due >= year then + res = res .. math.floor(due / year) .. 'y ' + due = due % year + end + + if due >= month then + res = res .. math.floor(due / month) .. 'm ' + due = due % month + end + + if due >= week then + res = res .. math.floor(due / week) .. 'w ' + due = due % week + end + + if use_clock_time == true then + if due >= day then + res = res .. math.floor(due / day) .. 'd ' + due = due % day + end + + if due >= hour then + res = res .. math.floor(due / hour) .. 'h ' + due = due % hour + end + + if due >= minute then + res = res .. math.floor(due / minute) .. 'min ' + due = due % minute + end + else + res = res .. math.floor(due / day) + 1 .. 'd ' + end + + return res +end + +function M.setup(c) + use_clock_time = c.use_clock_time or true + default_due_time = c.default_due_time or 'midnight' + prescript = c.prescript or 'has been: ' + prescript_hi = c.prescript_hi or 'Comment' + due_hi = c.due_hi or 'String' + ft = c.ft or '*.wiki' + future = c.future or 'future' + future_hi = c.future_hi or 'Error' + date_hi = c.date_hi or 'Conceal' + pattern_start = c.pattern_start or '(' + pattern_end = c.pattern_end or ')' + + local lua_start = pattern_start:gsub("[%(%)%.%%%+%-%*%?%[%^%$%]]", "%%%1") + local lua_end = pattern_end:gsub("[%(%)%.%%%+%-%*%?%[%^%$%]]", "%%%1") + + local regex_start = pattern_start:gsub("\\%^%$%.%*~%[%]&", "\\%1") + local regex_end = pattern_end:gsub("\\%^%$%.%*~%[%]&", "\\%1") + + datetime_pattern = lua_start .. '%d%d%d%d%-%d%d%-%d%d %d%d:%d%d' .. lua_end + datetime_pattern_match = lua_start .. '(%d%d%d%d)%-(%d%d)%-(%d%d) (%d%d):(%d%d)' .. lua_end + + local regex_hi = '/' .. regex_start .. '\\d*-*\\d\\+-\\d\\+' .. regex_end .. + '/' + + vim.api.nvim_command('autocmd BufEnter ' .. ft .. + ' lua require("stale").draw(0)') + vim.api.nvim_command('autocmd InsertLeave ' .. ft .. + ' lua require("stale").redraw(0)') + vim.api.nvim_command('autocmd TextChanged ' .. ft .. + ' lua require("stale").redraw(0)') + vim.api.nvim_command('autocmd TextChangedI ' .. ft .. + ' lua require("stale").redraw(0)') + + vim.api.nvim_command('autocmd BufEnter ' .. ft .. ' syn match DueDate ' .. + regex_hi .. + ' display containedin=mkdNonListItemBlock,mkdListItemLine,mkdBlockquote contained') + vim.api.nvim_command('autocmd BufEnter ' .. ft .. ' hi def link DueDate ' .. + date_hi) +end + +function M.draw(buf) + local user_time + local user_hour + local user_min + local user_sec = 00 + + -- get current time + local now = os.time(os.date('*t')) + + -- find which date pattern is being passed in by user + for key, value in pairs(vim.api.nvim_buf_get_lines(buf, 0, -1, {})) do + local dateTime = string.match(value, datetime_pattern) + local due + + if dateTime then + local cur_year, month, day, user_hour, user_min = dateTime:match(datetime_pattern_match) + user_time = os.time({ + year = cur_year, + month = month, + day = day, + hour = user_hour, + min = user_min, + sec = user_sec + }) + + due = now - user_time + end + + if due then + local parsed + + if due > 0 then + parsed = { parseDue(due), due_hi } + else + parsed = { future, future_hi } + end + + vim.api.nvim_buf_set_virtual_text(buf, _VT_NS, key - 1, { + { prescript, prescript_hi }, parsed + }, {}) + end + end +end + +function M.clear(buf) vim.api.nvim_buf_clear_namespace(buf, _VT_NS, 0, -1) end + +function M.redraw(buf) + M.clear(buf) + M.draw(buf) +end + +return M -- cgit v1.2.3-70-g09d2