summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--npins/sources.json16
m---------private0
-rw-r--r--system/linde.nix7
-rw-r--r--user/marvin.nix1
-rw-r--r--user/modules/tabnine.nix8
-rw-r--r--user/nvim/init.lua219
-rw-r--r--user/settings/development/base.nix10
-rw-r--r--user/settings/development/golang.nix7
-rw-r--r--user/settings/development/web.nix13
-rw-r--r--user/settings/development/zig.nix7
-rw-r--r--user/settings/neovim.nix143
-rw-r--r--user/settings/nix.nix7
-rw-r--r--user/settings/user-interface.nix35
13 files changed, 166 insertions, 307 deletions
diff --git a/npins/sources.json b/npins/sources.json
index 78fc35fd..4c6f4e3f 100644
--- a/npins/sources.json
+++ b/npins/sources.json
@@ -93,6 +93,18 @@
       "url": "https://releases.nixos.org/nixos/unstable/nixos-25.05beta770807.a84ebe20c6bc/nixexprs.tar.xz",
       "hash": "1nnncvsn1xszaav09ldn99kb0fnb7yhmszbsagb56q3p6w62qhir"
     },
+    "nixvim": {
+      "type": "Git",
+      "repository": {
+        "type": "GitHub",
+        "owner": "nix-community",
+        "repo": "nixvim"
+      },
+      "branch": "main",
+      "revision": "6b95b825529aa2d8536f7684fe64382ef4d15d84",
+      "url": "https://github.com/nix-community/nixvim/archive/6b95b825529aa2d8536f7684fe64382ef4d15d84.tar.gz",
+      "hash": "0bx1rrkkryhkgpfj5phgsa3gwvayzlfdwb1h2zvr4dhsxgj7pqyr"
+    },
     "nur": {
       "type": "Git",
       "repository": {
@@ -112,9 +124,9 @@
         "url": "https://git.alanpearce.eu/searchix"
       },
       "branch": "main",
-      "revision": "03fa0eb00aef448bec05280a121c659a600fc13f",
+      "revision": "f38ccb5ec8149072c93a6c3173da06ba1d724c4c",
       "url": null,
-      "hash": "182ldbz7gpcsbmii51gigwiavklj62p2q9sv32nwlcr1hc8d6g2a"
+      "hash": "0x8vci3m7jvp4sc0iwxwiv1y94mx7nvjjkcd2n80939n8q4c3x2c"
     },
     "srvos": {
       "type": "Git",
diff --git a/private b/private
-Subproject 7b106e27d58e46bed2a4f627f1321592a0bedb2
+Subproject 414f928498da42a4a8998186618bb0285e13099
diff --git a/system/linde.nix b/system/linde.nix
index 7fd8337a..8e73267f 100644
--- a/system/linde.nix
+++ b/system/linde.nix
@@ -120,12 +120,12 @@ in
       ${pkgs.npins}/bin/npins update searchix nixpkgs
     '';
     useNixShell = true;
-    dates = "03:23";
+    dates = "05:23";
     allowReboot = true;
     randomizedDelaySec = "45 min";
     rebootWindow = {
-      lower = "03:00";
-      upper = "05:30";
+      lower = "05:20";
+      upper = "07:00";
     };
   };
 
@@ -929,6 +929,7 @@ in
         };
 
       importer.timeout = "45m";
+      importer.batchSize = 5000;
       importer.sources = {
         darwin = {
           enable = true;
diff --git a/user/marvin.nix b/user/marvin.nix
index df8ce8bc..acd0ece1 100644
--- a/user/marvin.nix
+++ b/user/marvin.nix
@@ -20,6 +20,7 @@
     ../private
     ../private/ssh.nix
     ../private/tabnine.nix
+    ../private/llm.nix
   ];
 
   home.username = "alan";
diff --git a/user/modules/tabnine.nix b/user/modules/tabnine.nix
index b8ed3773..1c9b1a96 100644
--- a/user/modules/tabnine.nix
+++ b/user/modules/tabnine.nix
@@ -61,11 +61,9 @@ in
       text = cfg.registrationKey;
     };
 
