diff --git a/README.md b/README.md index 75d26f6..56b82a3 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ use "cpea2506/relative-toggle.nvim" ### Requirements -- Neovim >= 0.7.2 +- Neovim >= 0.8.0 ## ⚙️ Setup diff --git a/lua/relative-toggle/init.lua b/lua/relative-toggle/init.lua index 03d9ad8..20c01dc 100644 --- a/lua/relative-toggle/init.lua +++ b/lua/relative-toggle/init.lua @@ -1,63 +1,51 @@ local M = {} -local config = require "relative-toggle.config" -local logs = require "relative-toggle.logs" - ----creates an autocommand event handler. ----@param event object ----@param opts? table -local function create_autocmd(event, opts) - local event_ok, error = pcall(vim.api.nvim_create_autocmd, event, opts) - - if not event_ok then - logs.error(error) - end -end - --- to keep the combination of number and relativenumber -local current_number = vim.o.number - ----@param relative boolean #whether relativenumber should be set ----@param redraw boolean #whether to redraw the screen -local function set_relativenumber(relative, redraw) - -- ignore for buffer or window with these off by default +---Set relative number +---@param relative boolean #Whether relative number should be set +---@param number boolean #Whether number should be set +---@param redraw boolean #Whether to redraw the screen +local function set_relativenumber(relative, number, redraw) + -- Ignore for buffer or window with number and relative number off by default if not vim.o.number and not vim.o.relativenumber then return end local in_insert_mode = vim.api.nvim_get_mode().mode == "i" - vim.opt.number = not relative or in_insert_mode or current_number + vim.opt.number = not relative or in_insert_mode or number vim.opt.relativenumber = relative and not in_insert_mode if redraw then - vim.cmd "redraw" + vim.cmd.redraw() end end function M.setup(user_config) - local events = config.events - local augroup = vim.api.nvim_create_augroup("relative-toggle", {}) + local config = require "relative-toggle.config" + local augroup = vim.api.nvim_create_augroup("relative-toggle", { clear = true }) vim.opt.relativenumber = true + -- To keep the combination of number and relativenumber + local current_number = vim.o.number + config:extend(user_config) - create_autocmd(events.on, { + vim.api.nvim_create_autocmd(config.events.on, { pattern = config.pattern, group = augroup, - desc = "turn relative number on", - callback = function(ev) - set_relativenumber(true, ev.event == "CmdlineEnter") + desc = "Turn relative number on", + callback = function(args) + set_relativenumber(true, current_number, args.event == "CmdlineEnter") end, }) - create_autocmd(events.off, { + vim.api.nvim_create_autocmd(config.events.off, { pattern = config.pattern, group = augroup, - desc = "turn relative number off", - callback = function(ev) - set_relativenumber(false, ev.event == "CmdlineEnter") + desc = "Turn relative number off", + callback = function(args) + set_relativenumber(false, current_number, args.event == "CmdlineEnter") end, }) end diff --git a/neovim.yml b/neovim.yml index 31614c0..18602ba 100644 --- a/neovim.yml +++ b/neovim.yml @@ -7,6 +7,12 @@ globals: args: - type: any - type: ... + assert.is_true: + args: + - type: any + assert.is_false: + args: + - type: any assert.is_not.equal: args: - type: any diff --git a/tests/spec/config_spec.lua b/tests/spec/config_spec.lua index 47d58f0..fe960eb 100644 --- a/tests/spec/config_spec.lua +++ b/tests/spec/config_spec.lua @@ -1,18 +1,66 @@ +local config = require "relative-toggle.config" +local relative_toggle = require "relative-toggle" + +describe("Config options", function() + it("could be indexed without options field", function() + assert.equal("*", config.pattern) + assert.are.same(config.events.on, { "BufEnter", "FocusGained", "InsertLeave", "WinEnter", "CmdlineLeave" }) + assert.are.same(config.events.off, { "BufLeave", "FocusLost", "InsertEnter", "WinLeave", "CmdlineEnter" }) + end) +end) + describe("Override config", function() - local relative_toggle = require "relative-toggle" - local config = require "relative-toggle.config" + local expected = { + pattern = "*.toml", + events = { + on = "BufWinEnter", + off = "BufWinLeave", + }, + } + + relative_toggle.setup(expected) it("should change default config", function() - local expected = { - pattern = "*.toml", - events = { - on = "BufWinEnter", - off = "BufWinLeave", - }, - } + assert.equal(expected.pattern, config.pattern) + assert.are.same(expected.events, config.events) + end) + + it("should change default autocmds", function() + local function tbl_contains(table, value) + return vim.tbl_contains(table, function(v) + for k, _ in pairs(value) do + if v[k] ~= value[k] then + return false + end + end + + return true + end, { predicate = true }) + end + + local groupid = vim.api.nvim_create_augroup("relative-toggle", { clear = false }) + local autocmds = vim.api.nvim_get_autocmds { group = groupid } + + assert.is_true(tbl_contains(autocmds, { pattern = "*.toml", event = "BufWinEnter" })) + assert.is_true(tbl_contains(autocmds, { pattern = "*.toml", event = "BufWinLeave" })) + assert.is_false(tbl_contains(autocmds, { pattern = "*.toml", event = "InsertEnter" })) + end) + + it("should change default relativenumber", function() + local groupid = vim.api.nvim_create_augroup("relative-toggle", { clear = false }) + + vim.api.nvim_exec_autocmds(config.events.on, { + group = groupid, + pattern = config.pattern, + }) + + assert.is_true(vim.o.relativenumber) - relative_toggle.setup(expected) + vim.api.nvim_exec_autocmds(config.events.off, { + group = groupid, + pattern = config.pattern, + }) - assert.are.same(expected, config.options) + assert.is_false(vim.o.relativenumber) end) end)