From 5d95db34807a770d56d279c5a08b3c07dd8c1e6f Mon Sep 17 00:00:00 2001 From: Alexander Zinn Date: Fri, 5 Sep 2025 20:46:41 -0400 Subject: [PATCH] nvim --- nvim/init.lua | 1 + nvim/lazy-lock.json | 24 +++++ nvim/lua/zinn/init.lua | 4 + nvim/lua/zinn/lazy.lua | 40 ++++++++ nvim/lua/zinn/options.lua | 34 +++++++ .../zinn/plugins/colorscheme-gihtub_dark.lua | 8 ++ nvim/lua/zinn/plugins/lazygit.lua | 21 +++++ nvim/lua/zinn/plugins/lsp.lua | 92 +++++++++++++++++++ nvim/lua/zinn/plugins/mason-lsp.lua | 38 ++++++++ nvim/lua/zinn/plugins/mvim-cmp.lua | 20 ++++ nvim/lua/zinn/plugins/nvim-tree.lua | 67 ++++++++++++++ nvim/lua/zinn/plugins/telescope.lua | 16 ++++ nvim/lua/zinn/plugins/treesitter.lua | 86 +++++++++++++++++ nvim/lua/zinn/plugins/trouble.lua | 5 + nvim/lua/zinn/plugins/vim-hightlighter.lua | 3 + nvim/lua/zinn/plugins/wakatime.lua | 1 + nvim/lua/zinn/plugins/webdev-icons.lua | 3 + nvim/lua/zinn/plugins/which-key.lua | 18 ++++ 18 files changed, 481 insertions(+) create mode 100644 nvim/init.lua create mode 100644 nvim/lazy-lock.json create mode 100644 nvim/lua/zinn/init.lua create mode 100644 nvim/lua/zinn/lazy.lua create mode 100644 nvim/lua/zinn/options.lua create mode 100644 nvim/lua/zinn/plugins/colorscheme-gihtub_dark.lua create mode 100644 nvim/lua/zinn/plugins/lazygit.lua create mode 100644 nvim/lua/zinn/plugins/lsp.lua create mode 100644 nvim/lua/zinn/plugins/mason-lsp.lua create mode 100644 nvim/lua/zinn/plugins/mvim-cmp.lua create mode 100644 nvim/lua/zinn/plugins/nvim-tree.lua create mode 100644 nvim/lua/zinn/plugins/telescope.lua create mode 100644 nvim/lua/zinn/plugins/treesitter.lua create mode 100644 nvim/lua/zinn/plugins/trouble.lua create mode 100644 nvim/lua/zinn/plugins/vim-hightlighter.lua create mode 100644 nvim/lua/zinn/plugins/wakatime.lua create mode 100644 nvim/lua/zinn/plugins/webdev-icons.lua create mode 100644 nvim/lua/zinn/plugins/which-key.lua diff --git a/nvim/init.lua b/nvim/init.lua new file mode 100644 index 0000000..dcb18ed --- /dev/null +++ b/nvim/init.lua @@ -0,0 +1 @@ +require("zinn") diff --git a/nvim/lazy-lock.json b/nvim/lazy-lock.json new file mode 100644 index 0000000..0a65cde --- /dev/null +++ b/nvim/lazy-lock.json @@ -0,0 +1,24 @@ +{ + "cmp-buffer": { "branch": "main", "commit": "b74fab3656eea9de20a9b8116afa3cfc4ec09657" }, + "cmp-nvim-lsp": { "branch": "main", "commit": "bd5a7d6db125d4654b50eeae9f5217f24bb22fd3" }, + "cmp-path": { "branch": "main", "commit": "c642487086dbd9a93160e1679a1327be111cbc25" }, + "fidget.nvim": { "branch": "main", "commit": "4d5858bd4c471c895060e1b9f3575f1551184dc5" }, + "github-theme": { "branch": "main", "commit": "c106c9472154d6b2c74b74565616b877ae8ed31d" }, + "lazy.nvim": { "branch": "main", "commit": "6c3bda4aca61a13a9c63f1c1d1b16b9d3be90d7a" }, + "lazygit.nvim": { "branch": "main", "commit": "3c524ebec6072568064235c407195e9f9fd0cb8a" }, + "mason-lspconfig.nvim": { "branch": "main", "commit": "5e085efe67fccb13372d54331d849219662a7e93" }, + "mason.nvim": { "branch": "main", "commit": "7dc4facca9702f95353d5a1f87daf23d78e31c2a" }, + "neodev.nvim": { "branch": "main", "commit": "46aa467dca16cf3dfe27098042402066d2ae242d" }, + "nvim-cmp": { "branch": "main", "commit": "b5311ab3ed9c846b585c0c15b7559be131ec4be9" }, + "nvim-lspconfig": { "branch": "master", "commit": "408cf07b97535825cca6f1afa908d98348712ba6" }, + "nvim-tree.lua": { "branch": "master", "commit": "321bc61580fd066b76861c32de3319c3a6d089e7" }, + "nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" }, + "nvim-ts-autotag": { "branch": "main", "commit": "a1d526af391f6aebb25a8795cbc05351ed3620b5" }, + "nvim-web-devicons": { "branch": "master", "commit": "f66cdfef5e84112045b9ebc3119fee9bddb3c687" }, + "plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" }, + "telescope.nvim": { "branch": "master", "commit": "a0bbec21143c7bc5f8bb02e0005fa0b982edc026" }, + "trouble.nvim": { "branch": "main", "commit": "85bedb7eb7fa331a2ccbecb9202d8abba64d37b3" }, + "vim-highlighter": { "branch": "main", "commit": "b12fa20268cf838ac18e295eb408d0112cf0e855" }, + "vim-wakatime": { "branch": "master", "commit": "ecba6015dd9a8c7657583efcdcd95c362e5ed20b" }, + "which-key.nvim": { "branch": "main", "commit": "370ec46f710e058c9c1646273e6b225acf47cbed" } +} diff --git a/nvim/lua/zinn/init.lua b/nvim/lua/zinn/init.lua new file mode 100644 index 0000000..a94c286 --- /dev/null +++ b/nvim/lua/zinn/init.lua @@ -0,0 +1,4 @@ +require("zinn.lazy") +require("zinn.options") + +vim.cmd("colorscheme github_dark_high_contrast") diff --git a/nvim/lua/zinn/lazy.lua b/nvim/lua/zinn/lazy.lua new file mode 100644 index 0000000..4447ee2 --- /dev/null +++ b/nvim/lua/zinn/lazy.lua @@ -0,0 +1,40 @@ +local lazyPath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" +local isLazyInstalled = vim.uv.fs_stat(lazyPath) + +if not isLazyInstalled then + vim.fn.system({ + "git", + "clone", + "--filter=blob:none", + "https://github.com/folke/lazy.nvim.git", + "--branch=stable", + lazyPath + }) +end + +vim.opt.rtp:prepend(lazyPath) + +vim.g.mapleader = " " + +require("lazy").setup({ + defaults = { + lazy = false, + version = false + }, + spec = { + + { import = "zinn.plugins" } + }, + performance = { + rtp = { + disabled_plugins = { + "gzip", + "tarPlugin", + "netrwPlugin", + "tohtml", + "tutor", + "zipPlugin", + }, + }, + }, +}) diff --git a/nvim/lua/zinn/options.lua b/nvim/lua/zinn/options.lua new file mode 100644 index 0000000..3ab9b12 --- /dev/null +++ b/nvim/lua/zinn/options.lua @@ -0,0 +1,34 @@ +print("loading options.lua") + +-- Disable netrw since we're using nvim-tree +vim.g.loaded_netrw = 1 +vim.g.loaded_netrwPlugin = 1 +vim.g.netrw_browse_split = 0 +vim.g.netrw_banner = 0 +vim.g.netrw_winsize = 25 + +vim.opt.fixendofline = false +vim.opt.fixeol = false -- prevent auto adding end of line +vim.opt.backup = false +vim.opt.colorcolumn = "100" +vim.opt.cursorline = true +vim.opt.guicursor = "" +vim.opt.nu = true +vim.opt.hlsearch = true +vim.opt.incsearch = true +vim.opt.ignorecase = true +vim.opt.isfname:append("@-@") +vim.opt.relativenumber = true +vim.opt.scrolloff = 8 +vim.opt.signcolumn = "yes" +vim.opt.smartindent = true +vim.opt.swapfile = false +vim.opt.termguicolors = true +vim.opt.undodir = os.getenv("HOME") .. "/.vim/undodir" +vim.opt.undofile = true +vim.opt.updatetime = 50 +vim.opt.wrap = false +vim.opt.tabstop = 2 +vim.opt.softtabstop = 2 +vim.opt.shiftwidth = 2 +vim.opt.expandtab = true diff --git a/nvim/lua/zinn/plugins/colorscheme-gihtub_dark.lua b/nvim/lua/zinn/plugins/colorscheme-gihtub_dark.lua new file mode 100644 index 0000000..897dc13 --- /dev/null +++ b/nvim/lua/zinn/plugins/colorscheme-gihtub_dark.lua @@ -0,0 +1,8 @@ +return { + { + "projekt0n/github-nvim-theme", + name = "github-theme", + lazy = false, -- make sure we load this during startup if it is your main colorscheme + priority = 1000, -- make sure to load this before all the other start plugins + }, +} diff --git a/nvim/lua/zinn/plugins/lazygit.lua b/nvim/lua/zinn/plugins/lazygit.lua new file mode 100644 index 0000000..c7cb122 --- /dev/null +++ b/nvim/lua/zinn/plugins/lazygit.lua @@ -0,0 +1,21 @@ +-- nvim v0.8.0 +return { + "kdheepak/lazygit.nvim", + lazy = true, + cmd = { + "LazyGit", + "LazyGitConfig", + "LazyGitCurrentFile", + "LazyGitFilter", + "LazyGitFilterCurrentFile", + }, + -- optional for floating window border decoration + dependencies = { + "nvim-lua/plenary.nvim", + }, + -- setting the keybinding for LazyGit with 'keys' is recommended in + -- order to load the plugin when the command is run for the first time + keys = { + { "lg", "LazyGit", desc = "LazyGit" } + } +} diff --git a/nvim/lua/zinn/plugins/lsp.lua b/nvim/lua/zinn/plugins/lsp.lua new file mode 100644 index 0000000..a8831dd --- /dev/null +++ b/nvim/lua/zinn/plugins/lsp.lua @@ -0,0 +1,92 @@ +return { + -- LSP Configuration + { + "neovim/nvim-lspconfig", + dependencies = { + -- LSP Management + "williamboman/mason.nvim", + "williamboman/mason-lspconfig.nvim", + + -- Optional but recommended + "hrsh7th/nvim-cmp", -- Completion engine + "hrsh7th/cmp-nvim-lsp", -- LSP source for nvim-cmp + "j-hui/fidget.nvim", -- LSP status updates + "folke/neodev.nvim", -- Additional Lua configuration + }, + config = function() + -- Setup language servers + local lspconfig = require("lspconfig") + local capabilities = require("cmp_nvim_lsp").default_capabilities() + + -- Configure each language server + lspconfig.lua_ls.setup({ + capabilities = capabilities, + settings = { + Lua = { + diagnostics = { + globals = { "vim" }, + }, + workspace = { + library = vim.api.nvim_get_runtime_file("", true), + checkThirdParty = false, + }, + telemetry = { + enable = false, + }, + }, + }, + }) + + -- Add more language servers + lspconfig.pyright.setup({ + capabilities = capabilities, + }) + + -- Add keybindings for LSP functions + vim.api.nvim_create_autocmd("LspAttach", { + group = vim.api.nvim_create_augroup("UserLspConfig", {}), + callback = function(ev) + local opts = { buffer = ev.buf, noremap = true, silent = true } + + vim.keymap.set("n", "gd", vim.lsp.buf.definition, opts) + vim.keymap.set("n", "K", vim.lsp.buf.hover, opts) + vim.keymap.set("n", "rn", vim.lsp.buf.rename, opts) + vim.keymap.set("n", "ca", vim.lsp.buf.code_action, opts) + vim.keymap.set("n", "gr", vim.lsp.buf.references, opts) + vim.keymap.set("n", "f", function() + vim.lsp.buf.format({ async = true }) + end, opts) + end, + }) + end, + }, + { + "williamboman/mason.nvim", + config = function() + require("mason").setup() + end, + }, + { + "williamboman/mason-lspconfig.nvim", + config = function() + require("mason-lspconfig").setup({ + ensure_installed = { + -- Add the language servers you want to auto-install + "lua_ls", + "pyright", + "ts_ls" + }, + }) + end, + }, + -- Optional: Add nvim-cmp and its sources + { + "hrsh7th/nvim-cmp", + dependencies = { + "hrsh7th/cmp-nvim-lsp", + "hrsh7th/cmp-buffer", + "hrsh7th/cmp-path", + -- Add other sources as needed + }, + }, +} \ No newline at end of file diff --git a/nvim/lua/zinn/plugins/mason-lsp.lua b/nvim/lua/zinn/plugins/mason-lsp.lua new file mode 100644 index 0000000..b06150d --- /dev/null +++ b/nvim/lua/zinn/plugins/mason-lsp.lua @@ -0,0 +1,38 @@ +return { + { + "williamboman/mason.nvim", + config = function() + require("mason").setup({ + ui = { + border = "rounded", -- Nice UI borders + }, + }) + end, + }, + { + "williamboman/mason-lspconfig.nvim", + dependencies = { + "williamboman/mason.nvim", + "neovim/nvim-lspconfig", + }, + config = function() + local mason_lspconfig = require("mason-lspconfig") + + mason_lspconfig.setup({ + ensure_installed = { + -- "ts_ls", -- Typescript + -- "html", -- HTML + -- "cssls", -- CSS + -- "gopls", -- Go + -- "clangd", -- C++/C + -- "lua_ls", -- Lua + }, + automatic_installation = true, + }) + end, + }, + { + "neovim/nvim-lspconfig", -- Core LSP config + dependencies = { "williamboman/mason.nvim" }, + }, +} diff --git a/nvim/lua/zinn/plugins/mvim-cmp.lua b/nvim/lua/zinn/plugins/mvim-cmp.lua new file mode 100644 index 0000000..9bac70c --- /dev/null +++ b/nvim/lua/zinn/plugins/mvim-cmp.lua @@ -0,0 +1,20 @@ +return { +-- -- In the config function of nvim-cmp +-- config = function() +-- local cmp = require("cmp") +-- +-- cmp.setup({ +-- mapping = cmp.mapping.preset.insert({ +-- [""] = cmp.mapping.complete(), +-- [""] = cmp.mapping.confirm({ select = true }), +-- [""] = cmp.mapping.select_next_item(), +-- [""] = cmp.mapping.select_prev_item(), +-- }), +-- sources = cmp.config.sources({ +-- { name = "nvim_lsp" }, +-- { name = "buffer" }, +-- { name = "path" }, +-- }), +-- }) +-- end +} diff --git a/nvim/lua/zinn/plugins/nvim-tree.lua b/nvim/lua/zinn/plugins/nvim-tree.lua new file mode 100644 index 0000000..1aa477c --- /dev/null +++ b/nvim/lua/zinn/plugins/nvim-tree.lua @@ -0,0 +1,67 @@ +-- lua/plugins/nvim-tree.lua +return { + { + "nvim-tree/nvim-tree.lua", + version = "*", + lazy = false, + dependencies = { "nvim-tree/nvim-web-devicons", opts = {} }, + config = function() + require("nvim-tree").setup({ + disable_netrw = true, -- Disable built-in netrw (recommended) + hijack_netrw = true, -- Let nvim-tree handle directory browsing + view = { + width = 30, -- Fixed width for the sidebar + side = "left", -- Position on the left + }, + renderer = { + group_empty = true, -- Compact folders that only contain a single folder + highlight_git = true, -- Highlight git status + icons = { + show = { + file = true, + folder = true, + folder_arrow = true, + git = true, + }, + }, + }, + filters = { + dotfiles = false, -- Show dotfiles by default + git_ignored = false, -- Show git-ignored files + }, + actions = { + open_file = { + quit_on_open = true, -- Close the tree when opening a file + resize_window = true, -- Resize the window to fit the tree + }, + }, + git = { + enable = true, -- Enable git integration + ignore = false, + }, + -- Custom on_attach for keybindings + on_attach = function(bufnr) + local api = require("nvim-tree.api") + + -- Default mappings (these are built-in; see :help nvim-tree-mappings) + api.config.mappings.default_on_attach(bufnr) + + -- Optional: Add or override custom keymaps here + -- Example: vim.keymap.set("n", "", api.tree.toggle, { buffer = bufnr, desc = "Toggle Nvim-Tree" }) + end, + }) + + -- Optional: Auto-open nvim-tree on startup if no file is specified + vim.api.nvim_create_autocmd("VimEnter", { + callback = function() + if vim.fn.argc() == 0 and vim.fn.getcwd() ~= vim.fn.stdpath("config") then + require("nvim-tree.api").tree.open() + end + end, + }) + + -- Optional: Global keybinding to toggle the tree from anywhere + vim.keymap.set("n", "e", "NvimTreeToggle", { desc = "Toggle File Explorer" }) + end, + }, + } \ No newline at end of file diff --git a/nvim/lua/zinn/plugins/telescope.lua b/nvim/lua/zinn/plugins/telescope.lua new file mode 100644 index 0000000..73cf46f --- /dev/null +++ b/nvim/lua/zinn/plugins/telescope.lua @@ -0,0 +1,16 @@ +return { + "nvim-telescope/telescope.nvim", + tag = "0.1.8", + dependencies = { "nvim-lua/plenary.nvim" }, + pickers = { + find_files = { + theme = "dropdown", + } + }, + keys = { + { "ff", "Telescope find_files", desc = "Find Files" }, + { "fw", "Telescope live_grep", desc = "Live Grep" }, + { "fg", "Telescope git_files", desc = "Git Files" }, + { "fb", "Telescope buffers", desc = "Buffers" }, + }, +} diff --git a/nvim/lua/zinn/plugins/treesitter.lua b/nvim/lua/zinn/plugins/treesitter.lua new file mode 100644 index 0000000..f52b509 --- /dev/null +++ b/nvim/lua/zinn/plugins/treesitter.lua @@ -0,0 +1,86 @@ +-- lua/plugins/treesitter.lua +return { + { + "nvim-treesitter/nvim-treesitter", + version = false, -- last release is way too old and doesn't work on Windows + build = ":TSUpdate", + event = { "BufRead", "BufNewFile" }, + lazy = vim.fn.argc(-1) == 0, -- load treesitter early when opening a file from the cmdline + init = function(plugin) + -- PERF: add nvim-treesitter queries to the rtp and it's custom query predicates early + -- This is needed because a bunch of plugins no longer `require("nvim-treesitter")`, which + -- no longer trigger the **nvim-treesitter** module to be loaded in time. + -- Luckily, the only things that those plugins need are the custom queries, which we make available + -- during startup. + require("lazy.core.loader").add_to_rtp(plugin) + require("nvim-treesitter.query_predicates") + end, + cmd = { "TSUpdateSync", "TSUpdate", "TSInstall" }, + keys = { + { "", desc = "Increment Selection" }, + { "", desc = "Decrement Selection", mode = "x" }, + }, + opts_extend = { "ensure_installed" }, + ---@type TSConfig + ---@diagnostic disable-next-line: missing-fields + opts = { + highlight = { enable = true }, + indent = { enable = true }, + ensure_installed = { + "bash", + "c", + "cpp", -- Added for C++ (complements clangd LSP) + "diff", + "go", -- Added for Go (complements gopls LSP) + "html", + "javascript", + "jsdoc", + "json", + "jsonc", + "lua", + "luadoc", + "luap", + "markdown", + "markdown_inline", + "printf", + "python", + "query", + "regex", + "toml", + "tsx", + "typescript", + "vim", + "vimdoc", + "xml", + "yaml", + }, + incremental_selection = { + enable = true, + keymaps = { + init_selection = "", + node_incremental = "", + scope_incremental = false, + node_decremental = "", + }, + }, + textobjects = { + move = { + enable = true, + goto_next_start = { ["]f"] = "@function.outer", ["]c"] = "@class.outer", ["]a"] = "@parameter.inner" }, + goto_next_end = { ["]F"] = "@function.outer", ["]C"] = "@class.outer", ["]A"] = "@parameter.inner" }, + goto_previous_start = { ["[f"] = "@function.outer", ["[c"] = "@class.outer", ["[a"] = "@parameter.inner" }, + goto_previous_end = { ["[F"] = "@function.outer", ["[C"] = "@class.outer", ["[A"] = "@parameter.inner" }, + }, + }, + }, + ---@param opts TSConfig + config = function(_, opts) + require("nvim-treesitter.configs").setup(opts) + end, + }, + { + "windwp/nvim-ts-autotag", + event = { "BufRead", "BufNewFile" }, + opts = {}, + }, +} \ No newline at end of file diff --git a/nvim/lua/zinn/plugins/trouble.lua b/nvim/lua/zinn/plugins/trouble.lua new file mode 100644 index 0000000..2d2b7c9 --- /dev/null +++ b/nvim/lua/zinn/plugins/trouble.lua @@ -0,0 +1,5 @@ +-- lua/plugins/trouble.lua +return { + { "folke/trouble.nvim", opts = {} }, + } + \ No newline at end of file diff --git a/nvim/lua/zinn/plugins/vim-hightlighter.lua b/nvim/lua/zinn/plugins/vim-hightlighter.lua new file mode 100644 index 0000000..992eafa --- /dev/null +++ b/nvim/lua/zinn/plugins/vim-hightlighter.lua @@ -0,0 +1,3 @@ +return { + { "azabiong/vim-highlighter" }, +} \ No newline at end of file diff --git a/nvim/lua/zinn/plugins/wakatime.lua b/nvim/lua/zinn/plugins/wakatime.lua new file mode 100644 index 0000000..89df094 --- /dev/null +++ b/nvim/lua/zinn/plugins/wakatime.lua @@ -0,0 +1 @@ +return { 'wakatime/vim-wakatime', lazy = false } diff --git a/nvim/lua/zinn/plugins/webdev-icons.lua b/nvim/lua/zinn/plugins/webdev-icons.lua new file mode 100644 index 0000000..1a69462 --- /dev/null +++ b/nvim/lua/zinn/plugins/webdev-icons.lua @@ -0,0 +1,3 @@ +return { + { "nvim-tree/nvim-web-devicons", opts = {} } +} diff --git a/nvim/lua/zinn/plugins/which-key.lua b/nvim/lua/zinn/plugins/which-key.lua new file mode 100644 index 0000000..9fadb97 --- /dev/null +++ b/nvim/lua/zinn/plugins/which-key.lua @@ -0,0 +1,18 @@ +return { + "folke/which-key.nvim", + event = "VeryLazy", + opts = { + -- your configuration comes here + -- or leave it empty to use the default settings + -- refer to the configuration section below + }, + keys = { + { + "?", + function() + require("which-key").show({ global = false }) + end, + desc = "Buffer Local Keymaps (which-key)", + }, + }, +}