From 28f82915cf149fb15853519c78a5992db6af84ec Mon Sep 17 00:00:00 2001 From: dim Date: Sun, 9 Nov 2025 21:12:03 +0700 Subject: [PATCH] change from nixvim to nvf --- flake.lock | 114 +++++++++++++- flake.nix | 7 +- home/programs/nvf/default.nix | 13 ++ home/programs/nvf/keymaps.nix | 173 +++++++++++++++++++++ home/programs/nvf/languages.nix | 99 ++++++++++++ home/programs/nvf/mini.nix | 13 ++ home/programs/nvf/options.nix | 40 +++++ home/programs/nvf/picker.nix | 257 +++++++++++++++++++++++++++++++ home/programs/nvf/snacks.nix | 19 +++ home/programs/nvf/utils.nix | 49 ++++++ home/system/hyprland/default.nix | 2 +- hosts/laptop/home.nix | 3 +- nixos/fonts.nix | 2 +- themes/stylix/nixy.nix | 2 +- 14 files changed, 780 insertions(+), 13 deletions(-) create mode 100644 home/programs/nvf/default.nix create mode 100644 home/programs/nvf/keymaps.nix create mode 100644 home/programs/nvf/languages.nix create mode 100644 home/programs/nvf/mini.nix create mode 100644 home/programs/nvf/options.nix create mode 100644 home/programs/nvf/picker.nix create mode 100644 home/programs/nvf/snacks.nix create mode 100644 home/programs/nvf/utils.nix diff --git a/flake.lock b/flake.lock index f5253da..9e1f2f8 100644 --- a/flake.lock +++ b/flake.lock @@ -155,6 +155,22 @@ "type": "github" } }, + "flake-compat_2": { + "flake": false, + "locked": { + "lastModified": 1751685974, + "narHash": "sha256-NKw96t+BgHIYzHUjkTK95FqYRVKB8DHpVhefWSz/kTw=", + "ref": "refs/heads/main", + "rev": "549f2762aebeff29a2e5ece7a7dc0f955281a1d1", + "revCount": 92, + "type": "git", + "url": "https://git.lix.systems/lix-project/flake-compat.git" + }, + "original": { + "type": "git", + "url": "https://git.lix.systems/lix-project/flake-compat.git" + } + }, "flake-parts": { "inputs": { "nixpkgs-lib": [ @@ -177,6 +193,27 @@ } }, "flake-parts_2": { + "inputs": { + "nixpkgs-lib": [ + "nvf", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1760948891, + "narHash": "sha256-TmWcdiUUaWk8J4lpjzu4gCGxWY6/Ok7mOK4fIFfBuU4=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "864599284fc7c0ba6357ed89ed5e2cd5040f0c04", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_3": { "inputs": { "nixpkgs-lib": [ "stylix", @@ -706,6 +743,21 @@ "type": "github" } }, + "mnw": { + "locked": { + "lastModified": 1758834834, + "narHash": "sha256-Y7IvY4F8vajZyp3WGf+KaiIVwondEkMFkt92Cr9NZmg=", + "owner": "Gerg-L", + "repo": "mnw", + "rev": "cfbc7d1cc832e318d0863a5fc91d940a96034001", + "type": "github" + }, + "original": { + "owner": "Gerg-L", + "repo": "mnw", + "type": "github" + } + }, "nixos-hardware": { "locked": { "lastModified": 1762267440, @@ -771,6 +823,22 @@ } }, "nixpkgs_4": { + "locked": { + "lastModified": 1761880412, + "narHash": "sha256-QoJjGd4NstnyOG4mm4KXF+weBzA2AH/7gn1Pmpfcb0A=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a7fc11be66bdfb5cdde611ee5ce381c183da8386", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_5": { "locked": { "lastModified": 1758690382, "narHash": "sha256-NY3kSorgqE5LMm1LqNwGne3ZLMF2/ILgLpFr1fS4X3o=", @@ -857,6 +925,28 @@ "type": "github" } }, + "nvf": { + "inputs": { + "flake-compat": "flake-compat_2", + "flake-parts": "flake-parts_2", + "mnw": "mnw", + "nixpkgs": "nixpkgs_4", + "systems": "systems_5" + }, + "locked": { + "lastModified": 1762622004, + "narHash": "sha256-NpzzgaoMK8aRHnndHWbYNKLcZN0r1y6icCoJvGoBsoE=", + "owner": "notashelf", + "repo": "nvf", + "rev": "09470524a214ed26633ddc2b6ec0c9bf31a8b909", + "type": "github" + }, + "original": { + "owner": "notashelf", + "repo": "nvf", + "type": "github" + } + }, "pre-commit-hooks": { "inputs": { "flake-compat": "flake-compat", @@ -889,6 +979,7 @@ "nixos-hardware": "nixos-hardware", "nixpkgs": "nixpkgs_3", "nixvim": "nixvim", + "nvf": "nvf", "spicetify-nix": "spicetify-nix", "stylix": "stylix" } @@ -898,7 +989,7 @@ "nixpkgs": [ "nixpkgs" ], - "systems": "systems_5" + "systems": "systems_6" }, "locked": { "lastModified": 1762057664, @@ -921,11 +1012,11 @@ "base16-helix": "base16-helix", "base16-vim": "base16-vim", "firefox-gnome-theme": "firefox-gnome-theme", - "flake-parts": "flake-parts_2", + "flake-parts": "flake-parts_3", "gnome-shell": "gnome-shell", - "nixpkgs": "nixpkgs_4", + "nixpkgs": "nixpkgs_5", "nur": "nur", - "systems": "systems_6", + "systems": "systems_7", "tinted-foot": "tinted-foot", "tinted-kitty": "tinted-kitty", "tinted-schemes": "tinted-schemes", @@ -1036,6 +1127,21 @@ "type": "github" } }, + "systems_7": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, "tinted-foot": { "flake": false, "locked": { diff --git a/flake.nix b/flake.nix index df4c746..36698f0 100644 --- a/flake.nix +++ b/flake.nix @@ -26,18 +26,17 @@ url = "gitlab:rycee/nur-expressions?dir=pkgs/firefox-addons"; inputs.nixpkgs.follows = "nixpkgs"; }; + nvf.url = "github:notashelf/nvf"; }; - outputs = inputs @ {nixpkgs, ...}: { + outputs = inputs@{ nixpkgs, ... }: { nixosConfigurations = { dark = # CHANGEME: This should match the 'hostname' in your variables.nix file nixpkgs.lib.nixosSystem { system = "x86_64-linux"; modules = [ - { - _module.args = {inherit inputs;}; - } + { _module.args = { inherit inputs; }; } inputs.nixos-hardware.nixosModules.lenovo-thinkpad-x270 # CHANGEME: check https://github.com/NixOS/nixos-hardware inputs.home-manager.nixosModules.home-manager inputs.stylix.nixosModules.stylix diff --git a/home/programs/nvf/default.nix b/home/programs/nvf/default.nix new file mode 100644 index 0000000..5babac5 --- /dev/null +++ b/home/programs/nvf/default.nix @@ -0,0 +1,13 @@ +{ inputs, pkgs, ... }: { + inputs = [ + inputs.nfv.homeManagerModules.default + ./options.nix + ./languages.nix + ./picker.nix + ./snacks.nix + ./keymaps.nix + ./utils.nix + ./mini.nix + ]; + programs.nvf = { enable = true; }; +} diff --git a/home/programs/nvf/keymaps.nix b/home/programs/nvf/keymaps.nix new file mode 100644 index 0000000..d2705fe --- /dev/null +++ b/home/programs/nvf/keymaps.nix @@ -0,0 +1,173 @@ +{ + programs.nvf.settings.vim = { + globals.mapleader = " "; + binds = { + whichKey = { + enable = true; + # TODO: registers + register = { }; + }; + }; + keymaps = [ + # General Mappings + { + key = "s"; + mode = "n"; + silent = true; + action = "lua require('flash').jump()"; + desc = "Flash"; + } + { + key = "K"; + mode = "n"; + silent = true; + action = "lua vim.lsp.buf.hover()"; + desc = "LSP Hover"; + } + { + key = ""; + mode = "n"; + silent = true; + action = "bnext"; + desc = "Next Buffer"; + } + + # Kitty navigator + { + key = ""; + mode = "n"; + silent = true; + action = "KittyNavigateLeft"; + } + { + key = ""; + mode = "n"; + silent = true; + action = "KittyNavigateDown"; + } + { + key = ""; + mode = "n"; + silent = true; + action = "KittyNavigateUp"; + } + { + key = ""; + mode = "n"; + silent = true; + action = "KittyNavigateRight"; + } + + # Disable Arrow Keys in Normal Mode + { + key = ""; + mode = "n"; + silent = true; + action = ""; + desc = "Disable Up Arrow"; + } + { + key = ""; + mode = "n"; + silent = true; + action = ""; + desc = "Disable Down Arrow"; + } + { + key = ""; + mode = "n"; + silent = true; + action = ""; + desc = "Disable Left Arrow"; + } + { + key = ""; + mode = "n"; + silent = true; + action = ""; + desc = "Disable Right Arrow"; + } + + # UI + { + key = "uw"; + mode = "n"; + silent = true; + action = "set wrap!"; + desc = "Toggle word wrapping"; + } + { + key = "ul"; + mode = "n"; + silent = true; + action = "set linebreak!"; + desc = "Toggle linebreak"; + } + { + key = "us"; + mode = "n"; + silent = true; + action = "set spell!"; + desc = "Toggle spellLazyGitcheck"; + } + { + key = "uc"; + mode = "n"; + silent = true; + action = "set cursorline!"; + desc = "Toggle cursorline"; + } + { + key = "un"; + mode = "n"; + silent = true; + action = "set number!"; + desc = "Toggle line numbers"; + } + { + key = "ur"; + mode = "n"; + silent = true; + action = "set relativenumber!"; + desc = "Toggle relative line numbers"; + } + { + key = "ut"; + mode = "n"; + silent = true; + action = "set showtabline=2"; + desc = "Show tabline"; + } + { + key = "uT"; + mode = "n"; + silent = true; + action = "set showtabline=0"; + desc = "Hide tabline"; + } + + # Windows + { + key = "ws"; + mode = "n"; + silent = true; + action = "split"; + desc = "Split"; + } + { + key = "wv"; + mode = "n"; + silent = true; + action = "vsplit"; + desc = "VSplit"; + } + { + key = "wd"; + mode = "n"; + silent = true; + action = "close"; + desc = "Close"; + } + ]; + }; +} diff --git a/home/programs/nvf/languages.nix b/home/programs/nvf/languages.nix new file mode 100644 index 0000000..e347b83 --- /dev/null +++ b/home/programs/nvf/languages.nix @@ -0,0 +1,99 @@ +{ lib, pkgs, ... }: { + programs.nvf.settings.vim = { + diagnostics = { + enable = true; + config = { + signs = { + text = { + "vim.diagnostic.severity.Error" = " "; + "vim.diagnostic.severity.Warn" = " "; + "vim.diagnostic.severity.Hint" = " "; + "vim.diagnostic.severity.Info" = " "; + }; + }; + underline = true; + update_in_insert = true; + virtual_text = { + format = lib.generators.mkLuaInline + # lua + '' + function(diagnostic) + return string.format("%s", diagnostic.message) + --return string.format("%s (%s)", diagnostic.message, diagnostic.source) + end + ''; + }; + }; + nvim-lint = { enable = true; }; + }; + syntaxHighlighting = true; + treesitter = { + enable = true; + autotagHtml = true; + context.enable = true; + highlight.enable = true; + grammars = with pkgs.vimPlugins.nvim-treesitter.builtGrammars; + [ + typescript # in language settings only tsx gets enabled, not typescript + ]; + }; + lsp = { + enable = true; + trouble.enable = true; + lspSignature.enable = true; + lspconfig.enable = true; + formatOnSave = true; + inlayHints.enable = true; + null-ls.enable = true; + servers.nixd.settings.nil.nix.autoArchive = true; + otter-nvim = { + enable = true; + setupOpts = { + buffers.set_filetype = true; + lsp = { diagnostic_update_event = [ "BufWritePost" "InsertLeave" ]; }; + }; + }; + lspkind.enable = true; + lspsaga = { + enable = true; + setupOpts = { + ui = { code_action = ""; }; + lightbulb = { + sign = false; + virtual_text = true; + }; + breadcrumbs.enable = false; + }; + }; + }; + languages = { + enableDAP = true; + enableExtraDiagnostics = true; + enableFormat = true; + enableTreesitter = true; + + php = { + enable = true; + server = "intelephense"; + }; + go.enable = true; + markdown = { + enable = true; + format.type = "prettierd"; + extensions = { markview-nvim = { enable = true; }; }; + extraDiagnostics.enable = true; + }; + ts = { + enable = false; + extensions.ts-error-translator.enable = true; + }; + css.enable = true; + sql.enable = true; + html.enable = true; + bash.enable = true; + nix.enable = true; + tailwind.enable = true; + }; + formatter = { conform-nvim = { enable = true; }; }; + }; +} diff --git a/home/programs/nvf/mini.nix b/home/programs/nvf/mini.nix new file mode 100644 index 0000000..2c0568b --- /dev/null +++ b/home/programs/nvf/mini.nix @@ -0,0 +1,13 @@ +{ + programs.nvf.settings.vim.mini = { + starter.enable = true; + comment.enable = true; + # cursorword.enable = true; + icons.enable = true; + indentscope.enable = true; + notify.enable = true; + pairs.enable = true; + diff.enable = true; + git.enable = true; + }; +} diff --git a/home/programs/nvf/options.nix b/home/programs/nvf/options.nix new file mode 100644 index 0000000..d142b5e --- /dev/null +++ b/home/programs/nvf/options.nix @@ -0,0 +1,40 @@ +{ lib, ... }: { + programs.nvf.settings.vim = { + viAlias = false; + vimAlias = true; + withNodeJs = true; + # syntaxHighlighting = true; + options = { + autoindent = true; + smartindent = true; + shiftwidth = 2; + foldlevel = 99; + foldcolumn = "auto:1"; + mousescroll = "ver:1,hor:1"; + mousemoveevent = true; + fillchars = "eob:‿,fold: ,foldopen:▼,foldsep:⸽,foldclose:⏵"; + signcolumn = "yes"; + tabstop = 2; + softtabstop = 2; + wrap = false; + }; + globals = { + navic_silence = true; # navic tries to attach multiple LSPs and fails + suda_smart_edit = 1; # use super user write automatically + neovide_scale_factor = 0.7; + neovide_cursor_animation_length = 0.1; + neovide_cursor_short_animation_length = 0; + }; + clipboard = { + enable = true; + registers = "unnamedplus"; + providers.wl-copy.enable = true; + }; + theme = { + enable = true; + name = lib.mkForce "catppuccin"; + style = lib.mkForce "mocha"; + transparent = lib.mkForce true; + }; + }; +} diff --git a/home/programs/nvf/picker.nix b/home/programs/nvf/picker.nix new file mode 100644 index 0000000..c87033e --- /dev/null +++ b/home/programs/nvf/picker.nix @@ -0,0 +1,257 @@ +{ + programs.nvf.settings.vim = { + utility = { + oil-nvim.enable = true; + snacks-nvim = { + setupOpts = { + picker.enabled = true; + explorer.enabled = true; + }; + }; + }; + keymaps = [ + # Top Pickers & Explorer + { + key = " "; + mode = "n"; + silent = true; + action = "lua Snacks.picker.smart()"; + desc = "Smart Find Files"; + } + { + key = ","; + mode = "n"; + silent = true; + action = "lua Snacks.picker.buffers()"; + desc = "Buffers"; + } + { + key = "/"; + mode = "n"; + silent = true; + action = "lua Snacks.picker.grep()"; + desc = "Grep"; + } + { + key = ":"; + mode = "n"; + silent = true; + action = "lua Snacks.picker.command_history()"; + desc = "Command History"; + } + { + key = "e"; + mode = "n"; + silent = true; + action = "lua Snacks.explorer()"; + desc = "File Explorer"; + } + { + key = "-"; + mode = "n"; + silent = true; + action = "Oil"; + desc = "Oil"; + } + + # Find + { + key = "fb"; + mode = "n"; + silent = true; + action = "lua Snacks.picker.buffers()"; + desc = "Buffers"; + } + { + key = "fc"; + mode = "n"; + silent = true; + action = '' + lua Snacks.picker.files({ cwd = vim.fn.stdpath("config") })''; + desc = "Find Config File"; + } + { + key = "ff"; + mode = "n"; + silent = true; + action = "lua Snacks.picker.files()"; + desc = "Find Files"; + } + { + key = "fg"; + mode = "n"; + silent = true; + action = "lua Snacks.picker.git_files()"; + desc = "Find Git Files"; + } + { + key = "fp"; + mode = "n"; + silent = true; + action = "lua Snacks.picker.projects()"; + desc = "Projects"; + } + { + key = "fr"; + mode = "n"; + silent = true; + action = "lua Snacks.picker.recent()"; + desc = "Recent"; + } + { + key = "fn"; + mode = "n"; + silent = true; + action = "lua Snacks.picker.notifications()"; + desc = "Notification History"; + } + { + key = "fe"; + mode = "n"; + silent = true; + action = "lua Snacks.picker.icons()"; + desc = "Emoji"; + } + + # Git + { + key = "gb"; + mode = "n"; + silent = true; + action = "lua Snacks.picker.git_branches()"; + desc = "Git Branches"; + } + { + key = "gL"; + mode = "n"; + silent = true; + action = "lua Snacks.picker.git_log()"; + desc = "Git Log Line"; + } + { + key = "gs"; + mode = "n"; + silent = true; + action = "lua Snacks.picker.git_status()"; + desc = "Git Status"; + } + { + key = "gS"; + mode = "n"; + silent = true; + action = "lua Snacks.picker.git_stash()"; + desc = "Git Stash"; + } + { + key = "gd"; + mode = "n"; + silent = true; + action = "lua Snacks.picker.git_diff()"; + desc = "Git Diff (Hunks)"; + } + { + key = "gf"; + mode = "n"; + silent = true; + action = "lua Snacks.picker.git_log_file()"; + desc = "Git Log File"; + } + + # Grep + { + key = "sb"; + mode = "n"; + silent = true; + action = "lua Snacks.picker.lines()"; + desc = "Buffer Lines"; + } + { + key = "st"; + mode = "n"; + silent = true; + action = "lua Snacks.picker.todo_comments()"; + desc = "Todos"; + } + { + key = "sB"; + mode = "n"; + silent = true; + action = "lua Snacks.picker.grep_buffers()"; + desc = "Grep Open Buffers"; + } + { + key = "sg"; + mode = "n"; + silent = true; + action = "lua Snacks.picker.grep()"; + desc = "Grep"; + } + { + key = "sw"; + mode = "n"; + silent = true; + action = "lua Snacks.picker.grep_word()"; + desc = "Visual selection or word"; + } + { + key = "sr"; + mode = "n"; + silent = true; + action = "nohlsearch"; + desc = "Reset search"; + } + + # LSP + { + key = "gd"; + mode = "n"; + silent = true; + action = "lua Snacks.picker.lsp_definitions()"; + desc = "Goto Definition"; + } + { + key = "gD"; + mode = "n"; + silent = true; + action = "lua Snacks.picker.lsp_declarations()"; + desc = "Goto Declaration"; + } + { + key = "gr"; + mode = "n"; + silent = true; + action = "lua Snacks.picker.lsp_references()"; + desc = "References"; + nowait = true; + } + { + key = "gI"; + mode = "n"; + silent = true; + action = "lua Snacks.picker.lsp_implementations()"; + desc = "Goto Implementation"; + } + { + key = "gy"; + mode = "n"; + silent = true; + action = "lua Snacks.picker.lsp_type_definitions()"; + desc = "Goto Type Definition"; + } + { + key = "ss"; + mode = "n"; + silent = true; + action = "lua Snacks.picker.lsp_symbols()"; + desc = "LSP Symbols"; + } + { + key = "sS"; + mode = "n"; + silent = true; + action = "lua Snacks.picker.lsp_workspace_symbols()"; + desc = "LSP Workspace Symbols"; + } + ]; + }; +} diff --git a/home/programs/nvf/snacks.nix b/home/programs/nvf/snacks.nix new file mode 100644 index 0000000..0624537 --- /dev/null +++ b/home/programs/nvf/snacks.nix @@ -0,0 +1,19 @@ +{ + programs.nvf.settings.vim.utility.snacks-nvim = { + enable = true; + setupOpts = { + image = { + enabled = true; + doc = { + inline = false; + float = true; + }; + }; + quickfile.enabled = true; + statuscolumn.enabled = true; + zen.enabled = true; + bufdelete.enabled = true; + gitsigns.enabled = true; + }; + }; +} diff --git a/home/programs/nvf/utils.nix b/home/programs/nvf/utils.nix new file mode 100644 index 0000000..f9a2817 --- /dev/null +++ b/home/programs/nvf/utils.nix @@ -0,0 +1,49 @@ +{ pkgs, ... }: { + programs.nvf.settings.vim = { + undoFile.enable = true; + utility = { + motion.flash-nvim.enable = true; + outline.aerial-nvim.enable = true; + }; + tabline.nvimBufferline.enable = true; + notes.todo-comments.enable = true; + assistant.copilot = { + enable = false; + cmp.enable = true; + }; + statusline.lualine.enable = true; + + autocomplete = { + nvim-cmp = { + enable = true; + sources = { + buffer = "[Buffer]"; + nvim-cmp = null; + path = "[Path]"; + }; + sourcePlugins = [ pkgs.vimPlugins.cmp-cmdline ]; + }; + }; + + snippets.luasnip.enable = true; + ui = { + noice.enable = true; + colorizer.enable = true; + }; + git = { + enable = true; + gitsigns.enable = true; + }; + terminal.toggleterm = { + enable = true; + lazygit = { + enable = true; + mappings.open = "gl"; + }; + }; + visuals = { + rainbow-delimiters.enable = true; + nvim-scrollbar = { enable = false; }; + }; + }; +} diff --git a/home/system/hyprland/default.nix b/home/system/hyprland/default.nix index 834c3a1..d69e8e1 100644 --- a/home/system/hyprland/default.nix +++ b/home/system/hyprland/default.nix @@ -13,7 +13,7 @@ in { qt5.qtwayland qt6.qtwayland libsForQt5.qt5ct - qt6ct + qt6Packages.qt6ct hyprshot hyprpicker swappy diff --git a/hosts/laptop/home.nix b/hosts/laptop/home.nix index 055c159..9481f16 100644 --- a/hosts/laptop/home.nix +++ b/hosts/laptop/home.nix @@ -5,7 +5,7 @@ # Programs ../../home/programs/kitty - ../../home/programs/nvim + ../../home/programs/nfv ../../home/programs/shell ../../home/programs/pass ../../home/programs/fetch @@ -26,7 +26,6 @@ ../../home/system/hyprland ../../home/system/hypridle ../../home/system/hyprlock - # ../../home/system/hyprpanel ../../home/system/hyprpaper ../../home/system/wofi ../../home/system/batsignal diff --git a/nixos/fonts.nix b/nixos/fonts.nix index 94901d9..db41285 100644 --- a/nixos/fonts.nix +++ b/nixos/fonts.nix @@ -14,7 +14,7 @@ dejavu_fonts noto-fonts noto-fonts-cjk-sans - noto-fonts-emoji + noto-fonts-color-emoji victor-mono nerd-fonts.victor-mono nerd-fonts.fira-code diff --git a/themes/stylix/nixy.nix b/themes/stylix/nixy.nix index 973c9c5..712b2d1 100644 --- a/themes/stylix/nixy.nix +++ b/themes/stylix/nixy.nix @@ -52,7 +52,7 @@ name = "Noto Serif"; }; emoji = { - package = pkgs.noto-fonts-emoji; + package = pkgs.noto-fonts-color-emoji; name = "Noto Color Emoji"; }; sizes = {