-    programs.neovim.plugins = [
-      pkgs.vimPlugins.coc-tabnine
-    ];
-    programs.neovim.coc.settings = {
-      "tabnine.binary_path" = "${pkgs.tabnine}/bin/TabNine";
+    programs.nixvim.plugins = {
+      blink-compat.enable = true;
+      cmp-tabnine.enable = true;
     };
 
     programs.emacs.extraPackages = epkgs: [
diff --git a/user/nvim/init.lua b/user/nvim/init.lua
deleted file mode 100644
index f9162167..00000000
--- a/user/nvim/init.lua
+++ /dev/null
@@ -1,219 +0,0 @@
-vim.opt.autoindent = true
-
-vim.opt.background = "light"
-vim.opt.number = true
-vim.opt.clipboard = "unnamed"
-
-vim.g.mapleader = ","
-
-local keyset = vim.keymap.set
-
-keyset("v", "<leader>y", "\"+y", {})
-keyset("n", "<leader>Y", "\"+yg_", {})
-keyset("n", "<leader>y", "\"+y", {})
-
-keyset("v", "<leader>p", "\"+p", {})
-keyset("v", "<leader>P", "\"+P", {})
-keyset("n", "<leader>p", "\"+p", {})
-keyset("n", "<leader>P", "\"+P", {})
-
--- Autocomplete
-function _G.check_back_space()
-    local col = vim.fn.col('.') - 1
-    return col == 0 or vim.fn.getline('.'):sub(col, col):match('%s') ~= nil
-end
-
--- Use Tab for trigger completion with characters ahead and navigate
--- NOTE: There's always a completion item selected by default, you may want to enable
--- no select by setting `"suggest.noselect": true` in your configuration file
--- NOTE: Use command ':verbose imap <tab>' to make sure Tab is not mapped by
--- other plugins before putting this into your config
-local opts = {silent = true, noremap = true, expr = true, replace_keycodes = false}
-keyset("i", "<TAB>", 'coc#pum#visible() ? coc#pum#next(1) : v:lua.check_back_space() ? "<TAB>" : coc#refresh()', opts)
-keyset("i", "<S-TAB>", [[coc#pum#visible() ? coc#pum#prev(1) : "\<C-h>"]], opts)
-
--- Make <CR> to accept selected completion item or notify coc.nvim to format
--- <C-g>u breaks current undo, please make your own choice
-keyset("i", "<cr>", [[coc#pum#visible() ? coc#pum#confirm() : "\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"]], opts)
-
--- Use <c-j> to trigger snippets
-keyset("i", "<c-j>", "<Plug>(coc-snippets-expand-jump)")
--- Use <c-space> to trigger completion
-keyset("i", "<c-space>", "coc#refresh()", {silent = true, expr = true})
-
--- Use `[g` and `]g` to navigate diagnostics
--- Use `:CocDiagnostics` to get all diagnostics of current buffer in location list
-keyset("n", "[g", "<Plug>(coc-diagnostic-prev)", {silent = true})
-keyset("n", "]g", "<Plug>(coc-diagnostic-next)", {silent = true})
-
--- GoTo code navigation
-keyset("n", "gd", "<Plug>(coc-definition)", {silent = true})
-keyset("n", "gy", "<Plug>(coc-type-definition)", {silent = true})
-keyset("n", "gi", "<Plug>(coc-implementation)", {silent = true})
-keyset("n", "gr", "<Plug>(coc-references)", {silent = true})
-
-
--- Use K to show documentation in preview window
-function _G.show_docs()
-    local cw = vim.fn.expand('<cword>')
-    if vim.fn.index({'vim', 'help'}, vim.bo.filetype) >= 0 then
-        vim.api.nvim_command('h ' .. cw)
-    elseif vim.api.nvim_eval('coc#rpc#ready()') then
-        vim.fn.CocActionAsync('doHover')
-    else
-        vim.api.nvim_command('!' .. vim.o.keywordprg .. ' ' .. cw)
-    end
-end
-keyset("n", "K", '<CMD>lua _G.show_docs()<CR>', {silent = true})
-
-
-
--- Highlight the symbol and its references on a CursorHold event(cursor is idle)
-vim.api.nvim_create_augroup("CocGroup", {})
-vim.api.nvim_create_autocmd("CursorHold", {
-    group = "CocGroup",
-    command = "silent call CocActionAsync('highlight')",
-    desc = "Highlight symbol under cursor on CursorHold"
-})
-
-
--- Symbol renaming
-keyset("n", "<leader>rn", "<Plug>(coc-rename)", {silent = true})
-
-
--- Formatting selected code
-keyset("x", "<leader>f", "<Plug>(coc-format-selected)", {silent = true})
-keyset("n", "<leader>f", "<Plug>(coc-format-selected)", {silent = true})
-
-
--- Setup formatexpr specified filetype(s)
-vim.api.nvim_create_autocmd("FileType", {
-    group = "CocGroup",
-    pattern = "typescript,json",
-    command = "setl formatexpr=CocAction('formatSelected')",
-    desc = "Setup formatexpr specified filetype(s)."
-})
-
--- Update signature help on jump placeholder
-vim.api.nvim_create_autocmd("User", {
-    group = "CocGroup",
-    pattern = "CocJumpPlaceholder",
-    command = "call CocActionAsync('showSignatureHelp')",
-    desc = "Update signature help on jump placeholder"
-})
-
--- Apply codeAction to the selected region
--- Example: `<leader>aap` for current paragraph
-local opts = {silent = true, nowait = true}
-keyset("x", "<leader>a", "<Plug>(coc-codeaction-selected)", opts)
-keyset("n", "<leader>a", "<Plug>(coc-codeaction-selected)", opts)
-
--- Remap keys for apply code actions at the cursor position.
-keyset("n", "<leader>ac", "<Plug>(coc-codeaction-cursor)", opts)
--- Remap keys for apply code actions affect whole buffer.
-keyset("n", "<leader>as", "<Plug>(coc-codeaction-source)", opts)
--- Remap keys for applying codeActions to the current buffer
-keyset("n", "<leader>ac", "<Plug>(coc-codeaction)", opts)
--- Apply the most preferred quickfix action on the current line.
-keyset("n", "<leader>qf", "<Plug>(coc-fix-current)", opts)
-
--- Remap keys for apply refactor code actions.
-keyset("n", "<leader>re", "<Plug>(coc-codeaction-refactor)", { silent = true })
-keyset("x", "<leader>r", "<Plug>(coc-codeaction-refactor-selected)", { silent = true })
-keyset("n", "<leader>r", "<Plug>(coc-codeaction-refactor-selected)", { silent = true })
-
--- Run the Code Lens actions on the current line
-keyset("n", "<leader>cl", "<Plug>(coc-codelens-action)", opts)
-
-
--- Map function and class text objects
--- NOTE: Requires 'textDocument.documentSymbol' support from the language server
-keyset("x", "if", "<Plug>(coc-funcobj-i)", opts)
-keyset("o", "if", "<Plug>(coc-funcobj-i)", opts)
-keyset("x", "af", "<Plug>(coc-funcobj-a)", opts)
-keyset("o", "af", "<Plug>(coc-funcobj-a)", opts)
-keyset("x", "ic", "<Plug>(coc-classobj-i)", opts)
-keyset("o", "ic", "<Plug>(coc-classobj-i)", opts)
-keyset("x", "ac", "<Plug>(coc-classobj-a)", opts)
-keyset("o", "ac", "<Plug>(coc-classobj-a)", opts)
-
-
--- Remap <C-f> and <C-b> to scroll float windows/popups
----@diagnostic disable-next-line: redefined-local
-local opts = {silent = true, nowait = true, expr = true}
-keyset("n", "<C-f>", 'coc#float#has_scroll() ? coc#float#scroll(1) : "<C-f>"', opts)
-keyset("n", "<C-b>", 'coc#float#has_scroll() ? coc#float#scroll(0) : "<C-b>"', opts)
-keyset("i", "<C-f>",
-       'coc#float#has_scroll() ? "<c-r>=coc#float#scroll(1)<cr>" : "<Right>"', opts)
-keyset("i", "<C-b>",
-       'coc#float#has_scroll() ? "<c-r>=coc#float#scroll(0)<cr>" : "<Left>"', opts)
-keyset("v", "<C-f>", 'coc#float#has_scroll() ? coc#float#scroll(1) : "<C-f>"', opts)
-keyset("v", "<C-b>", 'coc#float#has_scroll() ? coc#float#scroll(0) : "<C-b>"', opts)
-
-
--- Use CTRL-S for selections ranges
--- Requires 'textDocument/selectionRange' support of language server
-keyset("n", "<C-s>", "<Plug>(coc-range-select)", {silent = true})
-keyset("x", "<C-s>", "<Plug>(coc-range-select)", {silent = true})
-
-
--- Add `:Format` command to format current buffer
-vim.api.nvim_create_user_command("Format", "call CocAction('format')", {})
-
--- " Add `:Fold` command to fold current buffer
-vim.api.nvim_create_user_command("Fold", "call CocAction('fold', <f-args>)", {nargs = '?'})
-
--- Add `:OR` command for organize imports of the current buffer
-vim.api.nvim_create_user_command("OR", "call CocActionAsync('runCommand', 'editor.action.organizeImport')", {})
-
--- Add (Neo)Vim's native statusline support
--- NOTE: Please see `:h coc-status` for integrations with external plugins that
--- provide custom statusline: lightline.vim, vim-airline
-vim.opt.statusline:prepend("%{coc#status()}%{get(b:,'coc_current_function','')}")
-
--- Mappings for CoCList
--- code actions and coc stuff
----@diagnostic disable-next-line: redefined-local
-local opts = {silent = true, nowait = true}
--- Show all diagnostics
-keyset("n", "<space>a", ":<C-u>CocList diagnostics<cr>", opts)
--- Manage extensions
-keyset("n", "<space>e", ":<C-u>CocList extensions<cr>", opts)
--- Show commands
-keyset("n", "<space>c", ":<C-u>CocList commands<cr>", opts)
--- Find symbol of current document
-keyset("n", "<space>o", ":<C-u>CocList outline<cr>", opts)
--- Search workspace symbols
-keyset("n", "<space>s", ":<C-u>CocList -I symbols<cr>", opts)
--- Do default action for next item
-keyset("n", "<space>j", ":<C-u>CocNext<cr>", opts)
--- Do default action for previous item
-keyset("n", "<space>k", ":<C-u>CocPrev<cr>", opts)
--- Resume latest coc list
-keyset("n", "<space>p", ":<C-u>CocListResume<cr>", opts)
-
-local telescope = require("telescope")
-telescope.setup {
-	defaults = {
-		mappings = {
-			i ={
-				["<C-h>"] = "which_key"
-			}
-		}
-	},
-	extensions = {
-		fzf = {
-			fuzzy = true,
-			override_generic_sorter = true,
-			override_file_sorter = true,
-			case_mode = "smart_case",
-		}
-	}
-}
-telescope.load_extension("fzf")
-local ts_builtin = require('telescope.builtin')
-keyset("n", "<leader>ff", ts_builtin.find_files, {})
-keyset("n", "<leader>fg", ts_builtin.live_grep, {})
-keyset("n", "<leader>bb", ts_builtin.buffers, {})
-keyset("n", "<leader>pf", ts_builtin.git_files, {})
-keyset("n", "<leader>fh", ts_builtin.help_tags, {})
diff --git a/user/settings/development/base.nix b/user/settings/development/base.nix
index 3954986b..39739695 100644
--- a/user/settings/development/base.nix
+++ b/user/settings/development/base.nix
@@ -58,6 +58,16 @@
     ]))
   ]);
 
+  programs.nixvim.plugins = {
+    lsp.servers = {
+      bashls.enable = true;
+      fish_lsp.enable = true;
+      taplo.enable = true;
+      docker_compose_language_service.enable = true;
+      dockerls.enable = true;
+    };
+  };
+
   editorconfig = {
     enable = true;
     settings = {
diff --git a/user/settings/development/golang.nix b/user/settings/development/golang.nix
index ef6cf412..2cd29685 100644
--- a/user/settings/development/golang.nix
+++ b/user/settings/development/golang.nix
@@ -37,7 +37,8 @@
       tree-sitter-templ
     ]))
   ]);
