diff --git a/flake.lock b/flake.lock index c12556c..3ee13cd 100644 --- a/flake.lock +++ b/flake.lock @@ -19,6 +19,27 @@ "type": "github" } }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": [ + "nixvim", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1753121425, + "narHash": "sha256-TVcTNvOeWWk1DXljFxVRp+E0tzG1LhrVjOGGoMHuXio=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "644e0fc48951a860279da645ba77fe4a6e814c5e", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, "flake-utils": { "inputs": { "systems": "systems" @@ -37,6 +58,24 @@ "type": "github" } }, + "flake-utils_2": { + "inputs": { + "systems": "systems_2" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, "home-manager": { "inputs": { "nixpkgs": [ @@ -57,6 +96,34 @@ "type": "github" } }, + "ixx": { + "inputs": { + "flake-utils": [ + "nixvim", + "nuschtosSearch", + "flake-utils" + ], + "nixpkgs": [ + "nixvim", + "nuschtosSearch", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1748294338, + "narHash": "sha256-FVO01jdmUNArzBS7NmaktLdGA5qA3lUMJ4B7a05Iynw=", + "owner": "NuschtOS", + "repo": "ixx", + "rev": "cc5f390f7caf265461d4aab37e98d2292ebbdb85", + "type": "github" + }, + "original": { + "owner": "NuschtOS", + "ref": "v0.0.8", + "repo": "ixx", + "type": "github" + } + }, "nix-darwin": { "inputs": { "nixpkgs": [ @@ -110,12 +177,59 @@ "type": "github" } }, + "nixvim": { + "inputs": { + "flake-parts": "flake-parts", + "nixpkgs": [ + "nixpkgs" + ], + "nuschtosSearch": "nuschtosSearch", + "systems": "systems_3" + }, + "locked": { + "lastModified": 1753533009, + "narHash": "sha256-4KlfDVsYL9c3ogEehJcQOBZ+pUBH7Lwvlu2J6FCtSJc=", + "owner": "nix-community", + "repo": "nixvim", + "rev": "29edaafdb088cee3d8c616a4a5bb48b5eecc647c", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixvim", + "type": "github" + } + }, + "nuschtosSearch": { + "inputs": { + "flake-utils": "flake-utils_2", + "ixx": "ixx", + "nixpkgs": [ + "nixvim", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1753450833, + "narHash": "sha256-Pmpke0JtLRzgdlwDC5a+aiLVZ11JPUO5Bcqkj0nHE/k=", + "owner": "NuschtOS", + "repo": "search", + "rev": "40987cc1a24feba378438d691f87c52819f7bd75", + "type": "github" + }, + "original": { + "owner": "NuschtOS", + "repo": "search", + "type": "github" + } + }, "root": { "inputs": { "claude-code": "claude-code", "home-manager": "home-manager", "nix-darwin": "nix-darwin", - "nixpkgs": "nixpkgs_2" + "nixpkgs": "nixpkgs_2", + "nixvim": "nixvim" } }, "systems": { @@ -132,6 +246,36 @@ "repo": "default", "type": "github" } + }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_3": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } } }, "root": "root", diff --git a/flake.nix b/flake.nix index 82b2804..a1b6182 100644 --- a/flake.nix +++ b/flake.nix @@ -7,10 +7,12 @@ nix-darwin.inputs.nixpkgs.follows = "nixpkgs"; home-manager.url = "github:nix-community/home-manager"; home-manager.inputs.nixpkgs.follows = "nixpkgs"; + nixvim.url = "github:nix-community/nixvim"; + nixvim.inputs.nixpkgs.follows = "nixpkgs"; claude-code.url = "github:sadjow/claude-code-nix"; }; - outputs = inputs@{ self, nix-darwin, nixpkgs, home-manager, claude-code }: + outputs = inputs@{ self, nix-darwin, nixpkgs, home-manager, nixvim, claude-code }: let configuration = { pkgs, ... }: { environment.systemPackages = @@ -26,7 +28,12 @@ }; homeConfiguration = { pkgs, ... }: { - imports = [ ./nvim.nix ./tmux.nix ./zsh.nix ]; + imports = [ + nixvim.homeManagerModules.nixvim + ./nvim.nix + ./tmux.nix + ./zsh.nix + ]; home.username = "yanlin"; home.homeDirectory = "/Users/yanlin"; @@ -64,7 +71,7 @@ homeConfigurations.yanlin = home-manager.lib.homeManagerConfiguration { pkgs = nixpkgs.legacyPackages.aarch64-darwin; modules = [ homeConfiguration ]; - extraSpecialArgs = { inherit claude-code; }; + extraSpecialArgs = { inherit claude-code nixvim; }; }; }; } diff --git a/nvim.nix b/nvim.nix index 8f93889..7c65a8a 100644 --- a/nvim.nix +++ b/nvim.nix @@ -1,94 +1,173 @@ { pkgs, ... }: { - programs.neovim = { + programs.nixvim = { enable = true; defaultEditor = true; - plugins = with pkgs.vimPlugins; [ - nvim-tree-lua - nvim-treesitter.withAllGrammars - lualine-nvim - nvim-web-devicons - gruvbox-nvim + + # Global settings + globals.mapleader = " "; + + # Vim options + opts = { + number = true; + relativenumber = false; + expandtab = true; + shiftwidth = 2; + tabstop = 2; + smartindent = true; + wrap = false; + linebreak = true; # Don't break words when wrapping + breakindent = true; # Preserve indentation when wrapping + termguicolors = true; + }; + + # Enable filetype detection + viAlias = true; + vimAlias = true; + + # Gruvbox colorscheme with hard contrast + colorschemes.gruvbox = { + enable = true; + settings = { + contrast = "hard"; # Makes background much darker (#1d2021 instead of #282828) + background = "dark"; + }; + }; + + # Plugins + plugins = { + # File explorer + nvim-tree = { + enable = true; + # NixVim nvim-tree uses extraConfig for detailed settings + }; + + # Syntax highlighting + treesitter = { + enable = true; + settings = { + highlight = { + enable = true; + additional_vim_regex_highlighting = true; + }; + indent = { + enable = true; + }; + ensure_installed = []; # Managed by Nix + auto_install = false; + }; + grammarPackages = with pkgs.vimPlugins.nvim-treesitter.builtGrammars; [ + bash c cpp css dockerfile go html javascript json lua markdown nix python rust typescript yaml + ]; + }; + + # Status line with gruvbox theme and relative paths + lualine = { + enable = true; + settings = { + options = { + theme = "gruvbox_dark"; + component_separators = { left = "|"; right = "|"; }; + section_separators = { left = " "; right = " "; }; + }; + sections = { + lualine_c = [{ __unkeyed-1 = "filename"; path = 1; }]; + }; + }; + }; + + # Web dev icons + web-devicons = { + enable = true; + }; + }; + + # Extra plugins that don't have dedicated modules + extraPlugins = with pkgs.vimPlugins; [ vim-fugitive ]; - extraLuaConfig = '' - -- Basic settings - vim.opt.number = true - vim.opt.relativenumber = false - vim.opt.expandtab = true - vim.opt.shiftwidth = 2 - vim.opt.tabstop = 2 - vim.opt.smartindent = true - vim.opt.wrap = false - vim.opt.linebreak = true -- Don't break words when wrapping - vim.opt.breakindent = true -- Preserve indentation when wrapping - vim.opt.termguicolors = true - -- Enable filetype detection and syntax - vim.cmd('filetype on') - vim.cmd('filetype plugin on') - vim.cmd('filetype indent on') - vim.cmd('syntax enable') + # Keymaps + keymaps = [ + # File explorer + { + mode = "n"; + key = "e"; + action = ":NvimTreeToggle"; + options = { desc = "Toggle file explorer"; }; + } - -- Leader key - vim.g.mapleader = " " + # Basic keymaps + { + mode = "n"; + key = "w"; + action = ":w"; + options = { desc = "Save file"; }; + } + { + mode = "n"; + key = "q"; + action = ":q"; + options = { desc = "Quit"; }; + } - -- Configure gruvbox with hard contrast for darker background - require("gruvbox").setup({ - contrast = "hard", -- Makes background much darker (#1d2021 instead of #282828) - }) - vim.opt.background = "dark" - vim.cmd('colorscheme gruvbox') + # System clipboard keymaps + { + mode = ["n" "v"]; + key = "y"; + action = "\"+y"; + options = { desc = "Copy to system clipboard"; }; + } + { + mode = "n"; + key = "p"; + action = "\"+p"; + options = { desc = "Paste from system clipboard"; }; + } + { + mode = "v"; + key = "p"; + action = "\"+p"; + options = { desc = "Replace selection with system clipboard"; }; + } - -- Nvim-tree setup + # Git keymaps (vim-fugitive) + { + mode = "n"; + key = "gs"; + action = ":Git"; + options = { desc = "Git status"; }; + } + { + mode = "n"; + key = "gd"; + action = ":Git diff"; + options = { desc = "Git diff"; }; + } + { + mode = "n"; + key = "gc"; + action = ":Git commit"; + options = { desc = "Git commit"; }; + } + { + mode = "n"; + key = "gp"; + action = ":Git push"; + options = { desc = "Git push"; }; + } + ]; + + # Additional Lua configuration for plugins that need custom setup + extraConfigLua = '' + -- Nvim-tree setup with filters require("nvim-tree").setup({ filters = { - dotfiles = true, -- Hide dotfiles by default (Ctrl+H to toggle) - git_ignored = false, -- Show gitignored files by default (Ctrl+I to toggle) + dotfiles = true, -- Hide dotfiles by default (H to toggle) + git_ignored = false, -- Show gitignored files by default (I to toggle) }, }) - vim.keymap.set("n", "e", ":NvimTreeToggle", { desc = "Toggle file explorer" }) - - -- Treesitter setup - require('nvim-treesitter.configs').setup({ - highlight = { - enable = true, - additional_vim_regex_highlighting = true, - }, - indent = { - enable = true, - }, - ensure_installed = {}, -- Managed by Nix - auto_install = false, - }) - - -- Lualine setup with gruvbox theme - require('lualine').setup({ - options = { - theme = 'gruvbox_dark', - component_separators = { left = '|', right = '|'}, - section_separators = { left = ' ', right = ' '}, - }, - sections = { - lualine_c = { { 'filename', path = 1 } }, - }, - }) - - -- Basic keymaps - vim.keymap.set("n", "w", ":w", { desc = "Save file" }) - vim.keymap.set("n", "q", ":q", { desc = "Quit" }) - - -- System clipboard keymaps - vim.keymap.set({"n", "v"}, "y", "\"+y", { desc = "Copy to system clipboard" }) - vim.keymap.set("n", "p", "\"+p", { desc = "Paste from system clipboard" }) - vim.keymap.set("v", "p", "\"+p", { desc = "Replace selection with system clipboard" }) - - -- Git keymaps (vim-fugitive) - vim.keymap.set("n", "gs", ":Git", { desc = "Git status" }) - vim.keymap.set("n", "gd", ":Git diff", { desc = "Git diff" }) - vim.keymap.set("n", "gc", ":Git commit", { desc = "Git commit" }) - vim.keymap.set("n", "gp", ":Git push", { desc = "Git push" }) ''; }; -} +} \ No newline at end of file