vim.keymap.set("n", "t", function() end, { desc = "+Todos" }) -- add new todo line when previous is already a todo local function press_enter() local current_line = vim.api.nvim_get_current_line() -- Check if the current line matches the pattern local pattern = "^%- %[[ x]%] .*$" local match = string.match(current_line, pattern) if match then if string.len(current_line) >= 7 then vim.api.nvim_feedkeys("\n- [ ] ", "n", true) else -- go to normal mode before removing the content of the line vim.api.nvim_feedkeys(vim.api.nvim_eval('"\\"'), "n", true) vim.api.nvim_feedkeys("_", "n", true) vim.api.nvim_feedkeys("C", "n", true) vim.api.nvim_feedkeys("\n", "n", true) -- vim.api.nvim_set_current_line("") end else vim.api.nvim_feedkeys("\n", "n", true) end end vim.keymap.set("i", "", press_enter, { desc = "On enter", noremap = true, expr = true }) -- function that checks if the current line starts with the string "- [ ]" or "- [x]" and toggles the x local function toggle_todo() local openpattern = "^%s*%- %[[ ]%]" local closedpattern = "^%s*%- %[[x]%]" local titleopenpattern = "^%s*# %[[ ]%]" local titleclosedpattern = "^%s*# %[[x]%]" local line = vim.api.nvim_get_current_line() if string.match(line, openpattern) then line = string.gsub(line, openpattern, "- [x]") vim.api.nvim_set_current_line(line) elseif string.match(line, closedpattern) then line = string.gsub(line, closedpattern, "- [ ]") vim.api.nvim_set_current_line(line) elseif string.match(line, titleopenpattern) then line = string.gsub(line, titleopenpattern, "# [x]") vim.api.nvim_set_current_line(line) elseif string.match(line, titleclosedpattern) then line = string.gsub(line, titleclosedpattern, "# [ ]") vim.api.nvim_set_current_line(line) end end vim.keymap.set("n", "tt", toggle_todo, { desc = "Toggle todo" }) -- function that checks if the current line doesn't start with the string "- [ ] " and, if it doesn't, adds the string at the beginning of the line local function add_todo() local openpattern = "^%s*%- %[[ ]%]" local closedpattern = "^%s*%- %[[x]%]" local line = vim.api.nvim_get_current_line() local index, spaces = string.find(line, "^%s*") if index == 1 and not string.match(line, openpattern) and not string.match(line, closedpattern) then if index == 1 and spaces == 0 then line = "- [ ] " .. line vim.api.nvim_set_current_line(line) elseif index == 1 and spaces > 0 then local spacestring = "" for x = 1, spaces, 1 do spacestring = spacestring .. " " end line = spacestring .. "- [ ] " .. line end end -- if not string.sub(line, 1, 1) == " " then -- line = "- [ ] " .. line -- vim.api.nvim_set_current_line(line) -- else -- line = "- [ ]" .. line -- vim.api.nvim_set_current_line(line) -- end -- end end vim.keymap.set("n", "ta", add_todo, { desc = "Add todo" }) -- function that checks if the current line starts with the string "- [ ]" or "- [x]" and, if it does, removes that string from the line local function remove_todo() local openpattern = "^%s*%- %[[ ]%]" local closedpattern = "^%s*%- %[[x]%]" local line = vim.api.nvim_get_current_line() if string.match(line, openpattern) or string.match(line, closedpattern) then line = string.gsub(line, openpattern, "") line = string.gsub(line, closedpattern, "") vim.api.nvim_set_current_line(line) end end vim.keymap.set("n", "td", remove_todo, { desc = "Remove todo" })