-  programs.neovim.plugins = with pkgs.vimPlugins; [
-    coc-go
-  ];
+  programs.nixvim.plugins.lsp.servers = {
+    gopls.enable = true;
+    golangci_lint_ls.enable = true;
+  };
 }
diff --git a/user/settings/development/web.nix b/user/settings/development/web.nix
index 0212d9fd..a32f5a21 100644
--- a/user/settings/development/web.nix
+++ b/user/settings/development/web.nix
@@ -8,6 +8,7 @@
     csslint
     stylelint
   ] ++ (with pkgs; [
+    emmet-language-server
     flyctl
     personal.htmlformat
   ]);
@@ -102,8 +103,12 @@
       tree-sitter-html
     ]))
   ]);
-  programs.neovim.plugins = with pkgs.vimPlugins; [
-    coc-css
-    coc-html
-  ];
+  programs.nixvim.plugins = {
+    lsp.servers = {
+      emmet_language_server.enable = true;
+      cssls.enable = true;
+      html.enable = true;
+      jsonls.enable = true;
+    };
+  };
 }
diff --git a/user/settings/development/zig.nix b/user/settings/development/zig.nix
index ac21267f..e3c78305 100644
--- a/user/settings/development/zig.nix
+++ b/user/settings/development/zig.nix
@@ -8,7 +8,8 @@
   programs.emacs.extraPackages = epkgs: (with epkgs; [
     zig-mode
   ]);
