@ -1,25 +1,30 @@
local M = { }
local M = { }
local function is_excluded_ft ( opts )
local function list_to_set ( list )
if not opts or not opts.filetype_exclude then
local set = { }
return false
end
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
return set
if entry == ft then
end
return true
end
end
local function is_excluded_ft ( opts )
if not opts.filetype_exclude then
return false
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
end
local function reset_cursor_pos ( pos )
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
if the row value in the original cursor
position tuple is greater than the
position tuple is greater than the
line count after empty line deletion
line count after empty line deletion
@ -28,33 +33,42 @@ local function reset_cursor_pos(pos)
the file when they were deleted ) , set
the file when they were deleted ) , set
the cursor row to the last line .
the cursor row to the last line .
] ]
] ]
if pos [ 1 ] > num_rows then
if pos [ 1 ] > num_rows then
pos [ 1 ] = num_rows
pos [ 1 ] = num_rows
end
end
vim.api . nvim_win_set_cursor ( 0 , pos )
vim.api . nvim_win_set_cursor ( 0 , pos )
end
end
function M . setup ( opts )
function M . setup ( opts )
local tidy_grp = vim.api . nvim_create_augroup ( " tidy " , { clear = true } )
vim.api . nvim_create_autocmd ( " BufWritePre " , {
local defaults = {
group = tidy_grp ,
filetype_exclude = { } ,
callback = function ( )
newline_at_eof = false
if is_excluded_ft ( opts ) then
}
return false
end
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
-- delete lines @ eof
vim.cmd ( [[:keepjumps keeppatterns silent! 0;/^\%(\n*.\)\@!/,$d]] )
vim.cmd ( [[:keepjumps keeppatterns silent! 0;/^\%(\n*.\)\@!/,$d]] )
reset_cursor_pos ( cursor_pos )
reset_cursor_pos ( cursor_pos )
end ,
end ,
} )
} )
end
end
return M
return M