diff --git a/lua/tidy/init.lua b/lua/tidy/init.lua index b31c17b..26dfcd9 100644 --- a/lua/tidy/init.lua +++ b/lua/tidy/init.lua @@ -1,25 +1,30 @@ local M = {} -local function is_excluded_ft(opts) - if not opts or not opts.filetype_exclude then - return false - end +local function list_to_set(list) + local set = {} - local ft = vim.api.nvim_buf_get_option(0, "filetype") + for _, item in ipairs(list) do + set[item] = true + end - for _, entry in ipairs(opts.filetype_exclude) do - if entry == ft then - return true - end - end + return set +end +local function is_excluded_ft(opts) + if not opts.filetype_exclude then return false + end + + local ft = vim.api.nvim_buf_get_option(0, "filetype") + local ft_set = list_to_set(opts.filetype_exclude) + + return ft_set[ft] end local function reset_cursor_pos(pos) - local num_rows = vim.api.nvim_buf_line_count(0) + local num_rows = vim.api.nvim_buf_line_count(0) - --[[ + --[[ if the row value in the original cursor position tuple is greater than the line count after empty line deletion @@ -28,33 +33,42 @@ local function reset_cursor_pos(pos) the file when they were deleted), set the cursor row to the last line. ]] - if pos[1] > num_rows then - pos[1] = num_rows - end + if pos[1] > num_rows then + pos[1] = num_rows + end - vim.api.nvim_win_set_cursor(0, pos) + vim.api.nvim_win_set_cursor(0, pos) end function M.setup(opts) - local tidy_grp = vim.api.nvim_create_augroup("tidy", { clear = true }) - vim.api.nvim_create_autocmd("BufWritePre", { - group = tidy_grp, - callback = function() - if is_excluded_ft(opts) then - return false - end + local defaults = { + filetype_exclude = {}, + newline_at_eof = false + } + + opts = vim.tbl_extend("force", defaults, opts or {}) + + local tidy_grp = vim.api.nvim_create_augroup("tidy", { clear = true }) + + vim.api.nvim_create_autocmd("BufWritePre", { + group = tidy_grp, + callback = function() + if is_excluded_ft(opts) then + return false + end - local cursor_pos = vim.api.nvim_win_get_cursor(0) + local cursor_pos = vim.api.nvim_win_get_cursor(0) - vim.cmd([[:keepjumps keeppatterns %s/\s\+$//e]]) + -- delete trailing whitespace + vim.cmd([[:keepjumps keeppatterns %s/\s\+$//e]]) - -- delete all lines at end of buffer, see source 2 - vim.cmd([[:keepjumps keeppatterns silent! 0;/^\%(\n*.\)\@!/,$d]]) + -- delete lines @ eof + vim.cmd([[:keepjumps keeppatterns silent! 0;/^\%(\n*.\)\@!/,$d]]) - reset_cursor_pos(cursor_pos) - end, - }) + reset_cursor_pos(cursor_pos) + end, + }) end return M