-  programs.neovim.plugins = with pkgs.vimPlugins; [
-    zig-vim
-  ];
+  programs.nixvim.plugins = {
+    zig.enable = true;
+    lsp.servers.zls.enable = true;
+  };
 }
diff --git a/user/settings/neovim.nix b/user/settings/neovim.nix
index dcee5fde..d04de0b8 100644
--- a/user/settings/neovim.nix
+++ b/user/settings/neovim.nix
@@ -1,58 +1,109 @@
-{ pkgs
+{ config
 , ...
-}: {
-  programs.neovim = {
+}:
+let
+  nixvim = import <nixvim>;
+in
+{
+  imports = [
+    nixvim.homeManagerModules.nixvim
+  ];
+
+  programs.nixvim = {
     enable = true;
     defaultEditor = true;
+
+    nixpkgs.config = config.nixpkgs.config;
+
     viAlias = true;
     vimAlias = true;
     vimdiffAlias = true;
-    withNodeJs = true;
-    plugins = with pkgs.vimPlugins; [
-      commentary
-      conjure
-      coc-git
-      coc-json
-      coc-yaml
-      direnv-vim
-      (nvim-treesitter.withPlugins (
-        plugins: with plugins; [
-          nix
-        ]
-      ))
-      telescope-nvim
-      telescope-fzf-native-nvim
-      vim-polyglot
-      vim-tridactyl
-      vim-surround
-    ];
-    extraLuaConfig = builtins.readFile ../nvim/init.lua;
-    coc = {
-      enable = true;
-      settings = {
-        "json.enable" = true;
-        languageserver = {
-          nix = {
-            command = "${pkgs.nil}/bin/nil";
-            filetypes = [ "nix" ];
-            rootPatterns = [ "flake.nix" ];
-            settings = {
-              coc.preferences.formatOnSaveFiletypes = [ "nix" ];
-              links.tooltip = true;
-              semanticTokens = {
-                filetypes = [ "nix" ];
-              };
-              nil = {
-                formatting.command = [ "nixpkgs-fmt" ];
-                nix.flake.autoArchive = true;
-              };
-            };
+
+    # withRuby = false;
+
+    clipboard.register = "unnamed";
+    opts = {
+      autoindent = true;
+      number = true;
+      relativenumber = true;
+      shiftwidth = 2;
+      background = "light";
+    };
+    globals.mapleader = ",";
+
+    colorscheme = "shine";
+
+    performance = {
+      byteCompileLua = {
+        enable = true;
+        nvimRuntime = true;
+        plugins = true;
+      };
+    };
+
+    plugins = {
+      blink-cmp = {
+        enable = true;
+        settings = {
+          keymap.preset = "super-tab";
+        };
+      };
+
+      mini = {
+        enable = true;
+        mockDevIcons = true;
+        modules.icons = {
+          style = "glyph";
+        };
+        modules.basics = { };
+      };
+
+      lsp = {
+        enable = true;
+        keymaps = {
+          lspBuf = {
+            gD = "references";
+            gd = "definition";
+            gi = "implementation";
+            gt = "type_definition";
           };
-          lua = {
-            command = "${pkgs.lua-language-server}/bin/lua-language-server";
-            filetypes = [ "lua" ];
+        };
+      };
+
+      direnv.enable = true;
+      friendly-snippets.enable = true;
+      nvim-snippets = {
+        enable = true;
+        settings.friendly_snippets = true;
+        luaConfig.post = ''
+          local capabilities = vim.lsp.protocol.make_client_capabilities()
+          capabilities.textDocument.completion.completionItem.snippetSupport = true
+
+          require'lspconfig'.cssls.setup {
+            capabilities = capabilities,
+          }
+        '';
+      };
+      nvim-surround.enable = true;
+      telescope = {
+        enable = true;
+        keymaps = {
+          "<leader>ff" = "find_files";
+          "<leader>fg" = "live_grep";
+          "<leader>bb" = "buffers";
+          "<leader>pf" = "git_files";
+          "<leader>fh" = "help_tags";
+        };
+        settings = {
+          mappings = {
+            i = {
+              "<C-h>" = "which_key";
+            };
           };
         };
+        extensions = {
+          fzf-native.enable = true;
+        };
       };
     };
   };
diff --git a/user/settings/nix.nix b/user/settings/nix.nix
index eaae1083..c0382078 100644
--- a/user/settings/nix.nix
+++ b/user/settings/nix.nix
@@ -37,7 +37,8 @@ in
     nix-mode
     nix-update
   ]);
-  programs.neovim.plugins = with pkgs.vimPlugins; [
-    vim-nix
-  ];
+  programs.nixvim.plugins = {
+    nix.enable = true;
+    lsp.servers.nixd.enable = true;
+  };
 }
diff --git a/user/settings/user-interface.nix b/user/settings/user-interface.nix
index a7dde811..9b413ee7 100644
--- a/user/settings/user-interface.nix
+++ b/user/settings/user-interface.nix
@@ -1,5 +1,5 @@
-{ config
-, pkgs
+{ pkgs
+, lib
 , ...
 }:
 let
@@ -24,23 +24,20 @@ in
       ];
     };
   };
-  home.packages = with pkgs;
-    [
-      inter
-    ] ++ (with pkgs.nerd-fonts; [
-      blex-mono
-      jetbrains-mono
-      recursive-mono
-      symbols-only
-    ])
-    ++ lib.optionals (!stdenv.isDarwin) (with pkgs; [
-      (discord.override { withOpenASAR = true; })
+  home.packages = (with pkgs.nerd-fonts; [
+    blex-mono
+    jetbrains-mono
+    recursive-mono
+    symbols-only
+  ])
+  ++ lib.optionals (!stdenv.isDarwin) (with pkgs; [
+    (discord.override { withOpenASAR = true; })
 
-      zeal
-      falkon
-      beeper
-      kdePackages.neochat
-      kdePackages.kleopatra
-    ]);
+    zeal
+    falkon
+    beeper
+    kdePackages.neochat
+    kdePackages.kleopatra
+  ]);
   services.emacs.startWithUserSession = "graphical";
 }