{ config, pkgs, lib, ... }: let cfg = config.programs.v.nvim; nvim-nio = pkgs.vimUtils.buildVimPlugin { name = "nvim-nio"; src = pkgs.fetchFromGitHub { owner = "nvim-neotest"; repo = "nvim-nio"; rev = "refs/tags/v1.8.0"; sha256 = "sha256-RFmH+683vrg4BELwtAQqjV8oGkvRgzcd6kd5r1s3Jp8="; }; }; in with lib; { options.programs.v.nvim = { enable = mkEnableOption "nvim"; }; config = mkIf cfg.enable { home.packages = with pkgs; [ fd ]; home.file.".config/nvim/lua".source = ./lua; programs.nixvim = {helpers, ...}: { enable = true; package = pkgs.neovim-unwrapped; vimAlias = true; luaLoader.enable = true; globals.mapleader = " "; opts = { number = true; conceallevel = 2; expandtab = true; tabstop = 2; shiftwidth = 2; smartindent = true; }; clipboard.providers.wl-copy.enable = true; keymaps = with helpers; [ # General { mode = "n"; key = ""; action = ":noh"; } # Telescope { mode = "n"; key = "ff"; action = ":Telescope find_files"; } { mode = "n"; key = "fs"; action = ":Telescope file_browser"; } { mode = "n"; key = "fg"; action = mkRaw "require('telescope.builtin').live_grep"; } { mode = "n"; key = "fb"; action = ":Telescope buffers"; } { mode = "n"; key = "fo"; action = ":Telescope oldfiles"; } { mode = "n"; key = "fr"; action = ":Telescope frecency"; } { mode = "n"; key = "ob"; action = mkRaw "require('obsidian_picker').obsidian_picker"; } # Commenting { mode = "n"; key = ""; action = mkRaw "require('Comment.api').toggle.linewise.current"; } { mode = "x"; key = ""; action = mkRaw '' function() local esc = vim.api.nvim_replace_termcodes( '', true, false, true ) vim.api.nvim_feedkeys(esc, 'nx', false) require('Comment.api').toggle.linewise(vim.fn.visualmode()) end ''; } # Float Term { mode = "n"; key = "t"; action = ":FloatermToggle myfloat"; } { mode = "t"; key = ""; action = mkRaw "function() vim.cmd(':FloatermToggle myfloat') end"; } # Switch buffers { mode = "n"; key = "q"; action = ":bd"; # Delete buffer } { mode = "n"; key = "s"; action = ":bn"; # Buffer next } { mode = "n"; key = "a"; action = ":bp"; # Buffer previous } # Change Indenting { mode = "n"; key = ""; action = "<<_"; } { mode = "n"; key = ""; action = ">>_"; } { mode = "v"; key = ""; action = ">gv"; } { mode = "v"; key = ""; action = "j" = "goto_next"; "k" = "goto_prev"; }; }; servers = { cssls.enable = true; nil_ls.enable = true; #NixOS dockerls.enable = true; rust_analyzer = { enable = true; installCargo = false; installRustc = false; }; pyright.enable = true; pylsp = { enable = true; settings.plugins = { black = { enabled = true; cache_config = true; }; pycodestyle = { maxLineLength = 100; }; }; }; elixirls.enable = true; clangd.enable = true; yamlls.enable = true; lua_ls.enable = true; }; }; trouble.enable = true; lspkind.enable = true; lspsaga = { enable = true; lightbulb.enable = false; }; nvim-lightbulb = { enable = true; settings = { autocmd.enabled = true; number.enabled = true; }; }; vimtex.enable = true; floaterm.enable = true; cmp = { enable = true; autoEnableSources = true; settings = { cmdline.":".sources = [ { name = "path"; } ]; snippet.expand = "function(args) require('luasnip').lsp_expand(args.body) end"; mapping = { "" = "cmp.mapping(cmp.mapping.select_prev_item(), {'i', 's'})"; "" = "cmp.mapping(cmp.mapping.select_next_item(), {'i', 's'})"; "" = "cmp.mapping.confirm({ select = true })"; "" = "cmp.mapping.complete()"; "" = "cmp.mapping.close()"; }; sources = [ { name = "nvim_lsp_signature_help"; } { name = "path"; } { name = "nvim_lsp"; } { name = "luasnip"; } { name = "buffer"; # Words from other open buffers can also be suggested. option.get_bufnrs.__raw = "vim.api.nvim_list_bufs"; } ]; }; }; }; }; }; }