dotfiles/config/nvim/lua/fschauen/window.lua

115 lines
2.8 KiB
Lua

local M = {}
---Determine whether the window is wide.
---@param win_nr integer|nil: window number or window-ID, 0 for current window.
---@return boolean
M.is_wide = function(win_nr)
return vim.fn.winwidth(win_nr or 0) > 80
end
---Determine whether the window is medium.
---@param win_nr integer|nil: window number or window-ID, 0 for current window.
---@return boolean
M.is_medium = function(win_nr)
return vim.fn.winwidth(win_nr or 0) > 50
end
---Whether the current window is the last in a given direction.
---@param direction string: one of 'h', 'j', 'k', or 'l'
local is_last = function(direction)
local current = vim.api.nvim_get_current_win()
vim.cmd("wincmd " .. direction)
local next = vim.api.nvim_get_current_win()
local is_last = current == next
if not is_last then
vim.cmd("wincmd p")
end
return is_last
end
---Resize current window in a given direction.
---@param dir string: one of 'h', 'j', 'k', or 'l'
---@param size integer: how much to resize
local resize = function(dir, size)
if dir ~= "h" and dir ~= "j" and dir ~= "k" and dir ~= "l" then
return
end
size = math.abs(size)
local is_height = dir == "j" or dir == "k"
local is_positive = dir == "j" or dir == "l"
if is_last(is_height and "j" or "l") then
is_positive = not is_positive
end
local delta = string.format("%s%d", is_positive and "+" or "-", size)
local prefix = is_height and "" or "vertical "
vim.cmd(prefix .. "resize " .. delta .. "<cr>")
end
---Resize current window upwards.
---@param size integer: how much to resize
M.resize_up = function(size)
return function()
resize("k", size)
end
end
---Resize current window downwards.
---@param size integer: how much to resize
M.resize_down = function(size)
return function()
resize("j", size)
end
end
---Resize current window leftwards.
---@param size integer: how much to resize
M.resize_left = function(size)
return function()
resize("h", size)
end
end
---Resize current window rightwards.
---@param size integer: how much to resize
M.resize_right = function(size)
return function()
resize("l", size)
end
end
---Toggle quickfix (or location) list.
---@param qf string: 'c' for quickfix, 'l' for location list
local toggle_list = function(qf)
local l = qf == "l" and 1 or 0
local is_qf = function(win)
return win.quickfix == 1 and win.loclist == l
end
local is_open = not vim.tbl_isempty(vim.tbl_filter(is_qf, vim.fn.getwininfo()))
if is_open then
vim.cmd(qf .. "close")
else
local ok = pcall(function(c)
vim.cmd(c)
end, qf .. "open")
if not ok and qf == "l" then
vim.notify("No location list", vim.log.levels.WARN)
end
end
end
---Toggle quickfix list.
M.toggle_quickfix = function()
toggle_list("c")
end
---Toggle location list.
M.toggle_loclist = function()
toggle_list("l")
end
return M