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() -- create a variable called openpattern with a pattern that matches a string that starts with any amount of spaces or tabs followed by "- [ ]" local openpattern = "^%s*%- %[[ x]%]" -- create a variable called closepattern with a pattern that matches a string that starts with any amount of spaces or tabs followed by "- [x]" local closedpattern = "^%s*%- %[[ x]%]" -- create a variable called titleopenpattern with a pattern that matches a string that starts with "# [ ]" local titleopenpattern = "^# [ ]" -- create a variable called titleclosedpattern with a pattern that matches a string that starts with "# [x]" local titleclosedpattern = "^# [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 -- if string.sub(line, 1, 5) == "- [ ]" then -- line = string.sub(line, 6, -1) -- line = "- [x]" .. line -- vim.api.nvim_set_current_line(line) -- elseif string.sub(line, 1, 5) == "- [x]" then -- line = string.sub(line, 6, -1) -- line = "- [ ]" .. line -- vim.api.nvim_set_current_line(line) -- elseif string.sub(line, 1, 5) == "# [ ]" then -- line = string.sub(line, 6, -1) -- line = "# [x]" .. line -- vim.api.nvim_set_current_line(line) -- elseif string.sub(line, 1, 5) == "# [x]" then -- line = string.sub(line, 6, -1) -- line = "# [ ]" .. line -- 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 line = vim.api.nvim_get_current_line() if string.sub(line, 1, 5) ~= "- [ ] " then line = "- [ ] " .. line vim.api.nvim_set_current_line(line) vim.api.nvim_feedkeys("A", "n", true) 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 line = vim.api.nvim_get_current_line() if string.sub(line, 1, 6) == "- [ ] " or string.sub(line, 1, 6) == "- [x] " then line = string.sub(line, 7, -1) vim.api.nvim_set_current_line(line) end end vim.keymap.set("n", "td", remove_todo, { desc = "Remove todo" })