------------------------------------------------------------------- -- Settings ------------------------------------------------------------------- -- vim.opt.winborder = "rounded" vim.opt.hlsearch = false vim.opt.tabstop = 4 vim.opt.cursorcolumn = false vim.opt.ignorecase = true vim.opt.shiftwidth = 4 vim.opt.smartindent = true vim.opt.number = true vim.opt.relativenumber = true vim.opt.termguicolors = true vim.opt.undofile = true vim.opt.signcolumn = "yes" ------------------------------------------------------------------- -- Autocommands ------------------------------------------------------------------- -- show cursor line only in active window (TMUX) local cursorLineGrp = vim.api.nvim_create_augroup("CursorLine", { clear = true }) vim.api.nvim_create_autocmd( { "InsertLeave", "WinEnter" }, { pattern = "*", command = "set cursorline", group = cursorLineGrp } ) vim.api.nvim_create_autocmd( { "InsertEnter", "WinLeave" }, { pattern = "*", command = "set nocursorline", group = cursorLineGrp } ) vim.api.nvim_create_autocmd( { "InsertLeave", "FocusGained" }, { pattern = "*", command = "set cursorline", group = cursorLineGrp } ) vim.api.nvim_create_autocmd( { "InsertEnter", "FocusLost" }, { pattern = "*", command = "set nocursorline", group = cursorLineGrp } ) ------------------------------------------------------------------- -- Functions ------------------------------------------------------------------- local center_window = function() local height = math.floor(0.618 * vim.o.lines) local width = math.floor(0.618 * vim.o.columns) return { anchor = "NW", height = height, width = width, row = math.floor(0.5 * (vim.o.lines - height)), col = math.floor(0.5 * (vim.o.columns - width)), } end local active_statusline = function() local mode, mode_hl = MiniStatusline.section_mode({ trunc_width = 120 }) local diff = MiniStatusline.section_diff({ trunc_width = 75 }) local git = MiniStatusline.section_git({ trunc_width = 40 }) 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 = string.match(MiniStatusline.section_fileinfo({ trunc_width = 120 }), "%S+") local location = MiniStatusline.section_location({ trunc_width = 75 }) return MiniStatusline.combine_groups({ { hl = mode_hl, strings = { mode } }, { hl = "MiniStatuslineDevinfo", strings = { git, diff, diagnostics } }, "%<", -- Mark general truncate point { hl = "MiniStatuslineFilename", strings = { filename } }, "%=", -- End left alignment { hl = "MiniStatuslineFileinfo", strings = { lsp, fileinfo } }, { hl = mode_hl, strings = { location } }, }) end local inactive_statusline = function() return MiniStatusline.combine_groups({ { hl = "MiniStatuslineDevinfo", strings = {} }, }) end ------------------------------------------------------------------- -- Plugin installation ------------------------------------------------------------------- vim.pack.add({ { src = "https://git.cmtec.se/cm/nightly_cm.nvim.git" }, { src = "https://github.com/mrjones2014/smart-splits.nvim" }, { src = "https://github.com/nvim-lua/plenary.nvim" }, { src = "https://github.com/kdheepak/lazygit.nvim" }, { src = "https://github.com/echasnovski/mini.icons" }, { src = "https://github.com/echasnovski/mini.statusline" }, { src = "https://github.com/echasnovski/mini.pick" }, { src = "https://github.com/echasnovski/mini.extra" }, { src = "https://github.com/neovim/nvim-lspconfig" }, { src = "https://github.com/lewis6991/gitsigns.nvim" }, { src = "https://github.com/MunifTanjim/nui.nvim" }, -- { src = "https://github.com/folke/noice.nvim" }, { src = "https://github.com/L3MON4D3/LuaSnip" }, { src = "https://github.com/rafamadriz/friendly-snippets" }, { src = "https://github.com/saghen/blink.cmp" }, { src = "https://github.com/stevearc/conform.nvim" }, { src = "https://github.com/prichrd/netrw.nvim" }, { src = "https://github.com/nvim-tree/nvim-tree.lua" }, }) ------------------------------------------------------------------- -- Plugin config ------------------------------------------------------------------- -- require("noice").setup() require("netrw").setup() require("conform").setup({ formatters_by_ft = { lua = { "stylua" }, python = { "isort", "black" }, rust = { "rustfmt", lsp_format = "fallback" }, c = { "clang_format" }, cpp = { "clang_format" }, javascript = { "prettier" }, typescript = { "prettier" }, javascriptreact = { "prettier" }, typescriptreact = { "prettier" }, css = { "prettier" }, html = { "prettier" }, json = { "prettier" }, yaml = { "prettier" }, markdown = { "prettier" }, sh = { "shfmt" }, }, formatters = { clang_format = { prepend_args = { "--style={BasedOnStyle: LLVM, IndentWidth: 4, TabWidth: 4, UseTab: Never}" }, }, shfmt = { prepend_args = { "-i", "4" }, }, }, format_on_save = { timeout_ms = 3000, lsp_format = "fallback", }, }) require("mini.pick").setup({ window = { config = center_window } }) require("mini.extra").setup() require("mini.statusline").setup({ content = { active = active_statusline, inactive = inactive_statusline } }) require("gitsigns").setup({ signs = { add = { text = "▎" }, change = { text = "▎" }, delete = { text = "▎" }, topdelete = { text = "▎" }, changedelete = { text = "▎" }, untracked = { text = "▎" }, }, preview_config = { -- Options passed to nvim_open_win border = "solid", style = "minimal", relative = "cursor", row = 0, col = 1, }, }) require("luasnip.loaders.from_vscode").lazy_load() require("blink.cmp").setup({ signature = { enabled = true }, completion = { documentation = { auto_show = false, auto_show_delay_ms = 500 }, menu = { auto_show = true, draw = { columns = { { "label", "label_description", gap = 1 }, { "kind_icon", "kind" }, }, }, }, }, sources = { default = { "lsp", "buffer", "path", "snippets" }, providers = { -- defaults to `{ 'buffer' }` lsp = { fallbacks = {} }, }, }, fuzzy = { implementation = "lua" }, }) require("nvim-tree").setup() ------------------------------------------------------------------- -- LSP config ------------------------------------------------------------------- vim.lsp.enable({ "lua_ls", "rust_analyzer", "bashls", "pyright", "marksman", "clangd", "yamlls" }) ------------------------------------------------------------------- -- GUI config ------------------------------------------------------------------- vim.cmd.colorscheme("nightly_cm") vim.diagnostic.config({ severity_sort = true, float = { border = "rounded", source = "if_many" }, underline = { severity = vim.diagnostic.severity.WARN }, signs = { numhl = { [vim.diagnostic.severity.ERROR] = "DiagnosticSignError", }, text = { [vim.diagnostic.severity.ERROR] = "", [vim.diagnostic.severity.WARN] = "", [vim.diagnostic.severity.INFO] = "", [vim.diagnostic.severity.HINT] = "", }, } or {}, virtual_text = { source = "if_many", spacing = 2, format = function(diagnostic) local diagnostic_message = { [vim.diagnostic.severity.ERROR] = diagnostic.message, [vim.diagnostic.severity.WARN] = diagnostic.message, [vim.diagnostic.severity.INFO] = diagnostic.message, [vim.diagnostic.severity.HINT] = diagnostic.message, } return diagnostic_message[diagnostic.severity] end, }, }) ------------------------------------------------------------------- -- Keybindings ------------------------------------------------------------------- local map = vim.keymap.set vim.g.mapleader = " " -- QoL bindings map("i", "jj", "", { noremap = true, silent = true }) map("n", "u", ":update :source", { noremap = true, silent = true }) map("n", "w", ":write", { noremap = true, silent = true }) map("n", "q", ":quit", { noremap = true, silent = true }) map("n", "v", ":vsplit", { noremap = true, silent = true }) map("n", "", "zz", { noremap = true, silent = true }) map("n", "", "zz", { noremap = true, silent = true }) map("n", "n", "nzzzv", { noremap = true, silent = true }) map("n", "N", "Nzzzv", { noremap = true, silent = true }) -- Git map("n", "g", ":LazyGitCurrentFile", { noremap = true, silent = true }) -- File browser -- map("n", "e", ":25Lex", { noremap = true, silent = true }) map("n", "e", ":NvimTreeToggle", { noremap = true, silent = true }) map("n", "f", ":Pick files", { noremap = true, silent = true }) map("n", "h", ":Pick help", { noremap = true, silent = true }) -- LSP map("n", "grr", ":Pick lsp scope='references'", { noremap = true, silent = true }) map("n", "grt", ":Pick lsp scope='type_definition'", { noremap = true, silent = true }) map("n", "gri", ":Pick lsp scope='implementation'", { noremap = true, silent = true }) -- Global Copy/Paste map({ "n", "v" }, "y", '"+y', { noremap = true, silent = true }) map({ "n", "v" }, "d", '"+d', { noremap = true, silent = true }) map({ "n", "v" }, "c", "1z=", { noremap = true, silent = true }) -- Smart splits to support TMUX map({ "n", "t" }, "", require("smart-splits").resize_left, { desc = "Resize left" }) map({ "n", "t" }, "", require("smart-splits").resize_down, { desc = "Resize down" }) map({ "n", "t" }, "", require("smart-splits").resize_up, { desc = "Resize up" }) map({ "n", "t" }, "", require("smart-splits").resize_right, { desc = "Resize right" }) map({ "n", "t" }, "", require("smart-splits").move_cursor_left, { desc = "Move cursor left" }) map({ "n", "t" }, "", require("smart-splits").move_cursor_down, { desc = "Move cursor down" }) map({ "n", "t" }, "", require("smart-splits").move_cursor_up, { desc = "Move cursor up" }) map({ "n", "t" }, "", require("smart-splits").move_cursor_right, { desc = "Move cursor right" }) map("n", "h", require("smart-splits").swap_buf_left, { desc = "Swap buffer left" }) map("n", "j", require("smart-splits").swap_buf_down, { desc = "Swap buffer down" }) map("n", "k", require("smart-splits").swap_buf_up, { desc = "Swap buffer up" }) map("n", "l", require("smart-splits").swap_buf_right, { desc = "Swap buffer right" })