Compare commits

...

4 commits

8 changed files with 112 additions and 66 deletions

View file

@ -42,11 +42,11 @@ M.open_float = function(opts) vim.diagnostic.open_float(opts) end
---Toggle diagnostics in the given buffer.
---@param bufnr integer|nil: Buffer number (0 for current buffer, nil for all buffers.
M.toggle = function(bufnr)
bufnr = bufnr or 0
if vim.diagnostic.is_disabled(bufnr) then
vim.diagnostic.enable(bufnr)
local filter = { bufnr = bufnr or 0 }
if vim.diagnostic.is_enabled(filter) then
vim.diagnostic.enable(false, filter)
else
vim.diagnostic.disable(bufnr)
vim.diagnostic.enable(true, filter)
end
end

View file

@ -4,34 +4,76 @@ return {
dependencies = "nvim-tree/nvim-web-devicons",
opts = function()
local icons = require("fschauen.util.icons")
local dynamic_color = require("fschauen.util.lualine").dynamic_color
local indicator = require("fschauen.util.lualine").indicator
local window = require("fschauen.util.window")
local orange = "#d65d0e"
local autoformat = require("fschauen.util.autoformat").lualine()
local is_diagnostics_enabled = function(bufnr)
return vim.diagnostic.is_enabled { bufnr = bufnr or 0 }
end
--
-- Components
--
local autoformat = indicator {
icon = icons.ui.Format,
cond = require("fschauen.util.autoformat").is_enabled,
}
local branch = {
"branch",
icon = require("fschauen.util.icons").git.Branch,
icon = icons.git.Branch,
cond = window.is_medium,
}
local diagnostics = {
dynamic_color("diagnostics"),
cond = is_diagnostics_enabled,
}
local diag_status = indicator {
icon = icons.ui.Diagnostic,
cond = is_diagnostics_enabled,
}
local fileformat = {
"fileformat",
cond = window.is_medium,
}
local diagnostics = dynamic_color("diagnostics")
local fileformat = { "fileformat", cond = window.is_medium }
local filename = "fschauen.filename"
local filetype = { dynamic_color("filetype"), cond = window.is_medium }
local filetype = {
dynamic_color("filetype"),
cond = window.is_medium,
}
local mode = "fschauen.mode"
local searchcount = "fschauen.searchcount"
local spell = "fschauen.spell"
local status =
{ dynamic_color("fschauen.status"), color = { fg = orange }, padding = 0 }
local whitespace = { dynamic_color("fschauen.whitespace"), cond = window.is_wide }
local wrap = "fschauen.wrap"
local spell = indicator {
icon = icons.ui.SpellCheck,
cond = function() return vim.o.spell end,
}
local status = {
dynamic_color("fschauen.status"),
color = { fg = orange },
padding = 0,
}
local whitespace = {
dynamic_color("fschauen.whitespace"),
cond = window.is_wide,
}
local wrap = indicator {
icon = icons.ui.TextWrap,
cond = function() return vim.o.wrap end,
}
--
-- Sections
--
local sections = {
lualine_a = { mode },
lualine_b = { branch },
lualine_c = { filename, status },
lualine_x = { diagnostics, searchcount, whitespace, filetype },
lualine_y = { spell, wrap, autoformat, fileformat, "progress" },
lualine_y = { diag_status, spell, wrap, autoformat, fileformat, "progress" },
lualine_z = { "location" },
}

View file

@ -4,18 +4,18 @@ M._augroup = nil
---Whether autoformatting is enabled.
---@return boolean
local is_enabled = function() return M._augroup ~= nil end
M.is_enabled = function() return M._augroup ~= nil end
---Disable autoformatting.
M.disable = function()
if not is_enabled() then return end
if not M.is_enabled() then return end
vim.api.nvim_del_augroup_by_id(M._augroup)
M._augroup = nil
end
---Enable autoformatting.
M.enable = function()
if is_enabled() then return end
if M.is_enabled() then return end
local ok, formatter = pcall(require, "formatter.format")
if not ok then
@ -34,21 +34,11 @@ end
---Toggle autoformatting.
M.toggle = function()
if is_enabled() then
if M.is_enabled() then
M.disable()
else
M.enable()
end
end
---Create a lualine component that shows an icon when autoformatting is enabled.
---@return table component
M.lualine = function()
local icon = require("fschauen.util.icons").ui.Format
return {
function() return icon end,
cond = is_enabled,
}
end
return M

View file

@ -119,9 +119,11 @@ M.ui = {
ReadOnly = "", -- "RO",
Search = "", -- 
Sleep = "󰒲",
SpellCheck = "󰓆",
Telescope = "",
TestTube = "󰙨", -- 󰤑
Text = "󰬴",
TextWrap = "󰖶",
Toggle = "󰨚",
TrafficLight = "󱠪",
Tree = "",

View file

@ -38,4 +38,37 @@ M.dynamic_color = function(base)
return component
end
---@class LualineIndicatorSpec
---@field icon string The icon to show when the indicator is active.
---@field cond function A function that returns true when the indicator should
--- be visible, false otherwise.
---Make a lualine indicator that shows an icon when a condition is true.
---@param spec LualineIndicatorSpec
---@return table component
M.indicator = function(spec)
vim.validate {
spec = { spec, "table" },
icon = { spec.icon, "string" },
cond = { spec.cond, "function" },
}
local component = require("lualine.component"):extend()
function component:init(options)
component.super.init(
self,
vim.tbl_deep_extend(
"keep",
options or {},
{ cond = spec.cond or function() return false end }
)
)
end
function component:update_status(--[[is_focused]]_) return spec.icon or "?" end
return component
end
return M

View file

@ -6,22 +6,29 @@ function M:init(options)
vim.tbl_extend("keep", options or {}, {
maxcount = 999,
timeout = 250,
cond = function() return vim.v.hlsearch == 1 end,
})
)
end
function M:update_status()
if vim.v.hlsearch == 0 then return "" end
local denominator = function(tbl)
if tbl.total > tbl.maxcount then return "󰛤" end
return string.format("%d", tbl.total)
end
local count = vim.fn.searchcount {
local render = function(tbl)
local status = "?"
if not vim.tbl_isempty(tbl) and vim.v.hlsearch == 1 then
status = string.format("%d/%s", tbl.current, denominator(tbl))
end
return string.format(" %s", status)
end
function M:update_status()
return render(vim.fn.searchcount {
maxcount = self.options.maxcount,
timeout = self.options.timeout,
}
if next(count) == nil then return "" end
local denominator = count.total > count.maxcount and "󰛤"
or string.format("%d", count.total)
return string.format(" %d/%s", count.current, denominator)
})
end
return M

View file

@ -1,14 +0,0 @@
local M = require("lualine.component"):extend()
function M:init(options)
M.super.init(
self,
vim.tbl_deep_extend("keep", options or {}, {
cond = function() return vim.o.spell end,
})
)
end
function M:update_status(--[[is_focused]]_) return "󰓆" end
return M

View file

@ -1,14 +0,0 @@
local M = require("lualine.component"):extend()
function M:init(options)
M.super.init(
self,
vim.tbl_deep_extend("keep", options or {}, {
cond = function() return vim.o.wrap end,
})
)
end
function M:update_status(--[[is_focused]]_) return "󰖶" end
return M