require("which-key").add({
    { "<leader>b",   group = "buffer" },
    { "<leader>bd",  Snacks.bufdelete.delete,                   name = "delete current" },
    { "<leader>bo",  Snacks.bufdelete.other,                    name = "delete others" },
    { "<leader>bk",  ":noa w<CR>",                              name = "write w/out format" },

    { "<leader>c",   group = "code" },
    { "<leader>ca",  vim.lsp.buf.code_action,                   name = "code action" },
    { "<leader>cd",  vim.diagnostic.open_float,                 name = "diagnostic" },
    { "<leader>cr",  vim.lsp.buf.rename,                        name = "rename" },

    { "<leader>e",   Snacks.explorer.open,                      name = "explorer" },

    { "<leader>f",   group = "find" },
    { "<leader>fb",  Snacks.picker.buffers,                     name = "buffers" },
    { "<leader>ff",  Snacks.picker.files,                       name = "files" },
    { "<leader>fg",  Snacks.picker.grep,                        name = "grep" },

    { "<leader>g",   group = "git" },
    { "<leader>gb",  group = "blame" },
    { "<leader>gbf", ":Gitsigns blame<CR>",                     name = "file" },
    { "<leader>gbh", ":Gitsigns blame_line<CR>",                name = "hover" },
    { "<leader>gbl", ":Gitsigns toggle_current_line_blame<CR>", name = "virtual text" },
    { "<leader>gh",  group = "hunk" },
    { "<leader>ghr", ":Gitsigns reset_hunk<CR>",                name = "reset hunk" },
    { "<leader>ghp", ":Gitsigns preview_hunk<CR>",              name = "preview hunk" },

    { "<leader>s",   group = "search" },
    { "<leader>ss",  Snacks.picker.lsp_workspace_symbols,       name = "symbols" },
    { "<leader>sg",  Snacks.picker.grep,                        name = "grep" },
    { "<leader>sn",  Snacks.picker.notifications,               name = "notifications" },

    { "<leader>u",   group = "ui" },
    { "<leader>ut",  Snacks.picker.colorschemes,                name = "colorschemes" },
    {
        "<leader>ul",
        function()
            local ll = vim.diagnostic.config().virtual_lines
            if ll == false then
                ll = { current_line = true }
            else
                ll = false
            end
            vim.diagnostic.config({ virtual_lines = ll })
        end,
        name = "toggle lsp lines",
    },

    { "<leader>w",  group = "window" },
    { "<leader>wh", "<C-w>h",                     name = "left" },
    { "<leader>wj", "<C-w>j",                     name = "down" },
    { "<leader>wk", "<C-w>k",                     name = "right" },
    { "<leader>wl", "<C-w>l",                     name = "up" },
    { "<leader>wq", ":q<CR>",                     name = "quit" },

    { "g",          group = "goto" },
    { "gd",         vim.lsp.buf.definition,       name = "definition" },
    { "gr",         Snacks.picker.lsp_references, nowait = true,           name = "references" },

    { "H",          ":bprev<CR>",                 name = "previous buffer" },
    { "L",          ":bnext<CR>",                 name = "next buffer" },

    {
        "[h",
        function()
            require("gitsigns").nav_hunk("prev")
        end,
        name = "Next Hunk",
    },
    {
        "]h",
        function()
            require("gitsigns").nav_hunk("next")
        end,
        name = "Next Hunk",
    },

    { "[h", function() require("gitsigns").nav_hunk("prev") end, name = "previous hunk" },
    { "]h", function() require("gitsigns").nav_hunk("next") end, name = "next hunk" },
})

Snacks.toggle.diagnostics():map("<leader>ud")
Snacks.toggle.inlay_hints():map("<leader>ui")