Files
nixos/nvim.lua
Matthew Stobbs cb6078e470 initial commit
Just base laptop system on demilich
2026-08-13 15:45:15 -05:00

359 lines
13 KiB
Lua

-- {{{ plugins
local gh = "https://github.com/"
local plugins = {
{ src = gh .. "MunifTanjim/nui.nvim", name = "nui" },
{ src = gh .. "catgoose/nvim-colorizer.lua", name = "colorizer" }, -- show colours of colour codes
{ src = gh .. "echasnovski/mini.nvim", name = "mini" }, -- a bunch of useful plugins
{ src = gh .. "folke/noice.nvim", name = "noice" },
{ src = gh .. "folke/snacks.nvim", name = "snacks" },
{ src = gh .. "kdheepak/lazygit.nvim", name = "lazygit" },
{ src = gh .. "nvim-lua/plenary.nvim", name = "plenary" },
{ src = gh .. "stevearc/conform.nvim", name = "conform" },
{ src = gh .. "folke/which-key.nvim", name = "whichkey" },
{ src = gh .. "mikavilpas/yazi.nvim", name = "yazi" },
{ src = gh .. "nvimdev/dashboard-nvim", name = "dashboard" },
{ src = gh .. "Dan7h3x/neaterm.nvim", name = "neaterm" },
}
vim.pack.add(plugins)
local function update_plugins()
local plist = {}
for _, v in ipairs(plugins)
do
table.insert(plist, v.name)
end
vim.pack.update(plist)
end -- }}}
-- {{{ Helper functions
function R(name)
require("plenary.reload").reload_module(name)
end
-- }}}
-- {{{ Global settings
vim.g.mapleader = " "
vim.g.maplocalleader = " "
vim.g.have_nerd_font = true
-- Common defaults
vim.opt.clipboard = "unnamedplus"
vim.opt.cursorline = true
vim.opt.expandtab = true
vim.opt.hlsearch = true
vim.opt.inccommand = "split"
vim.opt.modeline = true
vim.opt.mouse = "a"
vim.opt.number = true
vim.opt.preserveindent = true
vim.opt.relativenumber = true
vim.opt.ruler = true
vim.opt.scrolloff = 5
vim.opt.shiftwidth = 2
vim.opt.showmode = true
vim.opt.showtabline = 1
vim.opt.softtabstop = 2
vim.opt.tabstop = 2
vim.opt.termguicolors = true
vim.opt.listchars = { tab = "» ", trail = "·", nbsp = "" }
vim.opt.inccommand = "split"
-- Set foldmethod, change in .editorconfig of projects
vim.opt.foldmethod = "marker"
-- General gui settings
vim.o.guifont = "JetBrainsMono Nerd Font:12"
vim.cmd.colorscheme "evening"
-- }}}
require("snacks").setup({ -- {{{
animate = {},
dim = {},
image = {},
indent = {},
lazygit = {},
picker = {},
}) -- }}}
require("colorizer").setup({})
require("conform").setup({ -- {{{
formatters_by_ft = {
nix = { "nixfmt" },
},
})
vim.g.snacks_animate = true -- }}}
require("noice").setup({ -- {{{
lsp = {
override = {
["vim.lsp.util.convert_input_to_markdown_lines"] = true,
["vim.lsp.util.stylize_markdown"] = true,
},
},
popupmenu = {
enabled = true,
backend = "nui",
},
notify = {
enabled = true,
view = "notify",
},
routes = {
{
view = "notify",
filter = { event = "msg_showmode" },
},
},
}) -- }}}
require("yazi").setup({ -- {{{
open_for_directories = true,
keymaps = {
show_help = "<f1>",
},
})
vim.g.loaded_netrwPlugin = 1 -- }}}
require("dashboard").setup({ -- {{{
theme = "hyper",
config = {
shortcut = {
{ desc = "󰊳 Update ", group = "@property", key = "u", action = update_plugins },
{ desc = " Projects ", group = "label", key = "p", action = Snacks.picker.projects },
{ desc = "󰪶 Files ", group = "OkMsg", key = "f", action = Snacks.picker.files },
{ desc = "󰿅 Quit ", group = "ErrorMsg", key = "q", action = ":q" },
},
packages = { enable = false }, -- show number of installed plugins
project = { enable = true, limit = 8, label = "", action = Snacks.picker.projects },
},
}) -- }}}
require("which-key").setup({ -- {{{
preset = "modern",
}) -- }}}
require("neaterm").setup() -- {{{
-- Done neaterm }}}
-- Filetype configuration {{{
vim.filetype.add({
extension = {
Containerfile = "dockerfile",
Dockerfile = "dockerfile",
containerfile = "containerfile",
dockerfile = "dockerfile",
j2 = "jinja",
jinja = "jinja",
jinja2 = "jinja",
tf = "terraform",
tfstate = "json",
tfvars = "terraform",
templ = "templ",
},
}) -- }}}
-- {{{ LSP Configuration
local lspproto = vim.lsp.protocol
local capabilities = lspproto.make_client_capabilities()
-- Formatter autocmd
vim.api.nvim_create_autocmd({ "BufWritePre" }, {
callback = function(args)
require("conform").format({ bufnr = args.buf })
end,
})
-- Simple lspconfigs
vim.lsp.config("bashls", capabilities)
vim.lsp.enable("bashls")
vim.lsp.config("dockerls", capabilities)
vim.lsp.enable("dockerls")
vim.lsp.config("lua_ls", { -- {{{
on_init = function(client)
if client.workspace_folders then
local path = client.workspace_folders[1].name
if vim.uv.fs_stat(path .. "/.luarc.json") or vim.uv.fs_stat(path .. "/.luarc.jsonc") then
return
end
end
client.config.settings.Lua = vim.tbl_deep_extend("force", client.config.settings.Lua, {
runtime = { version = "LuaJIT" },
workspace = { checkThirdParty = false, library = { vim.env.VIMRUNTIME, "''${3rd}/luv/library" } },
format = { enable = true, defaultConfig = { indent_style = "space", indent_size = "2" } },
diagnostics = { globals = { "vim", "Snacks", "MiniSessions", "MiniPick", "MiniStatusline" } },
})
end,
settings = {
Lua = {}
}
})
vim.lsp.enable("lua_ls") -- }}}
vim.lsp.config("nginx_language_server", capabilities)
vim.lsp.enable("nginx_language_server")
vim.lsp.config("nixd", capabilities)
vim.lsp.enable("nixd")
vim.lsp.config("systemd-language-server", capabilities)
vim.lsp.enable("systemd-language-server")
vim.lsp.config("yamlls", {
format = { enable = true, bracketSpacing = true },
})
vim.lsp.enable("yamlls")
-- end LSPConfig }}}
-- {{{ mini.nvim setup
require("mini.basics").setup()
require("mini.ai").setup({ n_lines = 200 })
require("mini.align").setup()
require("mini.completion").setup()
require("mini.diff").setup()
require("mini.extra").setup()
require("mini.git").setup()
require("mini.icons").setup()
require("mini.move").setup()
require("mini.operators").setup()
require("mini.pairs").setup()
require("mini.snippets").setup()
require("mini.splitjoin").setup()
require("mini.statusline").setup({
content = {
active = function()
local check_macro_recording = function()
if vim.fn.reg_recording() ~= "" then
return "@" .. vim.fn.reg_recording()
else
return ""
end
end
-- configure statusline for active windows
local mode, mode_hl = MiniStatusline.section_mode { trunc_width = 120 }
local git = MiniStatusline.section_git { trunc_width = 40 }
local diff = MiniStatusline.section_diff { trunc_width = 75 }
local diagnostics = MiniStatusline.section_diagnostics { trunc_width = 75 }
local lsp = MiniStatusline.section_lsp { trunc_width = 75 }
local filename = MiniStatusline.section_filename { trunc_width = 140 }
local fileinfo = MiniStatusline.section_fileinfo { trunc_width = 120 }
local location = MiniStatusline.section_location { trunc_width = 75 }
local search = MiniStatusline.section_searchcount { trunc_width = 75 }
local macro = check_macro_recording()
return MiniStatusline.combine_groups {
{ hl = mode_hl, strings = { mode } },
{ hl = "MiniStatuslineDevinfo", strings = { git, diff, diagnostics, lsp } },
"%<", -- Mark general truncate point
{ hl = "MiniStatuslineFilename", strings = { filename } },
"%=", -- End left alignment
{ hl = "MiniStatuslineFilename", strings = { macro } },
{ hl = "MiniStatuslineFileinfo", strings = { fileinfo } },
{ hl = mode_hl, strings = { search, location } },
}
end,
use_icons = true,
set_vim_settings = true,
},
}) -- }}}
-- {{{ which-key config
local wk = require("which-key")
local wke = require("which-key.extras")
wk.add({
{ -- Normal Mode
{ "<Tab>", ">>", desc = "increase tab depth of line" },
{ "<S-Tab>", "<<", desc = "decrease tab depth of line" },
-- file group
{ "<leader>f", group = "file" },
{ "<leader>fb", "<cmd>Yazi<cr>", desc = "[f]ile [b]rowser" },
{ "<leader>fd", "<cmd>Yazi cwd<cr>", desc = "[f]ile browser for current [d]irectory" },
{ "<leader>fp", Snacks.picker.files, desc = "[f]ile [p]icker" },
{ "<leader>fg", Snacks.picker.grep, desc = "[f]ile [g]rep picker" },
{ "<leader>fz", Snacks.picker.zoxide, desc = "[f]ile [z]oxide picker" },
-- buffer group
{
"<leader>b",
group = "buffers",
expand = function()
return wke.expand.buf()
end
},
{ "<leader>be", "<cmd>e %<cr>", desc = "[b]uffer r[e]load" },
{ "<leader>bp", Snacks.picker.buffers, desc = "[b]uffer [p]icker" },
{ "<leader>bl", Snacks.picker.lines, desc = "[b]uffer pick [l]ine" },
-- project group
{ "<leader>pp", Snacks.picker.projects, desc = "[p]ick [p]roject" },
-- help group
{ "<leader>h", group = "help" },
{ "<leader>hh", Snacks.picker.help, desc = "[h]pick [h]elp" },
{ "<leader>hk", Snacks.picker.keymaps, desc = "[h]pick [k]eymaps" },
{ "<leader>hi", Snacks.picker.icons, desc = "[h]pick icon" },
-- git group
{ "<leader>g", group = "git" },
{ "<leader>gi", "<cmd>LazyGit<CR>", desc = "lazy[g][i]t open" },
{ "<leader>gc", "<cmd>LazyGitCurrentFile<CR>", desc = "lazy[g]it [c]urrent file" },
{ "<leader>go", "<cmd>LazyGitConfig<CR>", desc = "lazy[g]it c[o]nfig" },
{ "<leader>gl", "<cmd>LazyGitLog<CR>", desc = "Lazy[g]it [l]og" },
-- lsp group
{ "<leader>l", group = "LSP" },
{ "<leader>lh", vim.lsp.buf.hover, desc = "[l]sp [h]over Documentation" },
{ "<leader>ls", vim.lsp.buf.signature_help, desc = "[l]sp [s]ignature help" },
{ "<leader>lr", vim.lsp.buf.rename, desc = "[l]sp [r]ename" },
{ "<leader>lf", vim.lsp.buf.format, desc = "[l]sp [f]ormat buffer" },
{ "<leader>lgD", Snacks.picker.lsp_declarations, desc = "[l]sp [g]oto [D]eclaration" },
{ "<leader>lgI", Snacks.picker.lsp_implementations, desc = "[l]sp [g]oto [I]mplementation" },
{ "<leader>lgS", Snacks.picker.lsp_workspace_symbols, desc = "[l]sp [g]oto workspace [S]ymbol" },
{ "<leader>lgd", Snacks.picker.lsp_definitions, desc = "[l]sp [g]oto [d]efinition" },
{ "<leader>lgr", Snacks.picker.lsp_references, desc = "[l]sp [g]oto [r]eferences" },
{ "<leader>lgs", Snacks.picker.lsp_symbols, desc = "[l]sp [g]oto document [s]ymbol" },
{ "<leader>lde", vim.diagnostic.open_float, desc = "[l]sp [d]iagnostic [e]rror messages" },
{ "<leader>ldq", vim.diagnostic.setloclist, desc = "[l]sp [d]iagnostic [q]uickfix list" },
-- diagnostics
{
"[d",
function() vim.diagnostic.jump({ count = -1, float = true }) end,
desc = "goto previous [d]iagnostic message"
},
{
"]d",
function() vim.diagnostic.jump({ count = 1, float = true }) end,
desc = "goto next [d]iagnostic message"
},
-- misc
{ "<Esc>", ":nohl<CR>", desc = "Clear Highlights" },
{ "<leader>rr", ":source %<CR>", desc = "sou[r]ce cu[r]rent file as neovim lua" },
},
{ -- Visual Mode
mode = "v",
{ "<Tab>", ">>", desc = "increase tab depth of selection" },
{ "<S-Tab>", "<<", desc = "decrease tab depth of selection" },
},
{ -- Insert Mode
mode = "i",
{ "<C-i>", vim.lsp.buf.signature_help, desc = "signature help" },
{ "<C-d>", vim.lsp.buf.hover, desc = "Hover [d]ocumentation" },
{ "<Tab>", "<C-t>", desc = "restore tab functionality" },
{ "<S-Tab>", "<C-d>", desc = "restore de-tab functionality" },
},
{ -- Terminal Mode
mode = "t",
{ "<Esc>", "<C-\\><C-n>", desc = "Exit terminal mode" },
-- Window navigation
{ "<C-h>", "<C-\\><C-n><C-w>h", desc = "Navigate to left window" },
{ "<C-j>", "<C-\\><C-n><C-w>j", desc = "Navigate to lower window" },
{ "<C-k>", "<C-\\><C-n><C-w>k", desc = "Navigate to upper window" },
{ "<C-l>", "<C-\\><C-n><C-w>l", desc = "Navigate to right window" },
-- Tab navigation
{ "<M-h>", "<C-\\><C-n><cmd>tabprev<CR>", desc = "Navigate to previous tab" },
{ "<M-l>", "<C-\\><C-n><cmd>tabnext<CR>", desc = "Navigate to next tab" },
},
{ -- Normal, Insert mode
mode = { "n", "i" },
-- Window navigation
{ "<C-h>", "<C-w>h", desc = "Navigate to left window" },
{ "<C-j>", "<C-w>j", desc = "Navigate to lower window" },
{ "<C-k>", "<C-w>k", desc = "Navigate to upper window" },
{ "<C-l>", "<C-w>l", desc = "Navigate to right window" },
-- Tab navigation
{ "<M-h>", "<cmd>tabprev<CR>", desc = "Navigate to previous tab" },
{ "<M-l>", "<cmd>tabnext<CR>", desc = "Navigate to next tab" },
},
}) -- }}}