diff --git a/README.md b/README.md index 6456e2a..c6a641b 100644 --- a/README.md +++ b/README.md @@ -1,96 +1,35 @@ + # tidy.nvim 🧹 -A function and autocommand pair that can +A function and autocommand pair that removes all - - remove all empty lines at the top of the buffer - - remove all trailing whitespace - - remove a variable amount of empty lines at the end of the buffer - - condense multiple empty lines into one + - trailing whitespace + - empty lines at the end of the buffer 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 - -```lua -use{ - "mcauley-penney/tidy.nvim", - config = function() - require "tidy".setup{} - end, - event = "BufWritePre" -} -``` -## Configuration - -### default - -Tidy comes with the below default configuration: +## install +- Packer ```lua -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 - } - } -} +use "McAuleyPenney/tidy.nvim" ``` -### how to customize - -To customize which formattings will apply, give a list to the `setup` function: +or with lazy-loading ```lua -use{ - "mcauley-penney/tidy.nvim", - config = function() - require "tidy".setup{ - fmts = { - "eof", - "ws" - } - } - end, - event = "BufWritePre" -} +use{ "McAuleyPenney/tidy.nvim", 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 +## Credits: +- [Vim Tips Wiki entry for removing unwanted spaces](https://vim.fandom.com/wiki/Remove_unwanted_spaces#Automatically_removing_all_trailing_whitespace) -![whitespace](https://user-images.githubusercontent.com/59481467/146851131-c39e9ba8-851f-4a12-9eb5-609f8f7b29ab.gif) +- ib., the author of [this stack overflow answer](https://stackoverflow.com/a/7501902) -## Credits: -- [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 3eaa45a..ab7e04f 100644 --- a/lua/tidy/init.lua +++ b/lua/tidy/init.lua @@ -1,54 +1,20 @@ -local M = { - config = { - eof_quant = -1, - fmts = { - "sof", - "eof", - "multi", - "ws" - } - } -} +-- MP -function M.setup(user_config) - -- 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 +local M = {} function M.tidy_up() - local cmd_mods = ":keepjumps keeppatterns silent! " - - local patterns = { - -- delete all lines at end of buffer, see sources - eof = [[0;/^\%(\n*.\)\@!/ + ]] .. M.config.eof_quant .. ",$d", - - -- compress all instances of multiple newlines into one, see sources - multi = [[:%s/\n\{2,}/\r\r/e]], - - -- delete all new lines at beginning of file - sof = [[%s/\%^\n*/]], - - -- delete all whitespace, see sources - ws = [[%s/\s\+$//e]] - } -- get tuple of cursor position before making changes - local pos = vim.api.nvim_win_get_cursor(0) + local pos = vim.api.nvim_win_get_cursor( 0 ) - -- execute chosen patterns - for _, fmt_type in ipairs(M.config.fmts) do - vim.cmd(cmd_mods .. patterns[fmt_type]) - end + -- delete all whitespace, see source 1 + 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]] -- get row count after line deletion - local end_row = vim.api.nvim_buf_line_count(0) + local end_row = vim.api.nvim_buf_line_count( 0 ) --[[ if the row value in the original cursor @@ -63,7 +29,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 new file mode 100644 index 0000000..f0d021e --- /dev/null +++ b/plugin/tidy.vim @@ -0,0 +1,4 @@ +augroup Tidy + au! + au BufWritePre * lua require( "tidy" ).tidy_up() +augroup END