-- disable netrw for nvim-tree plugin vim.g.loaded_netrw = 1 vim.g.loaded_netrwPlugin = 1 -- 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 = { "nvim-tree/nvim-tree.lua", "nvim-tree/nvim-web-devicons", "nvim-lualine/lualine.nvim", -- 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, }, -- 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 = {}, }, -- 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', dependencies = { 'nvim-treesitter/nvim-treesitter-textobjects', }, 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({}) require("nvim-tree").setup({ view = { width = 30, }, on_attach = function (bufnr) local api = require "nvim-tree.api" api.config.mappings.default_on_attach(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' }) -- Configure Treesitter -- See `:help nvim-treesitter` require('nvim-treesitter.configs').setup { modules = {}, -- Add languages to be installed here that you want installed for treesitter ensure_installed = {'haskell', 'c', 'cpp', 'go', 'glsl', 'lua', 'python', 'rust', 'tsx', 'typescript', 'vimdoc', 'vim' }, -- Install parsers synchronously (only applied to `ensure_installed`) sync_install = false, -- Autoinstall languages that are not installed. Defaults to false (but you can change for yourself!) auto_install = true, -- List of parsers to ignore installing (or "all") ignore_install = {}, highlight = { enable = true }, indent = { enable = true }, incremental_selection = { enable = true, keymaps = { init_selection = '', node_incremental = '', scope_incremental = '', node_decremental = '', }, }, textobjects = { select = { enable = true, lookahead = true, -- Automatically jump forward to textobj, similar to targets.vim keymaps = { -- You can use the capture groups defined in textobjects.scm ['aa'] = '@parameter.outer', ['ia'] = '@parameter.inner', ['af'] = '@function.outer', ['if'] = '@function.inner', ['ac'] = '@class.outer', ['ic'] = '@class.inner', }, }, move = { enable = true, set_jumps = true, -- whether to set jumps in the jumplist goto_next_start = { [']m'] = '@function.outer', [']]'] = '@class.outer', }, goto_next_end = { [']M'] = '@function.outer', [']['] = '@class.outer', }, goto_previous_start = { ['[m'] = '@function.outer', ['[['] = '@class.outer', }, goto_previous_end = { ['[M'] = '@function.outer', ['[]'] = '@class.outer', }, }, swap = { enable = true, swap_next = { ['a'] = '@parameter.inner', }, swap_previous = { ['A'] = '@parameter.inner', }, }, }, } -- 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 })