From 8ffbc98161ce5af2263c2642b45d43ecf9702c93 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 5 Nov 2024 00:21:08 +0100 Subject: [PATCH] feat(snacks): use toggle --- lua/lazyvim/config/keymaps.lua | 24 +- lua/lazyvim/plugins/extras/lang/markdown.lua | 4 +- .../plugins/extras/ui/mini-animate.lua | 4 +- .../plugins/extras/ui/treesitter-context.lua | 6 +- lua/lazyvim/plugins/ui.lua | 4 +- lua/lazyvim/util/mini.lua | 5 +- lua/lazyvim/util/toggle.lua | 219 +++--------------- 7 files changed, 58 insertions(+), 208 deletions(-) diff --git a/lua/lazyvim/config/keymaps.lua b/lua/lazyvim/config/keymaps.lua index 423d512f..49d527c4 100644 --- a/lua/lazyvim/config/keymaps.lua +++ b/lua/lazyvim/config/keymaps.lua @@ -115,18 +115,18 @@ map("n", "[w", diagnostic_goto(false, "WARN"), { desc = "Prev Warning" }) -- stylua: ignore start -- toggle options -LazyVim.toggle.map("uf", LazyVim.toggle.format()) -LazyVim.toggle.map("uF", LazyVim.toggle.format(true)) -LazyVim.toggle.map("us", LazyVim.toggle("spell", { name = "Spelling" })) -LazyVim.toggle.map("uw", LazyVim.toggle("wrap", { name = "Wrap" })) -LazyVim.toggle.map("uL", LazyVim.toggle("relativenumber", { name = "Relative Number" })) -LazyVim.toggle.map("ud", LazyVim.toggle.diagnostics) -LazyVim.toggle.map("ul", LazyVim.toggle.number) -LazyVim.toggle.map( "uc", LazyVim.toggle("conceallevel", { values = { 0, vim.o.conceallevel > 0 and vim.o.conceallevel or 2 } })) -LazyVim.toggle.map("uT", LazyVim.toggle.treesitter) -LazyVim.toggle.map("ub", LazyVim.toggle("background", { values = { "light", "dark" }, name = "Background" })) +LazyVim.toggle.format():map("uf") +LazyVim.toggle.format(true):map("uF") +Snacks.toggle.option("spell", { name = "Spelling"}):map("us") +Snacks.toggle.option("wrap", {name = "Wrap"}):map("uw") +Snacks.toggle.option("relativenumber", { name = "Relative Number"}):map("uL") +Snacks.toggle.diagnostics():map("ud") +Snacks.toggle.line_number():map("ul") +Snacks.toggle.option("conceallevel", {off = 0, on = vim.o.conceallevel > 0 and vim.o.conceallevel or 2}):map("uc") +Snacks.toggle.treesitter():map("uT") +Snacks.toggle.option("background", { off = "light", on = "dark" , name = "Dark Background"}):map("ub") if vim.lsp.inlay_hint then - LazyVim.toggle.map("uh", LazyVim.toggle.inlay_hints) + Snacks.toggle.inlay_hints():map("uh") end -- lazygit @@ -163,7 +163,7 @@ map("n", "w", "", { desc = "Windows", remap = true }) map("n", "-", "s", { desc = "Split Window Below", remap = true }) map("n", "|", "v", { desc = "Split Window Right", remap = true }) map("n", "wd", "c", { desc = "Delete Window", remap = true }) -LazyVim.toggle.map("wm", LazyVim.toggle.maximize) +LazyVim.toggle.maximize():map("wm") -- tabs map("n", "l", "tablast", { desc = "Last Tab" }) diff --git a/lua/lazyvim/plugins/extras/lang/markdown.lua b/lua/lazyvim/plugins/extras/lang/markdown.lua index 4829098b..e7977cb5 100644 --- a/lua/lazyvim/plugins/extras/lang/markdown.lua +++ b/lua/lazyvim/plugins/extras/lang/markdown.lua @@ -108,7 +108,7 @@ return { ft = { "markdown", "norg", "rmd", "org" }, config = function(_, opts) require("render-markdown").setup(opts) - LazyVim.toggle.map("um", { + Snacks.toggle({ name = "Render Markdown", get = function() return require("render-markdown.state").enabled @@ -121,7 +121,7 @@ return { m.disable() end end, - }) + }):map("um") end, }, } diff --git a/lua/lazyvim/plugins/extras/ui/mini-animate.lua b/lua/lazyvim/plugins/extras/ui/mini-animate.lua index 1136230a..925a9f80 100644 --- a/lua/lazyvim/plugins/extras/ui/mini-animate.lua +++ b/lua/lazyvim/plugins/extras/ui/mini-animate.lua @@ -21,7 +21,7 @@ return { end, }) - LazyVim.toggle.map("ua", { + Snacks.toggle({ name = "Mini Animate", get = function() return not vim.g.minianimate_disable @@ -29,7 +29,7 @@ return { set = function(state) vim.g.minianimate_disable = not state end, - }) + }):map("ua") local animate = require("mini.animate") return { diff --git a/lua/lazyvim/plugins/extras/ui/treesitter-context.lua b/lua/lazyvim/plugins/extras/ui/treesitter-context.lua index 019977ed..ba9565a1 100644 --- a/lua/lazyvim/plugins/extras/ui/treesitter-context.lua +++ b/lua/lazyvim/plugins/extras/ui/treesitter-context.lua @@ -4,8 +4,7 @@ return { event = "VeryLazy", opts = function() local tsc = require("treesitter-context") - - LazyVim.toggle.map("ut", { + Snacks.toggle({ name = "Treesitter Context", get = tsc.enabled, set = function(state) @@ -15,8 +14,7 @@ return { tsc.disable() end end, - }) - + }):map("ut") return { mode = "cursor", max_lines = 3 } end, } diff --git a/lua/lazyvim/plugins/ui.lua b/lua/lazyvim/plugins/ui.lua index b349665c..3d31e498 100644 --- a/lua/lazyvim/plugins/ui.lua +++ b/lua/lazyvim/plugins/ui.lua @@ -226,7 +226,7 @@ return { "lukas-reineke/indent-blankline.nvim", event = "LazyFile", opts = function() - LazyVim.toggle.map("ug", { + Snacks.toggle({ name = "Indention Guides", get = function() return require("ibl.config").get_config(0).enabled @@ -234,7 +234,7 @@ return { set = function(state) require("ibl").setup_buffer(0, { enabled = state }) end, - }) + }):map("ug") return { indent = { diff --git a/lua/lazyvim/util/mini.lua b/lua/lazyvim/util/mini.lua index e7320a73..28d38f5b 100644 --- a/lua/lazyvim/util/mini.lua +++ b/lua/lazyvim/util/mini.lua @@ -121,7 +121,7 @@ end ---@param opts {skip_next: string, skip_ts: string[], skip_unbalanced: boolean, markdown: boolean} function M.pairs(opts) - LazyVim.toggle.map("up", { + Snacks.toggle({ name = "Mini Pairs", get = function() return not vim.g.minipairs_disable @@ -129,7 +129,8 @@ function M.pairs(opts) set = function(state) vim.g.minipairs_disable = not state end, - }) + }):map("up") + local pairs = require("mini.pairs") pairs.setup(opts) local open = pairs.open diff --git a/lua/lazyvim/util/toggle.lua b/lua/lazyvim/util/toggle.lua index d693dd9d..afa3f670 100644 --- a/lua/lazyvim/util/toggle.lua +++ b/lua/lazyvim/util/toggle.lua @@ -1,85 +1,9 @@ ---@class lazyvim.util.toggle local M = {} ----@class lazyvim.Toggle ----@field name string ----@field icon? string ----@field color_enabled? string ----@field color_disabled? string ----@field get fun():boolean ----@field set fun(state:boolean) - ----@class lazyvim.Toggle.wrap: lazyvim.Toggle ----@operator call:boolean - ----@param toggle lazyvim.Toggle -function M.wrap(toggle) - return setmetatable(toggle, { - __call = function() - toggle.set(not toggle.get()) - local state = toggle.get() - if state then - LazyVim.info("Enabled " .. toggle.name, { title = toggle.name }) - else - LazyVim.warn("Disabled " .. toggle.name, { title = toggle.name }) - end - return state - end, - }) --[[@as lazyvim.Toggle.wrap]] -end - ----@param lhs string ----@param toggle lazyvim.Toggle -function M.map(lhs, toggle) - local t = M.wrap(toggle) - LazyVim.safe_keymap_set("n", lhs, function() - t() - end, { desc = "Toggle " .. toggle.name }) - M.wk(lhs, toggle) -end - -function M.wk(lhs, toggle) - if not LazyVim.has("which-key.nvim") then - return - end - local function safe_get() - local ok, enabled = pcall(toggle.get) - if not ok then - LazyVim.error({ "Failed to get toggle state for **" .. toggle.name .. "**:\n", enabled }, { once = true }) - end - return enabled - end - require("which-key").add({ - { - lhs, - icon = function() - return safe_get() and { icon = toggle.icon or " ", color = toggle.color_enabled or "green" } - or { icon = toggle.icon or " ", color = toggle.color_disabled or "yellow" } - end, - desc = function() - return (safe_get() and "Disable " or "Enable ") .. toggle.name - end, - }, - }) -end - -M.treesitter = M.wrap({ - name = "Treesitter Highlight", - get = function() - return vim.b.ts_highlight - end, - set = function(state) - if state then - vim.treesitter.start() - else - vim.treesitter.stop() - end - end, -}) - ---@param buf? boolean function M.format(buf) - return M.wrap({ + return Snacks.toggle({ name = "Auto Format (" .. (buf and "Buffer" or "Global") .. ")", get = function() if not buf then @@ -93,118 +17,45 @@ function M.format(buf) }) end ----@param opts? {values?: {[1]:any, [2]:any}, name?: string} -function M.option(option, opts) - opts = opts or {} - local name = opts.name or option - local on = opts.values and opts.values[2] or true - local off = opts.values and opts.values[1] or false - return M.wrap({ - name = name, +function M.maximize() + ---@type {k:string, v:any}[]? + local maximized = nil + return Snacks.toggle({ + name = "Maximize", get = function() - return vim.opt_local[option]:get() == on + return maximized ~= nil end, set = function(state) - vim.opt_local[option] = state and on or off + if state then + maximized = {} + local function set(k, v) + table.insert(maximized, 1, { k = k, v = vim.o[k] }) + vim.o[k] = v + end + set("winwidth", 999) + set("winheight", 999) + set("winminwidth", 10) + set("winminheight", 4) + vim.cmd("wincmd =") + -- `QuitPre` seems to be executed even if we quit a normal window, so we don't want that + -- `VimLeavePre` might be another consideration? Not sure about differences between the 2 + vim.api.nvim_create_autocmd("ExitPre", { + once = true, + group = vim.api.nvim_create_augroup("lazyvim_restore_max_exit_pre", { clear = true }), + desc = "Restore width/height when close Neovim while maximized", + callback = function() + M.maximize.set(false) + end, + }) + else + for _, opt in ipairs(maximized) do + vim.o[opt.k] = opt.v + end + maximized = nil + vim.cmd("wincmd =") + end end, }) end -local nu = { number = true, relativenumber = true } -M.number = M.wrap({ - name = "Line Numbers", - get = function() - return vim.opt_local.number:get() or vim.opt_local.relativenumber:get() - end, - set = function(state) - if state then - vim.opt_local.number = nu.number - vim.opt_local.relativenumber = nu.relativenumber - else - nu = { number = vim.opt_local.number:get(), relativenumber = vim.opt_local.relativenumber:get() } - vim.opt_local.number = false - vim.opt_local.relativenumber = false - end - end, -}) - -M.diagnostics = M.wrap({ - name = "Diagnostics", - get = function() - local enabled = false - if vim.diagnostic.is_enabled then - enabled = vim.diagnostic.is_enabled() - elseif vim.diagnostic.is_disabled then - enabled = not vim.diagnostic.is_disabled() - end - return enabled - end, - set = function(state) - if vim.fn.has("nvim-0.10") == 0 then - if state then - pcall(vim.diagnostic.enable) - else - pcall(vim.diagnostic.disable) - end - else - vim.diagnostic.enable(state) - end - end, -}) - -M.inlay_hints = M.wrap({ - name = "Inlay Hints", - get = function() - return vim.lsp.inlay_hint.is_enabled({ bufnr = 0 }) - end, - set = function(state) - vim.lsp.inlay_hint.enable(state, { bufnr = 0 }) - end, -}) - ----@type {k:string, v:any}[] -M._maximized = nil -M.maximize = M.wrap({ - name = "Maximize", - get = function() - return M._maximized ~= nil - end, - set = function(state) - if state then - M._maximized = {} - local function set(k, v) - table.insert(M._maximized, 1, { k = k, v = vim.o[k] }) - vim.o[k] = v - end - set("winwidth", 999) - set("winheight", 999) - set("winminwidth", 10) - set("winminheight", 4) - vim.cmd("wincmd =") - -- `QuitPre` seems to be executed even if we quit a normal window, so we don't want that - -- `VimLeavePre` might be another consideration? Not sure about differences between the 2 - vim.api.nvim_create_autocmd("ExitPre", { - once = true, - group = vim.api.nvim_create_augroup("lazyvim_restore_max_exit_pre", { clear = true }), - desc = "Restore width/height when close Neovim while maximized", - callback = function() - M.maximize.set(false) - end, - }) - else - for _, opt in ipairs(M._maximized) do - vim.o[opt.k] = opt.v - end - M._maximized = nil - vim.cmd("wincmd =") - end - end, -}) - -setmetatable(M, { - __call = function(m, ...) - return m.option(...) - end, -}) - return M