|  |  | @ -70,6 +70,13 @@ local function get_line_details(lnum) | 
			
		
	
		
		
			
				
					
					|  |  |  | end |  |  |  | end | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | -- Helper: Creates proper indent string based on buffer settings | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | local function get_indent_string() | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     local sw = vim.bo.shiftwidth | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     local et = vim.bo.expandtab | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     return et and string.rep(" ", sw) or "\t" | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | end | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | -- Helper: Gets details for the current line including cursor position |  |  |  | -- Helper: Gets details for the current line including cursor position | 
			
		
	
		
		
			
				
					
					|  |  |  | local function get_current_line_details_with_cursor() |  |  |  | local function get_current_line_details_with_cursor() | 
			
		
	
		
		
			
				
					
					|  |  |  |     local cursor_pos = vim.api.nvim_win_get_cursor(0) |  |  |  |     local cursor_pos = vim.api.nvim_win_get_cursor(0) | 
			
		
	
	
		
		
			
				
					|  |  | @ -266,35 +273,46 @@ local function setup_buffer_keymaps() | 
			
		
	
		
		
			
				
					
					|  |  |  |         end |  |  |  |         end | 
			
		
	
		
		
			
				
					
					|  |  |  | 	end |  |  |  | 	end | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	-- indent line if tab is pressed when line is a todo (Will be refactored in Step 4) |  |  |  |     -- Handle tab indentation for TODO lines | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	local function press_tab() |  |  |  |     local function press_tab() | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		local current_line = vim.api.nvim_get_current_line() |  |  |  |         local details = get_line_details(vim.api.nvim_win_get_cursor(0)[1]) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		-- Updated pattern to match -, *, + markers |  |  |  |         if not details or not details.is_todo then | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		local pattern = "^%s*[%-%*%+]%s+%[[ x]%]" |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if string.match(current_line, pattern) then |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			-- Still using feedkeys for now, will be refactored later |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes("<C-t>", true, false, true), "i", false) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             return "" -- Action handled by feedkeys |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		else |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             -- Return <Tab> to allow default behavior |  |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |             return vim.api.nvim_replace_termcodes("<Tab>", true, false, true) |  |  |  |             return vim.api.nvim_replace_termcodes("<Tab>", true, false, true) | 
			
		
	
		
		
			
				
					
					|  |  |  |         end |  |  |  |         end | 
			
		
	
		
		
			
				
					
					|  |  |  | 	end |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	-- indent line if shift tab is pressed when line is a todo (Will be refactored in Step 4) |  |  |  |         local indent_str = get_indent_string() | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	local function press_shift_tab() |  |  |  |         local new_line = details.indent .. indent_str ..  | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		local current_line = vim.api.nvim_get_current_line() |  |  |  |                        (details.marker or "-") .. " [ ] " .. details.content | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		-- Updated pattern to match -, *, + markers |  |  |  |         vim.api.nvim_set_current_line(new_line) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		local pattern = "^%s*[%-%*%+]%s+%[[ x]%]" |  |  |  |          | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		if string.match(current_line, pattern) then |  |  |  |         -- Calculate new cursor column (preserve relative position) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			-- Still using feedkeys for now, will be refactored later |  |  |  |         local cursor_col = vim.api.nvim_win_get_cursor(0)[2] | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes("<C-d>", true, false, true), "i", false) |  |  |  |         local new_col = cursor_col + #indent_str | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             return "" -- Action handled by feedkeys |  |  |  |         vim.api.nvim_win_set_cursor(0, {vim.api.nvim_win_get_cursor(0)[1], new_col}) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		else |  |  |  |          | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             -- Return <S-Tab> to allow default behavior |  |  |  |         return "" -- Prevent default behavior | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     end | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     -- Handle shift-tab outdentation for TODO lines | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     local function press_shift_tab() | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         local details = get_line_details(vim.api.nvim_win_get_cursor(0)[1]) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if not details or not details.is_todo or #details.indent == 0 then | 
			
		
	
		
		
			
				
					
					|  |  |  |             return vim.api.nvim_replace_termcodes("<S-Tab>", true, false, true) |  |  |  |             return vim.api.nvim_replace_termcodes("<S-Tab>", true, false, true) | 
			
		
	
		
		
			
				
					
					|  |  |  |         end |  |  |  |         end | 
			
		
	
		
		
			
				
					
					|  |  |  | 	end |  |  |  | 
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         local sw = vim.bo.shiftwidth | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         local new_indent = details.indent:sub(1, -sw - 1) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         local new_line = new_indent ..  | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                        (details.marker or "-") .. " [ ] " .. details.content | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         vim.api.nvim_set_current_line(new_line) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |          | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         -- Calculate new cursor column (preserve relative position) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         local cursor_col = vim.api.nvim_win_get_cursor(0)[2] | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         local new_col = math.max(0, cursor_col - sw) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         vim.api.nvim_win_set_cursor(0, {vim.api.nvim_win_get_cursor(0)[1], new_col}) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |          | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         return "" -- Prevent default behavior | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     end | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	-- Toggles the checkbox [ ] <-> [x] for lines starting with -, *, +, or # |  |  |  | 	-- Toggles the checkbox [ ] <-> [x] for lines starting with -, *, +, or # | 
			
		
	
		
		
			
				
					
					|  |  |  | 	local function toggle_todo() |  |  |  | 	local function toggle_todo() | 
			
		
	
	
		
		
			
				
					|  |  | @ -322,9 +340,9 @@ local function setup_buffer_keymaps() | 
			
		
	
		
		
			
				
					
					|  |  |  | 	vim.keymap.set("n", "<leader>t", function() end, { desc = "+TODOs", buffer = 0 }) -- Placeholder |  |  |  | 	vim.keymap.set("n", "<leader>t", function() end, { desc = "+TODOs", buffer = 0 }) -- Placeholder | 
			
		
	
		
		
			
				
					
					|  |  |  |     -- Keep <CR> mapping without expr = true |  |  |  |     -- Keep <CR> mapping without expr = true | 
			
		
	
		
		
			
				
					
					|  |  |  | 	vim.keymap.set("i", "<CR>", press_enter, { desc = "Todoer: Handle Enter", buffer = 0 }) |  |  |  | 	vim.keymap.set("i", "<CR>", press_enter, { desc = "Todoer: Handle Enter", buffer = 0 }) | 
			
		
	
		
		
			
				
					
					|  |  |  |     -- Keep expr = true for Tab/S-Tab for now, until they are refactored |  |  |  |     -- Tab handling for TODO items | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	vim.keymap.set("i", "<TAB>", press_tab, { desc = "Todoer: Handle Tab", expr = true, buffer = 0 }) |  |  |  | 	vim.keymap.set("i", "<TAB>", press_tab, { desc = "Todoer: Handle Tab", buffer = 0 }) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	vim.keymap.set("i", "<S-Tab>", press_shift_tab, { desc = "Todoer: Handle Shift-Tab", expr = true, buffer = 0 }) |  |  |  | 	vim.keymap.set("i", "<S-Tab>", press_shift_tab, { desc = "Todoer: Handle Shift-Tab", buffer = 0 }) | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	vim.keymap.set("n", "<leader>tt", toggle_todo, { desc = "Todoer: Toggle TODO", buffer = 0 }) |  |  |  | 	vim.keymap.set("n", "<leader>tt", toggle_todo, { desc = "Todoer: Toggle TODO", buffer = 0 }) | 
			
		
	
		
		
			
				
					
					|  |  |  | 	-- New mappings for adding TODOs |  |  |  | 	-- New mappings for adding TODOs | 
			
		
	
		
		
			
				
					
					|  |  |  | 	vim.keymap.set("n", "<leader>ti", add_todo_insert_mode, { desc = "Todoer: Add TODO (cursor after marker)", buffer = 0, silent = true }) |  |  |  | 	vim.keymap.set("n", "<leader>ti", add_todo_insert_mode, { desc = "Todoer: Add TODO (cursor after marker)", buffer = 0, silent = true }) | 
			
		
	
	
		
		
			
				
					|  |  | 
 |