diff --git a/.gitignore b/.gitignore index e69de29..6374ba3 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1 @@ +**/test** diff --git a/lua/udivim.lua b/lua/udivim.lua index e69de29..a9030c1 100644 --- a/lua/udivim.lua +++ b/lua/udivim.lua @@ -0,0 +1,78 @@ +local M = {} + +local function highlight_todo_items() + local lines = vim.api.nvim_buf_get_lines(0, 0, -1, false) + for i, line in ipairs(lines) do + if line:match("^✔ ") then + vim.api.nvim_buf_add_highlight(0, -1, "TodoDoneHighlight", i - 1, 0, 3) + vim.api.nvim_buf_add_highlight(0, -1, "TodoDone", i - 1, 3, -1) + elseif line:match("^● ") then + vim.api.nvim_buf_add_highlight(0, -1, "TodoPendingHighlight", i - 1, 0, 3) + vim.api.nvim_buf_add_highlight(0, -1, "TodoPending", i - 1, 3, -1) + elseif line:match("^⚠ ") then + vim.api.nvim_buf_add_highlight(0, -1, "TodoImportantHighlight", i - 1, 0, 3) + vim.api.nvim_buf_add_highlight(0, -1, "TodoImportant", i - 1, 3, -1) + else + vim.api.nvim_buf_add_highlight(0, -1, "Normal", i - 1, 0, -1) + end + end +end + +local function replace_task_symbols() + local lines = vim.api.nvim_buf_get_lines(0, 0, -1, false) + for i, line in ipairs(lines) do + if line:match("^x ") then + vim.api.nvim_buf_set_text(0, i - 1, 0, i - 1, 1, { "✔" }) + elseif line:match("^- ") then + vim.api.nvim_buf_set_text(0, i - 1, 0, i - 1, 1, { "●" }) + elseif line:match("^! ") then + vim.api.nvim_buf_set_text(0, i - 1, 0, i - 1, 1, { "⚠" }) + end + end +end + +function M.setup() + vim.api.nvim_set_hl(0, "TodoDoneHighlight", { fg = "#00FF00", bold = true }) + vim.api.nvim_set_hl(0, "TodoPendingHighlight", { fg = "#FFFF00", bold = true }) + vim.api.nvim_set_hl(0, "TodoImportantHighlight", { fg = "#FF0000", bold = true }) + vim.api.nvim_set_hl(0, "TodoDone", { link = "Comment" }) + vim.api.nvim_set_hl(0, "TodoPending", { link = "Identifier" }) + vim.api.nvim_set_hl(0, "TodoImportant", { link = "Error" }) + vim.api.nvim_create_autocmd({ "BufRead", "BufNewFile" }, { + pattern = "*.udi", + callback = function() + vim.bo.filetype = "udi" + vim.opt_local.conceallevel = 2 + end, + }) + vim.api.nvim_create_autocmd("FileType", { + pattern = "udi", + callback = function() + replace_task_symbols() + highlight_todo_items() + end, + }) + vim.api.nvim_create_autocmd("TextChangedI", { + pattern = "*.udi", + callback = function() + replace_task_symbols() + highlight_todo_items() + end, + }) +end + +function M.toggle_todo() + local line = vim.api.nvim_get_current_line() + if line:match("^✔ ") then + vim.api.nvim_set_current_line("●" .. line:sub(4)) + elseif line:match("^● ") then + vim.api.nvim_set_current_line("✔" .. line:sub(4)) + elseif line:match("^⚠ ") then + vim.api.nvim_set_current_line("✔" .. line:sub(4)) + end + highlight_todo_items() +end + +vim.api.nvim_set_keymap("n", "t", ":lua require('udivim').toggle_todo()", { noremap = true, silent = true }) + +return M