-- disable netrw for nvim-tree plugin vim.g.loaded_netrw = 1 vim.g.loaded_netrwPlugin = 1 -- override stdpath locations, so that config is fully hermetic local orig_stdpath = vim.fn.stdpath vim.fn.stdpath = function(value) local config_path = orig_stdpath("config") if value == "config" then return config_path end if value == "data" then return config_path .. "/data" end if value == "cache" then return config_path .. "/cache" end if value == "state" then return config_path .. "/state" end return orig_stdpath(value) end -- package manager local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" if not (vim.uv or vim.loop).fs_stat(lazypath) then local lazyrepo = "https://github.com/folke/lazy.nvim.git" local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", -- latest stable release lazyrepo, lazypath, }) if vim.v.shell_error ~= 0 then vim.api.nvim_echo({ { "Failed to clone lazy.nvim:\n", "ErrorMsg" }, { out, "WarningMsg" }, { "\nPress any key to exit..." }, }, true, {}) vim.fn.getchar() os.exit(1) end end vim.opt.rtp:prepend(lazypath) -- set space key as a leader key, -- this has to be done before loading lazy.nvim vim.g.mapleader = ' ' vim.g.maplocalleader = ' ' require("lazy").setup({ spec = { -- color theme { "catppuccin/nvim", name = "catppuccin", -- make sure to load this during startup lazy = false, -- make sure to load this beofre all other plugins priority = 1000, config = function() vim.cmd.colorscheme("catppuccin-macchiato") end, }, "nvim-tree/nvim-tree.lua", "nvim-tree/nvim-web-devicons", "nvim-lualine/lualine.nvim", -- LSP { "mason-org/mason-lspconfig.nvim", opts = { ensure_installed = { "lua_ls", "rust_analyzer", "pyright", "clangd", }, }, dependencies = { { "mason-org/mason.nvim", opts = {} }, "neovim/nvim-lspconfig", } }, -- configure lua language server for nvim config file { "folke/lazydev.nvim", ft = "lua", -- only load for lua files opts = {}, }, -- venv selector for python { "linux-cultist/venv-selector.nvim", dependencies = { "neovim/nvim-lspconfig", { "nvim-telescope/telescope.nvim", branch = "0.1.x", dependencies = { "nvim-lua/plenary.nvim" } }, -- optional: you can also use fzf-lua, snacks, mini-pick instead. }, ft = "python", -- Load when opening Python files keys = { { ",v", "VenvSelect" }, -- Open picker on keymap }, opts = { -- this can be an empty lua table - just showing below for clarity. search = {}, -- if you add your own searches, they go here. options = {} -- if you add plugin options, they go here. }, }, -- Autocompletion -- TODO: look into github.com/ms-jpq/coq_nvim { 'hrsh7th/nvim-cmp', dependencies = { -- Snippet Engine & its associated nvim-cmp source 'L3MON4D3/LuaSnip', 'saadparwaiz1/cmp_luasnip', -- Adds LSP completion capabilities 'hrsh7th/cmp-nvim-lsp', -- Adds a number of user-friendly snippets 'rafamadriz/friendly-snippets', }, }, -- Useful plugin to show you pending keybinds. "folke/which-key.nvim", -- "gc" to comment visual regions/lines "numToStr/Comment.nvim", -- Fuzzy Finder (files, lsp, etc) { 'nvim-telescope/telescope.nvim', branch = '0.1.x', dependencies = { 'nvim-lua/plenary.nvim', -- Fuzzy Finder Algorithm which requires local dependencies to be built. -- Only load if `make` is available. Make sure you have the system -- requirements installed. { 'nvim-telescope/telescope-fzf-native.nvim', -- NOTE: If you are having trouble with this installation, -- refer to the README for telescope-fzf-native for more instructions. build = 'make', cond = function() return vim.fn.executable 'make' == 1 end, }, }, }, -- Highlight, edit, and navigate code { 'nvim-treesitter/nvim-treesitter', lazy = false, build = ':TSUpdate', }, -- Cut text without populating unnamed register { "gbprod/cutlass.nvim", opts = { cut_key = "x", } }, }, -- automatically check for plugin updates checker = { enabled = true }, }) -- copy to system clipboard by default vim.o.clipboard = "unnamedplus" vim.o.termguicolors = true vim.o.completeopt = "menuone,noselect" vim.opt.guifont = "Hack Nerd Font Mono:h12" vim.opt.number = true vim.opt.mouse = "" vim.opt.hlsearch = true vim.opt.tabstop = 2 vim.opt.shiftwidth = 2 require("lualine").setup({}) -- Configure Treesitter require('nvim-treesitter').install { 'haskell', 'c', 'cpp', 'go', 'glsl', 'lua', 'python', 'rust', 'tsx', 'typescript', 'javascript', 'vimdoc', 'vim', 'zig' } require("nvim-tree").setup({ view = { width = 30, }, on_attach = function (bufnr) local api = require "nvim-tree.api" --api.config.mappings.default_on_attach() api.map.on_attach.default(bufnr) vim.keymap.set("n", ".", api.tree.change_root_to_node, {noremap=true, silent=true, buffer=bufnr, nowait=true}) end, }) -- unmap space vim.api.nvim_set_keymap('n', '', '', {noremap=true, silent=true}) -- window operations with leader key vim.api.nvim_set_keymap("n", "w", "", {noremap=true, silent=true}) -- custom nvim tree mappings vim.api.nvim_set_keymap("n", "ft", ":NvimTreeToggle", {noremap=true, silent=true}) vim.api.nvim_set_keymap("n", "", ":NvimTreeFocus", {noremap=true, silent=true}) -- configure telescope -- See `:help telescope` and `:help telescope.setup()` require('telescope').setup { defaults = { mappings = { i = { [''] = false, [''] = false, }, }, }, } -- Enable telescope fzf native, if installed pcall(require('telescope').load_extension, 'fzf') -- See `:help telescope.builtin` vim.keymap.set('n', '?', require('telescope.builtin').oldfiles, { desc = '[?] Find recently opened files' }) vim.keymap.set('n', '', require('telescope.builtin').buffers, { desc = '[ ] Find existing buffers' }) vim.keymap.set('n', '/', function() -- You can pass additional configuration to telescope to change theme, layout, etc. require('telescope.builtin').current_buffer_fuzzy_find(require('telescope.themes').get_dropdown { winblend = 10, previewer = false, }) end, { desc = '[/] Fuzzily search in current buffer' }) -- vim.keymap.set('n', 'gf', require('telescope.builtin').git_files, { desc = 'Search [G]it [F]iles' }) vim.keymap.set('n', 'ff', require('telescope.builtin').find_files, { desc = '[S]earch [F]iles' }) -- vim.keymap.set('n', 'sh', require('telescope.builtin').help_tags, { desc = '[S]earch [H]elp' }) -- vim.keymap.set('n', 'sw', require('telescope.builtin').grep_string, { desc = '[S]earch current [W]ord' }) -- vim.keymap.set('n', 'sg', require('telescope.builtin').live_grep, { desc = '[S]earch by [G]rep' }) -- vim.keymap.set('n', 'sd', require('telescope.builtin').diagnostics, { desc = '[S]earch [D]iagnostics' }) -- Diagnostic keymaps vim.keymap.set('n', 'dp', function() vim.diagnostic.jump({count=-1, float=true}) end, { desc = 'Go to previous diagnostic message' }) vim.keymap.set('n', 'dn', function() vim.diagnostic.jump({count=1, float=true}) end, { desc = 'Go to next diagnostic message' }) vim.keymap.set('n', 'de', vim.diagnostic.open_float, { desc = 'Open floating diagnostic message' }) vim.keymap.set('n', 'dl', vim.diagnostic.setloclist, { desc = 'Open diagnostics list' }) -- nvim-cmp supports additional completion capabilities, so broadcast that to servers local capabilities = vim.lsp.protocol.make_client_capabilities() capabilities = require('cmp_nvim_lsp').default_capabilities(capabilities) -- Configure autocompletion nvim-cmp -- See `:help cmp` local cmp = require 'cmp' local luasnip = require 'luasnip' require('luasnip.loaders.from_vscode').lazy_load() luasnip.config.setup {} cmp.setup { snippet = { expand = function(args) luasnip.lsp_expand(args.body) end, }, mapping = cmp.mapping.preset.insert { [''] = cmp.mapping.select_next_item(), [''] = cmp.mapping.select_prev_item(), [''] = cmp.mapping.scroll_docs(-4), [''] = cmp.mapping.scroll_docs(4), [''] = cmp.mapping.complete {}, [''] = cmp.mapping.confirm { behavior = cmp.ConfirmBehavior.Replace, select = true, }, [''] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_next_item() elseif luasnip.expand_or_locally_jumpable() then luasnip.expand_or_jump() else fallback() end end, { 'i', 's' }), [''] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_prev_item() elseif luasnip.locally_jumpable(-1) then luasnip.jump(-1) else fallback() end end, { 'i', 's' }), }, sources = { { name = 'nvim_lsp' }, { name = 'luasnip' }, }, } -- Do not yank when pasting over selected text -- "x" - visual mode vim.keymap.set("x", "p", "P", { silent = true }) -- Auto format selected code vim.keymap.set("v", "f", function() local start_pos = vim.api.nvim_buf_get_mark(0, "<") local end_pos = vim.api.nvim_buf_get_mark(0, ">") vim.lsp.buf.format({ range = { ["start"] = { start_pos[1] - 1, start_pos[2] }, ["end"] = { end_pos[1] - 1, end_pos[2] }, }, }) end)