diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 36b3551..4c6ddd7 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - package_name: ["nvim-min"] + package_name: ["nvim"] steps: - uses: actions/checkout@v3 - uses: DeterminateSystems/nix-installer-action@main diff --git a/README.md b/README.md index 29a9c20..223d62a 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## Usage Try it out! ```bash -nix run "github:iofq/nvim.nix" #nvim-min +nix run "github:iofq/nvim.nix" #nvim ``` Or use in a flake: diff --git a/flake.lock b/flake.lock index 15c4ba2..dc6be5d 100644 --- a/flake.lock +++ b/flake.lock @@ -61,11 +61,11 @@ ] }, "locked": { - "lastModified": 1767609335, - "narHash": "sha256-feveD98mQpptwrAEggBQKJTYbvwwglSbOv53uCfH9PY=", + "lastModified": 1765835352, + "narHash": "sha256-XswHlK/Qtjasvhd1nOa1e8MgZ8GS//jBoTqWtrS1Giw=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "250481aafeb741edfe23d29195671c19b36b6dca", + "rev": "a34fae9c08a15ad73f295041fec82323541400a9", "type": "github" }, "original": { @@ -203,11 +203,11 @@ ] }, "locked": { - "lastModified": 1768003501, - "narHash": "sha256-pxxUR3VRDcDpMgF1qb9FnlHAEOGi24bk6pdB1QzL1II=", + "lastModified": 1766016290, + "narHash": "sha256-YMf/PUyY4z7RlIe/Dzn1NnxZGS0Vp2eHxcMNWJM9q+A=", "owner": "nix-community", "repo": "neovim-nightly-overlay", - "rev": "d31b28318affe5d58ef12e7f72a7adfa66930a7a", + "rev": "f7fbc4e3d4ccea45eaa5b187884592eb42dfdbbd", "type": "github" }, "original": { @@ -219,11 +219,11 @@ "neovim-src": { "flake": false, "locked": { - "lastModified": 1768000044, - "narHash": "sha256-hcdQHR8l8oZDIl0vXKNtbrN+32dTs9EYvlqppoHgG2k=", + "lastModified": 1766014002, + "narHash": "sha256-KE/ufBGH8XFXTw3Vt1DrK1rQmAEp1Q+oyLQibX5UKO0=", "owner": "neovim", "repo": "neovim", - "rev": "930817f1009d9d392103b5440e2503cb47fdacc0", + "rev": "c172fd9f464d5766eab9071e8f4770504c920c05", "type": "github" }, "original": { @@ -277,27 +277,98 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1768020509, - "narHash": "sha256-V7El1ktdJ0/WWEr6wGBKFYu433vitrWvxmvPk79FsSc=", + "lastModified": 1765779637, + "narHash": "sha256-KJ2wa/BLSrTqDjbfyNx70ov/HdgNBCBBSQP3BIzKnv4=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "299d331f770cdf7c466a4faa08b3070a767d681d", + "rev": "1306659b587dc277866c7b69eb97e5f07864d8c4", "type": "github" }, "original": { "owner": "NixOS", - "ref": "master", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } }, + "nixpkgs_3": { + "locked": { + "lastModified": 1765472234, + "narHash": "sha256-9VvC20PJPsleGMewwcWYKGzDIyjckEz8uWmT0vCDYK0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "2fbfb1d73d239d2402a8fe03963e37aab15abe8b", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nvim-treesitter": { + "flake": false, + "locked": { + "lastModified": 1765632521, + "narHash": "sha256-HT+UzX1m4hm2QAqDa0dltArr3gMyYhXHnHoYkkQBWZA=", + "owner": "nvim-treesitter", + "repo": "nvim-treesitter", + "rev": "74b119812e9f82bccc2f0eca156faff0354362ae", + "type": "github" + }, + "original": { + "owner": "nvim-treesitter", + "ref": "main", + "repo": "nvim-treesitter", + "type": "github" + } + }, + "nvim-treesitter-main": { + "inputs": { + "nixpkgs": "nixpkgs_3", + "nvim-treesitter": "nvim-treesitter", + "nvim-treesitter-textobjects": "nvim-treesitter-textobjects" + }, + "locked": { + "lastModified": 1765744132, + "narHash": "sha256-+Uw+965kDJTriyUGiYF/eYAuQBowoBZpLzJswInqLCY=", + "owner": "iofq", + "repo": "nvim-treesitter-main", + "rev": "2e8b5c686fc346c34b1d2a269584b32f480e7b7f", + "type": "github" + }, + "original": { + "owner": "iofq", + "repo": "nvim-treesitter-main", + "type": "github" + } + }, + "nvim-treesitter-textobjects": { + "flake": false, + "locked": { + "lastModified": 1765672441, + "narHash": "sha256-w2dzc5oWyEoPUgbqaAuNKCeFeh81rYJPOCPVRnFC724=", + "owner": "nvim-treesitter", + "repo": "nvim-treesitter-textobjects", + "rev": "0d7c800fadcfe2d33089f5726cb8907fc846eece", + "type": "github" + }, + "original": { + "owner": "nvim-treesitter", + "ref": "main", + "repo": "nvim-treesitter-textobjects", + "type": "github" + } + }, "root": { "inputs": { "dart": "dart", "flake-utils": "flake-utils_2", "gen-luarc": "gen-luarc", "neovim-nightly-overlay": "neovim-nightly-overlay", - "nixpkgs": "nixpkgs_2" + "nixpkgs": "nixpkgs_2", + "nvim-treesitter-main": "nvim-treesitter-main" } }, "systems": { diff --git a/flake.nix b/flake.nix index 5312b1a..2798e5f 100644 --- a/flake.nix +++ b/flake.nix @@ -2,7 +2,7 @@ description = "Neovim derivation"; inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/master"; + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; neovim-nightly-overlay = { url = "github:nix-community/neovim-nightly-overlay"; @@ -15,6 +15,9 @@ dart = { url = "github:iofq/dart.nvim"; }; + nvim-treesitter-main = { + url = "github:iofq/nvim-treesitter-main"; + }; }; outputs = inputs@{ @@ -29,6 +32,17 @@ 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 @@ -59,7 +73,6 @@ packages = rec { default = nvim; nvim = pkgs.nvim-pkg; - nvim-min = pkgs.nvim-min-pkg; }; devShells = { default = shell; diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index 6cf2234..efc75a1 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -14,43 +14,21 @@ let nvim-autopairs nvim-lint nvim-lspconfig - nvim-treesitter.withAllGrammars + nvim-treesitter nvim-treesitter-textobjects quicker-nvim render-markdown-nvim snacks-nvim ]; - basePackages = with prev; [ + packages = with prev; [ ripgrep fd ]; - # Extra packages that should be included on nixos but don't need to be bundled - extraPackages = with prev; [ - # linters - yamllint - jq - hadolint - nixfmt - shellcheck - golangci-lint - - # LSPs - gopls - lua-language-server - nixd - basedpyright - ]; in { nvim-pkg = mkNeovim { - inherit plugins; - packages = basePackages ++ extraPackages; - }; - - nvim-min-pkg = mkNeovim { - inherit plugins; - packages = basePackages; + inherit plugins packages; }; nvim-luarc-json = final.mk-luarc-json { diff --git a/nvim/after/lua/iofq/snacks_jj.lua b/nvim/after/lua/iofq/snacks_jj.lua index aae14fa..a9c78fe 100644 --- a/nvim/after/lua/iofq/snacks_jj.lua +++ b/nvim/after/lua/iofq/snacks_jj.lua @@ -62,6 +62,21 @@ function M.file_history(filename) end end + local function confirm(picker, item) + picker:close() + local cmd = string.format('jj show --git -r %s', item.rev) + local out = vim.fn.systemlist(cmd) + + local bufnr = vim.api.nvim_create_buf(false, true) + vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, out) + vim.bo[bufnr].bufhidden = 'wipe' + vim.bo[bufnr].buftype = 'nofile' + vim.bo[bufnr].filetype = 'diff' + vim.keymap.set('n', 'q', vim.cmd.bdelete, { buffer = bufnr, noremap = true }) + + vim.api.nvim_set_current_buf(bufnr) + end + local function get_history(f) local status_raw = vim.fn.system( 'jj log --ignore-working-copy --no-graph' @@ -85,6 +100,7 @@ function M.file_history(filename) title = 'jj file history for ' .. filename, items = get_history(filename), preview = preview, + confirm = confirm, } end return M diff --git a/nvim/after/plugin/autocmd.lua b/nvim/after/plugin/autocmd.lua index 81cb335..7e8e994 100644 --- a/nvim/after/plugin/autocmd.lua +++ b/nvim/after/plugin/autocmd.lua @@ -48,7 +48,7 @@ cmd('FileType', { 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 path = vim.fn.fnamemodify(item.user_data.right, ':.') local hl = 'Added' if exec('git diff --quiet -- %s', path) ~= 0 @@ -98,6 +98,45 @@ cmd('BufWinEnter', { vim.cmd(string.format('%dcopen', math.min(10, #items))) end) end + + local function get_hunks(bufnr) + local conf_start = vim.fn.search('^<<<<<<<', 'bc') + local base_start = vim.fn.search('^|||||||', 'W') + local base_end = vim.fn.search('^=======', 'W') + local conf_end = vim.fn.search('^>>>>>>>', 'W') + + local left = vim.api.nvim_buf_get_lines(bufnr, conf_start, base_start - 1, false) + local right = vim.api.nvim_buf_get_lines(bufnr, base_end, conf_end - 1, false) + + return { + start = conf_start, + stop = conf_end, + left = left, + right = right, + } + end + + local function apply_hunk(hunks, first) + local result = {} + if first == -1 then -- left first + vim.list_extend(result, hunks.left) + vim.list_extend(result, hunks.right) + else + vim.list_extend(result, hunks.right) + vim.list_extend(result, hunks.left) + end + + -- apply hunk in place + vim.api.nvim_buf_set_lines(0, hunks.start - 1, hunks.stop, false, result) + end + + -- "combine" mappings ala vscode's merge editor + vim.keymap.set('n', 'dl', function() + apply_hunk(get_hunks(event.buf), -1) + end, { buffer = event.buf }) + vim.keymap.set('n', 'dr', function() + apply_hunk(get_hunks(event.buf), 1) + end, { buffer = event.buf }) end, }) diff --git a/nvim/after/plugin/mini.lua b/nvim/after/plugin/mini.lua index 30d5984..76b5fe9 100644 --- a/nvim/after/plugin/mini.lua +++ b/nvim/after/plugin/mini.lua @@ -9,6 +9,8 @@ vim.schedule(function() ai.setup { 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' }, }, @@ -16,9 +18,7 @@ vim.schedule(function() require('mini.git').setup() map('n', 'gb', 'Git blame -- %') - map('n', 'go', function() - return MiniGit.show_at_cursor() - end) + map('n', 'go', MiniGit.show_at_cursor) local jump = require('mini.jump2d') jump.setup { diff --git a/nvim/after/plugin/plugins.lua b/nvim/after/plugin/plugins.lua index abd3c45..21c9339 100644 --- a/nvim/after/plugin/plugins.lua +++ b/nvim/after/plugin/plugins.lua @@ -3,12 +3,7 @@ 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('dart').setup {} require('snacks').setup { bigfile = { enabled = true }, @@ -76,7 +71,6 @@ vim.schedule(function() json = { 'jq' }, lua = { 'stylua' }, python = { 'ruff' }, - nix = { 'nixfmt' }, fish = { 'fish_indent' }, ['*'] = { 'trim_whitespace' }, }, @@ -99,11 +93,14 @@ vim.schedule(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({ 'BufWritePost' }, { callback = function() @@ -119,7 +116,7 @@ vim.schedule(function() sources = { default = { 'lsp', 'path', 'snippets', 'ripgrep', 'buffer' }, providers = { - lsp = { fallbacks = {} }, -- include buffer even when LSP is active + lsp = { fallbacks = {}, async = true }, -- 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',