From ac26b74e43e4c57a1364870104f1b56ad264d972 Mon Sep 17 00:00:00 2001 From: iofq Date: Fri, 15 Aug 2025 00:59:00 -0500 Subject: [PATCH 1/9] ensure plugins are exported in overlay --- flake.lock | 4 ++-- flake.nix | 2 +- nvim/lua/config/autocmd.lua | 7 +++++++ nvim/lua/plugins/lsp.lua | 4 +--- nvim/lua/plugins/mini.lua | 2 +- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/flake.lock b/flake.lock index a451654..2685c3c 100644 --- a/flake.lock +++ b/flake.lock @@ -3,10 +3,10 @@ "dart": { "flake": false, "locked": { - "lastModified": 1754291267, + "lastModified": 1755657012, "owner": "iofq", "repo": "dart.nvim", - "rev": "617587d40fd2f2727c18758c4e6decac78459529", + "rev": "c38b1e0d6daa47f8b9c58422e5a7ab57221810fd", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 68da80f..07d80b6 100644 --- a/flake.nix +++ b/flake.nix @@ -88,6 +88,6 @@ } ) // { - overlays.default = neovim-overlay; + overlays.default = final: prev: (plugin-overlay final prev) // (neovim-overlay final prev); }; } diff --git a/nvim/lua/config/autocmd.lua b/nvim/lua/config/autocmd.lua index d40ad17..0ccfabd 100644 --- a/nvim/lua/config/autocmd.lua +++ b/nvim/lua/config/autocmd.lua @@ -1,3 +1,10 @@ +-- create undopath +local undopath = vim.fn.stdpath('data') .. 'undo' +vim.api.nvim_create_autocmd('VimEnter', { + command = 'silent !mkdir -p ' .. undopath, + group = vim.api.nvim_create_augroup('Init', {}), +}) + -- open :h in buffers vim.api.nvim_create_autocmd('BufWinEnter', { pattern = '*', diff --git a/nvim/lua/plugins/lsp.lua b/nvim/lua/plugins/lsp.lua index 6015930..432aac4 100644 --- a/nvim/lua/plugins/lsp.lua +++ b/nvim/lua/plugins/lsp.lua @@ -84,7 +84,6 @@ return { notify_no_formatters = false, formatters_by_ft = { json = { 'jq' }, - puppet = { 'puppet-lint' }, lua = { 'stylua' }, python = { 'ruff' }, nix = { 'nixfmt' }, @@ -111,7 +110,6 @@ return { require('lint').linters_by_ft = { docker = { 'hadolint' }, yaml = { 'yamllint' }, - puppet = { 'puppet-lint' }, sh = { 'shellcheck' }, go = { 'golangcilint' }, ruby = { 'rubocop' }, @@ -124,7 +122,7 @@ return { group = vim.api.nvim_create_augroup('lint', { clear = true }), callback = function() if vim.bo.modifiable then - require('lint').try_lint() + require('lint').try_lint(nil, { ignore_errors = true }) end end, }) diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index c82350c..136521a 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -40,7 +40,7 @@ return { custom_textobjects = { i = extra_ai.indent(), g = extra_ai.buffer(), - e = extra_ai.line(), + l = extra_ai.line(), u = ai.gen_spec.function_call(), a = ai.gen_spec.treesitter { a = '@parameter.outer', i = '@parameter.inner' }, k = ai.gen_spec.treesitter { a = '@assignment.lhs', i = '@assignment.lhs' }, From 095e78128be3b0d995db6b9b7834856b2c43e6c0 Mon Sep 17 00:00:00 2001 From: iofq Date: Tue, 19 Aug 2025 23:07:48 -0500 Subject: [PATCH 2/9] nvim-ts-main --- flake.lock | 198 ++++++++++++++++++--------- flake.nix | 17 +-- nix/neovim-overlay.nix | 6 +- nix/plugin-overlay.nix | 29 ---- nvim/colors/iofq.lua | 2 +- nvim/lua/config/autocmd.lua | 66 +-------- nvim/lua/plugins/lib/minidiff_jj.lua | 137 ++++++------------ nvim/lua/plugins/lib/session_jj.lua | 1 - nvim/lua/plugins/lib/snacks_jj.lua | 63 --------- nvim/lua/plugins/mini.lua | 28 +--- nvim/lua/plugins/misc.lua | 37 +---- nvim/lua/plugins/snacks.lua | 24 ---- 12 files changed, 195 insertions(+), 413 deletions(-) delete mode 100644 nix/plugin-overlay.nix diff --git a/flake.lock b/flake.lock index 2685c3c..0530187 100644 --- a/flake.lock +++ b/flake.lock @@ -1,18 +1,19 @@ { "nodes": { "dart": { - "flake": false, + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + }, "locked": { - "lastModified": 1755657012, - "owner": "iofq", - "repo": "dart.nvim", - "rev": "c38b1e0d6daa47f8b9c58422e5a7ab57221810fd", - "type": "github" + "lastModified": 1758080529, + "narHash": "sha256-Sup4+HacL6Xe6mTk23N6sD4uXoU9dcoqRgc9Mu0oQ5E=", + "path": "/home/e/dev/dart.nvim", + "type": "path" }, "original": { - "owner": "iofq", - "repo": "dart.nvim", - "type": "github" + "path": "/home/e/dev/dart.nvim", + "type": "path" } }, "flake-compat": { @@ -89,11 +90,11 @@ ] }, "locked": { - "lastModified": 1754487366, - "narHash": "sha256-pHYj8gUBapuUzKV/kN/tR3Zvqc7o6gdFB9XKXIp1SQ8=", + "lastModified": 1756770412, + "narHash": "sha256-+uWLQZccFHwqpGqr2Yt5VsW/PbeJVTn9Dk6SHWhNRPw=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "af66ad14b28a127c5c0f3bbb298218fc63528a18", + "rev": "4524271976b625a4a605beefd893f270620fd751", "type": "github" }, "original": { @@ -102,27 +103,6 @@ "type": "github" } }, - "flake-parts_3": { - "inputs": { - "nixpkgs-lib": [ - "neovim-nightly-overlay", - "hercules-ci-effects", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1751413152, - "narHash": "sha256-Tyw1RjYEsp5scoigs1384gIg6e0GoBVjms4aXFfRssQ=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "77826244401ea9de6e3bac47c2db46005e1f30b5", - "type": "github" - }, - "original": { - "id": "flake-parts", - "type": "indirect" - } - }, "flake-utils": { "inputs": { "systems": "systems" @@ -140,6 +120,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" + } + }, "gen-luarc": { "inputs": { "flake-parts": "flake-parts", @@ -150,10 +148,11 @@ ] }, "locked": { - "lastModified": 1754586557, + "lastModified": 1755304025, + "narHash": "sha256-xVKfjFwc0zMbLMjLTiHz+0llggkjs93SmHkhaa9S3M4=", "owner": "mrcjkb", "repo": "nix-gen-luarc-json", - "rev": "4b8d4da04808062e2b1ef0e7bcd0a03bcb93e043", + "rev": "1865b0ebb753ae5324d7381b1fa8c98c04ec7509", "type": "github" }, "original": { @@ -196,11 +195,11 @@ ] }, "locked": { - "lastModified": 1754416808, - "narHash": "sha256-c6yg0EQ9xVESx6HGDOCMcyRSjaTpNJP10ef+6fRcofA=", + "lastModified": 1758108966, + "narHash": "sha256-ytw7ROXaWZ7OfwHrQ9xvjpUWeGVm86pwnEd1QhzawIo=", "owner": "cachix", "repo": "git-hooks.nix", - "rev": "9c52372878df6911f9afc1e2a1391f55e4dfc864", + "rev": "54df955a695a84cd47d4a43e08e1feaf90b1fd9b", "type": "github" }, "original": { @@ -255,18 +254,21 @@ }, "hercules-ci-effects": { "inputs": { - "flake-parts": "flake-parts_3", + "flake-parts": [ + "neovim-nightly-overlay", + "flake-parts" + ], "nixpkgs": [ "neovim-nightly-overlay", "nixpkgs" ] }, "locked": { - "lastModified": 1752595130, - "narHash": "sha256-CNBgr4OZSuklGtNOa9CnTNo9+Xceqn/EDAC1Tc43fH8=", + "lastModified": 1758022363, + "narHash": "sha256-ENUhCRWgSX4ni751HieNuQoq06dJvApV/Nm89kh+/A0=", "owner": "hercules-ci", "repo": "hercules-ci-effects", - "rev": "5f2e09654b2e70ba643e41609d9f9b6640f22113", + "rev": "1a3667d33e247ad35ca250698d63f49a5453d824", "type": "github" }, "original": { @@ -298,14 +300,15 @@ "git-hooks": "git-hooks_2", "hercules-ci-effects": "hercules-ci-effects", "neovim-src": "neovim-src", - "nixpkgs": "nixpkgs", + "nixpkgs": "nixpkgs_2", "treefmt-nix": "treefmt-nix" }, "locked": { - "lastModified": 1754641381, + "lastModified": 1759277111, + "narHash": "sha256-SDLZMha2miaChOBGBkQJlTtk2kvcB7WIVVZ2l0/9byc=", "owner": "nix-community", "repo": "neovim-nightly-overlay", - "rev": "83aaf3085f808dec9ea1b5d16b216875a8081b37", + "rev": "b7b3632fab34541543373254c265da03c1d0f240", "type": "github" }, "original": { @@ -317,11 +320,11 @@ "neovim-src": { "flake": false, "locked": { - "lastModified": 1754610154, - "narHash": "sha256-ORfF40X4BGiFxnLNQbdsQbUTW4TkUHfPqyZWHaYL5NE=", + "lastModified": 1759210115, + "narHash": "sha256-oc1pPeoe8458X0r/Wum8CucVcJLlIp4mg+1HiOSVRgA=", "owner": "neovim", "repo": "neovim", - "rev": "038eb01b41b66379f75164507571497929f8847c", + "rev": "198c9e9bca7549cf7110be8c6f1df1c38d4e747f", "type": "github" }, "original": { @@ -332,16 +335,15 @@ }, "nixpkgs": { "locked": { - "lastModified": 1754393734, - "narHash": "sha256-fbnmAwTQkuXHKBlcL5Nq1sMAzd3GFqCOQgEQw6Hy0Ak=", + "lastModified": 1755660401, "owner": "NixOS", "repo": "nixpkgs", - "rev": "a683adc19ff5228af548c6539dbc3440509bfed3", + "rev": "5788de501b965d7413f2beaac10aeeb56f9a19a8", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-unstable", + "ref": "master", "repo": "nixpkgs", "type": "github" } @@ -376,10 +378,27 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1754893210, + "lastModified": 1759070547, + "narHash": "sha256-JVZl8NaVRYb0+381nl7LvPE+A774/dRpif01FKLrYFQ=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "defc725219d1fb9b56662370e014012929e557af", + "rev": "647e5c14cbd5067f44ac86b74f014962df460840", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1759300078, + "narHash": "sha256-7G5fSMPNVwWNlFpZLwvKB8PUOaqPzFQbrtZ7RAzg2nw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "d48b56f4899ee1d5377291576284969c9e37acc2", "type": "github" }, "original": { @@ -389,13 +408,30 @@ "type": "github" } }, + "nixpkgs_4": { + "locked": { + "lastModified": 1759381078, + "narHash": "sha256-gTrEEp5gEspIcCOx9PD8kMaF1iEmfBcTbO0Jag2QhQs=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "7df7ff7d8e00218376575f0acdcc5d66741351ee", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "nvim-treesitter": { "flake": false, "locked": { - "lastModified": 1754640844, + "lastModified": 1759376029, + "narHash": "sha256-Cu6Wg9SKJpYAkp8DPAXe4Rf9OSSWW2wNdmCkYtl//fw=", "owner": "nvim-treesitter", "repo": "nvim-treesitter", - "rev": "9866036ec3c5db40700a9178494e0cfdcfe6ecfd", + "rev": "99bd52ba56a4b7c9a8cc50a6140180755e76fac6", "type": "github" }, "original": { @@ -405,13 +441,31 @@ "type": "github" } }, + "nvim-treesitter-main": { + "inputs": { + "nixpkgs": "nixpkgs_4", + "nvim-treesitter": "nvim-treesitter", + "nvim-treesitter-textobjects": "nvim-treesitter-textobjects" + }, + "locked": { + "lastModified": 1759555972, + "narHash": "sha256-vdIHsEjpZUdTYVzoJKsDsXjIlCyyIXMsBubg3dIp+cE=", + "path": "/home/e/dev/nvim-treesitter-main", + "type": "path" + }, + "original": { + "path": "/home/e/dev/nvim-treesitter-main", + "type": "path" + } + }, "nvim-treesitter-textobjects": { "flake": false, "locked": { - "lastModified": 1751128959, + "lastModified": 1756368113, + "narHash": "sha256-+KmOpRi4JAqm6UqYdtk80jwFrJhLCs0lZM/Liofq0R4=", "owner": "nvim-treesitter", "repo": "nvim-treesitter-textobjects", - "rev": "b54cec389e98c5b0babbe618773acec927437cab", + "rev": "1b2d85d3de6114c4bcea89ffb2cd1ce9e3a19931", "type": "github" }, "original": { @@ -424,12 +478,11 @@ "root": { "inputs": { "dart": "dart", - "flake-utils": "flake-utils", + "flake-utils": "flake-utils_2", "gen-luarc": "gen-luarc", "neovim-nightly-overlay": "neovim-nightly-overlay", - "nixpkgs": "nixpkgs_2", - "nvim-treesitter": "nvim-treesitter", - "nvim-treesitter-textobjects": "nvim-treesitter-textobjects" + "nixpkgs": "nixpkgs_3", + "nvim-treesitter-main": "nvim-treesitter-main" } }, "systems": { @@ -447,6 +500,21 @@ "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" + } + }, "treefmt-nix": { "inputs": { "nixpkgs": [ @@ -455,11 +523,11 @@ ] }, "locked": { - "lastModified": 1754492133, - "narHash": "sha256-B+3g9+76KlGe34Yk9za8AF3RL+lnbHXkLiVHLjYVOAc=", + "lastModified": 1758728421, + "narHash": "sha256-ySNJ008muQAds2JemiyrWYbwbG+V7S5wg3ZVKGHSFu8=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "1298185c05a56bff66383a20be0b41a307f52228", + "rev": "5eda4ee8121f97b218f7cc73f5172098d458f1d1", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 07d80b6..3224f5f 100644 --- a/flake.nix +++ b/flake.nix @@ -10,16 +10,10 @@ inputs.nixpkgs.follows = "nixpkgs"; }; dart = { - url = "github:iofq/dart.nvim"; - flake = false; + url = "path:/home/e/dev/dart.nvim"; }; - nvim-treesitter = { - url = "github:nvim-treesitter/nvim-treesitter/main"; - flake = false; - }; - nvim-treesitter-textobjects = { - url = "github:nvim-treesitter/nvim-treesitter-textobjects/main"; - flake = false; + nvim-treesitter-main = { + url = "path:/home/e/dev/nvim-treesitter-main"; }; # Add bleeding-edge plugins here. # They can be updated with `nix flake update` (make sure to commit the generated flake.lock) @@ -39,7 +33,6 @@ systems = builtins.attrNames nixpkgs.legacyPackages; # This is where the Neovim derivation is built. - plugin-overlay = import ./nix/plugin-overlay.nix { inherit inputs; }; neovim-overlay = import ./nix/neovim-overlay.nix { inherit inputs; }; in flake-utils.lib.eachSystem systems ( @@ -50,7 +43,7 @@ config.allowUnfree = true; overlays = [ inputs.neovim-nightly-overlay.overlays.default - plugin-overlay + inputs.nvim-treesitter-main.overlays.default neovim-overlay # This adds a function can be used to generate a .luarc.json # containing the Neovim API all plugins in the workspace directory. @@ -88,6 +81,6 @@ } ) // { - overlays.default = final: prev: (plugin-overlay final prev) // (neovim-overlay final prev); + overlays.default = final: prev: (neovim-overlay final prev); }; } diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index 204e118..d79bef6 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -4,6 +4,7 @@ final: prev: with final.pkgs.lib; let mkNeovim = prev.callPackage ./mkNeovim.nix { pkgs-wrapNeovim = prev; }; + dart-nvim = inputs.dart.packages.x86_64-linux.default; plugins = with final.vimPlugins; [ blink-cmp @@ -11,18 +12,13 @@ let conform-nvim dart-nvim diffview-nvim - eyeliner-nvim - friendly-snippets lazy-nvim mini-nvim - nvim-autopairs nvim-lint nvim-lspconfig nvim-treesitter.withAllGrammars - nvim-treesitter-context nvim-treesitter-textobjects quicker-nvim - refactoring-nvim render-markdown-nvim snacks-nvim ]; diff --git a/nix/plugin-overlay.nix b/nix/plugin-overlay.nix deleted file mode 100644 index 9a51a54..0000000 --- a/nix/plugin-overlay.nix +++ /dev/null @@ -1,29 +0,0 @@ -{ inputs, ... }: -final: prev: -let - mkNvimPlugin = - src: pname: - prev.vimUtils.buildVimPlugin { - inherit pname src; - version = src.lastModifiedDate; - }; -in -{ - vimPlugins = prev.vimPlugins.extend ( - final': prev': { - dart-nvim = mkNvimPlugin inputs.dart "dart.nvim"; - nvim-treesitter-textobjects = mkNvimPlugin inputs.nvim-treesitter-textobjects "nvim-treesitter-textobjects"; - nvim-treesitter = prev'.nvim-treesitter.overrideAttrs (old: rec { - src = inputs.nvim-treesitter; - name = "${old.pname}-${src.rev}"; - postPatch = ""; - # ensure runtime queries get linked to RTP (:TSInstall does this too) - buildPhase = " - mkdir -p $out/queries - cp -a $src/runtime/queries/* $out/queries - "; - nvimSkipModules = [ "nvim-treesitter._meta.parsers" ]; - }); - } - ); -} diff --git a/nvim/colors/iofq.lua b/nvim/colors/iofq.lua index be525d8..7d80403 100644 --- a/nvim/colors/iofq.lua +++ b/nvim/colors/iofq.lua @@ -626,7 +626,7 @@ hi(0, 'SpellLocal', { sp = '#5a93aa', undercurl = true }) hi(0, 'SpellRare', { sp = '#5a93aa', undercurl = true }) hi(0, 'Statement', { fg = '#ad5c7c' }) hi(0, 'StatusLine', { bg = 'none' }) -hi(0, 'StatusLineNC', { bg = 'none' }) +hi(0, 'StatusLineNC', { bg = 'none', fg = "grey" }) hi(0, 'String', { fg = '#7aa4a1' }) hi(0, 'Substitute', { bg = '#e85c51', fg = '#152528' }) hi(0, 'SymbolOutlineConnector', { link = 'Conceal' }) diff --git a/nvim/lua/config/autocmd.lua b/nvim/lua/config/autocmd.lua index 0ccfabd..e5cfb89 100644 --- a/nvim/lua/config/autocmd.lua +++ b/nvim/lua/config/autocmd.lua @@ -1,10 +1,3 @@ --- create undopath -local undopath = vim.fn.stdpath('data') .. 'undo' -vim.api.nvim_create_autocmd('VimEnter', { - command = 'silent !mkdir -p ' .. undopath, - group = vim.api.nvim_create_augroup('Init', {}), -}) - -- open :h in buffers vim.api.nvim_create_autocmd('BufWinEnter', { pattern = '*', @@ -17,26 +10,6 @@ vim.api.nvim_create_autocmd('BufWinEnter', { end, }) --- Allow basic deletion in qflist -vim.api.nvim_create_autocmd({ 'FileType' }, { - pattern = 'qf', - callback = function() - vim.keymap.set({ 'n', 'i' }, 'dd', function() - local ln = vim.fn.line('.') - local qf = vim.fn.getqflist() - if #qf == 0 then - return - end - table.remove(qf, ln) - vim.fn.setqflist(qf, 'r') - vim.cmd('copen') - -- move cursor to stay at same index (or up one if at EOF) - vim.api.nvim_win_set_cursor(vim.fn.win_getid(), { ln < #qf and ln or math.max(ln - 1, 1), 0 }) - require('quicker').refresh() - end, { buffer = true }) - end, -}) - -- resize splits if window got resized vim.api.nvim_create_autocmd({ 'VimResized' }, { group = vim.api.nvim_create_augroup('resize_splits', { clear = true }), @@ -61,51 +34,26 @@ vim.api.nvim_create_autocmd({ 'FocusGained', 'TermClose', 'TermLeave' }, { vim.api.nvim_create_autocmd('FileType', { callback = function(event) local bufnr = event.buf - local filetype = vim.api.nvim_get_option_value('filetype', { buf = bufnr }) - - if filetype == '' then - return - end - - local parser_name = vim.treesitter.language.get_lang(filetype) - if not parser_name then - return - end - local parser_installed = pcall(vim.treesitter.get_parser, bufnr, parser_name) - if not parser_installed then - return - end - - local function map(lhs, rhs, opts) - if lhs == '' then - return - end - opts = vim.tbl_deep_extend('force', { silent = true }, opts or {}) - vim.keymap.set({ 'v', 'n' }, lhs, rhs, opts) - end vim.bo.indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()" - vim.treesitter.start() + pcall(vim.treesitter.start, bufnr) - map('[c', function() - require('treesitter-context').go_to_context(vim.v.count1) - end, { buffer = bufnr, desc = 'jump to TS context' }) - map(']f', function() + vim.keymap.set({'v','n'}, ']f', function() require('nvim-treesitter-textobjects.move').goto_next_start('@function.outer', 'textobjects') end, { buffer = bufnr, desc = 'next function def' }) - map('[f', function() + vim.keymap.set({'v','n'}, '[f', function() require('nvim-treesitter-textobjects.move').goto_previous_start('@function.outer', 'textobjects') end, { buffer = bufnr, desc = 'prev function def' }) - map(']a', function() + vim.keymap.set({'v','n'}, ']a', function() require('nvim-treesitter-textobjects.move').goto_next_start('@parameter.inner', 'textobjects') end, { buffer = bufnr, desc = 'next param def' }) - map('[a', function() + vim.keymap.set({'v','n'}, '[a', function() require('nvim-treesitter-textobjects.move').goto_previous_start('@parameter.inner', 'textobjects') end, { buffer = bufnr, desc = 'prev param def' }) - map('a]', function() + vim.keymap.set({'v','n'}, 'a]', function() require('nvim-treesitter-textobjects.swap').swap_next('@parameter.inner') end, { buffer = bufnr, desc = 'swap next arg' }) - map('a[', function() + vim.keymap.set({'v','n'}, 'a[', function() require('nvim-treesitter-textobjects.swap').swap_previous('@parameter.inner') end, { buffer = bufnr, desc = 'swap prev arg' }) end, diff --git a/nvim/lua/plugins/lib/minidiff_jj.lua b/nvim/lua/plugins/lib/minidiff_jj.lua index d5b93d8..0294773 100644 --- a/nvim/lua/plugins/lib/minidiff_jj.lua +++ b/nvim/lua/plugins/lib/minidiff_jj.lua @@ -4,18 +4,12 @@ local M = { } M.get_buf_realpath = function(buf_id) - return vim.loop.fs_realpath(vim.api.nvim_buf_get_name(buf_id)) or '' + local path = vim.loop.fs_realpath(vim.api.nvim_buf_get_name(buf_id)) or '' + local cwd, basename = vim.fn.fnamemodify(path, ':h'), vim.fn.fnamemodify(path, ':t') + return path, cwd, basename end M.jj_start_watching_tree_state = function(buf_id, path) - local stdout = vim.loop.new_pipe() - local args = { 'workspace', 'root', '--ignore-working-copy' } - local spawn_opts = { - args = args, - cwd = vim.fn.fnamemodify(path, ':h'), - stdio = { nil, stdout, nil }, - } - local on_not_in_jj = vim.schedule_wrap(function() if not vim.api.nvim_buf_is_valid(buf_id) then M.cache[buf_id] = nil @@ -25,105 +19,57 @@ M.jj_start_watching_tree_state = function(buf_id, path) M.cache[buf_id] = {} end) - local process, stdout_feed = nil, {} - local on_exit = function(exit_code) - process:close() + vim.system( + { 'jj', 'workspace', 'root', '--ignore-working-copy' }, + {cwd = vim.fn.fnamemodify(path, ':h')}, + function(obj) + if obj.code ~= 0 then + return on_not_in_jj() + end - -- Watch index only if there was no error retrieving path to it - if exit_code ~= 0 or stdout_feed[1] == nil then - return on_not_in_jj() + -- Set up index watching + local root = obj.stdout:gsub('\n+$', '') .. '/.jj/working_copy/tree_state' + local buf_fs_event = vim.loop.new_fs_event() + + buf_fs_event:start(root, { stat = true }, function() + M.jj_set_ref_text(buf_id) + end) + M.cache[buf_id] = { fs_event = buf_fs_event } + + -- Set reference text immediately + M.jj_set_ref_text(buf_id) end - - -- Set up index watching - local jj_dir_path = table.concat(stdout_feed, ''):gsub('\n+$', '') .. '/.jj/working_copy' - M.jj_setup_tree_state_watch(buf_id, jj_dir_path) - - -- Set reference text immediately - M.jj_set_ref_text(buf_id) - end - - process = vim.loop.spawn('jj', spawn_opts, on_exit) - M.jj_read_stream(stdout, stdout_feed) + ) end -M.jj_setup_tree_state_watch = function(buf_id, jj_dir_path) - local buf_fs_event, timer = vim.loop.new_fs_event(), vim.loop.new_timer() - local buf_jj_set_ref_text = function() - M.jj_set_ref_text(buf_id) - end - - local watch_tree_state = function(_, filename, _) - if filename ~= 'tree_state' then - return - end - -- Debounce to not overload during incremental staging (like in script) - timer:stop() - timer:start(50, 0, buf_jj_set_ref_text) - end - buf_fs_event:start(jj_dir_path, { stat = true }, watch_tree_state) - - M.jj_invalidate_cache(M.cache[buf_id]) - M.cache[buf_id] = { fs_event = buf_fs_event, timer = timer } -end M.jj_set_ref_text = vim.schedule_wrap(function(buf_id) if not vim.api.nvim_buf_is_valid(buf_id) then return end - local buf_set_ref_text = vim.schedule_wrap(function(text) + local buf_set_ref_text = function(text) pcall(diff.set_ref_text, buf_id, text) - end) + end - -- NOTE: Do not cache buffer's name to react to its possible rename - local path = M.get_buf_realpath(buf_id) + -- react to possible rename + local path, cwd, basename = M.get_buf_realpath(buf_id) if path == '' then return buf_set_ref_text {} end - local cwd, basename = vim.fn.fnamemodify(path, ':h'), vim.fn.fnamemodify(path, ':t') - -- Set - local stdout = vim.loop.new_pipe() - local spawn_opts = { - args = { 'file', 'show', '--no-pager', '--ignore-working-copy', '-r', '@-', './' .. basename }, - cwd = cwd, - stdio = { nil, stdout, nil }, - } - - local process, stdout_feed = nil, {} - process = vim.loop.spawn('jj', spawn_opts, function(exit_code) - process:close() - - if exit_code ~= 0 or stdout_feed[1] == nil then - return buf_set_ref_text {} - end - - -- Set reference text accounting for possible 'crlf' end of line in index - local text = table.concat(stdout_feed, ''):gsub('\r\n', '\n') - buf_set_ref_text(text) - end) - - M.jj_read_stream(stdout, stdout_feed) + vim.system( + { 'jj', 'file', 'show', '--no-pager', '--ignore-working-copy', '-r', '@-', './' .. basename }, + { cwd = cwd }, + vim.schedule_wrap(function(obj) + if obj.code ~= 0 then return buf_set_ref_text {} end + buf_set_ref_text(obj.stdout:gsub('\r\n', '\n')) + end) + ) end) -M.jj_read_stream = function(stream, feed) - local callback = function(err, data) - if data ~= nil then - return table.insert(feed, data) - end - if err then - feed[1] = nil - end - stream:close() - end - stream:read_start(callback) -end - -M.jj_invalidate_cache = function(cache) - if cache == nil then - return - end - pcall(vim.loop.fs_event_stop, cache.fs_event) - pcall(vim.loop.timer_stop, cache.timer) +M.jj_invalidate_cache = function(buf_id) + pcall(vim.loop.fs_event_stop, M.cache[buf_id].fs_event) + M.cache[buf_id] = nil end M.gen_source = function() @@ -143,20 +89,15 @@ M.gen_source = function() end local detach = function(buf_id) - local cache = M.cache[buf_id] - M.cache[buf_id] = nil - M.jj_invalidate_cache(cache) + M.jj_invalidate_cache(buf_id) end - local apply_hunks = function(_, _) - -- staging does not apply for jj - end return { name = 'jj', attach = attach, detach = detach, - apply_hunks = apply_hunks, + apply_hunks = function(_, _) end -- staging does not apply for jj } end return M diff --git a/nvim/lua/plugins/lib/session_jj.lua b/nvim/lua/plugins/lib/session_jj.lua index 5e81803..ac21e3c 100644 --- a/nvim/lua/plugins/lib/session_jj.lua +++ b/nvim/lua/plugins/lib/session_jj.lua @@ -67,5 +67,4 @@ M.load = function() end end -_G.M = M return M diff --git a/nvim/lua/plugins/lib/snacks_jj.lua b/nvim/lua/plugins/lib/snacks_jj.lua index da442eb..cee860f 100644 --- a/nvim/lua/plugins/lib/snacks_jj.lua +++ b/nvim/lua/plugins/lib/snacks_jj.lua @@ -55,67 +55,4 @@ function M.status() } end -function M.revs() - local function jj_new(picker, item) - picker:close() - if item then - if not item.rev then - vim.notify.warn('No branch or commit found', { title = 'Snacks Picker' }) - return - end - local cmd = { 'jj', 'new', '-r', item.rev } - Snacks.picker.util.cmd(cmd, function() - vim.notify('Checking out revision: ' .. item.rev, { title = 'Snacks Picker' }) - vim.cmd.checktime() - require('plugins.lib.session_jj').load() - end, { cwd = item.cwd }) - end - end - - local function jj_rev_cmd(ctx) - if ctx.item.rev then - Snacks.picker.preview.cmd({ 'jj', 'show', '--ignore-working-copy', '--git', '-r', ctx.item.rev }, ctx) - else - ctx.preview:reset() - return 'No preview available.' - end - end - - local function jj_log(revset) - if revset == nil then - revset = '-r "ancestors(@,25)"' - else - revset = '-r ' .. revset - end - local status_raw = vim.fn.system( - 'jj log --ignore-working-copy ' - .. revset - .. - ' --template \'if(root, format_root_commit(self), label(if(current_working_copy, "working_copy"), concat(separate(" ", self.change_id().shortest(8), self.bookmarks()), " | ", if(empty, label("empty", "(empty)")), if(description, description.first_line(), label(if(empty, "empty"), description_placeholder),),) ++ "\n",),)\'' - ) - local lines = {} - - for line in status_raw:gmatch('[^\r\n]+') do - local sign, rev = string.match(line, '(.)%s(%a+)%s.*') - table.insert(lines, { - text = line, - sign = sign, - rev = rev, - }) - end - - return lines - end - - Snacks.picker.pick { - source = 'jj_revs', - layout = 'ivy', - format = 'text', - title = 'jj log', - items = jj_log(), - confirm = jj_new, - preview = jj_rev_cmd, - } -end - return M diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index 136521a..a0b78ff 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -1,6 +1,6 @@ return { { - 'echasnovski/mini.nvim', + 'nvim-mini/mini.nvim', lazy = false, keys = { { @@ -24,37 +24,23 @@ return { 'Git blame -- %', desc = 'git blame', }, - { - 'gg', - ':Git ', - desc = 'git command', - }, }, config = function() require('mini.basics').setup { mappings = { windows = true } } + require('mini.icons').setup() vim.schedule(function() local ai = require('mini.ai') - local extra_ai = require('mini.extra').gen_ai_spec ai.setup { n_lines = 300, custom_textobjects = { - i = extra_ai.indent(), - g = extra_ai.buffer(), - l = extra_ai.line(), + i = require('mini.extra').gen_ai_spec.indent(), u = ai.gen_spec.function_call(), a = ai.gen_spec.treesitter { a = '@parameter.outer', i = '@parameter.inner' }, - k = ai.gen_spec.treesitter { a = '@assignment.lhs', i = '@assignment.lhs' }, - v = ai.gen_spec.treesitter { a = '@assignment.rhs', i = '@assignment.rhs' }, f = ai.gen_spec.treesitter { a = '@function.outer', i = '@function.inner' }, - o = ai.gen_spec.treesitter { - a = { '@block.outer', '@conditional.outer', '@loop.outer' }, - i = { '@block.inner', '@conditional.inner', '@loop.inner' }, - }, }, } require('mini.align').setup() - require('mini.bracketed').setup { file = { suffix = 'm' } } - require('mini.icons').setup() + require('mini.pairs').setup() require('mini.git').setup() require('mini.surround').setup() require('mini.splitjoin').setup { detect = { separator = '[,;\n]' } } @@ -111,7 +97,7 @@ return { clues = { miniclue.gen_clues.g(), miniclue.gen_clues.marks(), - miniclue.gen_clues.registers(), + miniclue.gen_clues.registers({show_contents = true}), miniclue.gen_clues.windows(), miniclue.gen_clues.z(), }, @@ -153,10 +139,6 @@ return { Snacks.rename.on_rename_file(event.data.from, event.data.to) end, }) - - local multi = require('mini.keymap').map_multistep - multi({ 'i', 's' }, '', { 'blink_accept', 'vimsnippet_next', 'increase_indent' }) - multi({ 'i', 's' }, '', { 'vimsnippet_prev', 'decrease_indent' }) end) end, }, diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index 7dacf20..d880b74 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -3,12 +3,10 @@ return { 'iofq/dart.nvim', lazy = false, priority = 1001, - config = true, - }, - { - 'windwp/nvim-autopairs', - event = 'VeryLazy', - config = true, + dependencies = 'nvim-mini/mini.nvim', + opts = { + label_marked_fg = 'cyan' + }, }, { 'nvim-treesitter/nvim-treesitter', @@ -20,20 +18,8 @@ return { branch = 'main', config = true, }, - { - 'nvim-treesitter/nvim-treesitter-context', - opts = { - max_lines = 5, - min_window_height = 50, - }, - }, }, }, - { - 'jinh0/eyeliner.nvim', - event = 'VeryLazy', - config = true, - }, { 'MeanderingProgrammer/render-markdown.nvim', event = 'VeryLazy', @@ -86,21 +72,6 @@ return { }, }, }, - { - 'ThePrimeagen/refactoring.nvim', - event = 'VeryLazy', - config = true, - keys = { - { 'rv', 'Refactor inline_vardd', mode = { 'n', 'x' } }, - { - 'rr', - function() - require('refactoring').select_refactor { prefer_ex_cmd = true } - end, - mode = { 'n', 'x' }, - }, - }, - }, { 'stevearc/quicker.nvim', event = 'VeryLazy', diff --git a/nvim/lua/plugins/snacks.lua b/nvim/lua/plugins/snacks.lua index d6dd0b2..1fc4baa 100644 --- a/nvim/lua/plugins/snacks.lua +++ b/nvim/lua/plugins/snacks.lua @@ -13,9 +13,6 @@ return { notification = { wo = { wrap = true }, }, - terminal = { - border = 'rounded', - }, }, terminal = { enabled = true }, indent = { enabled = true }, @@ -88,13 +85,6 @@ return { end, desc = 'Fuzzy find smart', }, - { - 'fe', - function() - Snacks.explorer() - end, - desc = 'snacks explorer', - }, { 'ff', function() @@ -151,13 +141,6 @@ return { end, desc = 'Fuzzy find buffers', }, - { - 'fn', - function() - Snacks.picker.notifications() - end, - desc = 'pick notifications', - }, { 'gO', function() @@ -179,13 +162,6 @@ return { end, desc = 'pick notifications', }, - { - 'jj', - function() - require('plugins.lib.snacks_jj').revs() - end, - desc = 'pick notifications', - }, }, }, } From 27ce53153128a2c8f40c079e617ab9cff122f44d Mon Sep 17 00:00:00 2001 From: iofq Date: Sat, 4 Oct 2025 03:50:17 -0500 Subject: [PATCH 3/9] random cleanups --- nix/neovim-overlay.nix | 5 +---- nvim/init.lua | 1 - nvim/lsp/lua_ls.lua | 3 --- nvim/lua/config/init.lua | 1 + nvim/lua/plugins/lib/session_jj.lua | 4 ++-- nvim/lua/plugins/lib/snacks_jj.lua | 16 +++++----------- nvim/lua/plugins/lsp.lua | 21 ++++----------------- nvim/lua/plugins/mini.lua | 8 +------- nvim/lua/plugins/snacks.lua | 8 -------- 9 files changed, 14 insertions(+), 53 deletions(-) diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index d79bef6..7a5074e 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -40,11 +40,8 @@ let # LSPs gopls lua-language-server - nil + nixd basedpyright - - #other - jujutsu ]; in { diff --git a/nvim/init.lua b/nvim/init.lua index 622287b..43d1b43 100644 --- a/nvim/init.lua +++ b/nvim/init.lua @@ -28,7 +28,6 @@ if not LAZY_OPTS then }, } end -vim.cmd('packadd cfilter') vim.cmd('colorscheme iofq') require('lazy').setup(LAZY_OPTS) require('config') diff --git a/nvim/lsp/lua_ls.lua b/nvim/lsp/lua_ls.lua index 4be10e8..f71f2bd 100644 --- a/nvim/lsp/lua_ls.lua +++ b/nvim/lsp/lua_ls.lua @@ -19,9 +19,6 @@ return { end, settings = { Lua = { - codeLens = { - enable = true, - }, hint = { enable = true, arrayIndex = 'Enable', diff --git a/nvim/lua/config/init.lua b/nvim/lua/config/init.lua index f9ba85f..4ba1b24 100644 --- a/nvim/lua/config/init.lua +++ b/nvim/lua/config/init.lua @@ -1,6 +1,7 @@ vim.opt.autowrite = true vim.opt.backspace = 'indent,eol,start' vim.opt.confirm = true +vim.opt.completeopt = "menuone,popup,noselect,fuzzy" vim.opt.diffopt = 'internal,filler,closeoff,inline:char' vim.opt.expandtab = true -- insert tabs as spaces vim.opt.inccommand = 'split' -- incremental live completion diff --git a/nvim/lua/plugins/lib/session_jj.lua b/nvim/lua/plugins/lib/session_jj.lua index ac21e3c..c411d45 100644 --- a/nvim/lua/plugins/lib/session_jj.lua +++ b/nvim/lua/plugins/lib/session_jj.lua @@ -7,7 +7,7 @@ M.setup = function() end vim.keymap.set('n', 'fs', function() - require('plugins.lib.session_jj').load() + M.load() end, { noremap = true, desc = 'mini session select' }) end @@ -50,7 +50,6 @@ M.load = function() if id == '' then return end - vim.opt.shadafile = vim.fn.stdpath('data') .. '/myshada/' .. id .. '.shada' if M.check_exists(id) then vim.ui.select({ 'Yes', @@ -58,6 +57,7 @@ M.load = function() }, { prompt = 'Session found at ' .. id .. ', load it?' }, function(c) if c == 'Yes' then -- load session (buffers, etc) as well as shada (marks) + vim.opt.shadafile = vim.fn.stdpath('data') .. '/myshada/' .. id .. '.shada' MiniSessions.read(id) vim.notify('loaded jj session: ' .. id) end diff --git a/nvim/lua/plugins/lib/snacks_jj.lua b/nvim/lua/plugins/lib/snacks_jj.lua index cee860f..639ecfd 100644 --- a/nvim/lua/plugins/lib/snacks_jj.lua +++ b/nvim/lua/plugins/lib/snacks_jj.lua @@ -6,11 +6,9 @@ function M.status() local files = {} for status in status_raw:gmatch('[^\r\n]+') do - local state, text = string.match(status, '^(%a)%s(.+)$') - - if state and text then - local file = text + local state, file = string.match(status, '^(%a)%s(.+)$') + if state and file then local hl = '' if state == 'A' then hl = 'SnacksPickerGitStatusAdded' @@ -20,15 +18,13 @@ function M.status() hl = 'SnacksPickerGitStatusDeleted' elseif state == 'R' then hl = 'SnacksPickerGitStatusRenamed' - file = string.match(text, '{.-=>%s*(.-)}') + file = string.match(file, '{.-=>%s*(.-)}') end - local diff = vim.fn.system('jj diff ' .. file .. ' --ignore-working-copy --no-pager --stat --git') + local diff = vim.fn.system('jj diff ' .. file .. ' --no-pager --stat --git') table.insert(files, { - text = text, file = file, filename_hl = hl, - state = state, diff = diff, }) end @@ -37,11 +33,9 @@ function M.status() return files end - local files = get_files() - Snacks.picker.pick { source = 'jj_status', - items = files, + items = get_files(), format = 'file', title = 'jj status', preview = function(ctx) diff --git a/nvim/lua/plugins/lsp.lua b/nvim/lua/plugins/lsp.lua index 432aac4..ae902b2 100644 --- a/nvim/lua/plugins/lsp.lua +++ b/nvim/lua/plugins/lsp.lua @@ -4,7 +4,7 @@ return { event = 'VeryLazy', config = function() vim.lsp.enable { - 'nil_ls', + 'nixd', 'phpactor', 'gopls', 'lua_ls', @@ -34,27 +34,18 @@ return { vim.diagnostic.setqflist() end, { buffer = ev.buf, desc = 'LSP diagnostics' }) - vim.keymap.set('n', 'grc', function() - vim.lsp.buf.incoming_calls() - end, { buffer = ev.buf, desc = 'LSP incoming_calls' }) - vim.keymap.set('n', 'gro', function() - vim.lsp.buf.outgoing_calls() - end, { buffer = ev.buf, desc = 'LSP outgoing_calls' }) - -- Auto-refresh code lenses if client:supports_method('textDocument/codeLens') or client.server_capabilities.codeLensProvider then + vim.lsp.codelens.refresh { bufnr = ev.buf } vim.api.nvim_create_autocmd({ 'InsertLeave', 'TextChanged' }, { - group = vim.api.nvim_create_augroup(string.format('lsp-%s-%s', ev.buf, client.id), {}), callback = function() vim.lsp.codelens.refresh { bufnr = ev.buf } end, buffer = ev.buf, }) - vim.lsp.codelens.refresh() end end, }) - vim.api.nvim_exec_autocmds('FileType', {}) end, }, { @@ -65,7 +56,7 @@ return { '\\f', function() vim.b.disable_autoformat = not vim.b.disable_autoformat - Snacks.notify(string.format('Buffer formatting disabled: %s', vim.b.disable_autoformat)) + vim.notify(string.format('Buffer formatting disabled: %s', vim.b.disable_autoformat)) end, mode = { 'n', 'x' }, desc = 'toggle buffer formatting', @@ -74,7 +65,7 @@ return { '\\F', function() vim.g.disable_autoformat = not vim.g.disable_autoformat - Snacks.notify(string.format('Global formatting disabled: %s', vim.g.disable_autoformat)) + vim.notify(string.format('Global formatting disabled: %s', vim.g.disable_autoformat)) end, mode = { 'n', 'x' }, desc = 'toggle global formatting', @@ -97,10 +88,6 @@ return { end return { timeout_ms = 1500, lsp_format = 'fallback' } end, - default_format_opts = { - timeout_ms = 1500, - lsp_format = 'fallback', - }, }, }, { diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index a0b78ff..e64b55f 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -71,7 +71,6 @@ return { local diff = require('mini.diff') diff.setup { - options = { wrap_goto = true }, source = { require('plugins.lib.minidiff_jj').gen_source(), diff.gen_source.git(), @@ -109,7 +108,6 @@ return { }, windows = { preview = true, - width_focus = 30, width_preview = 50, }, } @@ -120,12 +118,8 @@ return { vim.api.nvim_create_autocmd('User', { pattern = 'MiniFilesBufferCreate', callback = function(args) - vim.keymap.set('n', 'nc', function() - files.synchronize() - files.close() - end, { buffer = args.data.buf_id }) vim.keymap.set('n', '`', function() - local cur_entry_path = MiniFiles.get_fs_entry().path + local _, cur_entry_path = pcall(MiniFiles.get_fs_entry().path) local cur_directory = vim.fs.dirname(cur_entry_path) if cur_directory ~= '' then vim.fn.chdir(cur_directory) diff --git a/nvim/lua/plugins/snacks.lua b/nvim/lua/plugins/snacks.lua index 1fc4baa..952cd00 100644 --- a/nvim/lua/plugins/snacks.lua +++ b/nvim/lua/plugins/snacks.lua @@ -68,14 +68,6 @@ return { mode = { 'n', 't' }, desc = 'terminal open', }, - { - '', - function() - Snacks.terminal.toggle('command -v fish >/dev/null && exec fish || exec bash') - end, - mode = { 'n', 't' }, - desc = 'terminal open', - }, { '', function() From 31f7ee21e8895b6d9e4bd8072bf05357f15f4bc1 Mon Sep 17 00:00:00 2001 From: iofq Date: Sun, 5 Oct 2025 13:08:24 -0500 Subject: [PATCH 4/9] remove mini.sessions/jj --- flake.lock | 30 ++++++++----- flake.nix | 4 +- nvim/lua/config/autocmd.lua | 8 ++-- nvim/lua/config/init.lua | 6 +-- nvim/lua/plugins/lib/session_jj.lua | 70 ----------------------------- nvim/lua/plugins/mini.lua | 19 -------- 6 files changed, 26 insertions(+), 111 deletions(-) delete mode 100644 nvim/lua/plugins/lib/session_jj.lua diff --git a/flake.lock b/flake.lock index 0530187..a89f66c 100644 --- a/flake.lock +++ b/flake.lock @@ -6,14 +6,17 @@ "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1758080529, - "narHash": "sha256-Sup4+HacL6Xe6mTk23N6sD4uXoU9dcoqRgc9Mu0oQ5E=", - "path": "/home/e/dev/dart.nvim", - "type": "path" + "lastModified": 1757895736, + "narHash": "sha256-BBjs+YCOzgb6N2lew4vEmyS6s70y0z5xStKjGQaf55g=", + "owner": "iofq", + "repo": "dart.nvim", + "rev": "f059335a22811374d5a7e22c97889ea712db58d7", + "type": "github" }, "original": { - "path": "/home/e/dev/dart.nvim", - "type": "path" + "owner": "iofq", + "repo": "dart.nvim", + "type": "github" } }, "flake-compat": { @@ -448,14 +451,17 @@ "nvim-treesitter-textobjects": "nvim-treesitter-textobjects" }, "locked": { - "lastModified": 1759555972, - "narHash": "sha256-vdIHsEjpZUdTYVzoJKsDsXjIlCyyIXMsBubg3dIp+cE=", - "path": "/home/e/dev/nvim-treesitter-main", - "type": "path" + "lastModified": 1759559567, + "narHash": "sha256-cNu8MIRumBeW1HJK8c8IM6ge1yalz4xS5j5RCDbhf0Y=", + "owner": "iofq", + "repo": "nvim-treesitter-main", + "rev": "1f19cc0a907328d8dbf467ee9fe216277628d366", + "type": "github" }, "original": { - "path": "/home/e/dev/nvim-treesitter-main", - "type": "path" + "owner": "iofq", + "repo": "nvim-treesitter-main", + "type": "github" } }, "nvim-treesitter-textobjects": { diff --git a/flake.nix b/flake.nix index 3224f5f..a2231e4 100644 --- a/flake.nix +++ b/flake.nix @@ -10,10 +10,10 @@ inputs.nixpkgs.follows = "nixpkgs"; }; dart = { - url = "path:/home/e/dev/dart.nvim"; + url = "github:iofq/dart.nvim"; }; nvim-treesitter-main = { - url = "path:/home/e/dev/nvim-treesitter-main"; + url = "github:iofq/nvim-treesitter-main"; }; # Add bleeding-edge plugins here. # They can be updated with `nix flake update` (make sure to commit the generated flake.lock) diff --git a/nvim/lua/config/autocmd.lua b/nvim/lua/config/autocmd.lua index e5cfb89..db5346a 100644 --- a/nvim/lua/config/autocmd.lua +++ b/nvim/lua/config/autocmd.lua @@ -38,10 +38,10 @@ vim.api.nvim_create_autocmd('FileType', { vim.bo.indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()" pcall(vim.treesitter.start, bufnr) - vim.keymap.set({'v','n'}, ']f', function() + vim.keymap.set({'v','n'}, ']]', function() require('nvim-treesitter-textobjects.move').goto_next_start('@function.outer', 'textobjects') end, { buffer = bufnr, desc = 'next function def' }) - vim.keymap.set({'v','n'}, '[f', function() + vim.keymap.set({'v','n'}, '[[', function() require('nvim-treesitter-textobjects.move').goto_previous_start('@function.outer', 'textobjects') end, { buffer = bufnr, desc = 'prev function def' }) vim.keymap.set({'v','n'}, ']a', function() @@ -50,10 +50,10 @@ vim.api.nvim_create_autocmd('FileType', { vim.keymap.set({'v','n'}, '[a', function() require('nvim-treesitter-textobjects.move').goto_previous_start('@parameter.inner', 'textobjects') end, { buffer = bufnr, desc = 'prev param def' }) - vim.keymap.set({'v','n'}, 'a]', function() + vim.keymap.set({'v','n'}, ']A', function() require('nvim-treesitter-textobjects.swap').swap_next('@parameter.inner') end, { buffer = bufnr, desc = 'swap next arg' }) - vim.keymap.set({'v','n'}, 'a[', function() + vim.keymap.set({'v','n'}, '[A', function() require('nvim-treesitter-textobjects.swap').swap_previous('@parameter.inner') end, { buffer = bufnr, desc = 'swap prev arg' }) end, diff --git a/nvim/lua/config/init.lua b/nvim/lua/config/init.lua index 4ba1b24..4c47a68 100644 --- a/nvim/lua/config/init.lua +++ b/nvim/lua/config/init.lua @@ -32,7 +32,5 @@ vim.diagnostic.config { source = 'if_many', }, } -vim.schedule(function() - require('config.autocmd') - require('config.keymaps') -end) +require('config.autocmd') +require('config.keymaps') diff --git a/nvim/lua/plugins/lib/session_jj.lua b/nvim/lua/plugins/lib/session_jj.lua deleted file mode 100644 index c411d45..0000000 --- a/nvim/lua/plugins/lib/session_jj.lua +++ /dev/null @@ -1,70 +0,0 @@ -local M = {} - -M.setup = function() - local id = M.get_id() - if M.check_exists(id) then - vim.notify('Existing session for ' .. id) - end - - vim.keymap.set('n', 'fs', function() - M.load() - end, { noremap = true, desc = 'mini session select' }) -end - -M.get_id = function() - local jj_root = vim.system({ 'jj', 'workspace', 'root' }):wait() - - if jj_root.code ~= 0 then - return - end - - local result = vim - .system({ - 'jj', - 'log', - '-r', - 'latest(heads(::@ & bookmarks()))', - '--template', - 'bookmarks', - '--no-pager', - '--no-graph', - }) - :wait() - local branch = vim.trim(string.gsub(result.stdout, '[\n*]', '')) -- trim newlines and unpushed indicator - local root = vim.trim(string.gsub(jj_root.stdout, '\n', '')) - local id = string.gsub(string.format('jj:%s:%s', root, branch), '[./]', '-') -- slugify - return id -end - -M.check_exists = function(id) - for name, _ in pairs(MiniSessions.detected) do - if name == id then - return true - end - end - return false -end - -M.load = function() - local id = M.get_id() - if id == '' then - return - end - if M.check_exists(id) then - vim.ui.select({ - 'Yes', - 'No', - }, { prompt = 'Session found at ' .. id .. ', load it?' }, function(c) - if c == 'Yes' then - -- load session (buffers, etc) as well as shada (marks) - vim.opt.shadafile = vim.fn.stdpath('data') .. '/myshada/' .. id .. '.shada' - MiniSessions.read(id) - vim.notify('loaded jj session: ' .. id) - end - end) - else - MiniSessions.write(id) - end -end - -return M diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index e64b55f..bf2d6f1 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -34,7 +34,6 @@ return { n_lines = 300, custom_textobjects = { i = require('mini.extra').gen_ai_spec.indent(), - u = ai.gen_spec.function_call(), a = ai.gen_spec.treesitter { a = '@parameter.outer', i = '@parameter.inner' }, f = ai.gen_spec.treesitter { a = '@function.outer', i = '@function.inner' }, }, @@ -45,24 +44,6 @@ return { require('mini.surround').setup() require('mini.splitjoin').setup { detect = { separator = '[,;\n]' } } - require('mini.sessions').setup { - file = '', - autowrite = true, - hooks = { - pre = { - read = function(session) -- load Dart state *before* buffers are loaded - vim.cmd('rshada') - Dart.read_session(session['name']) - end, - write = function(session) - vim.cmd('wshada') - Dart.write_session(session['name']) - end, - }, - }, - } - require('plugins.lib.session_jj').setup() - local jump = require('mini.jump2d') jump.setup { view = { n_steps_ahead = 1, dim = true }, From 8922491578544a6fb5ce8e35be8433e99a3a7ad3 Mon Sep 17 00:00:00 2001 From: iofq Date: Sun, 5 Oct 2025 14:01:43 -0500 Subject: [PATCH 5/9] migrate from lazy in anticipation of vim.pack --- nix/mkNeovim.nix | 59 +---- nix/neovim-overlay.nix | 2 +- nvim/init.lua | 78 ++++--- nvim/lua/{config => }/autocmd.lua | 37 +++ nvim/lua/config/init.lua | 36 --- nvim/lua/{config => }/keymaps.lua | 0 nvim/lua/{plugins => }/lib/minidiff_jj.lua | 0 nvim/lua/{plugins => }/lib/snacks_jj.lua | 0 nvim/lua/mini.lua | 73 ++++++ nvim/lua/plugins.lua | 253 +++++++++++++++++++++ nvim/lua/plugins/completion.lua | 87 ------- nvim/lua/plugins/lsp.lua | 118 ---------- nvim/lua/plugins/mini.lua | 120 ---------- nvim/lua/plugins/misc.lua | 114 ---------- nvim/lua/plugins/snacks.lua | 159 ------------- 15 files changed, 417 insertions(+), 719 deletions(-) rename nvim/lua/{config => }/autocmd.lua (63%) delete mode 100644 nvim/lua/config/init.lua rename nvim/lua/{config => }/keymaps.lua (100%) rename nvim/lua/{plugins => }/lib/minidiff_jj.lua (100%) rename nvim/lua/{plugins => }/lib/snacks_jj.lua (100%) create mode 100644 nvim/lua/mini.lua create mode 100644 nvim/lua/plugins.lua delete mode 100644 nvim/lua/plugins/completion.lua delete mode 100644 nvim/lua/plugins/lsp.lua delete mode 100644 nvim/lua/plugins/mini.lua delete mode 100644 nvim/lua/plugins/misc.lua delete mode 100644 nvim/lua/plugins/snacks.lua diff --git a/nix/mkNeovim.nix b/nix/mkNeovim.nix index 7d2e3a6..1ba7e54 100644 --- a/nix/mkNeovim.nix +++ b/nix/mkNeovim.nix @@ -52,7 +52,6 @@ let externalPackages = extraPackages ++ (optionals withSqlite [ pkgs.sqlite ]); # Map all plugins to an attrset { plugin = ; config = ; optional = ; ... } - normalizedPlugins = map (x: defaultPlugin // (if x ? plugin then x else { plugin = x; })) plugins; # This nixpkgs util function creates an attrset # that pkgs.wrapNeovimUnstable uses to configure the Neovim build. @@ -65,45 +64,20 @@ let viAlias vimAlias ; - plugins = normalizedPlugins; + + plugins = (pkgs.neovimUtils.normalizePlugins plugins); }; packDir = pkgs.neovimUtils.packDir { - myNeovimPackages = pkgs.neovimUtils.normalizedPluginsToVimPackage normalizedPlugins; + iofq = pkgs.neovimUtils.normalizedPluginsToVimPackage (pkgs.neovimUtils.normalizePlugins plugins); }; - # This uses the ignoreConfigRegexes list to filter - # the nvim directory - nvimRtpSrc = - let - src = ../nvim; - in - lib.cleanSourceWith { - inherit src; - name = "nvim-rtp-src"; - filter = - path: tyoe: - let - srcPrefix = toString src + "/"; - relPath = lib.removePrefix srcPrefix (toString path); - in - lib.all (regex: builtins.match regex relPath == null) ignoreConfigRegexes; - }; - - # Split runtimepath into 3 directories: - # - lua, to be prepended to the rtp at the beginning of init.lua - # - nvim, containing plugin, ftplugin, ... subdirectories - # - after, to be sourced last in the startup initialization - # See also: https://neovim.io/doc/user/starting.html nvimRtp = stdenv.mkDerivation { name = "nvim-rtp"; - src = nvimRtpSrc; - - buildPhase = '' - mkdir -p $out/ - ''; + src = ../nvim; installPhase = '' + mkdir -p $out/ cp -r . $out/ ''; }; @@ -112,30 +86,9 @@ let # It wraps the user init.lua, prepends the lua lib directory to the RTP # and prepends the nvim and after directory to the RTP initLua = '' - LAZY_OPTS = { - performance = { - reset_packpath = false, - rtp = { - reset = false, - disabled_plugins = { - "netrwPlugin", - "tutor", - }, - }, - }, - dev = { - path = "${packDir}/pack/myNeovimPackages/start", - patterns = {""}, - }, - checker = { - enabled = false, - }, - install = { missing = false, }, - spec = {{ import = "plugins" }}, - } vim.opt.rtp:prepend('${nvimRtp}') '' - + (builtins.readFile ../nvim/init.lua); + + builtins.readFile ../nvim/init.lua; # Add arguments to the Neovim wrapper script extraMakeWrapperArgs = builtins.concatStringsSep " " ( diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index 7a5074e..5a2684e 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -12,13 +12,13 @@ let conform-nvim dart-nvim diffview-nvim - lazy-nvim mini-nvim nvim-lint nvim-lspconfig nvim-treesitter.withAllGrammars nvim-treesitter-textobjects quicker-nvim + refactoring-nvim render-markdown-nvim snacks-nvim ]; diff --git a/nvim/init.lua b/nvim/init.lua index 43d1b43..708198b 100644 --- a/nvim/init.lua +++ b/nvim/init.lua @@ -1,33 +1,49 @@ vim.g.mapleader = ' ' --- If lazy_opts is set, we're running in wrapped neovim via nix -if not LAZY_OPTS then - -- Bootstrapping lazy.nvim - local lazypath = vim.fn.stdpath('data') .. '/lazy/lazy.nvim' - if not vim.loop.fs_stat(lazypath) then - vim.fn.system { - 'git', - 'clone', - '--filter=blob:none', - 'https://github.com/folke/lazy.nvim.git', - '--branch=stable', -- latest stable release - lazypath, - } - end - vim.opt.rtp:prepend(lazypath) - LAZY_OPTS = { - spec = { { import = 'plugins' } }, - performance = { - reset_packpath = false, - rtp = { - reset = false, - disabled_plugins = { - 'netrwPlugin', - 'tutor', - }, - }, - }, - } -end +vim.opt.autowrite = true +vim.opt.backspace = 'indent,eol,start' +vim.opt.confirm = true +vim.opt.completeopt = 'menuone,popup,noselect,fuzzy' +vim.opt.diffopt = 'internal,filler,closeoff,inline:char' +vim.opt.expandtab = true -- insert tabs as spaces +vim.opt.inccommand = 'split' -- incremental live completion +vim.opt.laststatus = 1 -- statusline only if split +vim.opt.nrformats:append('alpha') -- let Ctrl-a do letters as well +vim.opt.path:append('**') -- enable fuzzy :find ing +vim.opt.relativenumber = true +vim.opt.shadafile = 'NONE' -- disable shada (unless session) +vim.opt.shiftwidth = 0 -- >> shifts by tabstop +vim.opt.showmatch = true -- highlight matching brackets +vim.opt.showmode = true +vim.opt.signcolumn = 'no' +vim.opt.softtabstop = -1 -- backspace removes tabstop +vim.opt.swapfile = false +vim.opt.tabstop = 2 -- 2 space tabs are based +vim.opt.updatetime = 250 -- decrease update time +vim.opt.virtualedit = 'onemore' +vim.opt.winborder = 'rounded' + +-- Configure Neovim diagnostic messages +vim.diagnostic.config { + virtual_text = true, + underline = true, + severity_sort = true, + float = { + focusable = false, + style = 'minimal', + source = 'if_many', + }, +} + +vim.lsp.enable { + 'nixd', + 'phpactor', + 'gopls', + 'lua_ls', + 'basedpyright', +} + vim.cmd('colorscheme iofq') -require('lazy').setup(LAZY_OPTS) -require('config') +require('keymaps') +require('autocmd') +require('mini') +require('plugins') diff --git a/nvim/lua/config/autocmd.lua b/nvim/lua/autocmd.lua similarity index 63% rename from nvim/lua/config/autocmd.lua rename to nvim/lua/autocmd.lua index db5346a..a5e566d 100644 --- a/nvim/lua/config/autocmd.lua +++ b/nvim/lua/autocmd.lua @@ -58,3 +58,40 @@ vim.api.nvim_create_autocmd('FileType', { end, { buffer = bufnr, desc = 'swap prev arg' }) end, }) + +-- Init LSP +vim.api.nvim_create_autocmd('LspAttach', { + group = vim.api.nvim_create_augroup('UserLspConfig', {}), + callback = function(ev) + local client = vim.lsp.get_client_by_id(ev.data.client_id) + if not client then + return + end + vim.keymap.set('n', 'gO', function() + Snacks.picker.lsp_symbols { focus = 'list' } + end, { buffer = ev.buf, desc = 'LSP symbols' }) + + vim.keymap.set('n', 'grh', function() + vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled()) + end, { buffer = ev.buf, desc = 'LSP hints toggle' }) + vim.keymap.set('n', 'grl', vim.lsp.codelens.run, { buffer = ev.buf, desc = 'vim.lsp.codelens.run()' }) + + vim.keymap.set('n', 'gre', function() + vim.diagnostic.setloclist() + end, { buffer = ev.buf, desc = 'LSP buffer diagnostics' }) + vim.keymap.set('n', 'grE', function() + vim.diagnostic.setqflist() + end, { buffer = ev.buf, desc = 'LSP diagnostics' }) + + -- Auto-refresh code lenses + if client:supports_method('textDocument/codeLens') or client.server_capabilities.codeLensProvider then + vim.lsp.codelens.refresh { bufnr = ev.buf } + vim.api.nvim_create_autocmd({ 'InsertLeave', 'TextChanged' }, { + callback = function() + vim.lsp.codelens.refresh { bufnr = ev.buf } + end, + buffer = ev.buf, + }) + end + end, +}) diff --git a/nvim/lua/config/init.lua b/nvim/lua/config/init.lua deleted file mode 100644 index 4c47a68..0000000 --- a/nvim/lua/config/init.lua +++ /dev/null @@ -1,36 +0,0 @@ -vim.opt.autowrite = true -vim.opt.backspace = 'indent,eol,start' -vim.opt.confirm = true -vim.opt.completeopt = "menuone,popup,noselect,fuzzy" -vim.opt.diffopt = 'internal,filler,closeoff,inline:char' -vim.opt.expandtab = true -- insert tabs as spaces -vim.opt.inccommand = 'split' -- incremental live completion -vim.opt.laststatus = 1 -- statusline only if split -vim.opt.nrformats:append('alpha') -- let Ctrl-a do letters as well -vim.opt.path:append('**') -- enable fuzzy :find ing -vim.opt.relativenumber = true -vim.opt.shadafile = 'NONE' -- disable shada (unless session) -vim.opt.shiftwidth = 0 -- >> shifts by tabstop -vim.opt.showmatch = true -- highlight matching brackets -vim.opt.showmode = true -vim.opt.signcolumn = 'no' -vim.opt.softtabstop = -1 -- backspace removes tabstop -vim.opt.swapfile = false -vim.opt.tabstop = 2 -- 2 space tabs are based -vim.opt.updatetime = 250 -- decrease update time -vim.opt.virtualedit = 'onemore' -vim.opt.winborder = 'rounded' - --- Configure Neovim diagnostic messages -vim.diagnostic.config { - virtual_text = true, - underline = true, - severity_sort = true, - float = { - focusable = false, - style = 'minimal', - source = 'if_many', - }, -} -require('config.autocmd') -require('config.keymaps') diff --git a/nvim/lua/config/keymaps.lua b/nvim/lua/keymaps.lua similarity index 100% rename from nvim/lua/config/keymaps.lua rename to nvim/lua/keymaps.lua diff --git a/nvim/lua/plugins/lib/minidiff_jj.lua b/nvim/lua/lib/minidiff_jj.lua similarity index 100% rename from nvim/lua/plugins/lib/minidiff_jj.lua rename to nvim/lua/lib/minidiff_jj.lua diff --git a/nvim/lua/plugins/lib/snacks_jj.lua b/nvim/lua/lib/snacks_jj.lua similarity index 100% rename from nvim/lua/plugins/lib/snacks_jj.lua rename to nvim/lua/lib/snacks_jj.lua diff --git a/nvim/lua/mini.lua b/nvim/lua/mini.lua new file mode 100644 index 0000000..b1810d5 --- /dev/null +++ b/nvim/lua/mini.lua @@ -0,0 +1,73 @@ +require('mini.basics').setup { mappings = { windows = true } } +require('mini.icons').setup() + +vim.schedule(function() + require('mini.align').setup() + require('mini.pairs').setup() + require('mini.surround').setup() + require('mini.splitjoin').setup { detect = { separator = '[,;\n]' } } + + local ai = require('mini.ai') + ai.setup { + n_lines = 300, + custom_textobjects = { + i = require('mini.extra').gen_ai_spec.indent(), + a = ai.gen_spec.treesitter { a = '@parameter.outer', i = '@parameter.inner' }, + f = ai.gen_spec.treesitter { a = '@function.outer', i = '@function.inner' }, + }, + } + + require('mini.git').setup() + vim.keymap.set('n', 'go', function() + return MiniGit.show_at_cursor() + end, { noremap = true, desc = 'git show at cursor' }) + vim.keymap.set('n', 'gb', 'Git blame -- %', { desc = 'git blame' }) + + local jump = require('mini.jump2d') + jump.setup { + view = { n_steps_ahead = 1, dim = true }, + spotter = jump.gen_spotter.vimpattern(), + } + + local diff = require('mini.diff') + diff.setup { + source = { + require('lib.minidiff_jj').gen_source(), + diff.gen_source.git(), + }, + } + vim.keymap.set('n', 'gp', function() + MiniDiff.toggle_overlay(0) + end, { noremap = true, desc = 'git diff overlay' }) + + local files = require('mini.files') + files.setup { + mappings = { + go_in_plus = '', + }, + windows = { + preview = true, + width_preview = 50, + }, + } + vim.keymap.set('n', 'nc', function() + MiniFiles.open(vim.api.nvim_buf_get_name(0), false) -- open current buffer's dir + MiniFiles.reveal_cwd() + end, { desc = 'minifiles open' }) + + vim.keymap.set('n', '`', function() + local _, cur_entry_path = pcall(MiniFiles.get_fs_entry().path) + local cur_directory = vim.fs.dirname(cur_entry_path) + if cur_directory ~= '' then + vim.fn.chdir(cur_directory) + end + end) + + -- pass file rename events to LSP + vim.api.nvim_create_autocmd('User', { + pattern = 'MiniFilesActionRename', + callback = function(event) + Snacks.rename.on_rename_file(event.data.from, event.data.to) + end, + }) +end) diff --git a/nvim/lua/plugins.lua b/nvim/lua/plugins.lua new file mode 100644 index 0000000..b00a3e4 --- /dev/null +++ b/nvim/lua/plugins.lua @@ -0,0 +1,253 @@ +require('dart').setup { + tabline = { + label_marked_fg = 'cyan', + }, +} + +require('snacks').setup { + bigfile = { enabled = true }, + terminal = { enabled = true }, + indent = { enabled = true }, + input = { enabled = true }, + notifier = { enabled = true }, + styles = { + notification = { + wo = { wrap = true }, + }, + }, + picker = { + enabled = true, + matcher = { + frecency = true, + cwd_bonus = true, + }, + layout = 'ivy_split', + sources = { + grep = { hidden = true }, + lsp_symbols = { + filter = { default = true }, + layout = 'left', + }, + smart = { + multi = { + { source = 'files', hidden = true }, + { source = 'git_files', untracked = true }, + }, + }, + }, + }, +} + +vim.keymap.set({ 'n', 't' }, '', function() + Snacks.terminal.toggle() +end, { desc = 'terminal open' }) + +vim.keymap.set('n', 'ff', function() + Snacks.picker.smart() +end, { desc = 'Fuzzy find smart' }) + +vim.keymap.set('n', 'fa', function() + Snacks.picker.grep() +end, { desc = 'Fuzzy find grep' }) + +vim.keymap.set('n', 'f8', function() + Snacks.picker.grep_word() +end, { desc = 'Fuzzy find grep word' }) + +vim.keymap.set('n', 'f?', function() + Snacks.picker.pickers() +end, { desc = 'See all pickers' }) + +vim.keymap.set('n', 'fu', function() + Snacks.picker.undo() +end, { desc = 'Pick undotree' }) + +vim.keymap.set('n', 'fj', function() + Snacks.picker.jumps() +end, { desc = 'Pick jumps' }) + +vim.keymap.set('n', 'f.', function() + Snacks.picker.resume() +end, { desc = 'Fuzzy find resume' }) + +vim.keymap.set('n', 'fb', function() + Snacks.picker.buffers() +end, { desc = 'Fuzzy find buffers' }) + +vim.keymap.set('n', 'fq', function() + Snacks.picker.qflist() +end, { desc = 'pick quickfix list' }) + +vim.keymap.set('n', 'jf', function() + require('lib.snacks_jj').status() +end, { desc = 'pick notifications' }) +vim.schedule(function() + require('nvim-treesitter').setup() + require('nvim-treesitter-textobjects').setup() + require('render-markdown').setup() + + require('refactoring').setup() + vim.keymap.set('n', 'rr', function() + require('refactoring').select_refactor() + end, { desc = 'Refactor' }) + vim.keymap.set('n', 'rv', function() + require('refactoring').refactor('Inline Variable') + end, { desc = 'Inline Variable' }) + + require('quicker').setup() + vim.keymap.set('n', 'qf', function() + require('quicker').toggle { max_height = 20 } + end, { desc = 'Toggle qflist' }) + + require('diffview').setup { + use_icons = false, + enhanced_diff_hl = true, + default_args = { + DiffviewOpen = { '--imply-local' }, + }, + view = { + merge_tool = { + layout = 'diff4_mixed', + disable_diagnostics = true, + }, + }, + keymaps = { + view = { + { { 'n' }, 'q', vim.cmd.DiffviewClose, { desc = 'Close Diffview' } }, + }, + file_panel = { + { { 'n' }, 'q', vim.cmd.DiffviewClose, { desc = 'Close Diffview' } }, + }, + file_history_panel = { + { { 'n' }, 'q', vim.cmd.DiffviewClose, { desc = 'Close Diffview' } }, + }, + }, + } + + vim.keymap.set('n', 'nb', vim.cmd.DiffviewOpen, { desc = 'diffview open' }) + vim.keymap.set('n', 'nH', vim.cmd.DiffviewFileHistory, { desc = 'diffview history' }) + vim.keymap.set('n', 'nh', 'DiffviewFileHistory %', { desc = 'diffview history' }) + + require('conform').setup { + notify_no_formatters = false, + formatters_by_ft = { + json = { 'jq' }, + lua = { 'stylua' }, + python = { 'ruff' }, + nix = { 'nixfmt' }, + fish = { 'fish_indent' }, + ['*'] = { 'trim_whitespace' }, + }, + format_on_save = function(bufnr) + -- Disable with a global or buffer-local variable + if vim.g.disable_autoformat or vim.b[bufnr].disable_autoformat then + return + end + return { timeout_ms = 1500, lsp_format = 'fallback' } + end, + } + vim.keymap.set('n', '\\f', function() + vim.b.disable_autoformat = not vim.b.disable_autoformat + vim.notify(string.format('Buffer formatting disabled: %s', vim.b.disable_autoformat)) + end, { desc = 'toggle buffer formatting' }) + vim.keymap.set('n', '\\F', function() + vim.g.disable_autoformat = not vim.g.disable_autoformat + vim.notify(string.format('Global formatting disabled: %s', vim.g.disable_autoformat)) + end, { desc = 'toggle global formatting' }) + + require('lint').linters_by_ft = { + docker = { 'hadolint' }, + yaml = { 'yamllint' }, + sh = { 'shellcheck' }, + go = { 'golangcilint' }, + ruby = { 'rubocop' }, + fish = { 'fish' }, + bash = { 'bash' }, + nix = { 'nix' }, + php = { 'php' }, + } + vim.api.nvim_create_autocmd({ 'BufWritePost', 'InsertLeave' }, { + group = vim.api.nvim_create_augroup('lint', { clear = true }), + callback = function() + if vim.bo.modifiable then + require('lint').try_lint(nil, { ignore_errors = true }) + end + end, + }) + + vim.treesitter.language.register('markdown', 'blink-cmp-documentation') + require('blink.cmp').setup { + enabled = function() + return not vim.tbl_contains({ 'snacks_picker_input' }, vim.bo.filetype) + end, + fuzzy = { + sorts = { + 'exact', + 'score', + 'sort_text', + }, + }, + sources = { + default = { + 'lsp', + 'path', + 'snippets', + 'ripgrep', + 'buffer', + }, + providers = { + lsp = { + fallbacks = {}, -- include buffer even when LSP is active + score_offset = 10, + }, + snippets = { + score_offset = -10, + }, + path = { + opts = { + get_cwd = function(_) + return vim.fn.getcwd() -- use nvim pwd instead of current file pwd + end, + }, + }, + ripgrep = { + module = 'blink-ripgrep', + name = 'rg', + score_offset = -10, + async = true, + }, + }, + }, + cmdline = { + completion = { + menu = { + auto_show = true, + }, + }, + }, + completion = { + documentation = { + auto_show = true, + auto_show_delay_ms = 500, + }, + menu = { + draw = { + treesitter = { 'lsp' }, + columns = { + { 'label', 'label_description', gap = 1 }, + { 'source_name', 'kind', gap = 1 }, + }, + }, + }, + trigger = { + show_on_keyword = true, + }, + }, + signature = { + enabled = true, + trigger = { + show_on_insert = true, + }, + }, + } +end) diff --git a/nvim/lua/plugins/completion.lua b/nvim/lua/plugins/completion.lua deleted file mode 100644 index 20480dc..0000000 --- a/nvim/lua/plugins/completion.lua +++ /dev/null @@ -1,87 +0,0 @@ -return { - { - 'saghen/blink.cmp', - event = 'VeryLazy', - dependencies = { - 'mikavilpas/blink-ripgrep.nvim', - }, - opts = { - enabled = function() - return not vim.tbl_contains({ 'snacks_picker_input' }, vim.bo.filetype) - end, - fuzzy = { - sorts = { - 'exact', - 'score', - 'sort_text', - }, - }, - sources = { - default = { - 'lsp', - 'path', - 'snippets', - 'ripgrep', - 'buffer', - }, - providers = { - lsp = { - fallbacks = {}, -- include buffer even when LSP is active - score_offset = 10, - }, - snippets = { - score_offset = -10, - }, - path = { - opts = { - get_cwd = function(_) - return vim.fn.getcwd() -- use nvim pwd instead of current file pwd - end, - }, - }, - ripgrep = { - module = 'blink-ripgrep', - name = 'rg', - score_offset = -10, - async = true, - }, - }, - }, - cmdline = { - completion = { - menu = { - auto_show = true, - }, - }, - }, - completion = { - documentation = { - auto_show = true, - auto_show_delay_ms = 500, - }, - menu = { - draw = { - treesitter = { 'lsp' }, - columns = { - { 'label', 'label_description', gap = 1 }, - { 'source_name', 'kind', gap = 1 }, - }, - }, - }, - trigger = { - show_on_keyword = true, - }, - }, - signature = { - enabled = true, - trigger = { - show_on_insert = true, - }, - }, - }, - config = function(_, opts) - require('blink.cmp').setup(opts) - vim.treesitter.language.register('markdown', 'blink-cmp-documentation') - end, - }, -} diff --git a/nvim/lua/plugins/lsp.lua b/nvim/lua/plugins/lsp.lua deleted file mode 100644 index ae902b2..0000000 --- a/nvim/lua/plugins/lsp.lua +++ /dev/null @@ -1,118 +0,0 @@ -return { - { - 'neovim/nvim-lspconfig', - event = 'VeryLazy', - config = function() - vim.lsp.enable { - 'nixd', - 'phpactor', - 'gopls', - 'lua_ls', - 'basedpyright', - } - - vim.api.nvim_create_autocmd('LspAttach', { - group = vim.api.nvim_create_augroup('UserLspConfig', {}), - callback = function(ev) - local client = vim.lsp.get_client_by_id(ev.data.client_id) - if not client then - return - end - vim.keymap.set('n', 'gO', function() - Snacks.picker.lsp_symbols { focus = 'list' } - end, { buffer = ev.buf, desc = 'LSP symbols' }) - - vim.keymap.set('n', 'grh', function() - vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled()) - end, { buffer = ev.buf, desc = 'LSP hints toggle' }) - vim.keymap.set('n', 'grl', vim.lsp.codelens.run, { buffer = ev.buf, desc = 'vim.lsp.codelens.run()' }) - - vim.keymap.set('n', 'gre', function() - vim.diagnostic.setloclist() - end, { buffer = ev.buf, desc = 'LSP buffer diagnostics' }) - vim.keymap.set('n', 'grE', function() - vim.diagnostic.setqflist() - end, { buffer = ev.buf, desc = 'LSP diagnostics' }) - - -- Auto-refresh code lenses - if client:supports_method('textDocument/codeLens') or client.server_capabilities.codeLensProvider then - vim.lsp.codelens.refresh { bufnr = ev.buf } - vim.api.nvim_create_autocmd({ 'InsertLeave', 'TextChanged' }, { - callback = function() - vim.lsp.codelens.refresh { bufnr = ev.buf } - end, - buffer = ev.buf, - }) - end - end, - }) - end, - }, - { - 'stevearc/conform.nvim', - event = 'VeryLazy', - keys = { - { - '\\f', - function() - vim.b.disable_autoformat = not vim.b.disable_autoformat - vim.notify(string.format('Buffer formatting disabled: %s', vim.b.disable_autoformat)) - end, - mode = { 'n', 'x' }, - desc = 'toggle buffer formatting', - }, - { - '\\F', - function() - vim.g.disable_autoformat = not vim.g.disable_autoformat - vim.notify(string.format('Global formatting disabled: %s', vim.g.disable_autoformat)) - end, - mode = { 'n', 'x' }, - desc = 'toggle global formatting', - }, - }, - opts = { - notify_no_formatters = false, - formatters_by_ft = { - json = { 'jq' }, - lua = { 'stylua' }, - python = { 'ruff' }, - nix = { 'nixfmt' }, - fish = { 'fish_indent' }, - ['*'] = { 'trim_whitespace' }, - }, - format_on_save = function(bufnr) - -- Disable with a global or buffer-local variable - if vim.g.disable_autoformat or vim.b[bufnr].disable_autoformat then - return - end - return { timeout_ms = 1500, lsp_format = 'fallback' } - end, - }, - }, - { - 'mfussenegger/nvim-lint', - event = 'VeryLazy', - config = function() - require('lint').linters_by_ft = { - docker = { 'hadolint' }, - yaml = { 'yamllint' }, - sh = { 'shellcheck' }, - go = { 'golangcilint' }, - ruby = { 'rubocop' }, - fish = { 'fish' }, - bash = { 'bash' }, - nix = { 'nix' }, - php = { 'php' }, - } - vim.api.nvim_create_autocmd({ 'BufEnter', 'BufWritePost', 'InsertLeave' }, { - group = vim.api.nvim_create_augroup('lint', { clear = true }), - callback = function() - if vim.bo.modifiable then - require('lint').try_lint(nil, { ignore_errors = true }) - end - end, - }) - end, - }, -} diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua deleted file mode 100644 index bf2d6f1..0000000 --- a/nvim/lua/plugins/mini.lua +++ /dev/null @@ -1,120 +0,0 @@ -return { - { - 'nvim-mini/mini.nvim', - lazy = false, - keys = { - { - 'gp', - function() - MiniDiff.toggle_overlay(0) - end, - noremap = true, - desc = 'git diff overlay', - }, - { - 'go', - function() - return MiniGit.show_at_cursor() - end, - noremap = true, - desc = 'git show at cursor', - }, - { - 'gb', - 'Git blame -- %', - desc = 'git blame', - }, - }, - config = function() - require('mini.basics').setup { mappings = { windows = true } } - require('mini.icons').setup() - vim.schedule(function() - local ai = require('mini.ai') - ai.setup { - n_lines = 300, - custom_textobjects = { - i = require('mini.extra').gen_ai_spec.indent(), - a = ai.gen_spec.treesitter { a = '@parameter.outer', i = '@parameter.inner' }, - f = ai.gen_spec.treesitter { a = '@function.outer', i = '@function.inner' }, - }, - } - require('mini.align').setup() - require('mini.pairs').setup() - require('mini.git').setup() - require('mini.surround').setup() - require('mini.splitjoin').setup { detect = { separator = '[,;\n]' } } - - local jump = require('mini.jump2d') - jump.setup { - view = { n_steps_ahead = 1, dim = true }, - spotter = jump.gen_spotter.vimpattern(), - } - - local diff = require('mini.diff') - diff.setup { - source = { - require('plugins.lib.minidiff_jj').gen_source(), - diff.gen_source.git(), - }, - } - local miniclue = require('mini.clue') - miniclue.setup { - triggers = { - { mode = 'n', keys = '' }, - { mode = 'n', keys = 'g' }, - { mode = 'n', keys = "'" }, - { mode = 'n', keys = '`' }, - { mode = 'n', keys = '"' }, - { mode = 'n', keys = '' }, - { mode = 'n', keys = 'z' }, - { mode = 'n', keys = ']' }, - { mode = 'n', keys = '[' }, - { mode = 'n', keys = '\\' }, - }, - window = { - config = { width = 'auto' }, - }, - clues = { - miniclue.gen_clues.g(), - miniclue.gen_clues.marks(), - miniclue.gen_clues.registers({show_contents = true}), - miniclue.gen_clues.windows(), - miniclue.gen_clues.z(), - }, - } - local files = require('mini.files') - files.setup { - mappings = { - go_in_plus = '', - }, - windows = { - preview = true, - width_preview = 50, - }, - } - vim.keymap.set('n', 'nc', function() - files.open(vim.api.nvim_buf_get_name(0), false) -- open current buffer's dir - files.reveal_cwd() - end, { desc = 'minifiles open' }) - vim.api.nvim_create_autocmd('User', { - pattern = 'MiniFilesBufferCreate', - callback = function(args) - vim.keymap.set('n', '`', function() - local _, cur_entry_path = pcall(MiniFiles.get_fs_entry().path) - local cur_directory = vim.fs.dirname(cur_entry_path) - if cur_directory ~= '' then - vim.fn.chdir(cur_directory) - end - end, { buffer = args.data.buf_id }) - end, - }) - vim.api.nvim_create_autocmd('User', { - pattern = 'MiniFilesActionRename', - callback = function(event) - Snacks.rename.on_rename_file(event.data.from, event.data.to) - end, - }) - end) - end, - }, -} diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua deleted file mode 100644 index d880b74..0000000 --- a/nvim/lua/plugins/misc.lua +++ /dev/null @@ -1,114 +0,0 @@ -return { - { - 'iofq/dart.nvim', - lazy = false, - priority = 1001, - dependencies = 'nvim-mini/mini.nvim', - opts = { - label_marked_fg = 'cyan' - }, - }, - { - 'nvim-treesitter/nvim-treesitter', - event = 'VeryLazy', - branch = 'main', - dependencies = { - { - 'nvim-treesitter/nvim-treesitter-textobjects', - branch = 'main', - config = true, - }, - }, - }, - { - 'MeanderingProgrammer/render-markdown.nvim', - event = 'VeryLazy', - opts = { - completions = { - blink = { enabled = true }, - }, - }, - }, - { - 'sindrets/diffview.nvim', - event = 'VeryLazy', - opts = { - use_icons = false, - enhanced_diff_hl = true, - default_args = { - DiffviewOpen = { '--imply-local' }, - }, - view = { - merge_tool = { - layout = 'diff4_mixed', - disable_diagnostics = true, - }, - }, - keymaps = { - view = { - { { 'n' }, 'q', vim.cmd.DiffviewClose, { desc = 'Close Diffview' } }, - }, - file_panel = { - { { 'n' }, 'q', vim.cmd.DiffviewClose, { desc = 'Close Diffview' } }, - }, - file_history_panel = { - { { 'n' }, 'q', vim.cmd.DiffviewClose, { desc = 'Close Diffview' } }, - }, - }, - }, - keys = { - { 'nb', vim.cmd.DiffviewOpen, desc = 'diffview open' }, - { - 'nh', - 'DiffviewFileHistory %', - mode = { 'n', 'v' }, - desc = 'diffview history', - }, - { - 'nH', - 'DiffviewFileHistory', - mode = { 'n', 'v' }, - desc = 'diffview history', - }, - }, - }, - { - 'stevearc/quicker.nvim', - event = 'VeryLazy', - opts = { - follow = { - enabled = true, - }, - }, - keys = { - { - 'qf', - function() - require('quicker').toggle { max_height = 20 } - end, - desc = 'Toggle qflist', - }, - { - 'qr', - function() - require('quicker').refresh() - end, - desc = 'Refresh qflist', - }, - { - 'q>', - function() - require('quicker').expand { before = 2, after = 2, add_to_existing = true } - end, - desc = 'Expand quickfix context', - }, - { - 'q<', - function() - require('quicker').collapse() - end, - desc = 'Collapse quickfix context', - }, - }, - }, -} diff --git a/nvim/lua/plugins/snacks.lua b/nvim/lua/plugins/snacks.lua deleted file mode 100644 index 952cd00..0000000 --- a/nvim/lua/plugins/snacks.lua +++ /dev/null @@ -1,159 +0,0 @@ -return { - { - 'folke/snacks.nvim', - lazy = false, - priority = 1000, - opts = { - bigfile = { enabled = true }, - notifier = { - enabled = true, - timeout = 4000, - }, - styles = { - notification = { - wo = { wrap = true }, - }, - }, - terminal = { enabled = true }, - indent = { enabled = true }, - input = { enabled = true }, - picker = { - enabled = true, - jump = { reuse_win = true }, - matcher = { - frecency = true, - history_bonus = true, - cwd_bonus = true, - }, - layout = 'ivy_split', - sources = { - grep = { hidden = true }, - explorer = { hidden = true }, - lsp_symbols = { - filter = { default = true }, - layout = 'left', - }, - smart = { - sort = { - fields = { - 'score:desc', - 'idx', - '#text', - }, - }, - multi = { - 'marks', - { source = 'buffers', current = false }, - { source = 'files', hidden = true }, - { source = 'git_files', untracked = true }, - }, - }, - }, - win = { - input = { - keys = { ['wq'] = { 'close', mode = 'i' } }, - }, - list = { - keys = { ['wq'] = { 'close', mode = 'i' } }, - }, - }, - }, - }, - keys = { - { - '', - function() - Snacks.terminal.toggle() - end, - mode = { 'n', 't' }, - desc = 'terminal open', - }, - { - '', - function() - vim.cmd.delmarks { args = { '0-9' } } - vim.cmd.delmarks { args = { '"' } } - Snacks.picker.smart() - end, - desc = 'Fuzzy find smart', - }, - { - 'ff', - function() - Snacks.picker.files() - end, - desc = 'Fuzzy find files', - }, - { - 'fa', - function() - Snacks.picker.grep() - end, - desc = 'Fuzzy find grep', - }, - { - 'f8', - function() - Snacks.picker.grep_word() - end, - desc = 'Fuzzy find grep word', - }, - { - 'f?', - function() - Snacks.picker.pickers() - end, - desc = 'See all pickers', - }, - { - 'fu', - function() - Snacks.picker.undo() - end, - desc = 'Pick undotree', - }, - { - 'fj', - function() - Snacks.picker.jumps() - end, - desc = 'Pick jumps', - }, - { - 'f.', - function() - Snacks.picker.resume() - end, - desc = 'Fuzzy find resume', - }, - { - 'fb', - function() - Snacks.picker.buffers() - end, - desc = 'Fuzzy find buffers', - }, - { - 'gO', - function() - Snacks.picker.treesitter() - end, - desc = 'pick treesitter nodes', - }, - { - 'fq', - function() - Snacks.picker.qflist() - end, - desc = 'pick quickfix list', - }, - { - 'jf', - function() - require('plugins.lib.snacks_jj').status() - end, - desc = 'pick notifications', - }, - }, - }, -} From 49e373fe9a07480d9ea683d81772c05ce5da2f32 Mon Sep 17 00:00:00 2001 From: iofq Date: Mon, 6 Oct 2025 22:52:22 -0500 Subject: [PATCH 6/9] remove unused nix code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit flake.lock: Update Flake lock file updates: • Updated input 'neovim-nightly-overlay': 'github:nix-community/neovim-nightly-overlay/b7b3632fab34541543373254c265da03c1d0f240?narHash=sha256-SDLZMha2miaChOBGBkQJlTtk2kvcB7WIVVZ2l0/9byc%3D' (2025-10-01) → 'github:nix-community/neovim-nightly-overlay/7ff73a295b0065bde2f8b43b31558136ca77bd98?narHash=sha256-39JFRb006AOsIcOq%2B03H3y6YcGyaphk1CW5DRi14cOE%3D' (2025-10-13) • Updated input 'neovim-nightly-overlay/flake-parts': 'github:hercules-ci/flake-parts/4524271976b625a4a605beefd893f270620fd751?narHash=sha256-%2BuWLQZccFHwqpGqr2Yt5VsW/PbeJVTn9Dk6SHWhNRPw%3D' (2025-09-01) → 'github:hercules-ci/flake-parts/758cf7296bee11f1706a574c77d072b8a7baa881?narHash=sha256-wfG0S7pltlYyZTM%2BqqlhJ7GMw2fTF4mLKCIVhLii/4M%3D' (2025-10-01) • Updated input 'neovim-nightly-overlay/git-hooks': 'github:cachix/git-hooks.nix/54df955a695a84cd47d4a43e08e1feaf90b1fd9b?narHash=sha256-ytw7ROXaWZ7OfwHrQ9xvjpUWeGVm86pwnEd1QhzawIo%3D' (2025-09-17) → 'github:cachix/git-hooks.nix/cfc9f7bb163ad8542029d303e599c0f7eee09835?narHash=sha256-PTod9NG%2Bi3XbbnBKMl/e5uHDBYpwIWivQ3gOWSEuIEM%3D' (2025-10-03) • Updated input 'neovim-nightly-overlay/neovim-src': 'github:neovim/neovim/198c9e9bca7549cf7110be8c6f1df1c38d4e747f?narHash=sha256-oc1pPeoe8458X0r/Wum8CucVcJLlIp4mg%2B1HiOSVRgA%3D' (2025-09-30) → 'github:neovim/neovim/72b0bfa1fb7e897e5126aabae718a5480f466b9e?narHash=sha256-RnB%2BoJcP37YT9pjr1osUQtJc%2B1qcVyaaeSbiSyXwm1Y%3D' (2025-10-12) • Updated input 'neovim-nightly-overlay/nixpkgs': 'github:NixOS/nixpkgs/647e5c14cbd5067f44ac86b74f014962df460840?narHash=sha256-JVZl8NaVRYb0%2B381nl7LvPE%2BA774/dRpif01FKLrYFQ%3D' (2025-09-28) → 'github:NixOS/nixpkgs/362791944032cb532aabbeed7887a441496d5e6e?narHash=sha256-gKl2Gtro/LNf8P%2B4L3S2RsZ0G390ccd5MyXYrTdMCFE%3D' (2025-10-11) • Updated input 'neovim-nightly-overlay/treefmt-nix': 'github:numtide/treefmt-nix/5eda4ee8121f97b218f7cc73f5172098d458f1d1?narHash=sha256-ySNJ008muQAds2JemiyrWYbwbG%2BV7S5wg3ZVKGHSFu8%3D' (2025-09-24) → 'github:numtide/treefmt-nix/761ae7aff00907b607125b2f57338b74177697ed?narHash=sha256-gq9rdocpmRZCwLS5vsHozwB6b5nrOBDNc2kkEaTXHfg%3D' (2025-10-10) • Updated input 'nixpkgs': 'github:NixOS/nixpkgs/d48b56f4899ee1d5377291576284969c9e37acc2?narHash=sha256-7G5fSMPNVwWNlFpZLwvKB8PUOaqPzFQbrtZ7RAzg2nw%3D' (2025-10-01) → 'github:NixOS/nixpkgs/09c05674757a82f32b67f70f702e56c4901a3cdd?narHash=sha256-IzUhHp/jU06jBW6S%2Bd12AO3sgq5yehYVTCBH7J6re5c%3D' (2025-10-13) flake.lock: Update Flake lock file updates: • Updated input 'neovim-nightly-overlay/nixpkgs': 'github:NixOS/nixpkgs/362791944032cb532aabbeed7887a441496d5e6e?narHash=sha256-gKl2Gtro/LNf8P%2B4L3S2RsZ0G390ccd5MyXYrTdMCFE%3D' (2025-10-11) → follows 'nixpkgs' --- flake.lock | 95 +++---- flake.nix | 46 ++-- nix/mkNeovim.nix | 165 ++---------- nix/neovim-overlay.nix | 28 +- nvim/{ => after}/colors/iofq.lua | 0 nvim/{ => after}/ftplugin/go.lua | 0 nvim/{ => after}/ftplugin/php.lua | 0 nvim/{ => after}/lsp/gopls.lua | 0 nvim/{ => after}/lsp/lua_ls.lua | 0 .../lib => after/lua/iofq}/minidiff_jj.lua | 0 .../{lua/lib => after/lua/iofq}/snacks_jj.lua | 0 nvim/after/plugin/autocmd.lua | 139 ++++++++++ nvim/{ => after/plugin}/init.lua | 25 +- nvim/{lua => after/plugin}/mini.lua | 55 ++-- nvim/after/plugin/plugins.lua | 153 +++++++++++ nvim/lua/autocmd.lua | 97 ------- nvim/lua/keymaps.lua | 18 -- nvim/lua/plugins.lua | 253 ------------------ 18 files changed, 431 insertions(+), 643 deletions(-) rename nvim/{ => after}/colors/iofq.lua (100%) rename nvim/{ => after}/ftplugin/go.lua (100%) rename nvim/{ => after}/ftplugin/php.lua (100%) rename nvim/{ => after}/lsp/gopls.lua (100%) rename nvim/{ => after}/lsp/lua_ls.lua (100%) rename nvim/{lua/lib => after/lua/iofq}/minidiff_jj.lua (100%) rename nvim/{lua/lib => after/lua/iofq}/snacks_jj.lua (100%) create mode 100644 nvim/after/plugin/autocmd.lua rename nvim/{ => after/plugin}/init.lua (67%) rename nvim/{lua => after/plugin}/mini.lua (54%) create mode 100644 nvim/after/plugin/plugins.lua delete mode 100644 nvim/lua/autocmd.lua delete mode 100644 nvim/lua/keymaps.lua delete mode 100644 nvim/lua/plugins.lua diff --git a/flake.lock b/flake.lock index a89f66c..6e5f8e8 100644 --- a/flake.lock +++ b/flake.lock @@ -6,17 +6,14 @@ "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1757895736, - "narHash": "sha256-BBjs+YCOzgb6N2lew4vEmyS6s70y0z5xStKjGQaf55g=", - "owner": "iofq", - "repo": "dart.nvim", - "rev": "f059335a22811374d5a7e22c97889ea712db58d7", - "type": "github" + "lastModified": 1760318820, + "narHash": "sha256-3ETm+AZ/UEU0OYFSYviMSv/Ov4BN1cEsBH6KNGuTYS4=", + "path": "/home/e/dev/dart.nvim", + "type": "path" }, "original": { - "owner": "iofq", - "repo": "dart.nvim", - "type": "github" + "path": "/home/e/dev/dart.nvim", + "type": "path" } }, "flake-compat": { @@ -93,11 +90,11 @@ ] }, "locked": { - "lastModified": 1756770412, - "narHash": "sha256-+uWLQZccFHwqpGqr2Yt5VsW/PbeJVTn9Dk6SHWhNRPw=", + "lastModified": 1759362264, + "narHash": "sha256-wfG0S7pltlYyZTM+qqlhJ7GMw2fTF4mLKCIVhLii/4M=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "4524271976b625a4a605beefd893f270620fd751", + "rev": "758cf7296bee11f1706a574c77d072b8a7baa881", "type": "github" }, "original": { @@ -198,11 +195,11 @@ ] }, "locked": { - "lastModified": 1758108966, - "narHash": "sha256-ytw7ROXaWZ7OfwHrQ9xvjpUWeGVm86pwnEd1QhzawIo=", + "lastModified": 1759523803, + "narHash": "sha256-PTod9NG+i3XbbnBKMl/e5uHDBYpwIWivQ3gOWSEuIEM=", "owner": "cachix", "repo": "git-hooks.nix", - "rev": "54df955a695a84cd47d4a43e08e1feaf90b1fd9b", + "rev": "cfc9f7bb163ad8542029d303e599c0f7eee09835", "type": "github" }, "original": { @@ -303,15 +300,17 @@ "git-hooks": "git-hooks_2", "hercules-ci-effects": "hercules-ci-effects", "neovim-src": "neovim-src", - "nixpkgs": "nixpkgs_2", + "nixpkgs": [ + "nixpkgs" + ], "treefmt-nix": "treefmt-nix" }, "locked": { - "lastModified": 1759277111, - "narHash": "sha256-SDLZMha2miaChOBGBkQJlTtk2kvcB7WIVVZ2l0/9byc=", + "lastModified": 1760313895, + "narHash": "sha256-39JFRb006AOsIcOq+03H3y6YcGyaphk1CW5DRi14cOE=", "owner": "nix-community", "repo": "neovim-nightly-overlay", - "rev": "b7b3632fab34541543373254c265da03c1d0f240", + "rev": "7ff73a295b0065bde2f8b43b31558136ca77bd98", "type": "github" }, "original": { @@ -323,11 +322,11 @@ "neovim-src": { "flake": false, "locked": { - "lastModified": 1759210115, - "narHash": "sha256-oc1pPeoe8458X0r/Wum8CucVcJLlIp4mg+1HiOSVRgA=", + "lastModified": 1760312166, + "narHash": "sha256-RnB+oJcP37YT9pjr1osUQtJc+1qcVyaaeSbiSyXwm1Y=", "owner": "neovim", "repo": "neovim", - "rev": "198c9e9bca7549cf7110be8c6f1df1c38d4e747f", + "rev": "72b0bfa1fb7e897e5126aabae718a5480f466b9e", "type": "github" }, "original": { @@ -381,27 +380,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1759070547, - "narHash": "sha256-JVZl8NaVRYb0+381nl7LvPE+A774/dRpif01FKLrYFQ=", + "lastModified": 1760326837, + "narHash": "sha256-z+C6KRPRjwqEsTEAwUavapBWcbR7YOlQP91O+W5L1ek=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "647e5c14cbd5067f44ac86b74f014962df460840", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_3": { - "locked": { - "lastModified": 1759300078, - "narHash": "sha256-7G5fSMPNVwWNlFpZLwvKB8PUOaqPzFQbrtZ7RAzg2nw=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "d48b56f4899ee1d5377291576284969c9e37acc2", + "rev": "cfe6b045750c3aa5127817bc3f44f2909b1ee175", "type": "github" }, "original": { @@ -411,13 +394,13 @@ "type": "github" } }, - "nixpkgs_4": { + "nixpkgs_3": { "locked": { - "lastModified": 1759381078, - "narHash": "sha256-gTrEEp5gEspIcCOx9PD8kMaF1iEmfBcTbO0Jag2QhQs=", + "lastModified": 1760038930, + "narHash": "sha256-Oncbh0UmHjSlxO7ErQDM3KM0A5/Znfofj2BSzlHLeVw=", "owner": "nixos", "repo": "nixpkgs", - "rev": "7df7ff7d8e00218376575f0acdcc5d66741351ee", + "rev": "0b4defa2584313f3b781240b29d61f6f9f7e0df3", "type": "github" }, "original": { @@ -430,11 +413,11 @@ "nvim-treesitter": { "flake": false, "locked": { - "lastModified": 1759376029, - "narHash": "sha256-Cu6Wg9SKJpYAkp8DPAXe4Rf9OSSWW2wNdmCkYtl//fw=", + "lastModified": 1760260935, + "narHash": "sha256-To/syCZPs7vKA0WkuBz7ZxCGT/wzj705QfxZng6Nsjo=", "owner": "nvim-treesitter", "repo": "nvim-treesitter", - "rev": "99bd52ba56a4b7c9a8cc50a6140180755e76fac6", + "rev": "0606c7a9dcaa5c5beee0b0f09043e9fdd1ba0a68", "type": "github" }, "original": { @@ -446,16 +429,16 @@ }, "nvim-treesitter-main": { "inputs": { - "nixpkgs": "nixpkgs_4", + "nixpkgs": "nixpkgs_3", "nvim-treesitter": "nvim-treesitter", "nvim-treesitter-textobjects": "nvim-treesitter-textobjects" }, "locked": { - "lastModified": 1759559567, - "narHash": "sha256-cNu8MIRumBeW1HJK8c8IM6ge1yalz4xS5j5RCDbhf0Y=", + "lastModified": 1760324917, + "narHash": "sha256-ZlVGaUbxHf4DNR4GWhF1mvlMhP8IBbwF0g8WO1SL+Yw=", "owner": "iofq", "repo": "nvim-treesitter-main", - "rev": "1f19cc0a907328d8dbf467ee9fe216277628d366", + "rev": "da2262419eb66cfa426aa62ccf1fc8fdea33b4a0", "type": "github" }, "original": { @@ -487,7 +470,7 @@ "flake-utils": "flake-utils_2", "gen-luarc": "gen-luarc", "neovim-nightly-overlay": "neovim-nightly-overlay", - "nixpkgs": "nixpkgs_3", + "nixpkgs": "nixpkgs_2", "nvim-treesitter-main": "nvim-treesitter-main" } }, @@ -529,11 +512,11 @@ ] }, "locked": { - "lastModified": 1758728421, - "narHash": "sha256-ySNJ008muQAds2JemiyrWYbwbG+V7S5wg3ZVKGHSFu8=", + "lastModified": 1760120816, + "narHash": "sha256-gq9rdocpmRZCwLS5vsHozwB6b5nrOBDNc2kkEaTXHfg=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "5eda4ee8121f97b218f7cc73f5172098d458f1d1", + "rev": "761ae7aff00907b607125b2f57338b74177697ed", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index a2231e4..ed8d02c 100644 --- a/flake.nix +++ b/flake.nix @@ -4,27 +4,23 @@ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/master"; flake-utils.url = "github:numtide/flake-utils"; - neovim-nightly-overlay.url = "github:nix-community/neovim-nightly-overlay"; + neovim-nightly-overlay = { + url = "github:nix-community/neovim-nightly-overlay"; + inputs.nixpkgs.follows = "nixpkgs"; + }; gen-luarc = { url = "github:mrcjkb/nix-gen-luarc-json"; inputs.nixpkgs.follows = "nixpkgs"; }; dart = { - url = "github:iofq/dart.nvim"; + url = "path:/home/e/dev/dart.nvim"; }; nvim-treesitter-main = { url = "github:iofq/nvim-treesitter-main"; }; - # Add bleeding-edge plugins here. - # They can be updated with `nix flake update` (make sure to commit the generated flake.lock) - # wf-nvim = { - # url = "github:Cassin01/wf.nvim"; - # flake = false; - # }; }; outputs = inputs@{ - self, nixpkgs, flake-utils, ... @@ -34,20 +30,28 @@ # This is where the Neovim derivation is built. neovim-overlay = import ./nix/neovim-overlay.nix { inherit inputs; }; + finalOverlays = [ + inputs.neovim-nightly-overlay.overlays.default + inputs.nvim-treesitter-main.overlays.default + (final: prev: { + vimPlugins = prev.vimPlugins.extend ( + f: p: { + nvim-treesitter = p.nvim-treesitter.withAllGrammars; + nvim-treesitter-textobjects = p.nvim-treesitter-textobjects.overrideAttrs { + dependencies = [ f.nvim-treesitter ]; + }; + } + ); + }) + neovim-overlay + ]; in flake-utils.lib.eachSystem systems ( system: let pkgs = import nixpkgs { inherit system; - config.allowUnfree = true; - overlays = [ - inputs.neovim-nightly-overlay.overlays.default - inputs.nvim-treesitter-main.overlays.default - neovim-overlay - # This adds a function can be used to generate a .luarc.json - # containing the Neovim API all plugins in the workspace directory. - # The generated file can be symlinked in the devShell's shellHook. + overlays = finalOverlays ++ [ inputs.gen-luarc.overlays.default ]; }; @@ -55,16 +59,13 @@ name = "nvim-devShell"; buildInputs = with pkgs; [ lua-language-server - nil + nixd stylua luajitPackages.luacheck - nvim-dev ]; shellHook = '' # symlink the .luarc.json generated in the overlay ln -fs ${pkgs.nvim-luarc-json} .luarc.json - # allow quick iteration of lua configs - ln -Tfns $PWD/nvim ~/.config/nvim-dev ''; }; in @@ -73,7 +74,6 @@ default = nvim; nvim = pkgs.nvim-pkg; nvim-min = pkgs.nvim-min-pkg; - nvim-dev = pkgs.nvim-dev; }; devShells = { default = shell; @@ -81,6 +81,6 @@ } ) // { - overlays.default = final: prev: (neovim-overlay final prev); + overlays.default = nixpkgs.lib.composeManyExtensions finalOverlays; }; } diff --git a/nix/mkNeovim.nix b/nix/mkNeovim.nix index 1ba7e54..83baf98 100644 --- a/nix/mkNeovim.nix +++ b/nix/mkNeovim.nix @@ -1,150 +1,23 @@ -# Function for creating a Neovim derivation +{ pkgs, lib }: { - pkgs, - lib, - stdenv, - # Set by the overlay to ensure we use a compatible version of `wrapNeovimUnstable` - pkgs-wrapNeovim ? pkgs, -}: -with lib; -{ - # NVIM_APPNAME - Defaults to 'nvim' if not set. - # If set to something else, this will also rename the binary. - appName ? "nvim", - # The Neovim package to wrap - neovim-unwrapped ? pkgs-wrapNeovim.neovim-unwrapped, - plugins ? [ ], # List of plugins - # List of dev plugins (will be bootstrapped) - useful for plugin developers - # { name = ; url = ; } - devPlugins ? [ ], - # Regexes for config files to ignore, relative to the nvim directory. - # e.g. [ "^plugin/neogit.lua" "^ftplugin/.*.lua" ] - ignoreConfigRegexes ? [ ], - extraPackages ? [ ], # Extra runtime dependencies (e.g. ripgrep, ...) - # The below arguments can typically be left as their defaults - # Additional lua packages (not plugins), e.g. from luarocks.org. - # e.g. p: [p.jsregexp] - extraLuaPackages ? p: [ ], - extraPython3Packages ? p: [ ], # Additional python 3 packages - withPython3 ? false, # Build Neovim with Python 3 support? - withRuby ? false, # Build Neovim with Ruby support? - withNodeJs ? false, # Build Neovim with NodeJS support? - withSqlite ? true, # Add sqlite? This is a dependency for some plugins - # You probably don't want to create vi or vim aliases - # if the appName is something different than "nvim" - viAlias ? appName == "nvim", # Add a "vi" binary to the build output as an alias? - vimAlias ? appName == "nvim", # Add a "vim" binary to the build output as an alias? - wrapRc ? true, + plugins ? [ ], + packages ? [ ], }: let - # This is the structure of a plugin definition. - # Each plugin in the `plugins` argument list can also be defined as this attrset - defaultPlugin = { - plugin = null; # e.g. nvim-lspconfig - config = null; # plugin config - # If `optional` is set to `false`, the plugin is installed in the 'start' packpath - # set to `true`, it is installed in the 'opt' packpath, and can be lazy loaded with - # ':packadd! {plugin-name} - optional = false; - runtime = { }; - }; - - externalPackages = extraPackages ++ (optionals withSqlite [ pkgs.sqlite ]); - - # Map all plugins to an attrset { plugin = ; config = ; optional = ; ... } - - # This nixpkgs util function creates an attrset - # that pkgs.wrapNeovimUnstable uses to configure the Neovim build. - neovimConfig = pkgs-wrapNeovim.neovimUtils.makeNeovimConfig { - inherit - extraPython3Packages - withPython3 - withRuby - withNodeJs - viAlias - vimAlias - ; - - plugins = (pkgs.neovimUtils.normalizePlugins plugins); - }; - - packDir = pkgs.neovimUtils.packDir { - iofq = pkgs.neovimUtils.normalizedPluginsToVimPackage (pkgs.neovimUtils.normalizePlugins plugins); - }; - - nvimRtp = stdenv.mkDerivation { - name = "nvim-rtp"; - src = ../nvim; - - installPhase = '' - mkdir -p $out/ - cp -r . $out/ - ''; - }; - - # The final init.lua content that we pass to the Neovim wrapper. - # It wraps the user init.lua, prepends the lua lib directory to the RTP - # and prepends the nvim and after directory to the RTP - initLua = '' - vim.opt.rtp:prepend('${nvimRtp}') - '' - + builtins.readFile ../nvim/init.lua; - - # Add arguments to the Neovim wrapper script - extraMakeWrapperArgs = builtins.concatStringsSep " " ( - # Set the NVIM_APPNAME environment variable - (optional ( - appName != "nvim" && appName != null && appName != "" - ) ''--set NVIM_APPNAME "${appName}"'') - # Add external packages to the PATH - ++ (optional (externalPackages != [ ]) ''--prefix PATH : "${makeBinPath externalPackages}"'') - # Set the LIBSQLITE_CLIB_PATH if sqlite is enabled - ++ (optional withSqlite ''--set LIBSQLITE_CLIB_PATH "${pkgs.sqlite.out}/lib/libsqlite3.so"'') - # Set the LIBSQLITE environment variable if sqlite is enabled - ++ (optional withSqlite ''--set LIBSQLITE "${pkgs.sqlite.out}/lib/libsqlite3.so"'') - ); - - luaPackages = neovim-unwrapped.lua.pkgs; - resolvedExtraLuaPackages = extraLuaPackages luaPackages; - - # Native Lua libraries - extraMakeWrapperLuaCArgs = - optionalString (resolvedExtraLuaPackages != [ ]) - ''--suffix LUA_CPATH ";" "${ - concatMapStringsSep ";" luaPackages.getLuaCPath resolvedExtraLuaPackages - }"''; - - # Lua libraries - extraMakeWrapperLuaArgs = - optionalString (resolvedExtraLuaPackages != [ ]) - ''--suffix LUA_PATH ";" "${ - concatMapStringsSep ";" luaPackages.getLuaPath resolvedExtraLuaPackages - }"''; - - # wrapNeovimUnstable is the nixpkgs utility function for building a Neovim derivation. - neovim-wrapped = pkgs-wrapNeovim.wrapNeovimUnstable neovim-unwrapped ( - neovimConfig - // { - luaRcContent = initLua; - wrapperArgs = - escapeShellArgs neovimConfig.wrapperArgs - + " " - + extraMakeWrapperArgs - + " " - + extraMakeWrapperLuaCArgs - + " " - + extraMakeWrapperLuaArgs; - wrapRc = wrapRc; - } - ); - - isCustomAppName = appName != null && appName != "nvim"; + finalPlugins = plugins ++ [ + (pkgs.vimUtils.buildVimPlugin { + pname = "iofq-nvim"; + src = lib.cleanSource ../nvim; + version = "0.1"; + doCheck = false; + }) + ]; + wrapperArgs = ''--prefix PATH : "${lib.makeBinPath packages}"''; in -neovim-wrapped.overrideAttrs (oa: { - buildPhase = - oa.buildPhase - # If a custom NVIM_APPNAME has been set, rename the `nvim` binary - + lib.optionalString isCustomAppName '' - mv $out/bin/nvim $out/bin/${lib.escapeShellArg appName} - ''; -}) +pkgs.wrapNeovimUnstable pkgs.neovim-unwrapped { + inherit wrapperArgs; + plugins = finalPlugins; + withPython3 = false; + withRuby = false; + vimAlias = true; +} diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index 5a2684e..430c345 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -1,21 +1,20 @@ # This overlay, when applied to nixpkgs, adds the final neovim derivation to nixpkgs. { inputs }: final: prev: -with final.pkgs.lib; let - mkNeovim = prev.callPackage ./mkNeovim.nix { pkgs-wrapNeovim = prev; }; + mkNeovim = prev.callPackage ./mkNeovim.nix { pkgs = final; }; dart-nvim = inputs.dart.packages.x86_64-linux.default; - plugins = with final.vimPlugins; [ + plugins = with prev.vimPlugins; [ blink-cmp blink-ripgrep-nvim conform-nvim dart-nvim - diffview-nvim mini-nvim + nvim-autopairs nvim-lint nvim-lspconfig - nvim-treesitter.withAllGrammars + nvim-treesitter nvim-treesitter-textobjects quicker-nvim refactoring-nvim @@ -23,12 +22,12 @@ let snacks-nvim ]; - basePackages = with final; [ + basePackages = with prev; [ ripgrep fd ]; # Extra packages that should be included on nixos but don't need to be bundled - extraPackages = with final; [ + extraPackages = with prev; [ # linters yamllint jq @@ -47,25 +46,14 @@ in { nvim-pkg = mkNeovim { inherit plugins; - extraPackages = basePackages ++ extraPackages; + packages = basePackages ++ extraPackages; }; nvim-min-pkg = mkNeovim { inherit plugins; - extraPackages = basePackages; + packages = basePackages; }; - # This is meant to be used within a devshell. - # Instead of loading the lua Neovim configuration from - # the Nix store, it is loaded from $XDG_CONFIG_HOME/nvim-dev - nvim-dev = mkNeovim { - inherit plugins; - extraPackages = basePackages ++ extraPackages; - appName = "nvim-dev"; - wrapRc = false; - }; - - # This can be symlinked in the devShell's shellHook nvim-luarc-json = final.mk-luarc-json { inherit plugins; }; diff --git a/nvim/colors/iofq.lua b/nvim/after/colors/iofq.lua similarity index 100% rename from nvim/colors/iofq.lua rename to nvim/after/colors/iofq.lua diff --git a/nvim/ftplugin/go.lua b/nvim/after/ftplugin/go.lua similarity index 100% rename from nvim/ftplugin/go.lua rename to nvim/after/ftplugin/go.lua diff --git a/nvim/ftplugin/php.lua b/nvim/after/ftplugin/php.lua similarity index 100% rename from nvim/ftplugin/php.lua rename to nvim/after/ftplugin/php.lua diff --git a/nvim/lsp/gopls.lua b/nvim/after/lsp/gopls.lua similarity index 100% rename from nvim/lsp/gopls.lua rename to nvim/after/lsp/gopls.lua diff --git a/nvim/lsp/lua_ls.lua b/nvim/after/lsp/lua_ls.lua similarity index 100% rename from nvim/lsp/lua_ls.lua rename to nvim/after/lsp/lua_ls.lua diff --git a/nvim/lua/lib/minidiff_jj.lua b/nvim/after/lua/iofq/minidiff_jj.lua similarity index 100% rename from nvim/lua/lib/minidiff_jj.lua rename to nvim/after/lua/iofq/minidiff_jj.lua diff --git a/nvim/lua/lib/snacks_jj.lua b/nvim/after/lua/iofq/snacks_jj.lua similarity index 100% rename from nvim/lua/lib/snacks_jj.lua rename to nvim/after/lua/iofq/snacks_jj.lua diff --git a/nvim/after/plugin/autocmd.lua b/nvim/after/plugin/autocmd.lua new file mode 100644 index 0000000..18af3e9 --- /dev/null +++ b/nvim/after/plugin/autocmd.lua @@ -0,0 +1,139 @@ +local cmd = vim.api.nvim_create_autocmd +-- open :h in buffers +cmd('FileType', { + group = vim.api.nvim_create_augroup('help', { clear = true }), + pattern = 'help', + callback = function(_) + vim.cmd.only() + vim.keymap.set('n', 'q', vim.cmd.bdelete, { noremap = true }) + vim.bo.buflisted = false + end, +}) + +-- resize splits if window got resized +cmd({ 'VimResized' }, { + group = vim.api.nvim_create_augroup('resize_splits', { clear = true }), + callback = function() + vim.cmd('tabdo wincmd =') + vim.cmd('tabnext ' .. vim.fn.tabpagenr()) + end, +}) + +-- Check if we need to reload the file when it changed +cmd({ 'FocusGained', 'TermClose', 'TermLeave' }, { + group = vim.api.nvim_create_augroup('check_reload', { clear = true }), + callback = function() + if vim.o.buftype ~= 'nofile' then + vim.cmd('checktime') + end + end, +}) + +-- Configure difftool buffers +vim.api.nvim_create_autocmd('FileType', { + pattern = 'qf', + group = vim.api.nvim_create_augroup('difftool', { clear = true }), + callback = function(event) + local function exec(fmt, str) + os.execute(string.format(fmt, str)) + end + local function refresh() + local qf = vim.fn.getqflist() + + local entry = qf[1] + if not entry or not entry.user_data.diff then + return nil + end + + local ns = vim.api.nvim_create_namespace('nvim.difftool.hl') + vim.api.nvim_buf_clear_namespace(event.buf, ns, 0, -1) + for i, item in ipairs(qf) do + local path = vim.fn.fnamemodify(item.user_data.right, ':t') + local hl = 'Added' + if + exec('git diff --quiet -- %s', path) ~= 0 + or exec('git ls-files --error-unmatch -- %s > /dev/null 2>&1', path) ~= 0 + then + hl = 'Removed' + end + vim.hl.range(event.buf, ns, hl, { i - 1, 0 }, { i - 1, -1 }) + end + end + vim.keymap.set('n', 'gh', function() + local idx = vim.api.nvim_win_get_cursor(0)[1] + local qf = vim.fn.getqflist() + local filename = qf[idx].user_data.rel + + if exec('git diff --quiet --cached -- %s', filename) ~= 0 then + exec('git restore --quiet --staged -- %s', filename) + else + exec('git add -- %s', filename) + end + refresh() + end) + vim.schedule(refresh) + end, +}) + +-- Init treesitter +cmd('FileType', { + group = vim.api.nvim_create_augroup('treesitter', { clear = true }), + callback = function(event) + local bufnr = event.buf + + vim.bo.indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()" + pcall(vim.treesitter.start, bufnr) + + vim.keymap.set({ 'v', 'n' }, ']]', function() + require('nvim-treesitter-textobjects.move').goto_next_start('@function.outer', 'textobjects') + end, { buffer = bufnr }) + vim.keymap.set({ 'v', 'n' }, '[[', function() + require('nvim-treesitter-textobjects.move').goto_previous_start('@function.outer', 'textobjects') + end, { buffer = bufnr }) + vim.keymap.set({ 'v', 'n' }, ']a', function() + require('nvim-treesitter-textobjects.move').goto_next_start('@parameter.inner', 'textobjects') + end, { buffer = bufnr }) + vim.keymap.set({ 'v', 'n' }, '[a', function() + require('nvim-treesitter-textobjects.move').goto_previous_start('@parameter.inner', 'textobjects') + end, { buffer = bufnr }) + vim.keymap.set({ 'v', 'n' }, ']A', function() + require('nvim-treesitter-textobjects.swap').swap_next('@parameter.inner') + end, { buffer = bufnr }) + vim.keymap.set({ 'v', 'n' }, '[A', function() + require('nvim-treesitter-textobjects.swap').swap_previous('@parameter.inner') + end, { buffer = bufnr }) + end, +}) + +-- Init LSP +cmd('LspAttach', { + group = vim.api.nvim_create_augroup('UserLspConfig', {}), + callback = function(ev) + local client = vim.lsp.get_client_by_id(ev.data.client_id) + if not client then + return + end + vim.keymap.set('n', 'gO', function() + Snacks.picker.lsp_symbols { focus = 'list' } + end, { buffer = ev.buf }) + + vim.keymap.set('n', 'grh', function() + vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled()) + end, { buffer = ev.buf }) + vim.keymap.set('n', 'grl', vim.lsp.codelens.run, { buffer = ev.buf }) + + vim.keymap.set('n', 'gre', vim.diagnostic.setloclist, { buffer = ev.buf }) + vim.keymap.set('n', 'grE', vim.diagnostic.setqflist, { buffer = ev.buf }) + + -- Auto-refresh code lenses + if client:supports_method('textDocument/codeLens') or client.server_capabilities.codeLensProvider then + vim.lsp.codelens.refresh { bufnr = ev.buf } + cmd({ 'InsertLeave', 'TextChanged' }, { + callback = function() + vim.lsp.codelens.refresh { bufnr = ev.buf } + end, + buffer = ev.buf, + }) + end + end, +}) diff --git a/nvim/init.lua b/nvim/after/plugin/init.lua similarity index 67% rename from nvim/init.lua rename to nvim/after/plugin/init.lua index 708198b..b2afa6a 100644 --- a/nvim/init.lua +++ b/nvim/after/plugin/init.lua @@ -1,3 +1,5 @@ +vim.cmd('colorscheme iofq') + vim.g.mapleader = ' ' vim.opt.autowrite = true vim.opt.backspace = 'indent,eol,start' @@ -42,8 +44,21 @@ vim.lsp.enable { 'basedpyright', } -vim.cmd('colorscheme iofq') -require('keymaps') -require('autocmd') -require('mini') -require('plugins') +local map = vim.keymap.set +map('n', '\\t', function() -- Switch tab length on the fly + vim.o.tabstop = vim.o.tabstop == 8 and 2 or 2 * vim.o.tabstop + vim.notify('tabstop: ' .. vim.o.tabstop) +end) +map({ 'v', 'i' }, 'wq', 'l') +map('v', '<', '', '>gv') +map('n', 'n', 'nzz', { noremap = true }) +map('n', 'N', 'Nzz', { noremap = true }) +map('n', '', 'zz', { noremap = true }) +map('n', '', 'zz', { noremap = true }) +map('n', 'gq', vim.cmd.bdelete, { noremap = true }) +map('n', 'gQ', function() + vim.cmd('bufdo bdelete') +end, { noremap = true }) + +vim.cmd.packadd('nvim.difftool') diff --git a/nvim/lua/mini.lua b/nvim/after/plugin/mini.lua similarity index 54% rename from nvim/lua/mini.lua rename to nvim/after/plugin/mini.lua index b1810d5..c60ec00 100644 --- a/nvim/lua/mini.lua +++ b/nvim/after/plugin/mini.lua @@ -1,9 +1,7 @@ -require('mini.basics').setup { mappings = { windows = true } } -require('mini.icons').setup() +local map = vim.keymap.set vim.schedule(function() require('mini.align').setup() - require('mini.pairs').setup() require('mini.surround').setup() require('mini.splitjoin').setup { detect = { separator = '[,;\n]' } } @@ -12,19 +10,23 @@ vim.schedule(function() n_lines = 300, custom_textobjects = { i = require('mini.extra').gen_ai_spec.indent(), + b = require('mini.extra').gen_ai_spec.buffer(), a = ai.gen_spec.treesitter { a = '@parameter.outer', i = '@parameter.inner' }, f = ai.gen_spec.treesitter { a = '@function.outer', i = '@function.inner' }, }, } require('mini.git').setup() - vim.keymap.set('n', 'go', function() + map('n', 'gb', 'Git blame -- %') + map('n', 'go', function() return MiniGit.show_at_cursor() - end, { noremap = true, desc = 'git show at cursor' }) - vim.keymap.set('n', 'gb', 'Git blame -- %', { desc = 'git blame' }) + end) local jump = require('mini.jump2d') jump.setup { + mappings = { + start_jumping = 's', + }, view = { n_steps_ahead = 1, dim = true }, spotter = jump.gen_spotter.vimpattern(), } @@ -32,39 +34,42 @@ vim.schedule(function() local diff = require('mini.diff') diff.setup { source = { - require('lib.minidiff_jj').gen_source(), + require('iofq.minidiff_jj').gen_source(), diff.gen_source.git(), }, } - vim.keymap.set('n', 'gp', function() - MiniDiff.toggle_overlay(0) - end, { noremap = true, desc = 'git diff overlay' }) + map('n', 'gp', MiniDiff.toggle_overlay) - local files = require('mini.files') - files.setup { - mappings = { - go_in_plus = '', - }, + require('mini.files').setup { + mappings = { go_in_plus = '' }, windows = { preview = true, width_preview = 50, }, } - vim.keymap.set('n', 'nc', function() + map('n', 'nc', function() MiniFiles.open(vim.api.nvim_buf_get_name(0), false) -- open current buffer's dir - MiniFiles.reveal_cwd() - end, { desc = 'minifiles open' }) - - vim.keymap.set('n', '`', function() - local _, cur_entry_path = pcall(MiniFiles.get_fs_entry().path) - local cur_directory = vim.fs.dirname(cur_entry_path) - if cur_directory ~= '' then - vim.fn.chdir(cur_directory) - end end) + vim.api.nvim_create_autocmd('User', { + pattern = 'MiniFilesBufferCreate', + callback = function(args) + map('n', 'nc', function() + MiniFiles.synchronize() + MiniFiles.close() + end, { buffer = args.data.buf_id }) + map('n', '`', function() + local _, cur_entry_path = pcall(MiniFiles.get_fs_entry().path) + local cur_directory = vim.fs.dirname(cur_entry_path) + if cur_directory ~= '' then + vim.fn.chdir(cur_directory) + end + end, { buffer = args.data.buf_id }) + end, + }) -- pass file rename events to LSP vim.api.nvim_create_autocmd('User', { + group = vim.api.nvim_create_augroup('snacks_rename', { clear = true }), pattern = 'MiniFilesActionRename', callback = function(event) Snacks.rename.on_rename_file(event.data.from, event.data.to) diff --git a/nvim/after/plugin/plugins.lua b/nvim/after/plugin/plugins.lua new file mode 100644 index 0000000..58dae3e --- /dev/null +++ b/nvim/after/plugin/plugins.lua @@ -0,0 +1,153 @@ +local map = vim.keymap.set + +require('mini.basics').setup { mappings = { windows = true } } +require('mini.icons').setup() + +require('dart').setup { + tabline = { + icons = false, + label_marked_fg = 'cyan', + }, +} + +require('snacks').setup { + bigfile = { enabled = true }, + terminal = { enabled = true }, + indent = { enabled = true }, + input = { enabled = true }, + notifier = { enabled = true }, + styles = { notification = { wo = { wrap = true } } }, + picker = { + enabled = true, + matcher = { + frecency = true, + cwd_bonus = true, + }, + layout = 'ivy_split', + sources = { + grep = { hidden = true }, + lsp_symbols = { + filter = { default = true }, + layout = { + preset = 'left', + layout = { width = 90, min_width = 90 }, + }, + }, + smart = { + multi = { + 'buffers', + { source = 'files', hidden = true }, + { source = 'git_files', untracked = true }, + }, + }, + }, + }, +} + +map({ 'n', 't' }, '', Snacks.terminal.toggle) +map('n', 'ff', Snacks.picker.smart) +map('n', '', Snacks.picker.smart) +map('n', 'fa', Snacks.picker.grep) +map('n', 'f8', Snacks.picker.grep_word) +map('n', 'f?', Snacks.picker.pickers) +map('n', 'fu', Snacks.picker.undo) +map('n', 'fj', Snacks.picker.jumps) +map('n', 'f.', Snacks.picker.resume) +map('n', 'fb', Snacks.picker.buffers) +map('n', 'fq', Snacks.picker.qflist) +map('n', 'jf', require('iofq.snacks_jj').status) + +vim.schedule(function() + require('nvim-treesitter').setup() + require('nvim-treesitter-textobjects').setup() + require('render-markdown').setup() + require('nvim-autopairs').setup() + + require('refactoring').setup() + map('n', 'rr', require('refactoring').select_refactor) + map('n', 'rv', function() + require('refactoring').refactor('Inline Variable') + end) + + require('quicker').setup() + map('n', 'qf', function() + require('quicker').toggle { max_height = 20 } + end) + + require('conform').setup { + notify_no_formatters = false, + formatters_by_ft = { + json = { 'jq' }, + lua = { 'stylua' }, + python = { 'ruff' }, + nix = { 'nixfmt' }, + fish = { 'fish_indent' }, + ['*'] = { 'trim_whitespace' }, + }, + format_on_save = function(bufnr) + -- Disable with a global or buffer-local variable + if vim.g.disable_autoformat or vim.b[bufnr].disable_autoformat then + return + end + return { timeout_ms = 1500, lsp_format = 'fallback' } + end, + } + map('n', '\\f', function() + vim.b.disable_autoformat = not vim.b.disable_autoformat + vim.notify(string.format('Buffer formatting disabled: %s', vim.b.disable_autoformat)) + end) + map('n', '\\F', function() + vim.g.disable_autoformat = not vim.g.disable_autoformat + vim.notify(string.format('Global formatting disabled: %s', vim.g.disable_autoformat)) + end) + + require('lint').linters_by_ft = { + docker = { 'hadolint' }, + yaml = { 'yamllint' }, + sh = { 'shellcheck' }, + go = { 'golangcilint' }, + ruby = { 'rubocop' }, + fish = { 'fish' }, + bash = { 'bash' }, + nix = { 'nix' }, + php = { 'php' }, + } + vim.api.nvim_create_autocmd({ 'BufWritePost' }, { + callback = function() + require('lint').try_lint(nil, { ignore_errors = true }) + end, + }) + + vim.treesitter.language.register('markdown', 'blink-cmp-documentation') + require('blink.cmp').setup { + enabled = function() + return not vim.tbl_contains({ 'snacks_picker_input' }, vim.bo.filetype) + end, + sources = { + default = { 'lsp', 'path', 'snippets', 'ripgrep', 'buffer' }, + providers = { + lsp = { fallbacks = {} }, -- include buffer even when LSP is active + path = { opts = { get_cwd = vim.fn.getcwd } }, -- use nvim pwd instead of current file pwd + ripgrep = { + module = 'blink-ripgrep', + name = 'rg', + score_offset = -10, + async = true, + }, + }, + }, + cmdline = { completion = { menu = { auto_show = true } } }, + completion = { + documentation = { auto_show = true }, + menu = { + draw = { + columns = { + { 'label', 'label_description', gap = 1 }, + { 'source_name', 'kind', gap = 1 }, + }, + }, + }, + }, + signature = { enabled = true, trigger = { show_on_insert = true } }, + } +end) diff --git a/nvim/lua/autocmd.lua b/nvim/lua/autocmd.lua deleted file mode 100644 index a5e566d..0000000 --- a/nvim/lua/autocmd.lua +++ /dev/null @@ -1,97 +0,0 @@ --- open :h in buffers -vim.api.nvim_create_autocmd('BufWinEnter', { - pattern = '*', - callback = function(event) - if vim.bo[event.buf].filetype == 'help' then - vim.cmd.only() - vim.keymap.set('n', 'q', vim.cmd.bdelete, { noremap = true, silent = true }) - vim.bo.buflisted = false - end - end, -}) - --- resize splits if window got resized -vim.api.nvim_create_autocmd({ 'VimResized' }, { - group = vim.api.nvim_create_augroup('resize_splits', { clear = true }), - callback = function() - local current_tab = vim.fn.tabpagenr() - vim.cmd('tabdo wincmd =') - vim.cmd('tabnext ' .. current_tab) - end, -}) - --- Check if we need to reload the file when it changed -vim.api.nvim_create_autocmd({ 'FocusGained', 'TermClose', 'TermLeave' }, { - group = vim.api.nvim_create_augroup('check_reload', { clear = true }), - callback = function() - if vim.o.buftype ~= 'nofile' then - vim.cmd('checktime') - end - end, -}) - --- Init treesitter -vim.api.nvim_create_autocmd('FileType', { - callback = function(event) - local bufnr = event.buf - - vim.bo.indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()" - pcall(vim.treesitter.start, bufnr) - - vim.keymap.set({'v','n'}, ']]', function() - require('nvim-treesitter-textobjects.move').goto_next_start('@function.outer', 'textobjects') - end, { buffer = bufnr, desc = 'next function def' }) - vim.keymap.set({'v','n'}, '[[', function() - require('nvim-treesitter-textobjects.move').goto_previous_start('@function.outer', 'textobjects') - end, { buffer = bufnr, desc = 'prev function def' }) - vim.keymap.set({'v','n'}, ']a', function() - require('nvim-treesitter-textobjects.move').goto_next_start('@parameter.inner', 'textobjects') - end, { buffer = bufnr, desc = 'next param def' }) - vim.keymap.set({'v','n'}, '[a', function() - require('nvim-treesitter-textobjects.move').goto_previous_start('@parameter.inner', 'textobjects') - end, { buffer = bufnr, desc = 'prev param def' }) - vim.keymap.set({'v','n'}, ']A', function() - require('nvim-treesitter-textobjects.swap').swap_next('@parameter.inner') - end, { buffer = bufnr, desc = 'swap next arg' }) - vim.keymap.set({'v','n'}, '[A', function() - require('nvim-treesitter-textobjects.swap').swap_previous('@parameter.inner') - end, { buffer = bufnr, desc = 'swap prev arg' }) - end, -}) - --- Init LSP -vim.api.nvim_create_autocmd('LspAttach', { - group = vim.api.nvim_create_augroup('UserLspConfig', {}), - callback = function(ev) - local client = vim.lsp.get_client_by_id(ev.data.client_id) - if not client then - return - end - vim.keymap.set('n', 'gO', function() - Snacks.picker.lsp_symbols { focus = 'list' } - end, { buffer = ev.buf, desc = 'LSP symbols' }) - - vim.keymap.set('n', 'grh', function() - vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled()) - end, { buffer = ev.buf, desc = 'LSP hints toggle' }) - vim.keymap.set('n', 'grl', vim.lsp.codelens.run, { buffer = ev.buf, desc = 'vim.lsp.codelens.run()' }) - - vim.keymap.set('n', 'gre', function() - vim.diagnostic.setloclist() - end, { buffer = ev.buf, desc = 'LSP buffer diagnostics' }) - vim.keymap.set('n', 'grE', function() - vim.diagnostic.setqflist() - end, { buffer = ev.buf, desc = 'LSP diagnostics' }) - - -- Auto-refresh code lenses - if client:supports_method('textDocument/codeLens') or client.server_capabilities.codeLensProvider then - vim.lsp.codelens.refresh { bufnr = ev.buf } - vim.api.nvim_create_autocmd({ 'InsertLeave', 'TextChanged' }, { - callback = function() - vim.lsp.codelens.refresh { bufnr = ev.buf } - end, - buffer = ev.buf, - }) - end - end, -}) diff --git a/nvim/lua/keymaps.lua b/nvim/lua/keymaps.lua deleted file mode 100644 index 62c630c..0000000 --- a/nvim/lua/keymaps.lua +++ /dev/null @@ -1,18 +0,0 @@ --- Switch tab length on the fly -vim.keymap.set('n', '\\t', function() - vim.o.tabstop = vim.o.tabstop == 8 and 2 or 2 * vim.o.tabstop - vim.notify('tabstop: ' .. vim.o.tabstop) -end, { silent = true, desc = 'toggle tabstop' }) -vim.keymap.set({ 'v', 'i' }, 'wq', 'l', { noremap = true, silent = true }) -vim.keymap.set('v', '<', '', '>gv') -vim.keymap.set('n', 'n', 'nzz', { noremap = true }) -vim.keymap.set('n', 'N', 'Nzz', { noremap = true }) -vim.keymap.set('n', '', 'zz', { noremap = true }) -vim.keymap.set('n', '', 'zz', { noremap = true }) -vim.keymap.set('v', '', ":m '>+1gv=gv", { desc = 'move selection down' }) -vim.keymap.set('v', '', ":m '<-2gv=gv", { desc = 'move selection up' }) -vim.keymap.set('n', 'gq', vim.cmd.bdelete, { noremap = true, silent = true, desc = 'close buffer' }) -vim.keymap.set('n', 'gQ', function() - vim.cmd('bufdo bdelete') -end, { noremap = true, silent = true, desc = 'close all buffers' }) diff --git a/nvim/lua/plugins.lua b/nvim/lua/plugins.lua deleted file mode 100644 index b00a3e4..0000000 --- a/nvim/lua/plugins.lua +++ /dev/null @@ -1,253 +0,0 @@ -require('dart').setup { - tabline = { - label_marked_fg = 'cyan', - }, -} - -require('snacks').setup { - bigfile = { enabled = true }, - terminal = { enabled = true }, - indent = { enabled = true }, - input = { enabled = true }, - notifier = { enabled = true }, - styles = { - notification = { - wo = { wrap = true }, - }, - }, - picker = { - enabled = true, - matcher = { - frecency = true, - cwd_bonus = true, - }, - layout = 'ivy_split', - sources = { - grep = { hidden = true }, - lsp_symbols = { - filter = { default = true }, - layout = 'left', - }, - smart = { - multi = { - { source = 'files', hidden = true }, - { source = 'git_files', untracked = true }, - }, - }, - }, - }, -} - -vim.keymap.set({ 'n', 't' }, '', function() - Snacks.terminal.toggle() -end, { desc = 'terminal open' }) - -vim.keymap.set('n', 'ff', function() - Snacks.picker.smart() -end, { desc = 'Fuzzy find smart' }) - -vim.keymap.set('n', 'fa', function() - Snacks.picker.grep() -end, { desc = 'Fuzzy find grep' }) - -vim.keymap.set('n', 'f8', function() - Snacks.picker.grep_word() -end, { desc = 'Fuzzy find grep word' }) - -vim.keymap.set('n', 'f?', function() - Snacks.picker.pickers() -end, { desc = 'See all pickers' }) - -vim.keymap.set('n', 'fu', function() - Snacks.picker.undo() -end, { desc = 'Pick undotree' }) - -vim.keymap.set('n', 'fj', function() - Snacks.picker.jumps() -end, { desc = 'Pick jumps' }) - -vim.keymap.set('n', 'f.', function() - Snacks.picker.resume() -end, { desc = 'Fuzzy find resume' }) - -vim.keymap.set('n', 'fb', function() - Snacks.picker.buffers() -end, { desc = 'Fuzzy find buffers' }) - -vim.keymap.set('n', 'fq', function() - Snacks.picker.qflist() -end, { desc = 'pick quickfix list' }) - -vim.keymap.set('n', 'jf', function() - require('lib.snacks_jj').status() -end, { desc = 'pick notifications' }) -vim.schedule(function() - require('nvim-treesitter').setup() - require('nvim-treesitter-textobjects').setup() - require('render-markdown').setup() - - require('refactoring').setup() - vim.keymap.set('n', 'rr', function() - require('refactoring').select_refactor() - end, { desc = 'Refactor' }) - vim.keymap.set('n', 'rv', function() - require('refactoring').refactor('Inline Variable') - end, { desc = 'Inline Variable' }) - - require('quicker').setup() - vim.keymap.set('n', 'qf', function() - require('quicker').toggle { max_height = 20 } - end, { desc = 'Toggle qflist' }) - - require('diffview').setup { - use_icons = false, - enhanced_diff_hl = true, - default_args = { - DiffviewOpen = { '--imply-local' }, - }, - view = { - merge_tool = { - layout = 'diff4_mixed', - disable_diagnostics = true, - }, - }, - keymaps = { - view = { - { { 'n' }, 'q', vim.cmd.DiffviewClose, { desc = 'Close Diffview' } }, - }, - file_panel = { - { { 'n' }, 'q', vim.cmd.DiffviewClose, { desc = 'Close Diffview' } }, - }, - file_history_panel = { - { { 'n' }, 'q', vim.cmd.DiffviewClose, { desc = 'Close Diffview' } }, - }, - }, - } - - vim.keymap.set('n', 'nb', vim.cmd.DiffviewOpen, { desc = 'diffview open' }) - vim.keymap.set('n', 'nH', vim.cmd.DiffviewFileHistory, { desc = 'diffview history' }) - vim.keymap.set('n', 'nh', 'DiffviewFileHistory %', { desc = 'diffview history' }) - - require('conform').setup { - notify_no_formatters = false, - formatters_by_ft = { - json = { 'jq' }, - lua = { 'stylua' }, - python = { 'ruff' }, - nix = { 'nixfmt' }, - fish = { 'fish_indent' }, - ['*'] = { 'trim_whitespace' }, - }, - format_on_save = function(bufnr) - -- Disable with a global or buffer-local variable - if vim.g.disable_autoformat or vim.b[bufnr].disable_autoformat then - return - end - return { timeout_ms = 1500, lsp_format = 'fallback' } - end, - } - vim.keymap.set('n', '\\f', function() - vim.b.disable_autoformat = not vim.b.disable_autoformat - vim.notify(string.format('Buffer formatting disabled: %s', vim.b.disable_autoformat)) - end, { desc = 'toggle buffer formatting' }) - vim.keymap.set('n', '\\F', function() - vim.g.disable_autoformat = not vim.g.disable_autoformat - vim.notify(string.format('Global formatting disabled: %s', vim.g.disable_autoformat)) - end, { desc = 'toggle global formatting' }) - - require('lint').linters_by_ft = { - docker = { 'hadolint' }, - yaml = { 'yamllint' }, - sh = { 'shellcheck' }, - go = { 'golangcilint' }, - ruby = { 'rubocop' }, - fish = { 'fish' }, - bash = { 'bash' }, - nix = { 'nix' }, - php = { 'php' }, - } - vim.api.nvim_create_autocmd({ 'BufWritePost', 'InsertLeave' }, { - group = vim.api.nvim_create_augroup('lint', { clear = true }), - callback = function() - if vim.bo.modifiable then - require('lint').try_lint(nil, { ignore_errors = true }) - end - end, - }) - - vim.treesitter.language.register('markdown', 'blink-cmp-documentation') - require('blink.cmp').setup { - enabled = function() - return not vim.tbl_contains({ 'snacks_picker_input' }, vim.bo.filetype) - end, - fuzzy = { - sorts = { - 'exact', - 'score', - 'sort_text', - }, - }, - sources = { - default = { - 'lsp', - 'path', - 'snippets', - 'ripgrep', - 'buffer', - }, - providers = { - lsp = { - fallbacks = {}, -- include buffer even when LSP is active - score_offset = 10, - }, - snippets = { - score_offset = -10, - }, - path = { - opts = { - get_cwd = function(_) - return vim.fn.getcwd() -- use nvim pwd instead of current file pwd - end, - }, - }, - ripgrep = { - module = 'blink-ripgrep', - name = 'rg', - score_offset = -10, - async = true, - }, - }, - }, - cmdline = { - completion = { - menu = { - auto_show = true, - }, - }, - }, - completion = { - documentation = { - auto_show = true, - auto_show_delay_ms = 500, - }, - menu = { - draw = { - treesitter = { 'lsp' }, - columns = { - { 'label', 'label_description', gap = 1 }, - { 'source_name', 'kind', gap = 1 }, - }, - }, - }, - trigger = { - show_on_keyword = true, - }, - }, - signature = { - enabled = true, - trigger = { - show_on_insert = true, - }, - }, - } -end) From 35b0e0596532bcd1c192401d6b37c986e4da054b Mon Sep 17 00:00:00 2001 From: iofq Date: Wed, 15 Oct 2025 19:41:23 -0500 Subject: [PATCH 7/9] fix local flake path --- flake.lock | 15 +++++++++------ flake.nix | 2 +- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/flake.lock b/flake.lock index 6e5f8e8..76ad5f1 100644 --- a/flake.lock +++ b/flake.lock @@ -6,14 +6,17 @@ "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1760318820, - "narHash": "sha256-3ETm+AZ/UEU0OYFSYviMSv/Ov4BN1cEsBH6KNGuTYS4=", - "path": "/home/e/dev/dart.nvim", - "type": "path" + "lastModified": 1760366615, + "narHash": "sha256-qGWNl+UQLvdFl8AAgywOHthizfKovk8az1xhRhQeVn8=", + "owner": "iofq", + "repo": "dart.nvim", + "rev": "5fac43b0f7b5500c69a51a3717aef8ccceacd178", + "type": "github" }, "original": { - "path": "/home/e/dev/dart.nvim", - "type": "path" + "owner": "iofq", + "repo": "dart.nvim", + "type": "github" } }, "flake-compat": { diff --git a/flake.nix b/flake.nix index ed8d02c..a9cc1ad 100644 --- a/flake.nix +++ b/flake.nix @@ -13,7 +13,7 @@ inputs.nixpkgs.follows = "nixpkgs"; }; dart = { - url = "path:/home/e/dev/dart.nvim"; + url = "github:iofq/dart.nvim"; }; nvim-treesitter-main = { url = "github:iofq/nvim-treesitter-main"; From ce017fd37cc7b007adfb3377f9142793be8fdf58 Mon Sep 17 00:00:00 2001 From: iofq Date: Wed, 15 Oct 2025 19:53:48 -0500 Subject: [PATCH 8/9] fix os.execute return --- nvim/after/plugin/autocmd.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nvim/after/plugin/autocmd.lua b/nvim/after/plugin/autocmd.lua index 18af3e9..e22f2b7 100644 --- a/nvim/after/plugin/autocmd.lua +++ b/nvim/after/plugin/autocmd.lua @@ -35,7 +35,7 @@ vim.api.nvim_create_autocmd('FileType', { group = vim.api.nvim_create_augroup('difftool', { clear = true }), callback = function(event) local function exec(fmt, str) - os.execute(string.format(fmt, str)) + return os.execute(string.format(fmt, str)) end local function refresh() local qf = vim.fn.getqflist() From a96ea6e88b50de53dcc9b6ea71fb98b9f7ddb940 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 1 Nov 2025 10:17:18 +0000 Subject: [PATCH 9/9] chore: update flake.lock MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'dart': 'github:iofq/dart.nvim/5fac43b0f7b5500c69a51a3717aef8ccceacd178?narHash=sha256-qGWNl%2BUQLvdFl8AAgywOHthizfKovk8az1xhRhQeVn8%3D' (2025-10-13) → 'github:iofq/dart.nvim/71421e7ef5aee8267e24dc562fdd07a83bda192e?narHash=sha256-ULrZW4b8SKRvPpJPt8/jkqqc/blQiIWUriNWVXA33so%3D' (2025-10-23) • Updated input 'neovim-nightly-overlay': 'github:nix-community/neovim-nightly-overlay/7ff73a295b0065bde2f8b43b31558136ca77bd98?narHash=sha256-39JFRb006AOsIcOq%2B03H3y6YcGyaphk1CW5DRi14cOE%3D' (2025-10-13) → 'github:nix-community/neovim-nightly-overlay/c58076a0d9b24bf77fef4fa2e7c43950914edf71?narHash=sha256-hQomzSbBiFsDXDMCjHmWXrAMgFlQlCiy7T37Eq7RvT4%3D' (2025-11-01) • Removed input 'neovim-nightly-overlay/flake-compat' • Updated input 'neovim-nightly-overlay/flake-parts': 'github:hercules-ci/flake-parts/758cf7296bee11f1706a574c77d072b8a7baa881?narHash=sha256-wfG0S7pltlYyZTM%2BqqlhJ7GMw2fTF4mLKCIVhLii/4M%3D' (2025-10-01) → 'github:hercules-ci/flake-parts/864599284fc7c0ba6357ed89ed5e2cd5040f0c04?narHash=sha256-TmWcdiUUaWk8J4lpjzu4gCGxWY6/Ok7mOK4fIFfBuU4%3D' (2025-10-20) • Removed input 'neovim-nightly-overlay/git-hooks' • Removed input 'neovim-nightly-overlay/git-hooks/flake-compat' • Removed input 'neovim-nightly-overlay/git-hooks/gitignore' • Removed input 'neovim-nightly-overlay/git-hooks/gitignore/nixpkgs' • Removed input 'neovim-nightly-overlay/git-hooks/nixpkgs' • Removed input 'neovim-nightly-overlay/hercules-ci-effects' • Removed input 'neovim-nightly-overlay/hercules-ci-effects/flake-parts' • Removed input 'neovim-nightly-overlay/hercules-ci-effects/nixpkgs' • Updated input 'neovim-nightly-overlay/neovim-src': 'github:neovim/neovim/72b0bfa1fb7e897e5126aabae718a5480f466b9e?narHash=sha256-RnB%2BoJcP37YT9pjr1osUQtJc%2B1qcVyaaeSbiSyXwm1Y%3D' (2025-10-12) → 'github:neovim/neovim/1fddd74da7428e38b79ccb817dbd6952ff1d8ac6?narHash=sha256-YgMQaFD4L9%2BPEYSkUlBkqaKt%2BALPHiVgzgRbjOSW4tE%3D' (2025-10-31) • Removed input 'neovim-nightly-overlay/treefmt-nix' • Removed input 'neovim-nightly-overlay/treefmt-nix/nixpkgs' • Updated input 'nixpkgs': 'github:NixOS/nixpkgs/cfe6b045750c3aa5127817bc3f44f2909b1ee175?narHash=sha256-z%2BC6KRPRjwqEsTEAwUavapBWcbR7YOlQP91O%2BW5L1ek%3D' (2025-10-13) → 'github:NixOS/nixpkgs/0e65d6bc462e57fe6a76a49d4eea909ba08b1dc1?narHash=sha256-rccG7eGGelDsu4eXPi2vdBR1pddZFZAd/JlB3NLjgy4%3D' (2025-11-01) • Updated input 'nvim-treesitter-main': 'github:iofq/nvim-treesitter-main/da2262419eb66cfa426aa62ccf1fc8fdea33b4a0?narHash=sha256-ZlVGaUbxHf4DNR4GWhF1mvlMhP8IBbwF0g8WO1SL%2BYw%3D' (2025-10-13) → 'github:iofq/nvim-treesitter-main/834d66648bb7a96a2ad11d53a33f2d9b13766447?narHash=sha256-xTQUiJu0jJNSEHEv4La1HbaFokup0eWr67Kqf/wDENA%3D' (2025-10-26) • Updated input 'nvim-treesitter-main/nixpkgs': 'github:nixos/nixpkgs/0b4defa2584313f3b781240b29d61f6f9f7e0df3?narHash=sha256-Oncbh0UmHjSlxO7ErQDM3KM0A5/Znfofj2BSzlHLeVw%3D' (2025-10-09) → 'github:nixos/nixpkgs/01f116e4df6a15f4ccdffb1bcd41096869fb385c?narHash=sha256-f/QCJM/YhrV/lavyCVz8iU3rlZun6d%2BdAiC3H%2BCDle4%3D' (2025-10-22) • Updated input 'nvim-treesitter-main/nvim-treesitter': 'github:nvim-treesitter/nvim-treesitter/0606c7a9dcaa5c5beee0b0f09043e9fdd1ba0a68?narHash=sha256-To/syCZPs7vKA0WkuBz7ZxCGT/wzj705QfxZng6Nsjo%3D' (2025-10-12) → 'github:nvim-treesitter/nvim-treesitter/98fe644cb3b5ba390d1bc3f89299f93c70020803?narHash=sha256-/SGikTPEMxI7rcfGvuJlNZs73/wZiQx14QX9xlfsTv0%3D' (2025-10-25) --- flake.lock | 177 ++++++++--------------------------------------------- 1 file changed, 25 insertions(+), 152 deletions(-) diff --git a/flake.lock b/flake.lock index 76ad5f1..a9853c4 100644 --- a/flake.lock +++ b/flake.lock @@ -6,11 +6,11 @@ "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1760366615, - "narHash": "sha256-qGWNl+UQLvdFl8AAgywOHthizfKovk8az1xhRhQeVn8=", + "lastModified": 1761202123, + "narHash": "sha256-ULrZW4b8SKRvPpJPt8/jkqqc/blQiIWUriNWVXA33so=", "owner": "iofq", "repo": "dart.nvim", - "rev": "5fac43b0f7b5500c69a51a3717aef8ccceacd178", + "rev": "71421e7ef5aee8267e24dc562fdd07a83bda192e", "type": "github" }, "original": { @@ -35,38 +35,6 @@ "type": "github" } }, - "flake-compat_2": { - "flake": false, - "locked": { - "lastModified": 1747046372, - "narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885", - "type": "github" - }, - "original": { - "owner": "edolstra", - "repo": "flake-compat", - "type": "github" - } - }, - "flake-compat_3": { - "flake": false, - "locked": { - "lastModified": 1747046372, - "narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885", - "type": "github" - }, - "original": { - "owner": "edolstra", - "repo": "flake-compat", - "type": "github" - } - }, "flake-parts": { "inputs": { "nixpkgs-lib": "nixpkgs-lib" @@ -93,11 +61,11 @@ ] }, "locked": { - "lastModified": 1759362264, - "narHash": "sha256-wfG0S7pltlYyZTM+qqlhJ7GMw2fTF4mLKCIVhLii/4M=", + "lastModified": 1760948891, + "narHash": "sha256-TmWcdiUUaWk8J4lpjzu4gCGxWY6/Ok7mOK4fIFfBuU4=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "758cf7296bee11f1706a574c77d072b8a7baa881", + "rev": "864599284fc7c0ba6357ed89ed5e2cd5040f0c04", "type": "github" }, "original": { @@ -188,29 +156,6 @@ "type": "github" } }, - "git-hooks_2": { - "inputs": { - "flake-compat": "flake-compat_3", - "gitignore": "gitignore_2", - "nixpkgs": [ - "neovim-nightly-overlay", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1759523803, - "narHash": "sha256-PTod9NG+i3XbbnBKMl/e5uHDBYpwIWivQ3gOWSEuIEM=", - "owner": "cachix", - "repo": "git-hooks.nix", - "rev": "cfc9f7bb163ad8542029d303e599c0f7eee09835", - "type": "github" - }, - "original": { - "owner": "cachix", - "repo": "git-hooks.nix", - "type": "github" - } - }, "gitignore": { "inputs": { "nixpkgs": [ @@ -233,53 +178,6 @@ "type": "github" } }, - "gitignore_2": { - "inputs": { - "nixpkgs": [ - "neovim-nightly-overlay", - "git-hooks", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1709087332, - "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", - "owner": "hercules-ci", - "repo": "gitignore.nix", - "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "gitignore.nix", - "type": "github" - } - }, - "hercules-ci-effects": { - "inputs": { - "flake-parts": [ - "neovim-nightly-overlay", - "flake-parts" - ], - "nixpkgs": [ - "neovim-nightly-overlay", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1758022363, - "narHash": "sha256-ENUhCRWgSX4ni751HieNuQoq06dJvApV/Nm89kh+/A0=", - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "rev": "1a3667d33e247ad35ca250698d63f49a5453d824", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "type": "github" - } - }, "luvit-meta": { "flake": false, "locked": { @@ -298,22 +196,18 @@ }, "neovim-nightly-overlay": { "inputs": { - "flake-compat": "flake-compat_2", "flake-parts": "flake-parts_2", - "git-hooks": "git-hooks_2", - "hercules-ci-effects": "hercules-ci-effects", "neovim-src": "neovim-src", "nixpkgs": [ "nixpkgs" - ], - "treefmt-nix": "treefmt-nix" + ] }, "locked": { - "lastModified": 1760313895, - "narHash": "sha256-39JFRb006AOsIcOq+03H3y6YcGyaphk1CW5DRi14cOE=", + "lastModified": 1761955453, + "narHash": "sha256-hQomzSbBiFsDXDMCjHmWXrAMgFlQlCiy7T37Eq7RvT4=", "owner": "nix-community", "repo": "neovim-nightly-overlay", - "rev": "7ff73a295b0065bde2f8b43b31558136ca77bd98", + "rev": "c58076a0d9b24bf77fef4fa2e7c43950914edf71", "type": "github" }, "original": { @@ -325,11 +219,11 @@ "neovim-src": { "flake": false, "locked": { - "lastModified": 1760312166, - "narHash": "sha256-RnB+oJcP37YT9pjr1osUQtJc+1qcVyaaeSbiSyXwm1Y=", + "lastModified": 1761949631, + "narHash": "sha256-YgMQaFD4L9+PEYSkUlBkqaKt+ALPHiVgzgRbjOSW4tE=", "owner": "neovim", "repo": "neovim", - "rev": "72b0bfa1fb7e897e5126aabae718a5480f466b9e", + "rev": "1fddd74da7428e38b79ccb817dbd6952ff1d8ac6", "type": "github" }, "original": { @@ -383,11 +277,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1760326837, - "narHash": "sha256-z+C6KRPRjwqEsTEAwUavapBWcbR7YOlQP91O+W5L1ek=", + "lastModified": 1761991861, + "narHash": "sha256-rccG7eGGelDsu4eXPi2vdBR1pddZFZAd/JlB3NLjgy4=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "cfe6b045750c3aa5127817bc3f44f2909b1ee175", + "rev": "0e65d6bc462e57fe6a76a49d4eea909ba08b1dc1", "type": "github" }, "original": { @@ -399,11 +293,11 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1760038930, - "narHash": "sha256-Oncbh0UmHjSlxO7ErQDM3KM0A5/Znfofj2BSzlHLeVw=", + "lastModified": 1761114652, + "narHash": "sha256-f/QCJM/YhrV/lavyCVz8iU3rlZun6d+dAiC3H+CDle4=", "owner": "nixos", "repo": "nixpkgs", - "rev": "0b4defa2584313f3b781240b29d61f6f9f7e0df3", + "rev": "01f116e4df6a15f4ccdffb1bcd41096869fb385c", "type": "github" }, "original": { @@ -416,11 +310,11 @@ "nvim-treesitter": { "flake": false, "locked": { - "lastModified": 1760260935, - "narHash": "sha256-To/syCZPs7vKA0WkuBz7ZxCGT/wzj705QfxZng6Nsjo=", + "lastModified": 1761385693, + "narHash": "sha256-/SGikTPEMxI7rcfGvuJlNZs73/wZiQx14QX9xlfsTv0=", "owner": "nvim-treesitter", "repo": "nvim-treesitter", - "rev": "0606c7a9dcaa5c5beee0b0f09043e9fdd1ba0a68", + "rev": "98fe644cb3b5ba390d1bc3f89299f93c70020803", "type": "github" }, "original": { @@ -437,11 +331,11 @@ "nvim-treesitter-textobjects": "nvim-treesitter-textobjects" }, "locked": { - "lastModified": 1760324917, - "narHash": "sha256-ZlVGaUbxHf4DNR4GWhF1mvlMhP8IBbwF0g8WO1SL+Yw=", + "lastModified": 1761496664, + "narHash": "sha256-xTQUiJu0jJNSEHEv4La1HbaFokup0eWr67Kqf/wDENA=", "owner": "iofq", "repo": "nvim-treesitter-main", - "rev": "da2262419eb66cfa426aa62ccf1fc8fdea33b4a0", + "rev": "834d66648bb7a96a2ad11d53a33f2d9b13766447", "type": "github" }, "original": { @@ -506,27 +400,6 @@ "repo": "default", "type": "github" } - }, - "treefmt-nix": { - "inputs": { - "nixpkgs": [ - "neovim-nightly-overlay", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1760120816, - "narHash": "sha256-gq9rdocpmRZCwLS5vsHozwB6b5nrOBDNc2kkEaTXHfg=", - "owner": "numtide", - "repo": "treefmt-nix", - "rev": "761ae7aff00907b607125b2f57338b74177697ed", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "treefmt-nix", - "type": "github" - } } }, "root": "root",