From be5e044f8307ea127ac46fa5d6ed3493c3a7bd40 Mon Sep 17 00:00:00 2001
From: sloane <git@sloanelybutsurely.com>
Date: Thu, 20 Feb 2025 15:46:57 -0500
Subject: [PATCH] fix cmp bindings, format on save

---
 home-manager/nixvim/default.nix | 121 ++++++++++++++++++--------------
 1 file changed, 68 insertions(+), 53 deletions(-)

diff --git a/home-manager/nixvim/default.nix b/home-manager/nixvim/default.nix
index 8d8d41a..2b17f21 100644
--- a/home-manager/nixvim/default.nix
+++ b/home-manager/nixvim/default.nix
@@ -1,11 +1,8 @@
-{ pkgs, ... }:
-{
+{ pkgs, ... }: {
   programs.nixvim = {
     enable = true;
 
-    globals = {
-      mapleader = " ";
-    };
+    globals = { mapleader = " "; };
 
     opts = {
       number = true;
@@ -21,105 +18,110 @@
       {
         key = ";";
         action = ":";
-        mode = ["n" "v"];
+        mode = [ "n" "v" ];
       }
       {
         key = "q;";
         action = "q:";
-        mode = ["n" "v"];
+        mode = [ "n" "v" ];
       }
       {
         key = "<leader>y";
         action = ''"+y'';
-        mode = ["n" "v"];
+        mode = [ "n" "v" ];
       }
       {
         key = "<leader>Y";
         action = ''"+Y'';
-        mode = ["n" "v"];
+        mode = [ "n" "v" ];
       }
       {
         key = "<leader>p";
         action = ''"+p'';
-        mode = ["n" "v"];
+        mode = [ "n" "v" ];
       }
       {
         key = "<leader>P";
         action = ''"+P'';
-        mode = ["n" "v"];
+        mode = [ "n" "v" ];
       }
       {
         key = "<leader>w";
         action = "<cmd>w<cr>";
-        mode = ["n"];
+        mode = [ "n" ];
       }
       {
         key = "<leader>q";
         action = "<cmd>q<cr>";
-        mode = ["n"];
+        mode = [ "n" ];
       }
       {
         key = "<esc>";
         action = "<cmd>nohlsearch<cr>";
-        mode = ["n"];
+        mode = [ "n" ];
       }
       {
         key = ''<leader>"'';
         action = "<cmd>split<cr>";
-        mode = ["n"];
+        mode = [ "n" ];
       }
       {
         key = "<leader>%";
         action = "<cmd>vsplit<cr>";
-        mode = ["n"];
+        mode = [ "n" ];
       }
       {
         key = "<leader><tab>";
         action = "<cmd>NERDTreeToggle<cr>";
-        mode = ["n"];
+        mode = [ "n" ];
       }
       {
         key = "<leader>fl";
         action = "<cmd>NERDTreeFind<cr>";
-        mode = ["n"];
+        mode = [ "n" ];
       }
       {
         key = "<leader><space>";
         action = "<cmd>Telescope find_files theme=dropdown<cr>";
-        mode = ["n"];
+        mode = [ "n" ];
       }
       {
         key = "<leader>/";
         action = "<cmd>Telescope live_grep<cr>";
-        mode = ["n"];
+        mode = [ "n" ];
       }
       {
         key = "<C-h>";
         action = "<cmd>ZellijNavigateLeft<cr>";
-        mode = ["n"];
+        mode = [ "n" ];
       }
       {
         key = "<C-j>";
         action = "<cmd>ZellijNavigateDown<cr>";
-        mode = ["n"];
+        mode = [ "n" ];
       }
       {
         key = "<C-k>";
         action = "<cmd>ZellijNavigateUp<cr>";
-        mode = ["n"];
+        mode = [ "n" ];
       }
       {
         key = "<C-l>";
         action = "<cmd>ZellijNavigateRight<cr>";
-        mode = ["n"];
+        mode = [ "n" ];
       }
     ];
 
-    extraPlugins = with pkgs.vimPlugins; [
-      vim-abolish
-      nerdtree
-      vim-rhubarb
-    ];
+    autoGroups = { format_on_save = { clear = true; }; };
+
+    autoCmd = [{
+      event = "BufWritePre";
+      group = "format_on_save";
+      pattern = "*";
+      command = "lua vim.lsp.buf.format()";
+    }];
+
+    extraPlugins = with pkgs.vimPlugins; [ vim-abolish nerdtree vim-rhubarb ];
 
     plugins.commentary.enable = true;
     plugins.repeat.enable = true;
@@ -162,6 +164,21 @@
         tailwindcss.enable = true;
         terraform_lsp.enable = true;
       };
+      keymaps.lspBuf = {
+        gd = "definition";
+        gi = "implementation";
+        gr = "references";
+      };
+    };
+
+    plugins.none-ls = {
+      enable = true;
+      sources.formatting = {
+        mix.enable = true;
+        nixfmt.enable = true;
+        prettier.enable = true;
+        stylua.enable = true;
+      };
     };
 
     plugins.telescope.enable = true;
@@ -172,42 +189,40 @@
       settings = {
         sources = [
           { name = "nvim_lsp"; }
-          { name = "snippy"; }
+          { name = "luasnip"; }
           { name = "path"; }
           { name = "buffer"; }
         ];
-        mappings = {
-          "<C-n>" = ''
-            function(fallback) do
-              if cmp.visible() then
-                cmp.select_next_item({ behavior = cmp.SelectBehavior.Insert })
-              else
-                fallback()
-              end
-            end
-          '';
-          "<C-p>" = ''
-            function(fallback) do
-              if cmp.visible() then
-                cmp.select_prev_item({ behavior = cmp.SelectBehavior.Insert })
-              else
-                fallback()
-              end
-            end
-          '';
-          "<CR>" = ''
-            function(fallback)
+        mapping = {
+          "<C-n>" = "cmp.mapping(cmp.mapping.select_next_item(), {'i', 's'})";
+          "<C-p>" = "cmp.mapping(cmp.mapping.select_prev_item(), {'i', 's'})";
+          "<Tab>" = ''
+            cmp.mapping(function(fallback)
+              local luasnip = require('luasnip')
               if cmp.visible() then
                 cmp.confirm({ select = true })
+              elseif luasnip.expand_or_locally_jumpable() then
+                luasnip.expand_or_jump()
               else
                 fallback()
               end
-            end
+            end, {'i', 's'})
           '';
+          "<S-Tab>" = ''
+            cmp.mapping(function(fallback)
+              local luasnip = require('luasnip')
+              if luasnip.locally_jumpable(-1) then
+                luasnip.jump(-1)
+              else
+                fallback()
+              end
+            end, {'i', 's'})
+          '';
+          "<CR>" = "cmp.mapping.confirm({ select = true })";
         };
         snippet.expand = ''
           function(args)
-            require('snippy').expand_snippet(args.body)
+            require('luasnip').lsp_expand(args.body)
           end
         '';
       };