359 lines
13 KiB
Lua
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" },
|
|
},
|
|
}) -- }}}
|