-- =================================== -- | General Neovim Configuration | -- =================================== -- I won't lie to you, I vibecoded the boilerplate for this stuff. -- Aside from Emacs, I don't really like having to configure my editors -- very much. Basic understanding of the config is all I really prioritize. vim.opt.number = true -- Show line numbers vim.opt.relativenumber = true -- Show relative line numbers vim.opt.tabstop = 2 -- A tab is 2 spaces vim.opt.shiftwidth = 2 -- Indent is 2 spaces vim.opt.expandtab = true -- Use spaces instead of tabs vim.opt.termguicolors = true -- Enable terminal colors vim.opt.scrolloff = 8 -- Lines above/below cursor vim.opt.signcolumn = "yes" -- Always show the sign column -- Set the leader key to space. This is a crucial step for custom mappings. vim.g.mapleader = " " -- ==================================== -- | Plugin Management with lazy.nvim | -- ==================================== -- The configuration below bootstraps lazy.nvim if it's not already installed. local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" if not vim.loop.fs_stat(lazypath) then vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", lazypath }) end vim.opt.rtp:prepend(lazypath) -- Setup the plugins you need. require("lazy").setup({ -- Zen mode { "folke/zen-mode.nvim", opts = { window = { backdrop = .9, width = 150, } } }, -- For background transparency { 'xiyaowong/transparent.nvim' }, -- === The colorscheme plugin is specified here. === -- Gruvbox theme plugin. It will be automatically installed by lazy.nvim. { 'ellisonleao/gruvbox.nvim', config = function() -- Ensure the background is set to 'dark' for the gruvbox colorscheme. vim.o.background = 'dark' -- Load the colorscheme. vim.cmd.colorscheme("gruvbox") end }, -- Treesitter plugin for syntax highlighting. { "nvim-treesitter/nvim-treesitter", build = ":TSUpdate" }, -- Autocomplete plugins { "hrsh7th/nvim-cmp" }, { "hrsh7th/cmp-nvim-lsp" }, { "L3MON4D3/LuaSnip" }, { "neovim/nvim-lspconfig" }, -- Plugin to automatically close paired characters like (), {}, [], and "" { 'echasnovski/mini.pairs' }, -- File tree and icon plugins { 'nvim-tree/nvim-tree.lua', version = '*', lazy = false, dependencies = { 'nvim-tree/nvim-web-devicons', }, config = function() -- The setup call for the nvim-tree plugin. require('nvim-tree').setup {} end }, }) -- Transparent configuration require('transparent').setup({ enable = true, -- boolean: enable transparent extra_groups = { -- table: additional groups to clear 'Normal', 'NormalNC', 'Comment', 'Constant', 'Identifier', 'Statement', 'PreProc', 'Type', 'Special', 'Underlined', 'Todo', 'String', 'Function', 'Conditional', 'Repeat', 'Operator', 'Structure', 'LineNr', 'SignColumn', 'EndOfBuffer' }, }) -- Autocomplete (cmp) configuration. local cmp = require("cmp") cmp.setup({ snippet = { expand = function(args) require("luasnip").lsp_expand(args.body) end, }, mapping = cmp.mapping.preset.insert({ [""] = cmp.mapping.select_next_item(), [""] = cmp.mapping.select_prev_item(), [""] = cmp.mapping.confirm({ select = true }), }), sources = { { name = "nvim_lsp" }, }, }) -- Mini.pairs configuration. -- This simple setup is all that's needed for the basic functionality. require('mini.pairs').setup({}) -- =================================== -- | Custom Keymaps | -- =================================== -- Keymaps are custom commands mapped to a specific key combination. -- The "" prefix will be replaced with your leader key, which is "space". -- Split creation keymaps vim.keymap.set('n', 'sv', ':vsplit', { desc = 'Create a vertical split' }) vim.keymap.set('n', 'ss', ':split', { desc = 'Create a horizontal split' }) -- Buffer navigation -- bh/j/k/l to navigate between buffers vim.keymap.set('n', 'bh', ':bprev', { desc = 'Go to previous buffer' }) vim.keymap.set('n', 'bl', ':bnext', { desc = 'Go to next buffer' }) -- The following mappings are less common, but fulfill your request. vim.keymap.set('n', 'bj', ':bnext', { desc = 'Go to next buffer' }) vim.keymap.set('n', 'bk', ':bprev', { desc = 'Go to previous buffer' }) -- Split navigation -- sh/j/k/l to move between splits vim.keymap.set('n', 'sh', 'h', { desc = 'Move to left split' }) vim.keymap.set('n', 'sj', 'j', { desc = 'Move to split below' }) vim.keymap.set('n', 'sk', 'k', { desc = 'Move to split above' }) vim.keymap.set('n', 'sl', 'l', { desc = 'Move to right split' }) -- Normal mode keymaps -- Save the current file. vim.keymap.set('n', 'w', ':w', { desc = 'Save file' }) -- Force quit the current window without saving. vim.keymap.set('n', 'q', ':q!', { desc = 'Force quit window' }) -- Save and quit. vim.keymap.set('n', 'x', ':wq', { desc = 'Save and quit' }) -- Save all open buffers. vim.keymap.set('n', 'wa', ':wa', { desc = 'Save all buffers' }) -- Close all windows except the current one. vim.keymap.set('n', 'o', ':only', { desc = 'Close all other windows' }) -- Toggle the file tree. vim.keymap.set('n', 'e', ':NvimTreeToggle', { desc = 'Toggle file tree' }) -- Select the entire file content. vim.keymap.set('n', 'a', 'ggVG', { desc = 'Select entire file' }) -- Various commands to compile different file types. -- Groff => PDF vim.keymap.set('n', 'cg', ':!groff -ms -e %:t -T pdf > %:r.pdf', { desc = 'Compile Groff file to PDF' }) -- Typst => PDF vim.keymap.set('n', 'ct', ':!typst compile %:t', { desc = 'Compile Typst file to PDF'} ) -- Keybinding to toggle transparency vim.api.nvim_set_keymap('n', 'tt', ':TransparentToggle', { noremap = true, silent = true })