115 lines
2.8 KiB
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
|