Bladeren bron

feat(nvim): add Obsidian knowledge base, markdown rendering, and image preview; remove opencode.nvim

Zander Hawke 3 maanden geleden
bovenliggende
commit
044a2e25f1

+ 18 - 18
flake.lock

@@ -153,11 +153,11 @@
       },
       "locked": {
         "dir": "pkgs/firefox-addons",
-        "lastModified": 1768709017,
-        "narHash": "sha256-/Xc5B/+6nbX24iSaPbN/+wiVqGS50/LS4y53tzTvN0o=",
+        "lastModified": 1770782627,
+        "narHash": "sha256-H53CPHu4ko9a5MvaAyv2sWnmDrAVn2PF4L9YG8nTI5g=",
         "owner": "rycee",
         "repo": "nur-expressions",
-        "rev": "5728e3d62c3af09445cb013e304d627f6589efc4",
+        "rev": "8b607f9a01a1a50503da9df9dcb004bfbc00d594",
         "type": "gitlab"
       },
       "original": {
@@ -228,11 +228,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1765835352,
-        "narHash": "sha256-XswHlK/Qtjasvhd1nOa1e8MgZ8GS//jBoTqWtrS1Giw=",
+        "lastModified": 1769996383,
+        "narHash": "sha256-AnYjnFWgS49RlqX7LrC4uA+sCCDBj0Ry/WOJ5XWAsa0=",
         "owner": "hercules-ci",
         "repo": "flake-parts",
-        "rev": "a34fae9c08a15ad73f295041fec82323541400a9",
+        "rev": "57928607ea566b5db3ad13af0e57e921e6b12381",
         "type": "github"
       },
       "original": {
@@ -545,11 +545,11 @@
     },
     "nixpkgs-unstable": {
       "locked": {
-        "lastModified": 1768661221,
-        "narHash": "sha256-MJwOjrIISfOpdI9x4C+5WFQXvHtOuj5mqLZ4TMEtk1M=",
+        "lastModified": 1771207753,
+        "narHash": "sha256-b9uG8yN50DRQ6A7JdZBfzq718ryYrlmGgqkRm9OOwCE=",
         "owner": "nixos",
         "repo": "nixpkgs",
-        "rev": "3327b113f2ef698d380df83fbccefad7e83d7769",
+        "rev": "d1c15b7d5806069da59e819999d70e1cec0760bf",
         "type": "github"
       },
       "original": {
@@ -561,11 +561,11 @@
     },
     "nixpkgs_2": {
       "locked": {
-        "lastModified": 1768621446,
-        "narHash": "sha256-6YwHV1cjv6arXdF/PQc365h1j+Qje3Pydk501Rm4Q+4=",
+        "lastModified": 1771208521,
+        "narHash": "sha256-X01Q3DgSpjeBpapoGA4rzKOn25qdKxbPnxHeMLNoHTU=",
         "owner": "nixos",
         "repo": "nixpkgs",
-        "rev": "72ac591e737060deab2b86d6952babd1f896d7c5",
+        "rev": "fa56d7d6de78f5a7f997b0ea2bc6efd5868ad9e8",
         "type": "github"
       },
       "original": {
@@ -584,11 +584,11 @@
         "systems": "systems_2"
       },
       "locked": {
-        "lastModified": 1768486009,
-        "narHash": "sha256-I7ymDe6UQooHy9I9wrafKCCDnRbox/EMWAgJgpm7fGs=",
+        "lastModified": 1771135771,
+        "narHash": "sha256-wyvBIhDuyCRyjB3yPg77qoyxrlgQtBR1rVW3c9knV3E=",
         "owner": "nix-community",
         "repo": "nixvim",
-        "rev": "03a638205b5cb04ba9c2ed6c604e137b15f07fa1",
+        "rev": "ed0424f0b08d303a7348f52f7850ad1b2704f9ba",
         "type": "github"
       },
       "original": {
@@ -694,11 +694,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1768711359,
-        "narHash": "sha256-3n2ixvAMWij1ZOh/KMJJqizX+sRU083wFR8pa6+IkyU=",
+        "lastModified": 1770707140,
+        "narHash": "sha256-3ZRA2+o5p1+FKWx988WbwB1SQ2Mz5aL95zxhL5iD+O0=",
         "owner": "0xc000022070",
         "repo": "zen-browser-flake",
-        "rev": "8c9e9425946f290fa60e0e6fd7b1464cbcdbc53e",
+        "rev": "db14437f8667f7f09784e2a4e73c105bdc1c7023",
         "type": "github"
       },
       "original": {

+ 15 - 8
home/features/cli/tmux.nix

@@ -1,13 +1,13 @@
-{ pkgs
-, config
-, lib
-, ...
+{
+  pkgs,
+  config,
+  lib,
+  ...
 }:
 let
   isDarwin = pkgs.stdenv.isDarwin;
   reattach-to-user-namespace = lib.getExe' pkgs.reattach-to-user-namespace "reattach-to-user-namespace";
   lazygit = lib.getExe pkgs.lazygit;
-  shell = lib.getExe config.programs.fish.package;
 in
 {
   home.packages = with pkgs; [ eza ];
@@ -16,7 +16,7 @@ in
     enable = true;
     settings = {
       dir_length = 2;
-      default_session.startup_command = "nvim -c \"lua vim.defer_fn(function() require('telescope.builtin').find_files() end, 0)\"";
+      default_session.startup_command = "nvim";
       default_session.preview_command = "eza --all --git --icons --color=always {}";
     };
   };
@@ -38,6 +38,7 @@ in
 
     plugins = with pkgs.tmuxPlugins; [
       tmux-select-pane-no-wrap
+      tmux-toggle-popup
       vim-tmux-navigator
       yank
       {
@@ -90,8 +91,9 @@ in
       bind-key -n C-a select-window -t :2
 
       # some display popups
-      bind-key -n C-g display-popup -d "#{pane_current_path}" -w 80% -h 80% -E "${lazygit}"
-      bind-key -n C-t display-popup -d "#{pane_current_path}" -w 75% -h 75% -E "${shell}"
+      bind-key -n C-o run "#{@popup-toggle} -Ed'~/workspace/thomas/knowledge/' -w100% -h100% --name=notes 'nvim -c \"Obsidian today\"'"
+      bind-key -n C-g run "#{@popup-toggle} -Ed'##{pane_current_path}' -w90% -h90% --name=lazygit ${lazygit}"
+      bind-key -n C-t run "#{@popup-toggle} -Ed'##{pane_current_path}' -w75% -h75%"
 
       # sesh
       bind-key -n C-s run-shell "sesh connect \"$(
@@ -113,6 +115,11 @@ in
       # kill pane
       bind-key x kill-pane
       set -g detach-on-destroy off
+
+      # Allow programs in tmux to send escape sequences directly to the terminal
+      set -gq allow-passthrough on
+      # Recommended: Prevent images from flickering when switching windows
+      set -g visual-activity off
     '';
   };
 }

+ 6 - 0
home/features/desktop/ghostty.nix

@@ -27,6 +27,12 @@
 
       macos-titlebar-style = "hidden";
       theme = "Kanagawa Dragon";
+      cursor-style-blink = false;
+      # This defaults to true because out-of-sync rendering on macOS can cause
+      # kernel panics (macOS 14.4+) and performance issues for external displays
+      # over some hardware such as DisplayLink. If you want to minimize input
+      # latency, set this to false with the known aforementioned risks.
+      window-vsync = false;
 
       window-padding-balance = true;
       window-padding-color = "extend";

+ 12 - 3
home/features/nvim/configs/default.nix

@@ -2,16 +2,20 @@
   imports = [
     ./cmp.nix
     ./gitsigns.nix
+    ./image.nix
+    ./img-clip.nix
     ./indent-blankline.nix
     ./lspconfig.nix
     ./minuet.nix
     ./nvim-tree.nix
-    ./opencode.nix
+    ./obsidian.nix
+    ./render-markdown.nix
     ./rustaceanvim.nix
     ./telescope.nix
     ./treesitter.nix
     ./web-devicons.nix
     ./which-key.nix
+    ./zen-mode.nix
   ];
 
   plugins = {
@@ -44,13 +48,18 @@
     nvzone-menu.enable = true;
     nvzone-minty = {
       enable = true;
-      lazyLoad.settings.cmd = [ "Huefy" "Shades" ];
+      lazyLoad.settings.cmd = [
+        "Huefy"
+        "Shades"
+      ];
     };
 
     conform-nvim = {
       enable = true;
       settings = {
-        formatters_by_ft = { lua = [ "stylua" ]; };
+        formatters_by_ft = {
+          lua = [ "stylua" ];
+        };
       };
     };
 

+ 46 - 0
home/features/nvim/configs/image.nix

@@ -0,0 +1,46 @@
+{ pkgs, ... }:
+{
+  extraPackages = with pkgs; [
+    imagemagick
+    curl
+  ];
+
+  plugins.image = {
+    enable = true;
+    lazyLoad.settings.ft = [
+      "markdown"
+      "vimwiki"
+      "quarto"
+    ];
+    settings = {
+      backend = "kitty";
+      integrations = {
+        markdown = {
+          enabled = true;
+          clear_in_insert_mode = true;
+          download_remote_images = true;
+          only_render_image_at_cursor = true;
+          filetypes = [
+            "markdown"
+            "vimwiki"
+            "quarto"
+          ];
+        };
+      };
+      max_height = 20;
+      max_height_window_percentage = {
+        __raw = "math.huge";
+      };
+      max_width = 100;
+      max_width_window_percentage = {
+        __raw = "math.huge";
+      };
+      window_overlap_clear_enabled = true;
+      window_overlap_clear_ft_ignore = [
+        "cmp_menu"
+        "cmp_docs"
+        ""
+      ];
+    };
+  };
+}

+ 28 - 0
home/features/nvim/configs/img-clip.nix

@@ -0,0 +1,28 @@
+{
+  plugins.img-clip = {
+    enable = true;
+    lazyLoad.settings.ft = "markdown";
+    settings = {
+      default = {
+        # 1. Integration with Obsidian
+        dir_path = "assets";
+        use_absolute_path = false;
+        add_suffix = true;
+
+        # 2. Performance & Formatting
+        extension = "avif";
+        process_cmd = "magick convert - -quality 75 %s";
+
+        # 3. Behavioral
+        prompt_for_file_name = true;
+        drag_and_drop.insert_mode = false;
+      };
+
+      filetypes = {
+        markdown = {
+          download_images = true;
+        };
+      };
+    };
+  };
+}

+ 36 - 9
home/features/nvim/configs/lspconfig.nix

@@ -1,10 +1,22 @@
 {
   lsp = {
     keymaps = [
-      { key = "gD"; lspBufAction = "declaration"; }
-      { key = "gd"; lspBufAction = "definition"; }
-      { key = "<leader>wa"; lspBufAction = "add_workspace_folder"; }
-      { key = "<leader>wr"; lspBufAction = "remove_workspace_folder"; }
+      {
+        key = "gD";
+        lspBufAction = "declaration";
+      }
+      {
+        key = "gd";
+        lspBufAction = "definition";
+      }
+      {
+        key = "<leader>wa";
+        lspBufAction = "add_workspace_folder";
+      }
+      {
+        key = "<leader>wr";
+        lspBufAction = "remove_workspace_folder";
+      }
 
       {
         key = "<leader>wl";
@@ -15,14 +27,23 @@
         '';
       }
 
-      { key = "<leader>D"; lspBufAction = "type_definition"; }
-      { key = "<leader>ra"; action.__raw = "require('nvchad.lsp.renamer')"; }
+      {
+        key = "<leader>D";
+        lspBufAction = "type_definition";
+      }
+      {
+        key = "<leader>ra";
+        action.__raw = "require('nvchad.lsp.renamer')";
+      }
     ];
 
     servers = {
       "*".config = {
         capabilities.textDocument.completion.completionItem = {
-          documentationFormat = [ "markdown" "plaintext" ];
+          documentationFormat = [
+            "markdown"
+            "plaintext"
+          ];
           snippetSupport = true;
           preselectSupport = true;
           insertReplaceSupport = true;
@@ -59,7 +80,9 @@
         enable = true;
         config.settings = {
           Lua = {
-            runtime = { version = "LuaJIT"; };
+            runtime = {
+              version = "LuaJIT";
+            };
             workspace = {
               library.__raw = ''
                 {
@@ -87,11 +110,15 @@
 
       gopls.enable = true;
       html.enable = true;
+      marksman.enable = true;
       nextls.enable = true;
       nil_ls.enable = true;
       phpactor = {
         enable = true;
-        config.filetypes = [ "php" "blade" ];
+        config.filetypes = [
+          "php"
+          "blade"
+        ];
       };
       rust-analyzer = {
         enable = true;

+ 119 - 0
home/features/nvim/configs/obsidian.nix

@@ -0,0 +1,119 @@
+{
+  lib,
+  ...
+}:
+let
+  inherit (lib.nixvim) mkRaw;
+  keyMap = mode: key: action: options: {
+    inherit
+      mode
+      key
+      action
+      options
+      ;
+  };
+in
+{
+  plugins = {
+    obsidian = {
+      enable = true;
+      lazyLoad.settings = {
+        cmd = [ "Obsidian" ];
+        before = mkRaw ''
+          function()
+            require('lz.n').trigger_load('telescope.nvim')
+          end
+        '';
+      };
+
+      settings = {
+        legacy_commands = false;
+
+        completion = {
+          min_chars = 2;
+          nvim_cmp = true;
+        };
+
+        workspaces = [
+          {
+            name = "Knowledge Base";
+            path = "~/workspace/thomas/knowledge";
+          }
+        ];
+
+        templates.folder = "templates";
+
+        daily_notes = {
+          folder = "dailies";
+          date_format = "%Y-%m-%d";
+          template = "daily_template.md";
+        };
+
+        notes_subdir = "inbox";
+        new_notes_location = "notes_subdir";
+
+        preferred_link_style = "wiki";
+
+        ui = {
+          enable = false;
+        };
+      };
+    };
+  };
+
+  autoCmd = [
+    {
+      event = "BufEnter";
+      pattern = "*/workspace/thomas/knowledge/*";
+      callback.__raw = ''
+        function()
+          vim.opt_local.scrolloff = 999
+          vim.opt_local.wrap = true
+          vim.opt_local.linebreak = true
+          pcall(vim.cmd, "ZenMode")
+        end
+      '';
+    }
+  ];
+
+  keymaps = [
+    # 1. The "Smart Action" - Replaces ToggleCheckbox and FollowLink
+    # Handles checkboxes, links, tags, and even folding based on cursor context.
+    (keyMap "n" "<CR>" (mkRaw ''
+      function()
+        return require('obsidian').util.smart_action()
+      end
+    '') { desc = "Obsidian Smart Action"; })
+
+    # 2. Daily Note Navigation
+    (keyMap "n" "<leader>nd" "<cmd>Obsidian today<CR>" { desc = "Obsidian Today"; })
+    (keyMap "n" "<leader>ny" "<cmd>Obsidian yesterday<CR>" { desc = "Obsidian Yesterday"; })
+
+    # 3. Search & Navigation (Unified Command Syntax)
+    (keyMap "n" "<leader>ns" "<cmd>Obsidian search<CR>" { desc = "Obsidian Search"; })
+    (keyMap "n" "<leader>no" "<cmd>Obsidian quick_switch<CR>" { desc = "Obsidian Quick Switch"; })
+    (keyMap "n" "<leader>nn" "<cmd>Obsidian new<CR>" { desc = "Obsidian New Note"; })
+    (keyMap "n" "<leader>nw" "<cmd>Obsidian workspace<CR>" { desc = "Obsidian Workspace Switch"; })
+
+    # 4. Utilities
+    (keyMap "n" "<leader>nb" "<cmd>Obsidian backlinks<CR>" { desc = "Obsidian Backlinks"; })
+    (keyMap "n" "<leader>nt" "<cmd>Obsidian tags<CR>" { desc = "Obsidian Tags"; })
+    (keyMap "n" "<leader>ni" "<cmd>Obsidian paste_img<CR>" { desc = "Obsidian Paste Image"; })
+
+    # 5. Visual Mode - Link Selection or Extract to New Note
+    (keyMap "v" "<leader>nl" "<cmd>Obsidian link<CR>" { desc = "Obsidian Link Selection"; })
+    (keyMap "v" "<leader>ne" "<cmd>Obsidian extract_note<CR>" { desc = "Obsidian Extract to Note"; })
+
+    # 6. Some Shortcuts
+    (keyMap "n" "<leader>it" (mkRaw ''
+      function()
+        local time = os.date("%H:%M")
+        local line = "- **" .. time .. "** | "
+        -- Insert the text and move the cursor to the end
+        vim.api.nvim_put({line}, "c", true, true)
+        vim.cmd("startinsert!")
+      end
+    '') { desc = "Insert Timestamped Bullet Point"; })
+
+  ];
+}

+ 0 - 68
home/features/nvim/configs/opencode.nix

@@ -1,68 +0,0 @@
-{ lib
-, ...
-}:
-let
-  inherit (lib.nixvim) mkRaw;
-  keyMap = mode: key: action: options: { inherit mode key action options; };
-in
-{
-  plugins.opencode.enable = true;
-
-  keymaps = [
-    (keyMap [ "n" "x" ] "<C-a>"
-      (mkRaw ''
-        function() 
-          require("opencode").ask("@this: ", { submit = true })
-        end
-      '')
-      { desc = "Ask opencode"; })
-    (keyMap [ "n" "x" ] "<C-x>"
-      (mkRaw ''
-        function ()
-          require("opencode").select()
-        end
-      '')
-      { desc = "Execute opencode action…"; })
-    (keyMap [ "n" "t" ] "<C-.>"
-      (mkRaw ''
-        function() 
-          require("opencode").toggle()
-        end
-      '')
-      { desc = "Toggle opencode"; })
-
-    (keyMap [ "n" "x" ] "go"
-      (mkRaw ''
-        function()
-          return require("opencode").operator("@this ")
-        end
-      '')
-      { expr = true; desc = "Add range to opencode"; })
-    (keyMap "n" "goo"
-      (mkRaw ''
-        function()
-          return require("opencode").operator("@this ") .. "_"
-        end
-      '')
-      { expr = true; desc = "Add line to opencode"; })
-
-    (keyMap "n" "<S-C-u>"
-      (mkRaw ''
-        function()
-          require("opencode").command("session.half.page.up")
-        end
-      '')
-      { desc = "opencode half page up"; })
-    (keyMap "n" "<S-C-d>"
-      (mkRaw ''
-        function()
-          require("opencode").command("session.half.page.down")
-        end
-      '')
-      { desc = "opencode half page down"; })
-
-    # You may want these if you stick with the opinionated "<C-a>" and "<C-x>" above — otherwise consider "<leader>o".
-    (keyMap "n" "+" "<C-a>" { desc = "Increment"; noremap = true; })
-    (keyMap "n" "-" "<C-x>" { desc = "Decrement"; noremap = true; })
-  ];
-}

+ 80 - 0
home/features/nvim/configs/render-markdown.nix

@@ -0,0 +1,80 @@
+{
+  plugins.render-markdown = {
+    enable = true;
+    lazyLoad.settings.ft = "markdown";
+    settings = {
+      enabled = true;
+      render_modes = [
+        "n"
+        "c"
+        "t"
+        "v"
+      ];
+
+      anti_conceal = {
+        enabled = true;
+        ignore = {
+          code_background = true;
+          sign = true;
+        };
+      };
+
+      heading = {
+        sign = true;
+        position = "overlay";
+        icons = [
+          "󰲡 "
+          "󰲣 "
+          "󰲥 "
+          "󰲧 "
+          "󰲩 "
+          "󰲫 "
+        ];
+        signs = [ "󰫎 " ];
+        width = "block";
+        left_pad = 2;
+      };
+
+      callout = {
+        note = {
+          raw = "[!NOTE]";
+          rendered = "󰋽 Note";
+          highlight = "RenderMarkdownInfo";
+        };
+        tip = {
+          raw = "[!TIP]";
+          rendered = "󱄑 Tip";
+          highlight = "RenderMarkdownSuccess";
+        };
+      };
+
+      checkbox = {
+        enabled = true;
+        unchecked = {
+          icon = "󰄱 ";
+        };
+        checked = {
+          icon = "󰄵 ";
+        };
+        custom = {
+          todo = {
+            raw = "[-]";
+            rendered = "󰥔 Pending";
+            highlight = "RenderMarkdownWarn";
+          };
+        };
+      };
+
+      pipe_table = {
+        preset = "round";
+        style = "full";
+      };
+
+      latex = {
+        enabled = true;
+        top_pad = 1;
+        bottom_pad = 1;
+      };
+    };
+  };
+}

+ 5 - 2
home/features/nvim/configs/telescope.nix

@@ -1,7 +1,8 @@
 {
   plugins.telescope = {
     enable = true;
-    lazyLoad.settings.cmd = [ "Telescope" ];
+    # lazyLoad.settings.cmd = [ "Telescope" ];
+
     settings = {
       defaults = {
         prompt_prefix = "   ";
@@ -17,7 +18,9 @@
           height = 0.80;
         };
         mappings = {
-          n = { "q".__raw = ''require("telescope.actions").close''; };
+          n = {
+            "q".__raw = ''require("telescope.actions").close'';
+          };
         };
       };
       # extensions_list = [ "themes" "terms" ];

+ 32 - 0
home/features/nvim/configs/zen-mode.nix

@@ -0,0 +1,32 @@
+{
+  plugins.zen-mode = {
+    enable = true;
+    lazyLoad.settings.cmd = [ "ZenMode" ];
+    settings = {
+      window = {
+        backdrop = 1.0;
+        width = 0.5;
+        height = 1.0;
+        options = {
+          signcolumn = "no";
+          number = false;
+          relativenumber = false;
+          cursorline = false;
+          cursorcolumn = false;
+          foldcolumn = "0";
+          list = false;
+        };
+      };
+      plugins = {
+        options = {
+          enabled = true;
+          laststatus = 0;
+          showcmd = false;
+        };
+        twilight.enabled = true;
+        gitsigns.enabled = false;
+        tmux.enabled = false;
+      };
+    };
+  };
+}

+ 24 - 4
home/features/nvim/default.nix

@@ -1,7 +1,8 @@
-{ config
-, inputs
-, pkgs
-, ...
+{
+  config,
+  inputs,
+  pkgs,
+  ...
 }:
 {
   imports = [ inputs.nixvim.homeModules.nixvim ];
@@ -17,6 +18,25 @@
     defaultEditor = true;
     vimdiffAlias = true;
 
+    # extraPlugins = [ pkgs.opencode-nvim ];
+    # extraConfigLua = ''
+    #   require("opencode").setup({
+    #     default_mode = 'plan',
+    #   })
+    #
+    #   -- close zen-mode if opencode is toggled
+    #   vim.keymap.set('n', '<leader>og', function()
+    #     local ok, zen = pcall(require, 'zen-mode')
+    #     if ok then
+    #       local view = require('zen-mode.view')
+    #       if view.is_open() then
+    #         zen.close()
+    #       end
+    #     end
+    #     require('opencode.api').toggle()
+    #   end, { desc = 'Toggle Opencode' })
+    # '';
+
     imports = [
       ./autocmds.nix
       ./configs

+ 95 - 100
home/features/nvim/mapping.nix

@@ -1,9 +1,17 @@
-{ lib
-, ...
+{
+  lib,
+  ...
 }:
 let
   inherit (lib.nixvim) mkRaw;
-  keyMap = mode: key: action: options: { inherit mode key action options; };
+  keyMap = mode: key: action: options: {
+    inherit
+      mode
+      key
+      action
+      options
+      ;
+  };
 in
 {
   keymaps = [
@@ -29,51 +37,48 @@ in
     (keyMap "n" "<C-s>" "<cmd>w<CR>" { desc = "general save file"; })
     (keyMap "n" "<C-c>" "<cmd>%y+<CR>" { desc = "general copy whole file"; })
 
-    (keyMap "n" "<leader>n" "<cmd>set nu!<CR>" { desc = "toggle line number"; })
     (keyMap "n" "<leader>rn" "<cmd>set rnu!<CR>" { desc = "toggle relative number"; })
     (keyMap "n" "<leader>ch" "<cmd>NvCheatsheet<CR>" { desc = "toggle nvcheatsheet"; })
 
-    (keyMap [ "n" "x" ] "<leader>fm"
-      (mkRaw ''
-        function ()
-          require("conform").format { lsp_fallback = true }
-        end
-      '')
-      { desc = "general format file"; })
+    (keyMap [ "n" "x" ] "<leader>fm" (mkRaw ''
+      function ()
+        require("conform").format { lsp_fallback = true }
+      end
+    '') { desc = "general format file"; })
 
     # global lsp keyMappings
-    (keyMap "n" "<leader>ds" (mkRaw ''vim.diagnostic.setloclist'') { desc = "LSP diagnostic loclist"; })
+    (keyMap "n" "<leader>ds" (mkRaw "vim.diagnostic.setloclist") { desc = "LSP diagnostic loclist"; })
 
     # -- tabufline
     (keyMap "n" "<leader>b" "<cmd>enew<CR>" { desc = "buffer new"; })
 
-    (keyMap "n" "<tab>"
-      (mkRaw ''
-        function()
-          require("nvchad.tabufline").next()
-        end
-      '')
-      { desc = "buffer goto next"; })
-
-    (keyMap "n" "<S-tab>"
-      (mkRaw ''
-        function()
-          require("nvchad.tabufline").prev()
-        end
-      '')
-      { desc = "buffer goto prev"; })
-
-    (keyMap "n" "<leader>x"
-      (mkRaw ''
-        function()
-          require("nvchad.tabufline").close_buffer()
-        end
-      '')
-      { desc = "buffer close"; })
+    (keyMap "n" "<tab>" (mkRaw ''
+      function()
+        require("nvchad.tabufline").next()
+      end
+    '') { desc = "buffer goto next"; })
+
+    (keyMap "n" "<S-tab>" (mkRaw ''
+      function()
+        require("nvchad.tabufline").prev()
+      end
+    '') { desc = "buffer goto prev"; })
+
+    (keyMap "n" "<leader>x" (mkRaw ''
+      function()
+        require("nvchad.tabufline").close_buffer()
+      end
+    '') { desc = "buffer close"; })
 
     # Comment
-    (keyMap "n" "<leader>/" "gcc" { desc = "toggle comment"; remap = true; })
-    (keyMap "v" "<leader>/" "gc" { desc = "toggle comment"; remap = true; })
+    (keyMap "n" "<leader>/" "gcc" {
+      desc = "toggle comment";
+      remap = true;
+    })
+    (keyMap "v" "<leader>/" "gc" {
+      desc = "toggle comment";
+      remap = true;
+    })
 
     # nvimtree
     (keyMap "n" "<C-n>" "<cmd>NvimTreeToggle<CR>" { desc = "nvimtree toggle window"; })
@@ -85,85 +90,75 @@ in
     (keyMap "n" "<leader>fh" "<cmd>Telescope help_tags<CR>" { desc = "telescope help page"; })
     (keyMap "n" "<leader>ma" "<cmd>Telescope marks<CR>" { desc = "telescope find marks"; })
     (keyMap "n" "<leader>fo" "<cmd>Telescope oldfiles<CR>" { desc = "telescope find oldfiles"; })
-    (keyMap "n" "<leader>fz" "<cmd>Telescope current_buffer_fuzzy_find<CR>" { desc = "telescope find in current buffer"; })
+    (keyMap "n" "<leader>fz" "<cmd>Telescope current_buffer_fuzzy_find<CR>" {
+      desc = "telescope find in current buffer";
+    })
     (keyMap "n" "<leader>cm" "<cmd>Telescope git_commits<CR>" { desc = "telescope git commits"; })
     (keyMap "n" "<leader>gt" "<cmd>Telescope git_status<CR>" { desc = "telescope git status"; })
     (keyMap "n" "<leader>pt" "<cmd>Telescope terms<CR>" { desc = "telescope pick hidden term"; })
 
-    (keyMap "n" "<leader>th"
-      (mkRaw ''
-        function()
-          require("nvchad.themes").open()
-        end
-      '')
-      { desc = "telescope nvchad themes"; })
+    (keyMap "n" "<leader>th" (mkRaw ''
+      function()
+        require("nvchad.themes").open()
+      end
+    '') { desc = "telescope nvchad themes"; })
 
     (keyMap "n" "<leader>ff" "<cmd>Telescope find_files<cr>" { desc = "telescope find files"; })
-    (keyMap "n" "<leader>fa" "<cmd>Telescope find_files follow=true no_ignore=true hidden=true<CR>" { desc = "telescope find all files"; })
+    (keyMap "n" "<leader>fa" "<cmd>Telescope find_files follow=true no_ignore=true hidden=true<CR>" {
+      desc = "telescope find all files";
+    })
 
     # terminal
     (keyMap "t" "<C-x>" "<C-\\><C-N>" { desc = "terminal escape terminal mode"; })
 
     # new terminals
-    (keyMap "n" "<leader>h"
-      (mkRaw ''
-        function()
-          require("nvchad.term").new { pos = "sp" }
-        end
-      '')
-      { desc = "terminal new horizontal term"; })
-
-    (keyMap "n" "<leader>v"
-      (mkRaw ''
-        function()
-          require("nvchad.term").new { pos = "vsp" }
-        end
-      '')
-      { desc = "terminal new vertical term"; })
+    (keyMap "n" "<leader>h" (mkRaw ''
+      function()
+        require("nvchad.term").new { pos = "sp" }
+      end
+    '') { desc = "terminal new horizontal term"; })
+
+    (keyMap "n" "<leader>v" (mkRaw ''
+      function()
+        require("nvchad.term").new { pos = "vsp" }
+      end
+    '') { desc = "terminal new vertical term"; })
 
     # toggleable
-    (keyMap [ "n" "t" ] "<A-v>"
-      (mkRaw ''
-        function()
-          require("nvchad.term").toggle { pos = "vsp", id = "vtoggleTerm" }
-        end
-      '')
-      { desc = "terminal toggleable vertical term"; })
-
-    (keyMap [ "n" "t" ] "<A-h>"
-      (mkRaw ''
-        function()
-          require("nvchad.term").toggle { pos = "sp", id = "htoggleTerm" }
-        end
-      '')
-      { desc = "terminal toggleable horizontal term"; })
-
-    (keyMap [ "n" "t" ] "<A-i>"
-      (mkRaw ''
-        function()
-          require("nvchad.term").toggle {
-            pos = "float",
-            id = "floatTerm",
-            floatOpts = {
-              row = .04,
-              col = .04,
-              width = .9,
-              height = .9,
-            },
-          }
-        end
-      '')
-      { desc = "terminal toggle floating term"; })
+    (keyMap [ "n" "t" ] "<A-v>" (mkRaw ''
+      function()
+        require("nvchad.term").toggle { pos = "vsp", id = "vtoggleTerm" }
+      end
+    '') { desc = "terminal toggleable vertical term"; })
+
+    (keyMap [ "n" "t" ] "<A-h>" (mkRaw ''
+      function()
+        require("nvchad.term").toggle { pos = "sp", id = "htoggleTerm" }
+      end
+    '') { desc = "terminal toggleable horizontal term"; })
+
+    (keyMap [ "n" "t" ] "<A-i>" (mkRaw ''
+      function()
+        require("nvchad.term").toggle {
+          pos = "float",
+          id = "floatTerm",
+          floatOpts = {
+            row = .04,
+            col = .04,
+            width = .9,
+            height = .9,
+          },
+        }
+      end
+    '') { desc = "terminal toggle floating term"; })
 
     # whichkey
     (keyMap "n" "<leader>wK" "<cmd>WhichKey <CR>" { desc = "whichkey all keymaps"; })
 
-    (keyMap "n" "<leader>wk"
-      (mkRaw ''
-        function()
-          vim.cmd("WhichKey " .. vim.fn.input "WhichKey: ")
-        end
-      '')
-      { desc = "whichkey query lookup"; })
+    (keyMap "n" "<leader>wk" (mkRaw ''
+      function()
+        vim.cmd("WhichKey " .. vim.fn.input "WhichKey: ")
+      end
+    '') { desc = "whichkey query lookup"; })
   ];
 }

+ 15 - 13
packages/default.nix

@@ -1,15 +1,18 @@
-{ pkgs ? # If pkgs is not defined, instanciate nixpkgs from locked commit
-  let
-    lock = (builtins.fromJSON (builtins.readFile ../flake.lock)).nodes.nixpkgs.locked;
-    nixpkgs = fetchTarball {
-      url = "https://github.com/nixos/nixpkgs/archive/${lock.rev}.tar.gz";
-      sha256 = lock.narHash;
-    };
-  in
-  import nixpkgs {
-    overlays = [ (import (fetchTarball "https://github.com/tadfisher/nix-dart/archive/main.tar.gz")).overlay ];
-  }
-, ...
+{
+  pkgs ? # If pkgs is not defined, instanciate nixpkgs from locked commit
+    let
+      lock = (builtins.fromJSON (builtins.readFile ../flake.lock)).nodes.nixpkgs.locked;
+      nixpkgs = fetchTarball {
+        url = "https://github.com/nixos/nixpkgs/archive/${lock.rev}.tar.gz";
+        sha256 = lock.narHash;
+      };
+    in
+    import nixpkgs {
+      overlays = [
+        (import (fetchTarball "https://github.com/tadfisher/nix-dart/archive/main.tar.gz")).overlay
+      ];
+    },
+  ...
 }:
 {
   aerospace-tmux-focus = pkgs.callPackage ./aerospace-tmux-focus.nix { };
@@ -18,7 +21,6 @@
   go-avahi-cname = pkgs.callPackage ./go-avahi-cname.nix { };
   hello = pkgs.callPackage ./hello.nix { };
   nct6775-pwm-udev-package = pkgs.callPackage ./nct6775-pwm-udev-package.nix { };
-  opencode-nvim = pkgs.callPackage ./opencode-nvim.nix { };
   photo-cli = pkgs.callPackage ./photo-cli.nix { };
   tmux-select-pane-no-wrap = pkgs.callPackage ./tmux-select-pane-no-wrap.nix { };
   zapstore-cli = pkgs.callPackage ./zapstore-cli { };

+ 0 - 17
packages/opencode-nvim.nix

@@ -1,17 +0,0 @@
-{
-  fetchFromGitHub,
-  vimUtils,
-}:
-
-vimUtils.buildVimPlugin {
-  pname = "opencode.nvim";
-  version = "2025-08-08";
-  src = fetchFromGitHub {
-    owner = "NickvanDyke";
-    repo = "opencode.nvim";
-    rev = "b76199843f2fcdd9f66223595d43446c01f86984";
-    sha256 = "sha256-DolWUWcYauRFuyZWGMX1D/qzHk7u7ZvSD1UZ61xXDk0=";
-  };
-  meta.homepage = "https://github.com/NickvanDyke/opencode.nvim/";
-  meta.hydraPlatforms = [ ];
-}