Created
May 7, 2025 03:04
-
-
Save daveio/2e067b821ac3418baf38705224066c1d to your computer and use it in GitHub Desktop.
Neovim config (~/.config/nvim/init.lua)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- Bootstrap lazy.nvim | |
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" | |
if not (vim.uv or vim.loop).fs_stat(lazypath) then | |
local lazyrepo = "https://github.com/folke/lazy.nvim.git" | |
local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) | |
if vim.v.shell_error ~= 0 then | |
vim.api.nvim_echo({ | |
{ "Failed to clone lazy.nvim:\n", "ErrorMsg" }, | |
{ out, "WarningMsg" }, | |
{ "\nPress any key to exit..." }, | |
}, true, {}) | |
vim.fn.getchar() | |
os.exit(1) | |
end | |
end | |
-- For lazy.nvim | |
vim.g.mapleader = " " | |
vim.g.maplocalleader = "\\" | |
-- Keymap | |
vim.keymap.set("i", "<C-s>", "<Esc>:w<CR>a", { desc = "Save file" }) | |
vim.keymap.set("n", "<C-q>", ":q<CR>", { desc = "Quit" }) | |
vim.keymap.set("n", "<C-s>", ":w<CR>", { desc = "Save file" }) | |
-- Options | |
vim.opt.clipboard = "unnamedplus" | |
vim.opt.cursorline = true | |
vim.opt.expandtab = true | |
vim.opt.ignorecase = true | |
vim.opt.list = true | |
vim.opt.listchars = { | |
tab = "→ ", | |
eol = "↲", | |
nbsp = "␣", | |
trail = "•", | |
extends = "⟩", | |
precedes = "⟨", | |
space = "·", | |
} | |
vim.opt.mouse = "a" | |
vim.opt.number = true | |
vim.opt.rtp:prepend(lazypath) | |
vim.opt.scrolloff = 5 | |
vim.opt.shiftwidth = 2 | |
vim.opt.sidescrolloff = 8 | |
vim.opt.smartcase = true | |
vim.opt.smartindent = true | |
vim.opt.softtabstop = 2 | |
vim.opt.tabstop = 2 | |
vim.opt.wrap = false | |
-- Plugins | |
require("lazy").setup({ | |
spec = { | |
{ | |
"folke/snacks.nvim", | |
priority = 1000, | |
lazy = false, | |
---@diagnostic disable-next-line: undefined-doc-name | |
---@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 | |
} | |
} | |
}, | |
keys = { | |
-- Top Pickers & Explorer | |
{ "<leader><space>", function() Snacks.picker.smart() end, desc = "Smart Find Files" }, | |
{ "<leader>,", function() Snacks.picker.buffers() end, desc = "Buffers" }, | |
{ "<leader>/", function() Snacks.picker.grep() end, desc = "Grep" }, | |
{ "<leader>:", function() Snacks.picker.command_history() end, desc = "Command History" }, | |
{ "<leader>n", function() Snacks.picker.notifications() end, desc = "Notification History" }, | |
{ "<leader>e", function() Snacks.explorer() end, desc = "File Explorer" }, | |
-- find | |
{ "<leader>fb", function() Snacks.picker.buffers() end, desc = "Buffers" }, | |
{ "<leader>fc", function() Snacks.picker.files({ cwd = vim.fn.stdpath("config") }) end, desc = "Find Config File" }, | |
{ "<leader>ff", function() Snacks.picker.files() end, desc = "Find Files" }, | |
{ "<leader>fg", function() Snacks.picker.git_files() end, desc = "Find Git Files" }, | |
{ "<leader>fp", function() Snacks.picker.projects() end, desc = "Projects" }, | |
{ "<leader>fr", function() Snacks.picker.recent() end, desc = "Recent" }, | |
-- git | |
{ "<leader>gb", function() Snacks.picker.git_branches() end, desc = "Git Branches" }, | |
{ "<leader>gl", function() Snacks.picker.git_log() end, desc = "Git Log" }, | |
{ "<leader>gL", function() Snacks.picker.git_log_line() end, desc = "Git Log Line" }, | |
{ "<leader>gs", function() Snacks.picker.git_status() end, desc = "Git Status" }, | |
{ "<leader>gS", function() Snacks.picker.git_stash() end, desc = "Git Stash" }, | |
{ "<leader>gd", function() Snacks.picker.git_diff() end, desc = "Git Diff (Hunks)" }, | |
{ "<leader>gf", function() Snacks.picker.git_log_file() end, desc = "Git Log File" }, | |
-- Grep | |
{ "<leader>sb", function() Snacks.picker.lines() end, desc = "Buffer Lines" }, | |
{ "<leader>sB", function() Snacks.picker.grep_buffers() end, desc = "Grep Open Buffers" }, | |
{ "<leader>sg", function() Snacks.picker.grep() end, desc = "Grep" }, | |
{ "<leader>sw", function() Snacks.picker.grep_word() end, desc = "Visual selection or word", mode = { "n", "x" } }, | |
-- search | |
{ '<leader>s"', function() Snacks.picker.registers() end, desc = "Registers" }, | |
{ '<leader>s/', function() Snacks.picker.search_history() end, desc = "Search History" }, | |
{ "<leader>sa", function() Snacks.picker.autocmds() end, desc = "Autocmds" }, | |
{ "<leader>sb", function() Snacks.picker.lines() end, desc = "Buffer Lines" }, | |
{ "<leader>sc", function() Snacks.picker.command_history() end, desc = "Command History" }, | |
{ "<leader>sC", function() Snacks.picker.commands() end, desc = "Commands" }, | |
{ "<leader>sd", function() Snacks.picker.diagnostics() end, desc = "Diagnostics" }, | |
{ "<leader>sD", function() Snacks.picker.diagnostics_buffer() end, desc = "Buffer Diagnostics" }, | |
{ "<leader>sh", function() Snacks.picker.help() end, desc = "Help Pages" }, | |
{ "<leader>sH", function() Snacks.picker.highlights() end, desc = "Highlights" }, | |
{ "<leader>si", function() Snacks.picker.icons() end, desc = "Icons" }, | |
{ "<leader>sj", function() Snacks.picker.jumps() end, desc = "Jumps" }, | |
{ "<leader>sk", function() Snacks.picker.keymaps() end, desc = "Keymaps" }, | |
{ "<leader>sl", function() Snacks.picker.loclist() end, desc = "Location List" }, | |
{ "<leader>sm", function() Snacks.picker.marks() end, desc = "Marks" }, | |
{ "<leader>sM", function() Snacks.picker.man() end, desc = "Man Pages" }, | |
{ "<leader>sp", function() Snacks.picker.lazy() end, desc = "Search for Plugin Spec" }, | |
{ "<leader>sq", function() Snacks.picker.qflist() end, desc = "Quickfix List" }, | |
{ "<leader>sR", function() Snacks.picker.resume() end, desc = "Resume" }, | |
{ "<leader>su", function() Snacks.picker.undo() end, desc = "Undo History" }, | |
{ "<leader>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" }, | |
{ "<leader>ss", function() Snacks.picker.lsp_symbols() end, desc = "LSP Symbols" }, | |
{ "<leader>sS", function() Snacks.picker.lsp_workspace_symbols() end, desc = "LSP Workspace Symbols" }, | |
-- Other | |
{ "<leader>z", function() Snacks.zen() end, desc = "Toggle Zen Mode" }, | |
{ "<leader>Z", function() Snacks.zen.zoom() end, desc = "Toggle Zoom" }, | |
{ "<leader>.", function() Snacks.scratch() end, desc = "Toggle Scratch Buffer" }, | |
{ "<leader>S", function() Snacks.scratch.select() end, desc = "Select Scratch Buffer" }, | |
{ "<leader>n", function() Snacks.notifier.show_history() end, desc = "Notification History" }, | |
{ "<leader>bd", function() Snacks.bufdelete() end, desc = "Delete Buffer" }, | |
{ "<leader>cR", function() Snacks.rename.rename_file() end, desc = "Rename File" }, | |
{ "<leader>gB", function() Snacks.gitbrowse() end, desc = "Git Browse", mode = { "n", "v" } }, | |
{ "<leader>gg", function() Snacks.lazygit() end, desc = "Lazygit" }, | |
{ "<leader>un", function() Snacks.notifier.hide() end, desc = "Dismiss All Notifications" }, | |
{ "<c-/>", function() Snacks.terminal() end, desc = "Toggle Terminal" }, | |
{ "<c-_>", 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" } }, | |
{ | |
"<leader>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("<leader>us") | |
Snacks.toggle.option("wrap", { name = "Wrap" }):map("<leader>uw") | |
Snacks.toggle.option("relativenumber", { name = "Relative Number" }):map("<leader>uL") | |
Snacks.toggle.diagnostics():map("<leader>ud") | |
Snacks.toggle.line_number():map("<leader>ul") | |
Snacks.toggle.option("conceallevel", { off = 0, on = vim.o.conceallevel > 0 and vim.o.conceallevel or 2 }):map("<leader>uc") | |
Snacks.toggle.treesitter():map("<leader>uT") | |
Snacks.toggle.option("background", { off = "light", on = "dark", name = "Dark Background" }):map("<leader>ub") | |
Snacks.toggle.inlay_hints():map("<leader>uh") | |
Snacks.toggle.indent():map("<leader>ug") | |
Snacks.toggle.dim():map("<leader>uD") | |
end, | |
}) | |
end, | |
}, | |
{ | |
"williamboman/mason.nvim", | |
dependencies = { | |
"williamboman/mason-lspconfig.nvim", | |
"neovim/nvim-lspconfig", | |
}, | |
init = function() | |
require("mason").setup() | |
end, | |
}, | |
{ | |
"mhartington/formatter.nvim", | |
init = function() | |
local util = require "formatter.util" | |
require("formatter").setup { | |
logging = true, | |
log_level = vim.log.levels.WARN, | |
filetype = { | |
json = { | |
require("formatter.filetypes.json").prettier, | |
}, | |
lua = { | |
require("formatter.filetypes.lua").stylua, | |
}, | |
["*"] = { | |
require("formatter.filetypes.any").remove_trailing_whitespace, | |
} | |
} | |
} | |
end, | |
}, | |
{ | |
"supermaven-inc/supermaven-nvim", | |
config = function() | |
require("supermaven-nvim").setup({ | |
keymaps = { | |
accept_suggestion = "<Tab>", | |
clear_suggestion = "<C-]>", | |
accept_word = "<C-j>", | |
}, | |
ignore_filetypes = { cpp = true }, | |
color = { | |
suggestion_color = "#ffffff", | |
cterm = 244, | |
}, | |
log_level = "info", | |
disable_inline_completion = false, | |
disable_keymaps = false, | |
condition = function() | |
return false | |
end, | |
suppress_startup_warning = true, | |
}) | |
end, | |
}, | |
{ | |
"catppuccin/nvim", | |
name = "catppuccin", | |
priority = 1000, | |
config = function() | |
require("catppuccin").setup({ | |
flavour = "frappe", | |
background = { | |
light = "latte", | |
dark = "frappe", | |
}, | |
transparent_background = false, | |
integrations = { | |
mason = true, | |
cmp = true, | |
treesitter = true, | |
telescope = true, | |
}, | |
}) | |
vim.cmd.colorscheme "catppuccin" | |
end, | |
}, | |
{ | |
"nvim-treesitter/nvim-treesitter", | |
build = ":TSUpdate", | |
config = function() | |
require("nvim-treesitter.configs").setup({ | |
ensure_installed = { "lua", "vim", "vimdoc", "javascript", "typescript", "python", "rust" }, | |
auto_install = true, | |
highlight = { enable = true }, | |
indent = { enable = true }, | |
}) | |
end, | |
}, | |
{ | |
"nvim-telescope/telescope.nvim", | |
dependencies = { "nvim-lua/plenary.nvim" }, | |
config = function() | |
require("telescope").setup({}) | |
vim.keymap.set("n", "<leader>ff", "<cmd>Telescope find_files<cr>", { desc = "Find files" }) | |
vim.keymap.set("n", "<leader>fg", "<cmd>Telescope live_grep<cr>", { desc = "Find text" }) | |
vim.keymap.set("n", "<leader>fb", "<cmd>Telescope buffers<cr>", { desc = "Find buffers" }) | |
vim.keymap.set("n", "<leader>fh", "<cmd>Telescope help_tags<cr>", { desc = "Find help" }) | |
end, | |
}, | |
{ | |
"hrsh7th/nvim-cmp", | |
dependencies = { | |
"hrsh7th/cmp-nvim-lsp", | |
"hrsh7th/cmp-buffer", | |
"hrsh7th/cmp-path", | |
"hrsh7th/cmp-cmdline", | |
"L3MON4D3/LuaSnip", | |
"saadparwaiz1/cmp_luasnip", | |
"onsails/lspkind.nvim", | |
}, | |
config = function() | |
local cmp = require("cmp") | |
local lspkind = require("lspkind") | |
lspkind.init({ | |
symbol_map = { | |
Supermaven = "⭐", | |
}, | |
}) | |
cmp.setup({ | |
snippet = { | |
expand = function(args) | |
require("luasnip").lsp_expand(args.body) | |
end, | |
}, | |
mapping = cmp.mapping.preset.insert({ | |
["<C-b>"] = cmp.mapping.scroll_docs(-4), | |
["<C-f>"] = cmp.mapping.scroll_docs(4), | |
["<S-Space>"] = cmp.mapping.complete(), | |
["<C-e>"] = cmp.mapping.abort(), | |
["<CR>"] = cmp.mapping.confirm({ select = true }), | |
}), | |
sources = cmp.config.sources({ | |
{ name = "supermaven" }, | |
{ name = "nvim_lsp" }, | |
{ name = "luasnip" }, | |
}, { | |
{ name = "buffer" }, | |
}), | |
formatting = { | |
format = lspkind.cmp_format({ | |
mode = "symbol_text", | |
maxwidth = 50, | |
ellipsis_char = "...", | |
}), | |
}, | |
}) | |
cmp.setup.cmdline(':', { | |
mapping = cmp.mapping.preset.cmdline(), | |
sources = cmp.config.sources({ | |
{ name = 'path' } | |
}, { | |
{ name = 'cmdline' } | |
}) | |
}) | |
end, | |
}, | |
{ | |
"nvim-lualine/lualine.nvim", | |
config = function() | |
require("lualine").setup({ | |
options = { | |
theme = "catppuccin", | |
component_separators = { left = "", right = "" }, | |
section_separators = { left = "", right = "" }, | |
}, | |
}) | |
end, | |
}, | |
}, | |
install = { colorscheme = { "catppuccin" } }, | |
checker = { enabled = true }, | |
}) | |
-- Supermaven & lspkind | |
vim.api.nvim_set_hl(0, "CmpItemKindSupermaven", {fg ="#6CC644"}) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment