Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ use "cpea2506/relative-toggle.nvim"

### Requirements

- Neovim >= 0.7.2
- Neovim >= 0.8.0

## ⚙️ Setup

Expand Down
54 changes: 21 additions & 33 deletions lua/relative-toggle/init.lua
Original file line number Diff line number Diff line change
@@ -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<string, any>
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
Expand Down
6 changes: 6 additions & 0 deletions neovim.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
70 changes: 59 additions & 11 deletions tests/spec/config_spec.lua
Original file line number Diff line number Diff line change
@@ -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)
Loading