{ lib, pkgs, opts, ... }: { # Import all your configuration modules here imports = [ ./bufferline.nix ]; extraPackages = with pkgs; [ coreutils lldb_18 ]; plugins = { lualine.enable = true; luasnip.enable = true; barbar.enable = true; nvim-tree.enable = true; noice.enable = true; mini.enable = true; notify.enable = true; telescope.enable = true; treesitter = { enable = true; settings = { highlight.enable = true; grammarPackages = pkgs.vimPlugins.nvim-treesitter.passthru.allGrammars ++ [ pkgs.vimPlugins.nvim-treesitter-parsers.glsl ]; }; }; render-markdown.enable = true; web-devicons.enable = true; cmp-nvim-lsp.enable = true; lsp = { enable = true; servers = { #js/typescript ts_ls.enable = true; #c/c++ ccls.enable = true; #nix nil_ls.enable = true; #python pyright.enable = true; #bash bashls.enable = true; #css cssls.enable = true; #glsl glsl_analyzer.enable = true; }; keymaps = { # Diagnostic keymaps diagnostic = { "q" = { #mode = "n"; action = "setloclist"; desc = "Open diagnostic [Q]uickfix list"; }; }; extra = [ # Jump to the definition of the word under your cusor. # This is where a variable was first declared, or where a function is defined, etc. # To jump back, press . { mode = "n"; key = "gd"; action.__raw = "require('telescope.builtin').lsp_definitions"; options = { desc = "LSP: [G]oto [D]efinition"; }; } # Find references for the word under your cursor. { mode = "n"; key = "gr"; action.__raw = "require('telescope.builtin').lsp_references"; options = { desc = "LSP: [G]oto [R]eferences"; }; } # Jump to the implementation of the word under your cursor. # Useful when your language has ways of declaring types without an actual implementation. { mode = "n"; key = "gI"; action.__raw = "require('telescope.builtin').lsp_implementations"; options = { desc = "LSP: [G]oto [I]mplementation"; }; } # Jump to the type of the word under your cursor. # Useful when you're not sure what type a variable is and you want to see # the definition of its *type*, not where it was *defined*. { mode = "n"; key = "D"; action.__raw = "require('telescope.builtin').lsp_type_definitions"; options = { desc = "LSP: Type [D]efinition"; }; } # Fuzzy find all the symbols in your current document. # Symbols are things like variables, functions, types, etc. { mode = "n"; key = "ds"; action.__raw = "require('telescope.builtin').lsp_document_symbols"; options = { desc = "LSP: [D]ocument [S]ymbols"; }; } # Fuzzy find all the symbols in your current workspace. # Similar to document symbols, except searches over your entire project. { mode = "n"; key = "ws"; action.__raw = "require('telescope.builtin').lsp_dynamic_workspace_symbols"; options = { desc = "LSP: [W]orkspace [S]ymbols"; }; } ]; lspBuf = { # Rename the variable under your cursor. # Most Language Servers support renaming across files, etc. "rn" = { action = "rename"; desc = "LSP: [R]e[n]ame"; }; # Execute a code action, usually your cursor needs to be on top of an error # or a suggestion from your LSP for this to activate. "ca" = { #mode = "n"; action = "code_action"; desc = "LSP: [C]ode [A]ction"; }; # WARN: This is not Goto Definition, this is Goto Declaration. # For example, in C this would take you to the header. "gD" = { action = "declaration"; desc = "LSP: [G]oto [D]eclaration"; }; }; }; }; #dap-ui.enable = true; #dap-virtual-text.enable = true; dap = { enable = true; adapters = { executables = { lldb = { command = lib.getExe' pkgs.lldb "lldb-vscode"; }; }; servers = { codelldb = { port = 13000; executable = { command = "${pkgs.vscode-extensions.vadimcn.vscode-lldb}/share/vscode/extensions/vadimcn.vscode-lldb/adapter/codelldb"; args = [ "--port" "13000" ]; }; }; }; }; configurations = let codelldb-config = { name = "Launch (CodeLLDB)"; type = "codelldb"; request = "launch"; program.__raw = '' function() return vim.fn.input("Path to executable: ", vim.fn.getcwd() .. '/', "file") end ''; cwd = ''''${workspaceFolder}''; stopOnEntry = false; }; lldb-config = { name = "Launch (LLDB)"; type = "lldb"; request = "launch"; program.__raw = '' function() return vim.fn.input("Path to executable: ", vim.fn.getcwd() .. '/', "file") end''; cwd = ''''${workspaceFolder}''; stopOnEntry = false; }; in { c = [ lldb-config ]; cpp = [ lldb-config ] ++ lib.optionals pkgs.stdenv.isLinux [ codelldb-config ]; rust = [ lldb-config ] ++ lib.optionals pkgs.stdenv.isLinux [ codelldb-config ]; }; extensions = { # Creates a beautiful debugger UI dap-ui = { enable = true; # Set icons to characters that are more likely to work in every terminal. # Feel free to remove or use ones that you like more! :) # Don't feel like these are good choices. icons = { expanded = "▾"; collapsed = "▸"; current_frame = "*"; }; controls = { icons = { pause = "⏸"; play = "▶"; step_into = "⏎"; step_over = "⏭"; step_out = "⏮"; step_back = "b"; run_last = "▶▶"; terminate = "⏹"; disconnect = "⏏"; }; }; }; dap-virtual-text.enable = true; # Add debuggers here? dap-python = { enable = true; }; }; }; dap-lldb = { enable = true; settings.codelldb_path = "${pkgs.vscode-extensions.vadimcn.vscode-lldb}/share/vscode/extensions/vadimcn.vscode-lldb/adapter/codelldb"; }; cmp = { enable = true; autoEnableSources = true; settings = { sources = [ { name = "nvim_lsp"; } { name = "path"; } { name = "buffer"; } { name = "luasnip"; } # { name = "cmdline"; } ]; completion = { completeopt = "menu,menuone,noinsert"; }; mapping = { "" = "cmp.mapping.select_next_item()"; "" = "cmp.mapping.select_prev_item()"; "" = "cmp.mapping.confirm({ select = true })"; "" = "cmp.mapping.complete()"; "" = "cmp.mapping.abort()"; "" = "cmp.mapping.scroll_docs(-4)"; "" = "cmp.mapping.scroll_docs(4)"; }; snippet.expand = '' function(args) require("luasnip").lsp_expand(args.body) end ''; }; }; }; globals = { mapleader = " "; maplocalleader = " "; }; opts = { nu = true; rnu = true; scrolloff = 12; tabstop = 4; softtabstop = 4; shiftwidth = 4; expandtab = true; smartindent = true; wrap = false; hlsearch = false; incsearch = true; }; keymaps = [ { mode = "n"; key = "ff"; action = "Telescope find_files hidden=true"; } { mode = "n"; key = "fc"; action = "Telescope treesitter"; } { mode = "n"; key = "t"; action = "NvimTreeToggle"; } { mode = "n"; key = ""; action = "BufferNext"; } { mode = "n"; key = ""; action = "BufferPrevious"; } { mode = "n"; key = ""; action = "wincmd h"; } { mode = "n"; key = ""; action = "wincmd j"; } { mode = "n"; key = ""; action = "wincmd k"; } { mode = "n"; key = ""; action = "wincmd l"; } { mode = "n"; key = "Q"; action = ""; } { mode = "v"; key = "J"; action = ":m '>+1gv=gv"; } { mode = "v"; key = "K"; action = ":m '<-2gv=gv"; } { mode = "n"; key = "y"; action = "\"+y"; } { mode = "v"; key = "y"; action = "\"+y"; } { mode = "n"; key = "s"; action = ":%s/\\<\\>//gI"; } ]; extraConfigLua = '' vim.filetype.add({ pattern = { [".*/hypr/.*%.conf"] = "hyprlang" }, }) ''; extraPlugins = with pkgs.vimPlugins; [ pywal-nvim tokyonight-nvim llm-nvim nvim-lspconfig nvim-treesitter-parsers.glsl ]; colorscheme = if opts.pywal then "pywal" else "tokyonight-storm"; }