diff --git a/README.md b/README.md index d67dcdc..22c6ada 100644 --- a/README.md +++ b/README.md @@ -9,26 +9,86 @@ on every `BufWritePre`. ![tidy](https://user-images.githubusercontent.com/59481467/142785684-96559135-88e7-4c50-a848-56f2c65262ef.gif) +## install +- Packer with default configuration and lazy-loading -## install -- Packer +```lua +use{ + "mcauley-penney/tidy.nvim", + config = function() + require "tidy".setup{} + end, + event = "BufWritePre" +} +``` + +## Configuration + +### default + +Tidy comes with the below default configuration: ```lua -use "McAuleyPenney/tidy.nvim" +local M = { + config = { + eof_quant = -1, -- the amount of empty lines to leave at the end of + -- the file; -1 = no lines, 0 = 1 line, no limit; + -- only applies if "eof" given to "fmts" + + fmts = { -- the types of formattings to apply + "eof", -- removes lines at end of file + "multi", -- condenses multiple newlines into one + "sof", -- removes lines at start of file + "ws" -- removes trailing whitespace + } + } +} ``` -or with lazy-loading +### how to customize + +To customize which formattings will apply, give a list to the `setup` function: ```lua -use{ "McAuleyPenney/tidy.nvim", event = "BufWritePre" } -``` +use{ + "mcauley-penney/tidy.nvim", + config = function() + require "tidy".setup{ + fmts = { + "eof", + "ws" + } + } + end, + event = "BufWritePre" +} +``` + +### formatting styles + +- `eof`: remove a variable amount of newlines at end of file + +![eof](https://user-images.githubusercontent.com/59481467/146851029-d1c47cfa-a25f-4ea0-b33e-faac6153b5f6.gif) + +- `multi`: condenses multiple newlines into one + +![condense](https://user-images.githubusercontent.com/59481467/146851295-aa77bcb0-d5b3-4c0a-9857-5eb1043e48c9.gif) + +- `sof`: removes lines at start of file + +![sof](https://user-images.githubusercontent.com/59481467/146851203-d7d7c3dd-8c2f-4267-bb71-fde1f95fc88f.gif) + +- `ws`: remove whitespace +![whitespace](https://user-images.githubusercontent.com/59481467/146851131-c39e9ba8-851f-4a12-9eb5-609f8f7b29ab.gif) ## Credits: -- [Vim Tips Wiki entry for removing unwanted spaces](https://vim.fandom.com/wiki/Remove_unwanted_spaces#Automatically_removing_all_trailing_whitespace) - -- ib., the author of [this stack overflow answer](https://stackoverflow.com/a/7501902) - +- [Vim Tips Wiki entry](https://vim.fandom.com/wiki/Remove_unwanted_spaces#Automatically_removing_all_trailing_whitespace) +for removing unwanted spaces +- ib., the author of [this stack overflow answer](https://stackoverflow.com/a/7501902), for how to remove empty lines at the +end of the buffer + - @blackboardd for how to choose how many lines will be kept - [This line](https://github.com/gpanders/editorconfig.nvim/blob/ae3586771996b2fb1662eb0c17f5d1f4f5759bb7/lua/editorconfig.lua#L180) in [gpanders/editorconfig.nvim](https://github.com/gpanders/editorconfig.nvim) for exposing me to the `keepjumps` and `keeppatterns` modifiers +- [Vim Tips Wiki entry](https://vim.fandom.com/wiki/Remove_unwanted_empty_lines) for condensing multiple empty lines diff --git a/lua/tidy/init.lua b/lua/tidy/init.lua index 45e7697..3ade149 100644 --- a/lua/tidy/init.lua +++ b/lua/tidy/init.lua @@ -1,23 +1,54 @@ --- MP +local M = { + config = { + eof_quant = -1, + fmts = { + "sof", + "eof", + "multi", + "ws" + } + } +} +function M.setup(user_config) -local M = {} + -- integrate user configuration + M.config = vim.tbl_deep_extend("force", M.config, user_config or {}) + vim.cmd[[ + augroup Tidy + au! + au BufWritePre * lua require( "tidy" ).tidy_up() + augroup END + ]] +end function M.tidy_up() + local cmd_mods = ":keepjumps keeppatterns silent! " - -- get tuple of cursor position before making changes - local pos = vim.api.nvim_win_get_cursor( 0 ) + local patterns = { + -- delete all new lines at beginning of file - -- delete all whitespace, see source 1 - vim.cmd[[:keepjumps keeppatterns %s/\s\+$//e]] + sof = [[%s/\%^\n*/]], + -- delete all lines at end of buffer, see source 2 - -- delete all lines at end of buffer, see source 2 - vim.cmd[[:keepjumps keeppatterns silent! 0;/^\%(\n*.\)\@!/,$d]] + eof = [[0;/^\%(\n*.\)\@!/ + ]] .. M.config.eof_quant .. ",$d", + -- compress all instances of multiple newlines into one - -- get row count after line deletion - local end_row = vim.api.nvim_buf_line_count( 0 ) + multi = [[:%s/\n\{2,}/\r\r/e]], + -- delete all whitespace, see source 1 + ws = [[%s/\s\+$//e]] + } + + -- get tuple of cursor position before making changes + local pos = vim.api.nvim_win_get_cursor(0) + for _, fmt_type in ipairs(M.config.fmts) do + vim.cmd(cmd_mods .. patterns[fmt_type]) + end + + -- get row count after line deletion + local end_row = vim.api.nvim_buf_line_count(0) --[[ if the row value in the original cursor @@ -32,8 +63,7 @@ function M.tidy_up() pos[1] = end_row end - vim.api.nvim_win_set_cursor( 0, pos ) + vim.api.nvim_win_set_cursor(0, pos) end - return M diff --git a/plugin/tidy.vim b/plugin/tidy.vim deleted file mode 100644 index f1297e9..0000000 --- a/plugin/tidy.vim +++ /dev/null @@ -1,5 +0,0 @@ - -augroup Tidy - au! - au BufWritePre * lua require( "tidy.init" ).tidy_up() -augroup END