toggle-checkbox.nvim/lua/toggle-checkbox.lua
Oliver Davies f1e335a96d fix: cursor position is cached
Running the toggle command via a keymap multiple times within the same
file was always returning the first toggled line rather than updating
the cursor position and using the next line.
2022-08-08 21:20:36 -04:00

41 lines
1.1 KiB
Lua

local checked_character = "x"
local checked_checkbox = "[" .. checked_character .. "]"
local unchecked_checkbox = "%[ %]"
local line_contains_an_unchecked_checkbox = function(line)
return string.find(line, unchecked_checkbox)
end
local checkbox = {}
checkbox.check = function(line)
return line:gsub("%[ %]", checked_checkbox)
end
checkbox.uncheck = function(line)
return line:gsub("%[" .. checked_character .. "%]", unchecked_checkbox)
end
local M = {}
M.toggle = function()
local bufnr = vim.api.nvim_buf_get_number(0)
local cursor = vim.api.nvim_win_get_cursor(0)
local current_line = vim.api.nvim_buf_get_lines(bufnr, cursor[1] - 1, cursor[1], false)[1] or ""
-- If the line contains a checked checkbox then uncheck it.
-- Otherwise, if it contains an unchecked checkbox, check it.
local new_line = ""
if line_contains_an_unchecked_checkbox(current_line) then
new_line = checkbox.check(current_line)
else
new_line = checkbox.uncheck(current_line)
end
vim.api.nvim_buf_set_lines(bufnr, cursor[1] - 1, cursor[1], false, { new_line })
vim.api.nvim_win_set_cursor(0, cursor)
end
return M