{ inputs, pkgs, config, lib, theme, ... }: { imports = [ inputs.nixvim.homeManagerModules.nixvim ] ++ lib.optional (builtins.isString theme) ../../../../stylix/${theme}/home-manager/nixvim.nix; # https://github.com/nix-community/nixvim # Docs: # https://nix-community.github.io/nixvim/ programs.nixvim = { enable = true; viAlias = true; vimAlias = true; globals.mapleader = " "; globals.maplocalleader = " "; keymaps = let map = mode: key: action: { mode = mode; key = key; action = action; }; nmap = key: action: map [ "n" ] key action; nvmap = key: action: map [ "n" "v" ] key action; imap = key: action: map [ "i" ] key action; desc = d: { options.desc = d; }; silent = { options.silent = true; }; expr = { options.expr = true; }; in [ # Unmap keys that aren't useful, or that we want to use for different things (nvmap "" "" // silent) (nvmap "" "" // silent) (nvmap "s" "" // silent) # Redo (nmap "R" "") # Copy and paste (nvmap "y" "\"+y" // desc "Cop[y] to clipboard") (nvmap "p" "\"+p" // desc "[P]aste from clipboard") # Jump to start/end of line (nvmap "H" "0") (nvmap "L" "$") # Navigate up and down word wrapped text as if it were not word wrapped (nmap "k" "v:count == 0 ? 'gk' : 'k'" // silent // expr) (nmap "j" "v:count == 0 ? 'gj' : 'j'" // silent // expr) # Center cursor when jumping foward or back (nmap "" "zz") (nmap "" "zz") # Insert Mode # Normal Mode # NVimTree (nmap "n" "" // desc "[N]vimTree") (nmap "nf" ":NvimTreeFocus" // desc "[F]ocus NvimTree") (nmap "nt" ":NvimTreeToggle" // desc "[T]oggle NvimTree") (nmap "ns" ":NvimTreeFindFile" // desc "[S]earch NvimTree") (nmap "nc" ":NvimTreeClose" // desc "[C]lose NvimTree") # ToggleTerm (nmap "t" "" // desc "[T]oggleTerm") (nmap "tt" ":ToggleTerm" // desc "[T]oggle Terminal") # Fugitive (nmap "gc" ":Git commit -a" // desc "[C]ommit" ) (nmap "gp" ":Git push" // desc "Git [p]ush") (nmap "gP" ":Git pull" // desc "[P]ull") # Window Management (nmap "wh" ":wincmd h" // desc "Move left") (nmap "wl" ":wincmd l" // desc "Move right") (nmap "wj" ":wincmd j" // desc "Move down") (nmap "wk" ":wincmd k" // desc "Move up") (nmap "wn" ":wincmd w" // desc "Move to next") (nmap "wN" ":wincmd p" // desc "Move to previous") (nmap "wc" ":wincmd c" // desc "[C]lose active window") (nmap "woh" ":wincmd n" // desc "Open [H]orizontal window") (nmap "wov" ":wincmd v" // desc "Open [V]ertical window") # resize window (nmap "wrh" ":resize " // desc "Resize Horizontal") (nmap "wrv" ":vertical resize " // desc "Resize Vertical") # Buffer Management (nmap "bn" ":bnext" // desc "Next buffer") (nmap "bN" ":bNext" // desc "Previous buffer") (nmap "bc" ":bdelete" // desc "[c]lose buffer") ]; options = { number = true; shiftwidth = 2; breakindent = true; colorcolumn = "100"; showmode = false; }; plugins = { # Parser generator tool treesitter.enable = true; # Snippet engine for neovim luasnip.enable = true; # winbar that uses nvim-navic in order to get LSP context from your language server. barbecue.enable = true; # Nix language syntax highlighting / file type associations nix.enable = true; # Run nix develop / shell without exiting vim nix-develop.enable = true; # tab bar like Firefox or Chrome bufferline.enable = true; # Automatic indent intellitab.enable = true; # Highlight all entries of the currently selected word illuminate.enable = true; # sidebar file browser nvim-tree.enable = true; # Gutter information for git modifications gitsigns.enable = true; # Terminal in vim toggleterm.enable = true; # Rainbow matching {} [] () 's rainbow-delimiters.enable = true; # Colorize hex colors inline nvim-colorizer.enable = true; # git plugin for vim fugitive.enable = true; # Popup to show shortcuts which-key = { enable = true; registrations = { "b" = "Manage buffers..."; "c" = "Colorscheme..."; "g" = "Git Options..."; "l" = "LSP Options..."; "n" = "NvimTree..."; "t" = "ToggleTerm..."; "w" = "Manage Windows..."; "wo" = "Open New..."; "wr" = "Resize..."; }; }; # Airline / Powerline alternative lualine = { enable = true; componentSeparators = { left = "|"; right = "|"; }; }; telescope = { enable = true; extensions.fzf-native.enable = true; keymaps = { "" = { action = "find_files"; desc = "Search files by name"; }; "s" = { action = "live_grep"; desc = "Search by live grep"; }; "bl" = { action = "buffers"; desc = "[L]list open [B]uffers"; }; "h" = { action = "help_tags"; desc = "Search [H]elp"; }; "W" = { action = "grep_string"; desc = "Search for [W]ord under cursor"; }; "gs" = { action = "git_status"; desc = "Search [G]it [S]tatus"; }; "gl" = { action = "git_commits"; desc = "View [G]it [L]ogs"; }; "r" = { action = "oldfiles"; desc = "Search [R]ecently opened files by name"; }; "cs" = { action = "colorscheme"; desc = "Change [C]olor[s]cheme"; }; }; }; nvim-cmp = { enable = true; autoEnableSources = true; mapping = { "" = "cmp.mapping.complete()"; "" = "cmp.mapping.scroll_docs(-4)"; "" = "cmp.mapping.close()"; "" = "cmp.mapping.scroll_docs(4)"; "" = "cmp.mapping.confirm({ select = true })"; "" = { action = "cmp.mapping.select_prev_item()"; modes = [ "i" "s" ]; }; "" = { action = "cmp.mapping.select_next_item()"; modes = [ "i" "s" ]; }; }; sources = [ { name = "nvim_lua"; } { name = "nvim_lsp"; } { name = "path"; } { name = "buffer"; } ]; }; }; colorschemes = { tokyonight.enable = true; gruvbox.enable = true; catppuccin.enable = true; dracula.enable = true; oxocarbon.enable = true; }; extraPlugins = with pkgs.vimPlugins; [ everforest onehalf rose-pine ]; }; }