| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348 |
- -- 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", "<cmd>VenvSelect<cr>" }, -- 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 = "<Leader>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', '<Space>', '', {noremap=true, silent=true})
- -- window operations with leader key
- vim.api.nvim_set_keymap("n", "<Leader>w", "<C-w>", {noremap=true, silent=true})
- -- custom nvim tree mappings
- vim.api.nvim_set_keymap("n", "<Leader>ft", ":NvimTreeToggle<CR>", {noremap=true, silent=true})
- vim.api.nvim_set_keymap("n", "<BS>", ":NvimTreeFocus<CR>", {noremap=true, silent=true})
- -- configure telescope
- -- See `:help telescope` and `:help telescope.setup()`
- require('telescope').setup {
- defaults = {
- mappings = {
- i = {
- ['<C-u>'] = false,
- ['<C-d>'] = false,
- },
- },
- },
- }
- -- Enable telescope fzf native, if installed
- pcall(require('telescope').load_extension, 'fzf')
- -- See `:help telescope.builtin`
- vim.keymap.set('n', '<leader>?', require('telescope.builtin').oldfiles, { desc = '[?] Find recently opened files' })
- vim.keymap.set('n', '<leader><space>', require('telescope.builtin').buffers, { desc = '[ ] Find existing buffers' })
- vim.keymap.set('n', '<leader>/', 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', '<leader>gf', require('telescope.builtin').git_files, { desc = 'Search [G]it [F]iles' })
- vim.keymap.set('n', '<leader>ff', require('telescope.builtin').find_files, { desc = '[S]earch [F]iles' })
- -- vim.keymap.set('n', '<leader>sh', require('telescope.builtin').help_tags, { desc = '[S]earch [H]elp' })
- -- vim.keymap.set('n', '<leader>sw', require('telescope.builtin').grep_string, { desc = '[S]earch current [W]ord' })
- -- vim.keymap.set('n', '<leader>sg', require('telescope.builtin').live_grep, { desc = '[S]earch by [G]rep' })
- -- vim.keymap.set('n', '<leader>sd', require('telescope.builtin').diagnostics, { desc = '[S]earch [D]iagnostics' })
- -- Diagnostic keymaps
- vim.keymap.set('n', '<Leader>dp',
- function() vim.diagnostic.jump({count=-1, float=true}) end,
- { desc = 'Go to previous diagnostic message' })
- vim.keymap.set('n', '<Leader>dn',
- function() vim.diagnostic.jump({count=1, float=true}) end,
- { desc = 'Go to next diagnostic message' })
- vim.keymap.set('n', '<Leader>de', vim.diagnostic.open_float,
- { desc = 'Open floating diagnostic message' })
- vim.keymap.set('n', '<Leader>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 {
- ['<C-n>'] = cmp.mapping.select_next_item(),
- ['<C-p>'] = cmp.mapping.select_prev_item(),
- ['<C-d>'] = cmp.mapping.scroll_docs(-4),
- ['<C-f>'] = cmp.mapping.scroll_docs(4),
- ['<C-Space>'] = cmp.mapping.complete {},
- ['<CR>'] = cmp.mapping.confirm {
- behavior = cmp.ConfirmBehavior.Replace,
- select = true,
- },
- ['<Tab>'] = 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' }),
- ['<S-Tab>'] = 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", "<leader>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)
|