{ config, pkgs, lib, ... }: { options.neovim = { enable = lib.mkEnableOption "Enables neovim"; languages = { c.enable = lib.mkEnableOption "Enables c support"; go.enable = lib.mkEnableOption "Enables go support"; nix.enable = lib.mkEnableOption "Enables nix support"; rust.enable = lib.mkEnableOption "Enables rust support"; typescript.enable = lib.mkEnableOption "Enables typescript support"; }; themes = { catppuccin.enable = lib.mkEnableOption "Enables catppuccin theme"; }; plugins = { comments.enable = lib.mkOption { default = true; }; fugitive.enable = lib.mkOption { default = true; }; lualine.enable = lib.mkOption { default = true; }; luasnip.enable = lib.mkOption { default = false; }; nvimcmp.enable = lib.mkOption { default = true; }; telescope = { enable = lib.mkOption { default = true; }; fzf.enable = lib.mkOption { default = true; }; }; treesitter.enable = lib.mkOption { default = true; }; wiki.enable = lib.mkOption { default = false; }; }; }; config = lib.mkIf config.neovim.enable { home.sessionVariables = { EDITOR = "nvim"; VISUAL = "nvim"; }; programs.nixvim = { enable = true; viAlias = true; vimAlias = true; vimdiffAlias = true; globals = { mapleader = " "; maplocalleader = " "; rust_recommended_style = 0; }; options = { list = true; updatetime = 750; tabstop = 2; softtabstop = 0; shiftwidth = 2; smarttab = true; expandtab = true; colorcolumn = "81"; showmatch = true; number = true; relativenumber = true; swapfile = false; backup = false; undofile = true; undodir = "${config.xdg.configHome}/nvim/undodir"; smartcase = true; }; keymaps = [ { key = "d"; mode = "n"; action = "vim.diagnostic.open_float()"; } # -- Easy Split Navigation # -- nnoremap # -- nnoremap # -- nnoremap # -- nnoremap # # -- Easy copy and pasting to external programs # -- map "+yy # -- map "+P ]; }; programs.nixvim.colorschemes = with config.neovim.themes; { catppuccin = lib.mkIf catppuccin.enable { enable = true; flavour = "mocha"; integrations.vimwiki = lib.mkIf wiki.enable true; } }; programs.nixvim.plugins = with config.neovim.plugins; { comment.enable = comments.enable; fugitive.enable = fugitive.enable; lualine = lib.mkIf lualine.enable { enable = true; icons_enabled = true; }; web-devicons.enable = lualine.enable; luasnip.enable = luasnip.enable; friendly-snippets.enable = luasnip.enable; cmp = { enable = nvimcmp.enable; autoEnableSources = true; settings.sources = [ { name = "nvim_lsp"; } { name = "path"; } { name = "buffer"; } ] + lib.options luasnip.enable { name = "cmp-luasnip" }; mapping = { "" = "cmp.mapping.complete {}"; "" = "cmp.mapping.confirm { behavior = cmp.ConfirmBehavior.Replace, select = true, }"; "" = { actions = '' function(fallback) if cmp.visible() then cmp.select_next_item() '' + lib.optionalString luasnip.enable '' elseif luasnip.expand_or_locally_jumpable() then luasnip.expand_or_jump() '' + '' else fallback() end end ''; modes = [ "i" "s" ]; }; "" = { actions = '' function(fallback) if cmp.visible() then cmp.select_prev_item() '' + lib.optionalString luasnip.enable '' elseif luasnip.locally_jumpable(-1) then luasnip.jump(-1) '' + '' else fallback() end end ''; modes = [ "i" "s" ]; }; }; }; telescope = { enable = telescope.enable; keymaps = [ { key = "ff"; action = "find_files"; } { key = "fg"; action = "git_files"; } ]; extensions = { fzf = lib.mkIf telescope.fzf.enable { enable = true; fuzzy = true; override_generic_sorter = true; override_file_sorter = true; case_mode = "smart_case"; }; }; }; treesitter = { enable = treesiter.enable; highlight.enable = true; indent.enable = true; folding.enable = true; }; vimwiki = { enable = wiki.enable; list = [ { path = "${config.xdg.userDirs.documents}/wiki"; links_space_char = "_"; ext = ".md"; syntax = "markdown"; } ]; }; }; programs.nixvim.plugins.nvim-lspconfig.enable = true; programs.nixvim.plugins = with config.neovim.languages; { nix.enable = nix.enable; rustaceanvim.enable = rust.enable; typsecript-tools.enable = typescript.enable; }; programs.nixvim.lsp = { enable = true; servers = with config.neovim.languages; { clangd.enable = c.enable; gopls.enable = go.enable; nil_ls.enable = nix.enable; rust_analyzer.enable = rust.enable; tsserver.enable = typescript.enable; }; keymaps = [ { key = "gd"; lspBufAction = "definition"; } { key = "gD"; lspBufAction = "declaration"; } { key = "gi"; lspBufAction = "implementation"; } { key = "gt"; lspBufAction = "type_definition"; } { key = "K"; lspBufAction = "hover"; } ] + lib.options config.neovim.plugins.telescope.enable { key = "gr"; action = lib.nixvim.mkRaw "require('telescope.builtin').lsp_references"; }; }; }; }