diff --git a/init.lua b/init.lua index ffe61f0c..64ce93a5 100644 --- a/init.lua +++ b/init.lua @@ -340,153 +340,548 @@ require('lazy').setup({ -- -- Use the `dependencies` key to specify the dependencies of a particular plugin { - "folke/snacks.nvim", - priority = 1000, - lazy = false, - ---@type snacks.Config - opts = { - bigfile = { enabled = true }, - dashboard = { enabled = true }, - explorer = { enabled = true }, - indent = { enabled = true }, - input = { enabled = true }, - notifier = { - enabled = true, - timeout = 3000, + 'folke/snacks.nvim', + priority = 1000, + lazy = false, + ---@type snacks.Config + opts = { + bigfile = { enabled = true }, + dashboard = { enabled = true }, + explorer = { enabled = true }, + indent = { enabled = true }, + input = { enabled = true }, + notifier = { + enabled = true, + timeout = 3000, + }, + picker = { enabled = true }, + quickfile = { enabled = true }, + scope = { enabled = true }, + scroll = { enabled = true }, + statuscolumn = { enabled = true }, + words = { enabled = true }, + styles = { + notification = { + -- wo = { wrap = true } -- Wrap notifications + }, + }, }, - picker = { enabled = true }, - quickfile = { enabled = true }, - scope = { enabled = true }, - scroll = { enabled = true }, - statuscolumn = { enabled = true }, - words = { enabled = true }, - styles = { - notification = { - -- wo = { wrap = true } -- Wrap notifications - } - } - }, - keys = { - -- Top Pickers & Explorer - { "", function() Snacks.picker.smart() end, desc = "Smart Find Files" }, - { ",", function() Snacks.picker.buffers() end, desc = "Buffers" }, - { "/", function() Snacks.picker.grep() end, desc = "Grep" }, - { ":", function() Snacks.picker.command_history() end, desc = "Command History" }, - { "n", function() Snacks.picker.notifications() end, desc = "Notification History" }, - { "e", function() Snacks.explorer() end, desc = "File Explorer" }, - -- find - { "fb", function() Snacks.picker.buffers() end, desc = "Buffers" }, - { "fc", function() Snacks.picker.files({ cwd = vim.fn.stdpath("config") }) end, desc = "Find Config File" }, - { "ff", function() Snacks.picker.files() end, desc = "Find Files" }, - { "fg", function() Snacks.picker.git_files() end, desc = "Find Git Files" }, - { "fp", function() Snacks.picker.projects() end, desc = "Projects" }, - { "fr", function() Snacks.picker.recent() end, desc = "Recent" }, - -- git - { "gb", function() Snacks.picker.git_branches() end, desc = "Git Branches" }, - { "gl", function() Snacks.picker.git_log() end, desc = "Git Log" }, - { "gL", function() Snacks.picker.git_log_line() end, desc = "Git Log Line" }, - { "gs", function() Snacks.picker.git_status() end, desc = "Git Status" }, - { "gS", function() Snacks.picker.git_stash() end, desc = "Git Stash" }, - { "gd", function() Snacks.picker.git_diff() end, desc = "Git Diff (Hunks)" }, - { "gf", function() Snacks.picker.git_log_file() end, desc = "Git Log File" }, - -- Grep - { "sb", function() Snacks.picker.lines() end, desc = "Buffer Lines" }, - { "sB", function() Snacks.picker.grep_buffers() end, desc = "Grep Open Buffers" }, - { "sg", function() Snacks.picker.grep() end, desc = "Grep" }, - { "sw", function() Snacks.picker.grep_word() end, desc = "Visual selection or word", mode = { "n", "x" } }, - -- search - { 's"', function() Snacks.picker.registers() end, desc = "Registers" }, - { 's/', function() Snacks.picker.search_history() end, desc = "Search History" }, - { "sa", function() Snacks.picker.autocmds() end, desc = "Autocmds" }, - { "sb", function() Snacks.picker.lines() end, desc = "Buffer Lines" }, - { "sc", function() Snacks.picker.command_history() end, desc = "Command History" }, - { "sC", function() Snacks.picker.commands() end, desc = "Commands" }, - { "sd", function() Snacks.picker.diagnostics() end, desc = "Diagnostics" }, - { "sD", function() Snacks.picker.diagnostics_buffer() end, desc = "Buffer Diagnostics" }, - { "sh", function() Snacks.picker.help() end, desc = "Help Pages" }, - { "sH", function() Snacks.picker.highlights() end, desc = "Highlights" }, - { "si", function() Snacks.picker.icons() end, desc = "Icons" }, - { "sj", function() Snacks.picker.jumps() end, desc = "Jumps" }, - { "sk", function() Snacks.picker.keymaps() end, desc = "Keymaps" }, - { "sl", function() Snacks.picker.loclist() end, desc = "Location List" }, - { "sm", function() Snacks.picker.marks() end, desc = "Marks" }, - { "sM", function() Snacks.picker.man() end, desc = "Man Pages" }, - { "sp", function() Snacks.picker.lazy() end, desc = "Search for Plugin Spec" }, - { "sq", function() Snacks.picker.qflist() end, desc = "Quickfix List" }, - { "sR", function() Snacks.picker.resume() end, desc = "Resume" }, - { "su", function() Snacks.picker.undo() end, desc = "Undo History" }, - { "uC", function() Snacks.picker.colorschemes() end, desc = "Colorschemes" }, - -- LSP - { "gd", function() Snacks.picker.lsp_definitions() end, desc = "Goto Definition" }, - { "gD", function() Snacks.picker.lsp_declarations() end, desc = "Goto Declaration" }, - { "gr", function() Snacks.picker.lsp_references() end, nowait = true, desc = "References" }, - { "gI", function() Snacks.picker.lsp_implementations() end, desc = "Goto Implementation" }, - { "gy", function() Snacks.picker.lsp_type_definitions() end, desc = "Goto T[y]pe Definition" }, - { "ss", function() Snacks.picker.lsp_symbols() end, desc = "LSP Symbols" }, - { "sS", function() Snacks.picker.lsp_workspace_symbols() end, desc = "LSP Workspace Symbols" }, - -- Other - { "z", function() Snacks.zen() end, desc = "Toggle Zen Mode" }, - { "Z", function() Snacks.zen.zoom() end, desc = "Toggle Zoom" }, - { ".", function() Snacks.scratch() end, desc = "Toggle Scratch Buffer" }, - { "S", function() Snacks.scratch.select() end, desc = "Select Scratch Buffer" }, - { "n", function() Snacks.notifier.show_history() end, desc = "Notification History" }, - { "bd", function() Snacks.bufdelete() end, desc = "Delete Buffer" }, - { "cR", function() Snacks.rename.rename_file() end, desc = "Rename File" }, - { "gB", function() Snacks.gitbrowse() end, desc = "Git Browse", mode = { "n", "v" } }, - { "gg", function() Snacks.lazygit() end, desc = "Lazygit" }, - { "un", function() Snacks.notifier.hide() end, desc = "Dismiss All Notifications" }, - { "", function() Snacks.terminal() end, desc = "Toggle Terminal" }, - { "", function() Snacks.terminal() end, desc = "which_key_ignore" }, - { "]]", function() Snacks.words.jump(vim.v.count1) end, desc = "Next Reference", mode = { "n", "t" } }, - { "[[", function() Snacks.words.jump(-vim.v.count1) end, desc = "Prev Reference", mode = { "n", "t" } }, - { - "N", - desc = "Neovim News", - function() - Snacks.win({ - file = vim.api.nvim_get_runtime_file("doc/news.txt", false)[1], - width = 0.6, - height = 0.6, - wo = { - spell = false, - wrap = false, - signcolumn = "yes", - statuscolumn = " ", - conceallevel = 3, - }, - }) - end, - } - }, - init = function() - vim.api.nvim_create_autocmd("User", { - pattern = "VeryLazy", - callback = function() - -- Setup some globals for debugging (lazy-loaded) - _G.dd = function(...) - Snacks.debug.inspect(...) - end - _G.bt = function() - Snacks.debug.backtrace() - end - vim.print = _G.dd -- Override print to use snacks for `:=` command + keys = { + -- Top Pickers & Explorer + { + '', + function() + Snacks.picker.smart() + end, + desc = 'Smart Find Files', + }, + { + ',', + function() + Snacks.picker.buffers() + end, + desc = 'Buffers', + }, + { + '/', + function() + Snacks.picker.grep() + end, + desc = 'Grep', + }, + { + ':', + function() + Snacks.picker.command_history() + end, + desc = 'Command History', + }, + { + 'n', + function() + Snacks.picker.notifications() + end, + desc = 'Notification History', + }, + { + 'e', + function() + Snacks.explorer() + end, + desc = 'File Explorer', + }, + -- find + { + 'fb', + function() + Snacks.picker.buffers() + end, + desc = 'Buffers', + }, + { + 'fc', + function() + Snacks.picker.files { cwd = vim.fn.stdpath 'config' } + end, + desc = 'Find Config File', + }, + { + 'ff', + function() + Snacks.picker.files() + end, + desc = 'Find Files', + }, + { + 'fg', + function() + Snacks.picker.git_files() + end, + desc = 'Find Git Files', + }, + { + 'fp', + function() + Snacks.picker.projects() + end, + desc = 'Projects', + }, + { + 'fr', + function() + Snacks.picker.recent() + end, + desc = 'Recent', + }, + -- git + { + 'gb', + function() + Snacks.picker.git_branches() + end, + desc = 'Git Branches', + }, + { + 'gl', + function() + Snacks.picker.git_log() + end, + desc = 'Git Log', + }, + { + 'gL', + function() + Snacks.picker.git_log_line() + end, + desc = 'Git Log Line', + }, + { + 'gs', + function() + Snacks.picker.git_status() + end, + desc = 'Git Status', + }, + { + 'gS', + function() + Snacks.picker.git_stash() + end, + desc = 'Git Stash', + }, + { + 'gd', + function() + Snacks.picker.git_diff() + end, + desc = 'Git Diff (Hunks)', + }, + { + 'gf', + function() + Snacks.picker.git_log_file() + end, + desc = 'Git Log File', + }, + -- Grep + { + 'sb', + function() + Snacks.picker.lines() + end, + desc = 'Buffer Lines', + }, + { + 'sB', + function() + Snacks.picker.grep_buffers() + end, + desc = 'Grep Open Buffers', + }, + { + 'sg', + function() + Snacks.picker.grep() + end, + desc = 'Grep', + }, + { + 'sw', + function() + Snacks.picker.grep_word() + end, + desc = 'Visual selection or word', + mode = { 'n', 'x' }, + }, + -- search + { + 's"', + function() + Snacks.picker.registers() + end, + desc = 'Registers', + }, + { + 's/', + function() + Snacks.picker.search_history() + end, + desc = 'Search History', + }, + { + 'sa', + function() + Snacks.picker.autocmds() + end, + desc = 'Autocmds', + }, + { + 'sb', + function() + Snacks.picker.lines() + end, + desc = 'Buffer Lines', + }, + { + 'sc', + function() + Snacks.picker.command_history() + end, + desc = 'Command History', + }, + { + 'sC', + function() + Snacks.picker.commands() + end, + desc = 'Commands', + }, + { + 'sd', + function() + Snacks.picker.diagnostics() + end, + desc = 'Diagnostics', + }, + { + 'sD', + function() + Snacks.picker.diagnostics_buffer() + end, + desc = 'Buffer Diagnostics', + }, + { + 'sh', + function() + Snacks.picker.help() + end, + desc = 'Help Pages', + }, + { + 'sH', + function() + Snacks.picker.highlights() + end, + desc = 'Highlights', + }, + { + 'si', + function() + Snacks.picker.icons() + end, + desc = 'Icons', + }, + { + 'sj', + function() + Snacks.picker.jumps() + end, + desc = 'Jumps', + }, + { + 'sk', + function() + Snacks.picker.keymaps() + end, + desc = 'Keymaps', + }, + { + 'sl', + function() + Snacks.picker.loclist() + end, + desc = 'Location List', + }, + { + 'sm', + function() + Snacks.picker.marks() + end, + desc = 'Marks', + }, + { + 'sM', + function() + Snacks.picker.man() + end, + desc = 'Man Pages', + }, + { + 'sp', + function() + Snacks.picker.lazy() + end, + desc = 'Search for Plugin Spec', + }, + { + 'sq', + function() + Snacks.picker.qflist() + end, + desc = 'Quickfix List', + }, + { + 'sR', + function() + Snacks.picker.resume() + end, + desc = 'Resume', + }, + { + 'su', + function() + Snacks.picker.undo() + end, + desc = 'Undo History', + }, + { + 'uC', + function() + Snacks.picker.colorschemes() + end, + desc = 'Colorschemes', + }, + -- LSP + { + 'gd', + function() + Snacks.picker.lsp_definitions() + end, + desc = 'Goto Definition', + }, + { + 'gD', + function() + Snacks.picker.lsp_declarations() + end, + desc = 'Goto Declaration', + }, + { + 'gr', + function() + Snacks.picker.lsp_references() + end, + nowait = true, + desc = 'References', + }, + { + 'gI', + function() + Snacks.picker.lsp_implementations() + end, + desc = 'Goto Implementation', + }, + { + 'gy', + function() + Snacks.picker.lsp_type_definitions() + end, + desc = 'Goto T[y]pe Definition', + }, + { + 'ss', + function() + Snacks.picker.lsp_symbols() + end, + desc = 'LSP Symbols', + }, + { + 'sS', + function() + Snacks.picker.lsp_workspace_symbols() + end, + desc = 'LSP Workspace Symbols', + }, + -- Other + { + 'z', + function() + Snacks.zen() + end, + desc = 'Toggle Zen Mode', + }, + { + 'Z', + function() + Snacks.zen.zoom() + end, + desc = 'Toggle Zoom', + }, + { + '.', + function() + Snacks.scratch() + end, + desc = 'Toggle Scratch Buffer', + }, + { + 'S', + function() + Snacks.scratch.select() + end, + desc = 'Select Scratch Buffer', + }, + { + 'n', + function() + Snacks.notifier.show_history() + end, + desc = 'Notification History', + }, + { + 'bd', + function() + Snacks.bufdelete() + end, + desc = 'Delete Buffer', + }, + { + 'cR', + function() + Snacks.rename.rename_file() + end, + desc = 'Rename File', + }, + { + 'gB', + function() + Snacks.gitbrowse() + end, + desc = 'Git Browse', + mode = { 'n', 'v' }, + }, + { + 'gg', + function() + Snacks.lazygit() + end, + desc = 'Lazygit', + }, + { + 'un', + function() + Snacks.notifier.hide() + end, + desc = 'Dismiss All Notifications', + }, + { + '', + function() + Snacks.terminal() + end, + desc = 'Toggle Terminal', + }, + { + '', + function() + Snacks.terminal() + end, + desc = 'which_key_ignore', + }, + { + ']]', + function() + Snacks.words.jump(vim.v.count1) + end, + desc = 'Next Reference', + mode = { 'n', 't' }, + }, + { + '[[', + function() + Snacks.words.jump(-vim.v.count1) + end, + desc = 'Prev Reference', + mode = { 'n', 't' }, + }, + { + 'N', + desc = 'Neovim News', + function() + Snacks.win { + file = vim.api.nvim_get_runtime_file('doc/news.txt', false)[1], + width = 0.6, + height = 0.6, + wo = { + spell = false, + wrap = false, + signcolumn = 'yes', + statuscolumn = ' ', + conceallevel = 3, + }, + } + end, + }, + }, + init = function() + vim.api.nvim_create_autocmd('User', { + pattern = 'VeryLazy', + callback = function() + -- Setup some globals for debugging (lazy-loaded) + _G.dd = function(...) + Snacks.debug.inspect(...) + end + _G.bt = function() + Snacks.debug.backtrace() + end + vim.print = _G.dd -- Override print to use snacks for `:=` command - -- Create some toggle mappings - 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") - Snacks.toggle.inlay_hints():map("uh") - Snacks.toggle.indent():map("ug") - Snacks.toggle.dim():map("uD") - end, - }) - end, -}, + -- Create some toggle mappings + 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' + Snacks.toggle.inlay_hints():map 'uh' + Snacks.toggle.indent():map 'ug' + Snacks.toggle.dim():map 'uD' + end, + }) + end, + }, { -- Fuzzy Finder (files, lsp, etc) 'nvim-telescope/telescope.nvim', event = 'VimEnter', @@ -639,6 +1034,7 @@ require('lazy').setup({ 'pyright', 'rust_analyzer', 'black', + 'gopls', }, }, config = true, @@ -810,9 +1206,54 @@ require('lazy').setup({ -- - settings (table): Override the default settings passed when initializing the server. -- For example, to see the options for `lua_ls`, you could go to: https://luals.github.io/wiki/settings/ local servers = { - clangd = {}, - -- gopls = {}, - pyright = {}, + clangd = { + cmd = { 'clangd', '--header-insertion=never' }, + filetypes = { 'c', 'cpp', 'objc', 'objcpp', 'cxx' }, + capabilities = { + offsetEncoding = { 'utf-8', 'utf-16' }, + }, + root_dir = { + -- This is a list of patterns that will be used to find the root directory + -- for the current file. The first pattern that matches will be used. + '.git', + '.clangd', + '.clang-tidy', + '.clang-format', + '.gitignore', + 'compile_commands.json', + 'compile_flags.txt', + }, + }, + gopls = { + cmd = { 'gopls' }, + filetypes = { 'go', 'gomod', 'gowork', 'gotmpl' }, + capabilities = { + offsetEncoding = { 'utf-8', 'utf-16' }, + }, + root_dir = { + -- This is a list of patterns that will be used to find the root directory + -- for the current file. The first pattern that matches will be used. + 'go.mod', + 'go.work', + '.git', + }, + }, + pyright = { + cmd = { 'pyright-langserver', '--stdio' }, + filetypes = { 'python' }, + capabilities = { + offsetEncoding = { 'utf-8', 'utf-16' }, + }, + root_dir = { + -- This is a list of patterns that will be used to find the root directory + -- for the current file. The first pattern that matches will be used. + '.git', + '.pyrightconfig.json', + 'setup.py', + 'setup.cfg', + 'pyproject.toml', + }, + }, rust_analyzer = {}, -- ... etc. See `:help lspconfig-all` for a list of all the pre-configured LSPs -- @@ -1043,6 +1484,9 @@ require('lazy').setup({ -- If you want to see what colorschemes are already installed, you can use `:Telescope colorscheme`. 'catppuccin/nvim', name = 'catppuccin', + opts = { + transparent_background = true, + }, priority = 1000, -- Make sure to load this before all the other start plugins. init = function() -- Load the colorscheme here.