-- {{{ 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 = "", }, }) 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 { "", ">>", desc = "increase tab depth of line" }, { "", "<<", desc = "decrease tab depth of line" }, -- file group { "f", group = "file" }, { "fb", "Yazi", desc = "[f]ile [b]rowser" }, { "fd", "Yazi cwd", desc = "[f]ile browser for current [d]irectory" }, { "fp", Snacks.picker.files, desc = "[f]ile [p]icker" }, { "fg", Snacks.picker.grep, desc = "[f]ile [g]rep picker" }, { "fz", Snacks.picker.zoxide, desc = "[f]ile [z]oxide picker" }, -- buffer group { "b", group = "buffers", expand = function() return wke.expand.buf() end }, { "be", "e %", desc = "[b]uffer r[e]load" }, { "bp", Snacks.picker.buffers, desc = "[b]uffer [p]icker" }, { "bl", Snacks.picker.lines, desc = "[b]uffer pick [l]ine" }, -- project group { "pp", Snacks.picker.projects, desc = "[p]ick [p]roject" }, -- help group { "h", group = "help" }, { "hh", Snacks.picker.help, desc = "[h]pick [h]elp" }, { "hk", Snacks.picker.keymaps, desc = "[h]pick [k]eymaps" }, { "hi", Snacks.picker.icons, desc = "[h]pick icon" }, -- git group { "g", group = "git" }, { "gi", "LazyGit", desc = "lazy[g][i]t open" }, { "gc", "LazyGitCurrentFile", desc = "lazy[g]it [c]urrent file" }, { "go", "LazyGitConfig", desc = "lazy[g]it c[o]nfig" }, { "gl", "LazyGitLog", desc = "Lazy[g]it [l]og" }, -- lsp group { "l", group = "LSP" }, { "lh", vim.lsp.buf.hover, desc = "[l]sp [h]over Documentation" }, { "ls", vim.lsp.buf.signature_help, desc = "[l]sp [s]ignature help" }, { "lr", vim.lsp.buf.rename, desc = "[l]sp [r]ename" }, { "lf", vim.lsp.buf.format, desc = "[l]sp [f]ormat buffer" }, { "lgD", Snacks.picker.lsp_declarations, desc = "[l]sp [g]oto [D]eclaration" }, { "lgI", Snacks.picker.lsp_implementations, desc = "[l]sp [g]oto [I]mplementation" }, { "lgS", Snacks.picker.lsp_workspace_symbols, desc = "[l]sp [g]oto workspace [S]ymbol" }, { "lgd", Snacks.picker.lsp_definitions, desc = "[l]sp [g]oto [d]efinition" }, { "lgr", Snacks.picker.lsp_references, desc = "[l]sp [g]oto [r]eferences" }, { "lgs", Snacks.picker.lsp_symbols, desc = "[l]sp [g]oto document [s]ymbol" }, { "lde", vim.diagnostic.open_float, desc = "[l]sp [d]iagnostic [e]rror messages" }, { "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 { "", ":nohl", desc = "Clear Highlights" }, { "rr", ":source %", desc = "sou[r]ce cu[r]rent file as neovim lua" }, }, { -- Visual Mode mode = "v", { "", ">>", desc = "increase tab depth of selection" }, { "", "<<", desc = "decrease tab depth of selection" }, }, { -- Insert Mode mode = "i", { "", vim.lsp.buf.signature_help, desc = "signature help" }, { "", vim.lsp.buf.hover, desc = "Hover [d]ocumentation" }, { "", "", desc = "restore tab functionality" }, { "", "", desc = "restore de-tab functionality" }, }, { -- Terminal Mode mode = "t", { "", "", desc = "Exit terminal mode" }, -- Window navigation { "", "h", desc = "Navigate to left window" }, { "", "j", desc = "Navigate to lower window" }, { "", "k", desc = "Navigate to upper window" }, { "", "l", desc = "Navigate to right window" }, -- Tab navigation { "", "tabprev", desc = "Navigate to previous tab" }, { "", "tabnext", desc = "Navigate to next tab" }, }, { -- Normal, Insert mode mode = { "n", "i" }, -- Window navigation { "", "h", desc = "Navigate to left window" }, { "", "j", desc = "Navigate to lower window" }, { "", "k", desc = "Navigate to upper window" }, { "", "l", desc = "Navigate to right window" }, -- Tab navigation { "", "tabprev", desc = "Navigate to previous tab" }, { "", "tabnext", desc = "Navigate to next tab" }, }, }) -- }}}