139 lines
8.1 KiB
Lua
139 lines
8.1 KiB
Lua
--- ### AstroNvim Status Conditions
|
|
--
|
|
-- Statusline related condition functions to use with Heirline
|
|
--
|
|
-- This module can be loaded with `local condition = require "astronvim.utils.status.condition"`
|
|
--
|
|
-- @module astronvim.utils.status.condition
|
|
-- @copyright 2023
|
|
-- @license GNU General Public License v3.0
|
|
|
|
local M = {}
|
|
|
|
local env = require "astronvim.utils.status.env"
|
|
|
|
--- A condition function if the window is currently active
|
|
---@return boolean # whether or not the window is currently actie
|
|
-- @usage local heirline_component = { provider = "Example Provider", condition = require("astronvim.utils.status").condition.is_active }
|
|
function M.is_active() return vim.api.nvim_get_current_win() == tonumber(vim.g.actual_curwin) end
|
|
|
|
--- A condition function if the buffer filetype,buftype,bufname match a pattern
|
|
---@param patterns table the table of patterns to match
|
|
---@param bufnr number of the buffer to match (Default: 0 [current])
|
|
---@return boolean # whether or not LSP is attached
|
|
-- @usage local heirline_component = { provider = "Example Provider", condition = function() return require("astronvim.utils.status").condition.buffer_matches { buftype = { "terminal" } } end }
|
|
function M.buffer_matches(patterns, bufnr)
|
|
for kind, pattern_list in pairs(patterns) do
|
|
if env.buf_matchers[kind](pattern_list, bufnr) then return true end
|
|
end
|
|
return false
|
|
end
|
|
|
|
--- A condition function if a macro is being recorded
|
|
---@return boolean # whether or not a macro is currently being recorded
|
|
-- @usage local heirline_component = { provider = "Example Provider", condition = require("astronvim.utils.status").condition.is_macro_recording }
|
|
function M.is_macro_recording() return vim.fn.reg_recording() ~= "" end
|
|
|
|
--- A condition function if search is visible
|
|
---@return boolean # whether or not searching is currently visible
|
|
-- @usage local heirline_component = { provider = "Example Provider", condition = require("astronvim.utils.status").condition.is_hlsearch }
|
|
function M.is_hlsearch() return vim.v.hlsearch ~= 0 end
|
|
|
|
--- A condition function if showcmdloc is set to statusline
|
|
---@return boolean # whether or not statusline showcmd is enabled
|
|
-- @usage local heirline_component = { provider = "Example Provider", condition = require("astronvim.utils.status").condition.is_statusline_showcmd }
|
|
function M.is_statusline_showcmd() return vim.fn.has "nvim-0.9" == 1 and vim.opt.showcmdloc:get() == "statusline" end
|
|
|
|
--- A condition function if the current file is in a git repo
|
|
---@param bufnr table|integer a buffer number to check the condition for, a table with bufnr property, or nil to get the current buffer
|
|
---@return boolean # whether or not the current file is in a git repo
|
|
-- @usage local heirline_component = { provider = "Example Provider", condition = require("astronvim.utils.status").condition.is_git_repo }
|
|
function M.is_git_repo(bufnr)
|
|
if type(bufnr) == "table" then bufnr = bufnr.bufnr end
|
|
return vim.b[bufnr or 0].gitsigns_head or vim.b[bufnr or 0].gitsigns_status_dict
|
|
end
|
|
|
|
--- A condition function if there are any git changes
|
|
---@param bufnr table|integer a buffer number to check the condition for, a table with bufnr property, or nil to get the current buffer
|
|
---@return boolean # whether or not there are any git changes
|
|
-- @usage local heirline_component = { provider = "Example Provider", condition = require("astronvim.utils.status").condition.git_changed }
|
|
function M.git_changed(bufnr)
|
|
if type(bufnr) == "table" then bufnr = bufnr.bufnr end
|
|
local git_status = vim.b[bufnr or 0].gitsigns_status_dict
|
|
return git_status and (git_status.added or 0) + (git_status.removed or 0) + (git_status.changed or 0) > 0
|
|
end
|
|
|
|
--- A condition function if the current buffer is modified
|
|
---@param bufnr table|integer a buffer number to check the condition for, a table with bufnr property, or nil to get the current buffer
|
|
---@return boolean # whether or not the current buffer is modified
|
|
-- @usage local heirline_component = { provider = "Example Provider", condition = require("astronvim.utils.status").condition.file_modified }
|
|
function M.file_modified(bufnr)
|
|
if type(bufnr) == "table" then bufnr = bufnr.bufnr end
|
|
return vim.bo[bufnr or 0].modified
|
|
end
|
|
|
|
--- A condition function if the current buffer is read only
|
|
---@param bufnr table|integer a buffer number to check the condition for, a table with bufnr property, or nil to get the current buffer
|
|
---@return boolean # whether or not the current buffer is read only or not modifiable
|
|
-- @usage local heirline_component = { provider = "Example Provider", condition = require("astronvim.utils.status").condition.file_read_only }
|
|
function M.file_read_only(bufnr)
|
|
if type(bufnr) == "table" then bufnr = bufnr.bufnr end
|
|
local buffer = vim.bo[bufnr or 0]
|
|
return not buffer.modifiable or buffer.readonly
|
|
end
|
|
|
|
--- A condition function if the current file has any diagnostics
|
|
---@param bufnr table|integer a buffer number to check the condition for, a table with bufnr property, or nil to get the current buffer
|
|
---@return boolean # whether or not the current file has any diagnostics
|
|
-- @usage local heirline_component = { provider = "Example Provider", condition = require("astronvim.utils.status").condition.has_diagnostics }
|
|
function M.has_diagnostics(bufnr)
|
|
if type(bufnr) == "table" then bufnr = bufnr.bufnr end
|
|
return vim.g.diagnostics_mode > 0 and #vim.diagnostic.get(bufnr or 0) > 0
|
|
end
|
|
|
|
--- A condition function if there is a defined filetype
|
|
---@param bufnr table|integer a buffer number to check the condition for, a table with bufnr property, or nil to get the current buffer
|
|
---@return boolean # whether or not there is a filetype
|
|
-- @usage local heirline_component = { provider = "Example Provider", condition = require("astronvim.utils.status").condition.has_filetype }
|
|
function M.has_filetype(bufnr)
|
|
if type(bufnr) == "table" then bufnr = bufnr.bufnr end
|
|
return vim.bo[bufnr or 0].filetype and vim.bo[bufnr or 0].filetype ~= ""
|
|
end
|
|
|
|
--- A condition function if Aerial is available
|
|
---@return boolean # whether or not aerial plugin is installed
|
|
-- @usage local heirline_component = { provider = "Example Provider", condition = require("astronvim.utils.status").condition.aerial_available }
|
|
-- function M.aerial_available() return is_available "aerial.nvim" end
|
|
function M.aerial_available() return package.loaded["aerial"] end
|
|
|
|
--- A condition function if LSP is attached
|
|
---@param bufnr table|integer a buffer number to check the condition for, a table with bufnr property, or nil to get the current buffer
|
|
---@return boolean # whether or not LSP is attached
|
|
-- @usage local heirline_component = { provider = "Example Provider", condition = require("astronvim.utils.status").condition.lsp_attached }
|
|
function M.lsp_attached(bufnr)
|
|
if type(bufnr) == "table" then bufnr = bufnr.bufnr end
|
|
-- HACK: Check for lsp utilities loaded first, get_active_clients seems to have a bug if called too early (tokyonight colorscheme seems to be a good way to expose this for some reason)
|
|
return package.loaded["astronvim.utils.lsp"] and next(vim.lsp.get_active_clients { bufnr = bufnr or 0 }) ~= nil
|
|
end
|
|
|
|
--- A condition function if treesitter is in use
|
|
---@param bufnr table|integer a buffer number to check the condition for, a table with bufnr property, or nil to get the current buffer
|
|
---@return boolean # whether or not treesitter is active
|
|
-- @usage local heirline_component = { provider = "Example Provider", condition = require("astronvim.utils.status").condition.treesitter_available }
|
|
function M.treesitter_available(bufnr)
|
|
if not package.loaded["nvim-treesitter"] then return false end
|
|
if type(bufnr) == "table" then bufnr = bufnr.bufnr end
|
|
local parsers = require "nvim-treesitter.parsers"
|
|
return parsers.has_parser(parsers.get_buf_lang(bufnr or vim.api.nvim_get_current_buf()))
|
|
end
|
|
|
|
--- A condition function if the foldcolumn is enabled
|
|
---@return boolean # true if vim.opt.foldcolumn > 0, false if vim.opt.foldcolumn == 0
|
|
function M.foldcolumn_enabled() return vim.opt.foldcolumn:get() ~= "0" end
|
|
|
|
--- A condition function if the number column is enabled
|
|
---@return boolean # true if vim.opt.number or vim.opt.relativenumber, false if neither
|
|
function M.numbercolumn_enabled() return vim.opt.number:get() or vim.opt.relativenumber:get() end
|
|
|
|
return M
|