From 916bb1bf5dca11d55e2f89b2a8f1a68b45843f64 Mon Sep 17 00:00:00 2001 From: iofq Date: Wed, 17 May 2023 06:36:50 -0500 Subject: [PATCH 001/160] push today's rice --- config/init.lua | 3 +- config/lua/blankline-conf.lua | 8 +++--- config/lua/leap-conf.lua | 5 ---- config/lua/main.go | 7 +++++ config/lua/mini-conf.lua | 22 +++++++++++++++ config/lua/nvim-conf.lua | 13 +++++---- config/lua/nvim-treesitter-conf.lua | 0 config/lua/plugins-conf.lua | 2 -- config/lua/telescope-conf.lua | 7 ++++- config/lua/toggleterm-conf.lua | 0 flake.nix | 43 +++++++++++------------------ 11 files changed, 64 insertions(+), 46 deletions(-) mode change 100755 => 100644 config/init.lua mode change 100755 => 100644 config/lua/blankline-conf.lua delete mode 100755 config/lua/leap-conf.lua create mode 100644 config/lua/main.go create mode 100644 config/lua/mini-conf.lua mode change 100755 => 100644 config/lua/nvim-conf.lua mode change 100755 => 100644 config/lua/nvim-treesitter-conf.lua delete mode 100755 config/lua/plugins-conf.lua mode change 100755 => 100644 config/lua/telescope-conf.lua mode change 100755 => 100644 config/lua/toggleterm-conf.lua diff --git a/config/init.lua b/config/init.lua old mode 100755 new mode 100644 index 1d016e3..1de7fa4 --- a/config/init.lua +++ b/config/init.lua @@ -1,7 +1,6 @@ require("blankline-conf") -require("leap-conf") require("nvim-conf") require("nvim-treesitter-conf") -require("plugins-conf") require("telescope-conf") require("toggleterm-conf") +require("mini-conf") diff --git a/config/lua/blankline-conf.lua b/config/lua/blankline-conf.lua old mode 100755 new mode 100644 index 17104f8..05dcf45 --- a/config/lua/blankline-conf.lua +++ b/config/lua/blankline-conf.lua @@ -1,6 +1,6 @@ vim.cmd([[ hi IndentBlanklineChar ctermfg=240 ]]) vim.cmd([[ hi IndentBlanklineContextChar ctermfg=7 ]]) -require("indent_blankline").setup { - show_current_context = true, - show_current_context_start = true, -} +-- require("indent_blankline").setup { +-- show_current_context = true, +-- show_current_context_start = true, +-- } diff --git a/config/lua/leap-conf.lua b/config/lua/leap-conf.lua deleted file mode 100755 index ea1ec81..0000000 --- a/config/lua/leap-conf.lua +++ /dev/null @@ -1,5 +0,0 @@ -local leap = require('leap') -leap.set_default_keymaps() -leap.init_highlight(true) -vim.cmd([[ hi LeapLabelPrimary ctermbg=251 ctermfg=0 ]]) - diff --git a/config/lua/main.go b/config/lua/main.go new file mode 100644 index 0000000..50e8d8d --- /dev/null +++ b/config/lua/main.go @@ -0,0 +1,7 @@ +package main + +import "fmt" + +func main() { + fmt.Println("vim-go") +} diff --git a/config/lua/mini-conf.lua b/config/lua/mini-conf.lua new file mode 100644 index 0000000..9a8da39 --- /dev/null +++ b/config/lua/mini-conf.lua @@ -0,0 +1,22 @@ +require('mini.comment').setup() +require('mini.move').setup() +require('mini.surround').setup() +require('mini.splitjoin').setup({ + detect = { + separator = '[,;\n]' + } +}) + +require('mini.pairs').setup() +vim.cmd([[ hi MiniCursorwordCurrent ctermfg=240 ]]) + +require('mini.jump2d').setup({ + mappings = { start_jumping = 's' } +}) + +indent = require('mini.indentscope') +indent.setup({ + options = { try_as_border = false }, + draw = { delay = 0 } +}) +indent.gen_animation.none() diff --git a/config/lua/nvim-conf.lua b/config/lua/nvim-conf.lua old mode 100755 new mode 100644 index 684755a..c2acd27 --- a/config/lua/nvim-conf.lua +++ b/config/lua/nvim-conf.lua @@ -3,7 +3,7 @@ vim.opt.autoindent = true vim.opt.background = "light" vim.opt.backspace = "indent,eol,start" -vim.opt.backup = false -- and auto backps, to instead use +vim.opt.backup = false vim.opt.breakindent = true vim.opt.clipboard = "unnamedplus" -- use system clipboard vim.opt.completeopt = "menuone" @@ -13,11 +13,12 @@ vim.opt.guicursor = "" -- fixes alacritty changing cursor vim.opt.hidden = true -- dont save when switching buffers vim.opt.hlsearch = true vim.opt.ignorecase = true -- ignore case in searches -vim.opt.inccommand = "split" -- incremental live completion +vim.opt.inccommand = "split" -- incremental live completion vim.opt.incsearch = true vim.opt.laststatus = 1 vim.opt.list = true vim.opt.listchars:append("trail:·") +vim.opt.listchars:append("leadmultispace:╎ ") vim.opt.mouse = "a" vim.opt.nrformats:append("alpha") -- let Ctrl-a do letters as well vim.opt.number = true @@ -30,10 +31,10 @@ vim.opt.showmatch = true -- highlight matching brackets vim.opt.signcolumn= "number" vim.opt.smartcase = true -- unless capital query vim.opt.smartindent = true -- indent according to lang -vim.opt.softtabstop = -1 -- backspace removes tabstop +vim.opt.softtabstop = -1 -- backspace removes tabstop vim.opt.splitbelow = true vim.opt.splitright = true -vim.opt.swapfile = false -- disable swapfiles +vim.opt.swapfile = false vim.opt.tabstop = 4 -- 4 space tabs vim.opt.undofile = true -- enable auto save of undos vim.opt.updatetime = 250 -- decrease update time @@ -46,9 +47,11 @@ vim.g.netrw_liststyle = 3 -- tree view vim.g.fzf_layout = { window = { width = 0.9, height = 0.6 } } vim.g.indent_blankline_use_treesitter = true +-- highlight indents +vim.cmd([[ hi Whitespace ctermfg=240 ]]) -- mappings ---------------------------------------- --- local func to set keybinds + local remap = function(type, key, value) vim.api.nvim_set_keymap(type,key,value,{noremap = true, silent = true}); end diff --git a/config/lua/nvim-treesitter-conf.lua b/config/lua/nvim-treesitter-conf.lua old mode 100755 new mode 100644 diff --git a/config/lua/plugins-conf.lua b/config/lua/plugins-conf.lua deleted file mode 100755 index 1d32eab..0000000 --- a/config/lua/plugins-conf.lua +++ /dev/null @@ -1,2 +0,0 @@ --- telescope ----------------------------------------- diff --git a/config/lua/telescope-conf.lua b/config/lua/telescope-conf.lua old mode 100755 new mode 100644 index 4fb06b5..9873034 --- a/config/lua/telescope-conf.lua +++ b/config/lua/telescope-conf.lua @@ -6,6 +6,8 @@ vim.keymap.set("n", "fv", telescope.command_history, {noremap = true, si vim.keymap.set("n", "", telescope.live_grep, {noremap = true, silent = true}) vim.keymap.set("n", "8", telescope.grep_string, {noremap = true, silent = true}) vim.keymap.set("n", "fd", telescope.lsp_definitions, {noremap = true, silent = true}) +vim.keymap.set("n", "", telescope.resume, {noremap = true, silent = true}) +vim.keymap.set("n", "fr", telescope.lsp_references, {noremap = true, silent = true}) -- fix highlighting vim.cmd([[ hi telescopeselection ctermfg=242 ctermbg=252 ]]) @@ -13,6 +15,9 @@ require("telescope").setup({ defaults = { layout_strategy = "vertical", layout_config = { width = .90, }, + prompt_title = false, + results_title = false, + preview_title = false, vimgrep_arguments = { "rg", "--color=never", @@ -25,7 +30,7 @@ require("telescope").setup({ }, mappings = { i = { - [""] = require("telescope.actions").close, + ["wq"] = require("telescope.actions").close, [""] = require("telescope.actions").move_selection_previous, [""] = require("telescope.actions").move_selection_next, }, diff --git a/config/lua/toggleterm-conf.lua b/config/lua/toggleterm-conf.lua old mode 100755 new mode 100644 diff --git a/flake.nix b/flake.nix index 72fe7e2..6865628 100644 --- a/flake.nix +++ b/flake.nix @@ -4,17 +4,18 @@ nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; flake-utils.url = "github:numtide/flake-utils"; }; - outputs = inputs @ { - self, - nixpkgs, - flake-utils, - ... - }: + outputs = inputs @ {self, nixpkgs, flake-utils, ...}: flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; }; - + dependancies = with pkgs; [ + bash fd fzf gopls ripgrep + ]; + neovim-with-deps = recursiveMerge [ + pkgs.neovim-unwrapped + {buildInputs = dependancies;} + ]; recursiveMerge = attrList: let f = attrPath: builtins.zipAttrsWith (n: values: @@ -28,20 +29,12 @@ in f [] attrList; in rec { - deps = with pkgs; [ - bash - fzf - ripgrep - gopls - ]; - neovim-with-deps = recursiveMerge [ - pkgs.neovim-unwrapped - {buildInputs = deps;} - ]; packages.iofqvim = pkgs.wrapNeovim neovim-with-deps { viAlias = true; vimAlias = true; - extraMakeWrapperArgs = ''--prefix PATH : "${pkgs.lib.makeBinPath deps}"''; + withRuby = false; + withPython3 = false; + extraMakeWrapperArgs = ''--prefix PATH : "${pkgs.lib.makeBinPath dependancies}"''; configure = { customRC = '' @@ -55,15 +48,10 @@ packages.plugins = with pkgs.vimPlugins; { start = with pkgs.vimPlugins; [ telescope-nvim - vim-commentary - vim-surround toggleterm-nvim - targets-vim - indent-blankline-nvim + mini-nvim vim-go vim-nix - nvim-treesitter-textobjects - leap-nvim (nvim-treesitter.withPlugins ( plugins: with plugins; [ @@ -74,6 +62,7 @@ tree-sitter-javascript tree-sitter-json tree-sitter-lua + tree-sitter-markdown tree-sitter-nix tree-sitter-php tree-sitter-python @@ -81,14 +70,14 @@ ] ) ) + nvim-treesitter-textobjects + leap-nvim ]; }; }; }; apps.iofqvim = flake-utils.lib.mkApp { - drv = packages.iofqvim; - name = "iofqvim"; - exePath = "/bin/nvim"; + drv = packages.iofqvim; name = "iofqvim"; exePath = "/bin/nvim"; }; apps.default = apps.iofqvim; packages.default = packages.iofqvim; From 6e5ab46a79bc1e5b70acfe0c980907436c84f1f4 Mon Sep 17 00:00:00 2001 From: iofq Date: Wed, 24 May 2023 05:54:25 -0500 Subject: [PATCH 002/160] add oil, colors --- config/init.lua | 6 +- config/lua/blankline-conf.lua | 6 -- config/lua/gitsigns-conf.lua | 32 +++++++++++ config/lua/main.go | 7 --- config/lua/nvim-conf.lua | 3 + config/lua/nvim-treesitter-conf.lua | 10 ---- config/lua/oil-conf.lua | 14 +++++ config/lua/telescope-conf.lua | 4 +- config/minimal-init.lua | 6 ++ flake.nix | 88 +++++++++++++++-------------- plugins.nix | 35 ++++++++++++ 11 files changed, 139 insertions(+), 72 deletions(-) delete mode 100644 config/lua/blankline-conf.lua create mode 100644 config/lua/gitsigns-conf.lua delete mode 100644 config/lua/main.go create mode 100644 config/lua/oil-conf.lua create mode 100644 config/minimal-init.lua create mode 100644 plugins.nix diff --git a/config/init.lua b/config/init.lua index 1de7fa4..2c57f31 100644 --- a/config/init.lua +++ b/config/init.lua @@ -1,6 +1,2 @@ -require("blankline-conf") -require("nvim-conf") +require("minimal-init") require("nvim-treesitter-conf") -require("telescope-conf") -require("toggleterm-conf") -require("mini-conf") diff --git a/config/lua/blankline-conf.lua b/config/lua/blankline-conf.lua deleted file mode 100644 index 05dcf45..0000000 --- a/config/lua/blankline-conf.lua +++ /dev/null @@ -1,6 +0,0 @@ -vim.cmd([[ hi IndentBlanklineChar ctermfg=240 ]]) -vim.cmd([[ hi IndentBlanklineContextChar ctermfg=7 ]]) --- require("indent_blankline").setup { --- show_current_context = true, --- show_current_context_start = true, --- } diff --git a/config/lua/gitsigns-conf.lua b/config/lua/gitsigns-conf.lua new file mode 100644 index 0000000..8604d88 --- /dev/null +++ b/config/lua/gitsigns-conf.lua @@ -0,0 +1,32 @@ +require('gitsigns').setup{ + signs = { + add = { text = '✓'}, + change = { text = '↔'}, + delete = { text = '✗'}, + }, + signcolumn = auto, + on_attach = function() + vim.wo.signcolumn = "yes" + vim.cmd [[ hi SignColumn ctermbg=none]] + vim.cmd [[ hi GitSignsAdd ctermbg=none]] + vim.cmd [[ hi GitSignsDelete ctermbg=none]] + vim.cmd [[ hi GitSignsChange ctermbg=none]] + end +} + +require("neogit").setup({ + disable_context_highlighting = true +}) +vim.cmd [[ hi DiffAdd ctermbg=none ]] +vim.cmd [[ hi DiffDelete ctermbg=none ]] +vim.cmd [[ hi DiffContext ctermbg=none ]] +vim.cmd [[ hi NeogitHunkHeader ctermbg=none ]] +vim.cmd [[ hi NeogitHunkHeader ctermbg=none ]] + +require("rose-pine").setup({ + variant = "moon", + disable_background = true, + disable_float_background = true +}) + +vim.cmd.colorscheme "rose-pine" diff --git a/config/lua/main.go b/config/lua/main.go deleted file mode 100644 index 50e8d8d..0000000 --- a/config/lua/main.go +++ /dev/null @@ -1,7 +0,0 @@ -package main - -import "fmt" - -func main() { - fmt.Println("vim-go") -} diff --git a/config/lua/nvim-conf.lua b/config/lua/nvim-conf.lua index c2acd27..be99a74 100644 --- a/config/lua/nvim-conf.lua +++ b/config/lua/nvim-conf.lua @@ -36,6 +36,7 @@ vim.opt.splitbelow = true vim.opt.splitright = true vim.opt.swapfile = false vim.opt.tabstop = 4 -- 4 space tabs +vim.opt.termguicolors = true vim.opt.undofile = true -- enable auto save of undos vim.opt.updatetime = 250 -- decrease update time vim.opt.virtualedit = "onemore" @@ -49,6 +50,8 @@ vim.g.indent_blankline_use_treesitter = true -- highlight indents vim.cmd([[ hi Whitespace ctermfg=240 ]]) +-- highlight floats +vim.cmd([[ hi NormalFloat ctermbg=none ]]) -- mappings ---------------------------------------- diff --git a/config/lua/nvim-treesitter-conf.lua b/config/lua/nvim-treesitter-conf.lua index 1cd779a..07e9132 100644 --- a/config/lua/nvim-treesitter-conf.lua +++ b/config/lua/nvim-treesitter-conf.lua @@ -11,8 +11,6 @@ require("nvim-treesitter.configs").setup { enable = true, lookahead = true, keymaps = { - ['ac'] = '@comment.outer', - ['ic'] = '@comment.inner', ["af"] = "@function.outer", ["if"] = "@function.inner", ["aa"] = "@call.inner", @@ -25,18 +23,10 @@ require("nvim-treesitter.configs").setup { [']]'] = '@function.outer', [']m'] = '@class.outer', }, - goto_next_end = { - [']['] = '@function.outer', - [']M'] = '@class.outer', - }, goto_previous_start = { ['[['] = '@function.outer', ['[m'] = '@class.outer', }, - goto_previous_end = { - ['[]'] = '@function.outer', - ['[M'] = '@class.outer', - }, }, }, incremental_selection = { diff --git a/config/lua/oil-conf.lua b/config/lua/oil-conf.lua new file mode 100644 index 0000000..8085f83 --- /dev/null +++ b/config/lua/oil-conf.lua @@ -0,0 +1,14 @@ +local oil = require('oil') +oil.setup({ + columns = { + "permissions", + "size" + }, + view_options = { + show_hidden = true + }, + keymaps = { + ["wq"] = "actions.close" + } +}) +vim.keymap.set("n", "c", oil.open, {noremap = true, silent = true}); diff --git a/config/lua/telescope-conf.lua b/config/lua/telescope-conf.lua index 9873034..6b23bbc 100644 --- a/config/lua/telescope-conf.lua +++ b/config/lua/telescope-conf.lua @@ -11,7 +11,8 @@ vim.keymap.set("n", "fr", telescope.lsp_references, {noremap = true, sil -- fix highlighting vim.cmd([[ hi telescopeselection ctermfg=242 ctermbg=252 ]]) -require("telescope").setup({ +local telescope = require("telescope") +telescope.setup({ defaults = { layout_strategy = "vertical", layout_config = { width = .90, }, @@ -47,3 +48,4 @@ require("telescope").setup({ }, } }) +telescope.load_extension("fzf") diff --git a/config/minimal-init.lua b/config/minimal-init.lua new file mode 100644 index 0000000..80bd323 --- /dev/null +++ b/config/minimal-init.lua @@ -0,0 +1,6 @@ +require("nvim-conf") +require("telescope-conf") +require("toggleterm-conf") +require("mini-conf") +require("gitsigns-conf") +require("oil-conf") diff --git a/flake.nix b/flake.nix index 6865628..147f8da 100644 --- a/flake.nix +++ b/flake.nix @@ -9,12 +9,29 @@ pkgs = import nixpkgs { inherit system; }; + plugins = import ./plugins.nix { + inherit pkgs; + }; + base = { + viAlias = true; + vimAlias = true; + withRuby = false; + withPython3 = false; + extraMakeWrapperArgs = ''--prefix PATH : "${pkgs.lib.makeBinPath dependancies}"''; + }; dependancies = with pkgs; [ - bash fd fzf gopls ripgrep + ripgrep ]; + full-dependancies = with pkgs; [ + gopls + ] ++ dependancies; neovim-with-deps = recursiveMerge [ pkgs.neovim-unwrapped - {buildInputs = dependancies;} + { buildInputs = dependancies; } + ]; + neovim-with-full-deps = recursiveMerge [ + pkgs.neovim-unwrapped + { buildInputs = dependancies; } ]; recursiveMerge = attrList: let f = attrPath: @@ -29,57 +46,42 @@ in f [] attrList; in rec { - packages.iofqvim = pkgs.wrapNeovim neovim-with-deps { - viAlias = true; - vimAlias = true; - withRuby = false; - withPython3 = false; - extraMakeWrapperArgs = ''--prefix PATH : "${pkgs.lib.makeBinPath dependancies}"''; + packages.full = pkgs.wrapNeovim neovim-with-full-deps (base // { configure = { customRC = '' lua << EOF - package.path = "${self}/config/lua/?.lua;" .. package.path + package.path = "${self}/config/?.lua;" .. "${self}/config/lua/?.lua;" .. package.path '' + pkgs.lib.readFile ./config/init.lua + '' EOF ''; packages.plugins = with pkgs.vimPlugins; { - start = with pkgs.vimPlugins; [ - telescope-nvim - toggleterm-nvim - mini-nvim - vim-go - vim-nix - (nvim-treesitter.withPlugins - ( - plugins: with plugins; [ - tree-sitter-bash - tree-sitter-c - tree-sitter-dockerfile - tree-sitter-go - tree-sitter-javascript - tree-sitter-json - tree-sitter-lua - tree-sitter-markdown - tree-sitter-nix - tree-sitter-php - tree-sitter-python - tree-sitter-yaml - ] - ) - ) - nvim-treesitter-textobjects - leap-nvim - ]; - }; + start = plugins.base ++ plugins.treesitter; }; }; - apps.iofqvim = flake-utils.lib.mkApp { - drv = packages.iofqvim; name = "iofqvim"; exePath = "/bin/nvim"; - }; - apps.default = apps.iofqvim; - packages.default = packages.iofqvim; }); - } + packages.minimal = pkgs.wrapNeovim neovim-with-deps (base // { + configure = { + customRC = + '' + lua << EOF + package.path = "${self}/config/?.lua;" .. "${self}/config/lua/?.lua;" .. package.path + '' + + pkgs.lib.readFile ./config/minimal-init.lua + + '' + EOF + ''; + packages.plugins = with pkgs.vimPlugins; { + start = plugins.base; + }; + }; + }); + apps.full = flake-utils.lib.mkApp { + drv = packages.full; name = "neovim"; exePath = "/bin/nvim"; + }; + apps.default = apps.full; + packages.default = packages.full; + }); + } diff --git a/plugins.nix b/plugins.nix new file mode 100644 index 0000000..f0c7666 --- /dev/null +++ b/plugins.nix @@ -0,0 +1,35 @@ +{pkgs, ...}: +{ + base = with pkgs.vimPlugins; [ + telescope-nvim + telescope-fzf-native-nvim + toggleterm-nvim + mini-nvim + gitsigns-nvim + oil-nvim + neogit + rose-pine + ]; + treesitter = with pkgs.vimPlugins; [ + (nvim-treesitter.withPlugins + ( + plugins: with plugins; [ + tree-sitter-bash + tree-sitter-c + tree-sitter-dockerfile + tree-sitter-go + tree-sitter-javascript + tree-sitter-json + tree-sitter-lua + tree-sitter-markdown + tree-sitter-markdown-inline + tree-sitter-nix + tree-sitter-php + tree-sitter-python + tree-sitter-yaml + ] + ) + ) + nvim-treesitter-textobjects + ]; + } From 0c5b3d23aee857be48166e3f17eb87e657d46a77 Mon Sep 17 00:00:00 2001 From: iofq Date: Wed, 24 May 2023 15:10:06 -0500 Subject: [PATCH 003/160] fix full-deps --- .gitignore | 2 ++ flake.nix | 29 +++++++++++++++-------------- 2 files changed, 17 insertions(+), 14 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f7676fd --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.AppImage +squashfs_root diff --git a/flake.nix b/flake.nix index 147f8da..4ce672a 100644 --- a/flake.nix +++ b/flake.nix @@ -6,6 +6,18 @@ }; outputs = inputs @ {self, nixpkgs, flake-utils, ...}: flake-utils.lib.eachDefaultSystem (system: let + recursiveMerge = attrList: let + f = attrPath: + builtins.zipAttrsWith (n: values: + if pkgs.lib.tail values == [] + then pkgs.lib.head values + else if pkgs.lib.all pkgs.lib.isList values + then pkgs.lib.unique (pkgs.lib.concatLists values) + else if pkgs.lib.all pkgs.lib.isAttrs values + then f (attrPath ++ [n]) values + else pkgs.lib.last values); + in + f [] attrList; pkgs = import nixpkgs { inherit system; }; @@ -23,28 +35,17 @@ ripgrep ]; full-dependancies = with pkgs; [ + go gopls - ] ++ dependancies; + ]; neovim-with-deps = recursiveMerge [ pkgs.neovim-unwrapped { buildInputs = dependancies; } ]; neovim-with-full-deps = recursiveMerge [ pkgs.neovim-unwrapped - { buildInputs = dependancies; } + { buildInputs = dependancies ++ full-dependancies; } ]; - recursiveMerge = attrList: let - f = attrPath: - builtins.zipAttrsWith (n: values: - if pkgs.lib.tail values == [] - then pkgs.lib.head values - else if pkgs.lib.all pkgs.lib.isList values - then pkgs.lib.unique (pkgs.lib.concatLists values) - else if pkgs.lib.all pkgs.lib.isAttrs values - then f (attrPath ++ [n]) values - else pkgs.lib.last values); - in - f [] attrList; in rec { packages.full = pkgs.wrapNeovim neovim-with-full-deps (base // { configure = { From c4ddbfc40cb61fd796e15ce100528673fd943dac Mon Sep 17 00:00:00 2001 From: iofq Date: Thu, 25 May 2023 05:23:10 -0500 Subject: [PATCH 004/160] polish git, mini config --- config/lua/colors.lua | 8 +++++ config/lua/git-conf.lua | 30 +++++++++++++++++++ config/lua/gitsigns-conf.lua | 32 -------------------- config/lua/mini-conf.lua | 42 ++++++++++++++++++++++++++ config/lua/nvim-conf.lua | 54 ++++------------------------------ config/lua/oil-conf.lua | 2 +- config/lua/telescope-conf.lua | 16 ++-------- config/lua/toggleterm-conf.lua | 3 +- config/minimal-init.lua | 10 ++++--- flake.nix | 9 +++--- 10 files changed, 102 insertions(+), 104 deletions(-) create mode 100644 config/lua/colors.lua create mode 100644 config/lua/git-conf.lua delete mode 100644 config/lua/gitsigns-conf.lua diff --git a/config/lua/colors.lua b/config/lua/colors.lua new file mode 100644 index 0000000..a46e555 --- /dev/null +++ b/config/lua/colors.lua @@ -0,0 +1,8 @@ +require("rose-pine").setup({ + variant = "moon", + disable_background = true, + disable_italics = true, + disable_float_background = true +}) + +vim.cmd.colorscheme "rose-pine-main" diff --git a/config/lua/git-conf.lua b/config/lua/git-conf.lua new file mode 100644 index 0000000..f809a97 --- /dev/null +++ b/config/lua/git-conf.lua @@ -0,0 +1,30 @@ +require('gitsigns').setup{ + signcolumn = false, + numhl = true, + on_attach = function() + local gs = package.loaded.gitsigns + vim.keymap.set("n", "gg", gs.preview_hunk) + vim.keymap.set('n', 'gs', gs.stage_hunk) + vim.keymap.set('n', 'gr', gs.reset_hunk) + vim.keymap.set('n', 'gu', gs.undo_stage_hunk) + vim.keymap.set('n', 'gS', gs.stage_buffer) + vim.keymap.set('n', 'gR', gs.reset_buffer) + vim.keymap.set('n', 'gb', function() gs.blame_line{full=true} end) + vim.keymap.set('n', 'gd', gs.diffthis) + vim.keymap.set('n', 'gD', function() gs.diffthis('~') end) + vim.keymap.set('n', 'gt', gs.toggle_deleted) + -- Navigation + vim.keymap.set('n', ']g', function() + if vim.wo.diff then return ']c' end + vim.schedule(function() gs.next_hunk() end) + return '' + end, {expr=true}) + + vim.keymap.set('n', '[g', function() + if vim.wo.diff then return '[c' end + vim.schedule(function() gs.prev_hunk() end) + return '' + end, {expr=true}) end +} + +require("neogit").setup() diff --git a/config/lua/gitsigns-conf.lua b/config/lua/gitsigns-conf.lua deleted file mode 100644 index 8604d88..0000000 --- a/config/lua/gitsigns-conf.lua +++ /dev/null @@ -1,32 +0,0 @@ -require('gitsigns').setup{ - signs = { - add = { text = '✓'}, - change = { text = '↔'}, - delete = { text = '✗'}, - }, - signcolumn = auto, - on_attach = function() - vim.wo.signcolumn = "yes" - vim.cmd [[ hi SignColumn ctermbg=none]] - vim.cmd [[ hi GitSignsAdd ctermbg=none]] - vim.cmd [[ hi GitSignsDelete ctermbg=none]] - vim.cmd [[ hi GitSignsChange ctermbg=none]] - end -} - -require("neogit").setup({ - disable_context_highlighting = true -}) -vim.cmd [[ hi DiffAdd ctermbg=none ]] -vim.cmd [[ hi DiffDelete ctermbg=none ]] -vim.cmd [[ hi DiffContext ctermbg=none ]] -vim.cmd [[ hi NeogitHunkHeader ctermbg=none ]] -vim.cmd [[ hi NeogitHunkHeader ctermbg=none ]] - -require("rose-pine").setup({ - variant = "moon", - disable_background = true, - disable_float_background = true -}) - -vim.cmd.colorscheme "rose-pine" diff --git a/config/lua/mini-conf.lua b/config/lua/mini-conf.lua index 9a8da39..5d476fa 100644 --- a/config/lua/mini-conf.lua +++ b/config/lua/mini-conf.lua @@ -1,6 +1,46 @@ +-- gc gcc require('mini.comment').setup() +-- alt hjkl require('mini.move').setup() + +-- Add surrounding with sa +-- Delete surrounding with sd. +-- Replace surrounding with sr. +-- Find surrounding with sf or sF (move cursor right or left). +-- Highlight surrounding with sh. +-- 'f' - function call (string of alphanumeric symbols or '_' or '.' followed by balanced '()'). In "input" finds function call, in "output" prompts user to enter function name. +-- 't' - tag. In "input" finds tag with same identifier, in "output" prompts user to enter tag name. +-- All symbols in brackets '()', '[]', '{}', '<>". +-- '?' - interactive. Prompts user to enter left and right parts. require('mini.surround').setup() + +-- :Trim +require('mini.trailspace').setup() +vim.api.nvim_create_user_command('Trim', + function() + require("mini.trailspace").trim() + end, {} +) + +-- prefix \ +-- `b` - |'background'|. +-- `c` - |'cursorline'|. +-- `C` - |'cursorcolumn'|. +-- `d` - diagnostic (via |vim.diagnostic.enable()| and |vim.diagnostic.disable()|). +-- `h` - |'hlsearch'| (or |v:hlsearch| to be precise). +-- `i` - |'ignorecase'|. +-- `l` - |'list'|. +-- `n` - |'number'|. +-- `r` - |'relativenumber'|. +-- `s` - |'spell'|. +-- `w` - |'wrap'|. +require('mini.basics').setup({ + mappings = { + windows = true + } +}) + +-- gS require('mini.splitjoin').setup({ detect = { separator = '[,;\n]' @@ -10,6 +50,8 @@ require('mini.splitjoin').setup({ require('mini.pairs').setup() vim.cmd([[ hi MiniCursorwordCurrent ctermfg=240 ]]) +-- f F t T +require('mini.jump').setup() require('mini.jump2d').setup({ mappings = { start_jumping = 's' } }) diff --git a/config/lua/nvim-conf.lua b/config/lua/nvim-conf.lua index be99a74..bd2be05 100644 --- a/config/lua/nvim-conf.lua +++ b/config/lua/nvim-conf.lua @@ -1,74 +1,49 @@ --- vim settings +-- vim settings ++ mini.nvim.basics ---------------------------------------- -vim.opt.autoindent = true -vim.opt.background = "light" vim.opt.backspace = "indent,eol,start" -vim.opt.backup = false -vim.opt.breakindent = true vim.opt.clipboard = "unnamedplus" -- use system clipboard vim.opt.completeopt = "menuone" -vim.opt.cursorline = true vim.opt.expandtab = true -- insert tabs as spaces -vim.opt.guicursor = "" -- fixes alacritty changing cursor -vim.opt.hidden = true -- dont save when switching buffers -vim.opt.hlsearch = true -vim.opt.ignorecase = true -- ignore case in searches vim.opt.inccommand = "split" -- incremental live completion -vim.opt.incsearch = true vim.opt.laststatus = 1 vim.opt.list = true vim.opt.listchars:append("trail:·") vim.opt.listchars:append("leadmultispace:╎ ") -vim.opt.mouse = "a" vim.opt.nrformats:append("alpha") -- let Ctrl-a do letters as well -vim.opt.number = true -vim.opt.pastetoggle = "" vim.opt.path:append("**") -- enable fuzzy :find ing vim.opt.relativenumber = true vim.opt.shadafile = "NONE" -- disable shada vim.opt.shiftwidth = 0 -- >> shifts by tabstop vim.opt.showmatch = true -- highlight matching brackets -vim.opt.signcolumn= "number" -vim.opt.smartcase = true -- unless capital query -vim.opt.smartindent = true -- indent according to lang +vim.opt.showmode = true vim.opt.softtabstop = -1 -- backspace removes tabstop -vim.opt.splitbelow = true -vim.opt.splitright = true vim.opt.swapfile = false vim.opt.tabstop = 4 -- 4 space tabs -vim.opt.termguicolors = true -vim.opt.undofile = true -- enable auto save of undos vim.opt.updatetime = 250 -- decrease update time vim.opt.virtualedit = "onemore" -vim.opt.wildmenu = true -vim.g.netrw_banner = 0 -- disable annoying banner -vim.g.netrw_altv = 1 -- open splits to the right -vim.g.netrw_liststyle = 3 -- tree view vim.g.fzf_layout = { window = { width = 0.9, height = 0.6 } } vim.g.indent_blankline_use_treesitter = true --- highlight indents -vim.cmd([[ hi Whitespace ctermfg=240 ]]) --- highlight floats +-- no highlight floats vim.cmd([[ hi NormalFloat ctermbg=none ]]) + -- mappings ---------------------------------------- local remap = function(type, key, value) vim.api.nvim_set_keymap(type,key,value,{noremap = true, silent = true}); end + remap("i", "wq", "l") remap("v", "wq", "l") remap("n","gr", "gT") -remap("i", "{", "{}O") -remap("i", "(", "()O") -remap("n", "", "nohlsearchdiffupdate") remap("n","n", "nzz") remap("n", "N", "Nzz") remap("n", "Y", "y$") remap("n","[", ":put!=repeat([''],v:count)']+1") remap("n","]", ":put =repeat([''],v:count)'[-1") +remap("n","M", "m0i`0") -- autocmd ---------------------------------------- @@ -77,20 +52,3 @@ vim.api.nvim_create_autocmd("VimEnter", { command = "silent !mkdir -p " .. undopath, group = vim.api.nvim_create_augroup("Init", {}), }) - -local toggle_rel_num = vim.api.nvim_create_augroup("ToggleRelNum", {}) -vim.api.nvim_create_autocmd("InsertEnter", { - command = "set norelativenumber", - group = toggle_rel_num, -}) -vim.api.nvim_create_autocmd("InsertLeave", { - command = "set relativenumber", - group = toggle_rel_num, -}) -vim.api.nvim_create_autocmd("TextYankPost", { - callback = function() - vim.highlight.on_yank({ higroup = "Visual" }) - end, - group = vim.api.nvim_create_augroup("YankHighlight", {}), -}) - diff --git a/config/lua/oil-conf.lua b/config/lua/oil-conf.lua index 8085f83..80cada3 100644 --- a/config/lua/oil-conf.lua +++ b/config/lua/oil-conf.lua @@ -11,4 +11,4 @@ oil.setup({ ["wq"] = "actions.close" } }) -vim.keymap.set("n", "c", oil.open, {noremap = true, silent = true}); +vim.keymap.set("n", "c", oil.toggle_float, {noremap = true, silent = true}); diff --git a/config/lua/telescope-conf.lua b/config/lua/telescope-conf.lua index 6b23bbc..08d2b13 100644 --- a/config/lua/telescope-conf.lua +++ b/config/lua/telescope-conf.lua @@ -5,11 +5,10 @@ vim.keymap.set("n", "fg", telescope.git_files, {noremap = true, silent = vim.keymap.set("n", "fv", telescope.command_history, {noremap = true, silent = true}) vim.keymap.set("n", "", telescope.live_grep, {noremap = true, silent = true}) vim.keymap.set("n", "8", telescope.grep_string, {noremap = true, silent = true}) -vim.keymap.set("n", "fd", telescope.lsp_definitions, {noremap = true, silent = true}) vim.keymap.set("n", "", telescope.resume, {noremap = true, silent = true}) +vim.keymap.set("n", "fs", telescope.git_status, {noremap = true, silent = true}) +vim.keymap.set("n", "fd", telescope.lsp_definitions, {noremap = true, silent = true}) vim.keymap.set("n", "fr", telescope.lsp_references, {noremap = true, silent = true}) --- fix highlighting -vim.cmd([[ hi telescopeselection ctermfg=242 ctermbg=252 ]]) local telescope = require("telescope") telescope.setup({ @@ -32,20 +31,11 @@ telescope.setup({ mappings = { i = { ["wq"] = require("telescope.actions").close, + [""] = require("telescope.actions").close, [""] = require("telescope.actions").move_selection_previous, [""] = require("telescope.actions").move_selection_next, }, }, }, - pickers = { - find_files = { - hidden = true, - find_command = { 'rg', '--files', '--iglob', '!.git', '--hidden' } - }, - git_files = { - hidden = true, - find_command = { 'rg', '--files', '--iglob', '!.git', '--hidden' } - }, - } }) telescope.load_extension("fzf") diff --git a/config/lua/toggleterm-conf.lua b/config/lua/toggleterm-conf.lua index 0b066f9..49ac716 100644 --- a/config/lua/toggleterm-conf.lua +++ b/config/lua/toggleterm-conf.lua @@ -1,5 +1,4 @@ require("toggleterm").setup{ - open_mapping = [[t]], - shade_terminals = true, + open_mapping = [[]], size = vim.o.lines * 0.4 } diff --git a/config/minimal-init.lua b/config/minimal-init.lua index 80bd323..c15c163 100644 --- a/config/minimal-init.lua +++ b/config/minimal-init.lua @@ -1,6 +1,8 @@ -require("nvim-conf") -require("telescope-conf") -require("toggleterm-conf") +require("colors") require("mini-conf") -require("gitsigns-conf") +require("toggleterm-conf") +require("telescope-conf") +require("git-conf") require("oil-conf") +-- include our config last to override +require("nvim-conf") diff --git a/flake.nix b/flake.nix index 4ce672a..c95e387 100644 --- a/flake.nix +++ b/flake.nix @@ -29,25 +29,25 @@ vimAlias = true; withRuby = false; withPython3 = false; - extraMakeWrapperArgs = ''--prefix PATH : "${pkgs.lib.makeBinPath dependancies}"''; }; dependancies = with pkgs; [ ripgrep + lazygit ]; full-dependancies = with pkgs; [ - go gopls - ]; + ] ++ dependancies; neovim-with-deps = recursiveMerge [ pkgs.neovim-unwrapped { buildInputs = dependancies; } ]; neovim-with-full-deps = recursiveMerge [ pkgs.neovim-unwrapped - { buildInputs = dependancies ++ full-dependancies; } + { buildInputs = full-dependancies; } ]; in rec { packages.full = pkgs.wrapNeovim neovim-with-full-deps (base // { + extraMakeWrapperArgs = ''--prefix PATH : "${pkgs.lib.makeBinPath full-dependancies}"''; configure = { customRC = '' @@ -64,6 +64,7 @@ }; }); packages.minimal = pkgs.wrapNeovim neovim-with-deps (base // { + extraMakeWrapperArgs = ''--prefix PATH : "${pkgs.lib.makeBinPath dependancies}"''; configure = { customRC = '' From 4b7dd9144c95f0226cb333ef0f2c357323295b57 Mon Sep 17 00:00:00 2001 From: iofq Date: Fri, 26 May 2023 02:54:53 -0500 Subject: [PATCH 005/160] add nix config --- config/ftplugin/nix.lua | 1 + flake.nix | 4 +++- plugins.nix | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 config/ftplugin/nix.lua diff --git a/config/ftplugin/nix.lua b/config/ftplugin/nix.lua new file mode 100644 index 0000000..3c844d9 --- /dev/null +++ b/config/ftplugin/nix.lua @@ -0,0 +1 @@ +vim.opt_local.tabstop = 2 diff --git a/flake.nix b/flake.nix index c95e387..bb50ac1 100644 --- a/flake.nix +++ b/flake.nix @@ -53,13 +53,14 @@ '' lua << EOF package.path = "${self}/config/?.lua;" .. "${self}/config/lua/?.lua;" .. package.path + vim.o.runtimepath = "${self}/config," .. vim.o.runtimepath '' + pkgs.lib.readFile ./config/init.lua + '' EOF ''; packages.plugins = with pkgs.vimPlugins; { - start = plugins.base ++ plugins.treesitter; + start = plugins.base ++ plugins.extra ++ plugins.treesitter; }; }; }); @@ -70,6 +71,7 @@ '' lua << EOF package.path = "${self}/config/?.lua;" .. "${self}/config/lua/?.lua;" .. package.path + vim.o.runtimepath = "${self}/config," .. vim.o.runtimepath '' + pkgs.lib.readFile ./config/minimal-init.lua + '' diff --git a/plugins.nix b/plugins.nix index f0c7666..68cc004 100644 --- a/plugins.nix +++ b/plugins.nix @@ -10,6 +10,9 @@ neogit rose-pine ]; + extra = with pkgs.vimPlugins; [ + vim-nix + ]; treesitter = with pkgs.vimPlugins; [ (nvim-treesitter.withPlugins ( From bfc22a1979cbbb62652e8cd7dc6439af2116e4bf Mon Sep 17 00:00:00 2001 From: iofq Date: Fri, 26 May 2023 03:52:58 -0500 Subject: [PATCH 006/160] init lsp config --- config/init.lua | 1 + config/lua/lsp-conf.lua | 42 +++++++++++++++++++++++++++++++++++++ flake.nix | 46 ++++++++++++++++++++--------------------- plugins.nix | 7 +++++-- 4 files changed, 71 insertions(+), 25 deletions(-) create mode 100644 config/lua/lsp-conf.lua diff --git a/config/init.lua b/config/init.lua index 2c57f31..cad3a73 100644 --- a/config/init.lua +++ b/config/init.lua @@ -1,2 +1,3 @@ require("minimal-init") require("nvim-treesitter-conf") +require("lsp-conf") diff --git a/config/lua/lsp-conf.lua b/config/lua/lsp-conf.lua new file mode 100644 index 0000000..7328f68 --- /dev/null +++ b/config/lua/lsp-conf.lua @@ -0,0 +1,42 @@ +-- Setup language servers. +local lspconfig = require('lspconfig') +lspconfig.gopls.setup {} + + +-- Global mappings. +-- See `:help vim.diagnostic.*` for documentation on any of the below functions +vim.keymap.set('n', 'e', vim.diagnostic.open_float) +vim.keymap.set('n', '[d', vim.diagnostic.goto_prev) +vim.keymap.set('n', ']d', vim.diagnostic.goto_next) +vim.keymap.set('n', 'q', vim.diagnostic.setloclist) + +-- Use LspAttach autocommand to only map the following keys +-- after the language server attaches to the current buffer +vim.api.nvim_create_autocmd('LspAttach', { + group = vim.api.nvim_create_augroup('UserLspConfig', {}), + callback = function(ev) + -- Enable completion triggered by + vim.bo[ev.buf].omnifunc = 'v:lua.vim.lsp.omnifunc' + + -- Buffer local mappings. + -- See `:help vim.lsp.*` for documentation on any of the below functions + local opts = { buffer = ev.buf } + vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, opts) + vim.keymap.set('n', 'gd', vim.lsp.buf.definition, opts) + vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts) + vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, opts) + vim.keymap.set('n', '', vim.lsp.buf.signature_help, opts) + vim.keymap.set('n', 'wa', vim.lsp.buf.add_workspace_folder, opts) + vim.keymap.set('n', 'wr', vim.lsp.buf.remove_workspace_folder, opts) + vim.keymap.set('n', 'wl', function() + print(vim.inspect(vim.lsp.buf.list_workspace_folders())) + end, opts) + vim.keymap.set('n', 'D', vim.lsp.buf.type_definition, opts) + vim.keymap.set('n', 'rn', vim.lsp.buf.rename, opts) + vim.keymap.set({ 'n', 'v' }, 'ca', vim.lsp.buf.code_action, opts) + vim.keymap.set('n', 'gr', vim.lsp.buf.references, opts) + vim.keymap.set('n', 'f', function() + vim.lsp.buf.format { async = true } + end, opts) + end, +}) diff --git a/flake.nix b/flake.nix index bb50ac1..6f9ae33 100644 --- a/flake.nix +++ b/flake.nix @@ -60,32 +60,32 @@ EOF ''; packages.plugins = with pkgs.vimPlugins; { - start = plugins.base ++ plugins.extra ++ plugins.treesitter; + start = plugins.base ++ plugins.extra; }; }; }); - packages.minimal = pkgs.wrapNeovim neovim-with-deps (base // { - extraMakeWrapperArgs = ''--prefix PATH : "${pkgs.lib.makeBinPath dependancies}"''; - configure = { - customRC = - '' - lua << EOF - package.path = "${self}/config/?.lua;" .. "${self}/config/lua/?.lua;" .. package.path - vim.o.runtimepath = "${self}/config," .. vim.o.runtimepath - '' - + pkgs.lib.readFile ./config/minimal-init.lua - + '' - EOF - ''; - packages.plugins = with pkgs.vimPlugins; { - start = plugins.base; + packages.minimal = pkgs.wrapNeovim neovim-with-deps (base // { + extraMakeWrapperArgs = ''--prefix PATH : "${pkgs.lib.makeBinPath dependancies}"''; + configure = { + customRC = + '' + lua << EOF + package.path = "${self}/config/?.lua;" .. "${self}/config/lua/?.lua;" .. package.path + vim.o.runtimepath = "${self}/config," .. vim.o.runtimepath + '' + + pkgs.lib.readFile ./config/minimal-init.lua + + '' + EOF + ''; + packages.plugins = with pkgs.vimPlugins; { + start = plugins.base; + }; }; + }); + apps.full = flake-utils.lib.mkApp { + drv = packages.full; name = "neovim"; exePath = "/bin/nvim"; }; + apps.default = apps.full; + packages.default = packages.full; }); - apps.full = flake-utils.lib.mkApp { - drv = packages.full; name = "neovim"; exePath = "/bin/nvim"; - }; - apps.default = apps.full; - packages.default = packages.full; - }); - } + } diff --git a/plugins.nix b/plugins.nix index 68cc004..b22b056 100644 --- a/plugins.nix +++ b/plugins.nix @@ -12,8 +12,11 @@ ]; extra = with pkgs.vimPlugins; [ vim-nix - ]; - treesitter = with pkgs.vimPlugins; [ + + #lsp + nvim-lspconfig + + #treesitter (nvim-treesitter.withPlugins ( plugins: with plugins; [ From 482ec8e00a840bff4104cb031b13215fa12f2271 Mon Sep 17 00:00:00 2001 From: iofq Date: Fri, 26 May 2023 04:06:55 -0500 Subject: [PATCH 007/160] update lsp keybinds --- config/lua/lsp-conf.lua | 49 ++++++++++++++++++----------------------- 1 file changed, 21 insertions(+), 28 deletions(-) diff --git a/config/lua/lsp-conf.lua b/config/lua/lsp-conf.lua index 7328f68..d3661a0 100644 --- a/config/lua/lsp-conf.lua +++ b/config/lua/lsp-conf.lua @@ -2,41 +2,34 @@ local lspconfig = require('lspconfig') lspconfig.gopls.setup {} - -- Global mappings. -- See `:help vim.diagnostic.*` for documentation on any of the below functions -vim.keymap.set('n', 'e', vim.diagnostic.open_float) +vim.keymap.set('n', 'de', vim.diagnostic.open_float) vim.keymap.set('n', '[d', vim.diagnostic.goto_prev) vim.keymap.set('n', ']d', vim.diagnostic.goto_next) -vim.keymap.set('n', 'q', vim.diagnostic.setloclist) -- Use LspAttach autocommand to only map the following keys -- after the language server attaches to the current buffer vim.api.nvim_create_autocmd('LspAttach', { - group = vim.api.nvim_create_augroup('UserLspConfig', {}), - callback = function(ev) - -- Enable completion triggered by - vim.bo[ev.buf].omnifunc = 'v:lua.vim.lsp.omnifunc' + group = vim.api.nvim_create_augroup('UserLspConfig', {}), + callback = function(ev) + -- Enable completion triggered by + vim.bo[ev.buf].omnifunc = 'v:lua.vim.lsp.omnifunc' - -- Buffer local mappings. - -- See `:help vim.lsp.*` for documentation on any of the below functions - local opts = { buffer = ev.buf } - vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, opts) - vim.keymap.set('n', 'gd', vim.lsp.buf.definition, opts) - vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts) - vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, opts) - vim.keymap.set('n', '', vim.lsp.buf.signature_help, opts) - vim.keymap.set('n', 'wa', vim.lsp.buf.add_workspace_folder, opts) - vim.keymap.set('n', 'wr', vim.lsp.buf.remove_workspace_folder, opts) - vim.keymap.set('n', 'wl', function() - print(vim.inspect(vim.lsp.buf.list_workspace_folders())) - end, opts) - vim.keymap.set('n', 'D', vim.lsp.buf.type_definition, opts) - vim.keymap.set('n', 'rn', vim.lsp.buf.rename, opts) - vim.keymap.set({ 'n', 'v' }, 'ca', vim.lsp.buf.code_action, opts) - vim.keymap.set('n', 'gr', vim.lsp.buf.references, opts) - vim.keymap.set('n', 'f', function() - vim.lsp.buf.format { async = true } - end, opts) - end, + -- Buffer local mappings. + -- See `:help vim.lsp.*` for documentation on any of the below functions + local opts = { buffer = ev.buf } + vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts) + vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, opts) + vim.keymap.set('n', 'rn', vim.lsp.buf.rename, opts) + vim.keymap.set({ 'n', 'v' }, 'ca', vim.lsp.buf.code_action, opts) + vim.keymap.set("n", "gd", "Telescope lsp_definitions", { buffer = bufnr }) + vim.keymap.set("n", "gi", "Telescope lsp_implementations", { buffer = bufnr }) + vim.keymap.set("n", "gr", "Telescope lsp_references", { buffer = bufnr }) + vim.keymap.set("n", "dt", "Telescope lsp_type_definitions", { buffer = bufnr }) + vim.keymap.set("n", "ds", "Telescope lsp_document_symbols", { buffer = bufnr }) + vim.keymap.set('n', 'df', function() + vim.lsp.buf.format { async = true } + end, opts) + end, }) From b2489ca8f0481c44bf7c3bbe5ad7a717a31d633b Mon Sep 17 00:00:00 2001 From: iofq Date: Fri, 26 May 2023 06:05:44 -0500 Subject: [PATCH 008/160] idek --- config/lua/lsp-conf.lua | 12 ++++++++++-- flake.nix | 4 +++- plugins.nix | 13 +++++-------- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/config/lua/lsp-conf.lua b/config/lua/lsp-conf.lua index d3661a0..e047466 100644 --- a/config/lua/lsp-conf.lua +++ b/config/lua/lsp-conf.lua @@ -1,6 +1,7 @@ -- Setup language servers. local lspconfig = require('lspconfig') lspconfig.gopls.setup {} +lspconfig.phpactor.setup {} -- Global mappings. -- See `:help vim.diagnostic.*` for documentation on any of the below functions @@ -8,6 +9,11 @@ vim.keymap.set('n', 'de', vim.diagnostic.open_float) vim.keymap.set('n', '[d', vim.diagnostic.goto_prev) vim.keymap.set('n', ']d', vim.diagnostic.goto_next) +vim.diagnostic.config({ + virtual_text = true, + underline = true, + update_in_insert = false, +}) -- Use LspAttach autocommand to only map the following keys -- after the language server attaches to the current buffer vim.api.nvim_create_autocmd('LspAttach', { @@ -26,10 +32,12 @@ vim.api.nvim_create_autocmd('LspAttach', { vim.keymap.set("n", "gd", "Telescope lsp_definitions", { buffer = bufnr }) vim.keymap.set("n", "gi", "Telescope lsp_implementations", { buffer = bufnr }) vim.keymap.set("n", "gr", "Telescope lsp_references", { buffer = bufnr }) - vim.keymap.set("n", "dt", "Telescope lsp_type_definitions", { buffer = bufnr }) - vim.keymap.set("n", "ds", "Telescope lsp_document_symbols", { buffer = bufnr }) + vim.keymap.set("n", "dt", "Telescope lsp_type_definitions", { buffer = bufnr }) + vim.keymap.set("n", "ds", "Telescope lsp_document_symbols", { buffer = bufnr }) + vim.keymap.set("n", "dS", "Telescope lsp_dynamic_workspace_symbols", { buffer = bufnr }) vim.keymap.set('n', 'df', function() vim.lsp.buf.format { async = true } end, opts) + end, }) diff --git a/flake.nix b/flake.nix index 6f9ae33..8aef94b 100644 --- a/flake.nix +++ b/flake.nix @@ -32,7 +32,6 @@ }; dependancies = with pkgs; [ ripgrep - lazygit ]; full-dependancies = with pkgs; [ gopls @@ -85,6 +84,9 @@ apps.full = flake-utils.lib.mkApp { drv = packages.full; name = "neovim"; exePath = "/bin/nvim"; }; + apps.minimal = flake-utils.lib.mkApp { + drv = packages.minimal; name = "neovim"; exePath = "/bin/nvim"; + }; apps.default = apps.full; packages.default = packages.full; }); diff --git a/plugins.nix b/plugins.nix index b22b056..5f4e66c 100644 --- a/plugins.nix +++ b/plugins.nix @@ -7,14 +7,7 @@ mini-nvim gitsigns-nvim oil-nvim - neogit rose-pine - ]; - extra = with pkgs.vimPlugins; [ - vim-nix - - #lsp - nvim-lspconfig #treesitter (nvim-treesitter.withPlugins @@ -29,7 +22,6 @@ tree-sitter-lua tree-sitter-markdown tree-sitter-markdown-inline - tree-sitter-nix tree-sitter-php tree-sitter-python tree-sitter-yaml @@ -38,4 +30,9 @@ ) nvim-treesitter-textobjects ]; + extra = with pkgs.vimPlugins; [ + vim-nix + #lsp + nvim-lspconfig + ]; } From b65b7296e56ed87cf83c2b57296892d172c5aedb Mon Sep 17 00:00:00 2001 From: iofq Date: Fri, 26 May 2023 15:06:21 -0500 Subject: [PATCH 009/160] update CI for dual config --- .github/workflows/main.yml | 23 ++++++++++++++++++++--- Dockerfile | 11 +++++++++-- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2efcc74..0469fb1 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -7,14 +7,14 @@ on: jobs: build: runs-on: ubuntu-latest - steps: - - name: Set up Docker Buildx + steps: + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - name: Login to ghcr.io uses: docker/login-action@v1 - with: + with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} @@ -31,6 +31,14 @@ jobs: with: image: ghcr.io/iofq/nvim:latest path: /app/neovim-x86_64-linux.AppImage + + - + name: Extract .tar.gz from container + uses: shrink/actions-docker-extract@v1 + id: extract-minimal + with: + image: ghcr.io/iofq/nvim:latest + path: /app/neovim-x86_64-linux-minimal.AppImage - name: Upload archive to release uses: xresloader/upload-to-github-release@v1 @@ -40,3 +48,12 @@ jobs: file: ${{ steps.extract.outputs.destination }} update_latest_release: true overwrite: true + - + name: Upload archive to release + uses: xresloader/upload-to-github-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + file: ${{ steps.extract-minimal.outputs.destination }} + update_latest_release: true + overwrite: true diff --git a/Dockerfile b/Dockerfile index 0d72a8c..04ff68f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,6 +6,13 @@ COPY . . RUN nix bundle \ --bundler github:ralismark/nix-appimage \ --extra-experimental-features nix-command \ - --extra-experimental-features flakes . && \ - cp -L nvim-x86_64.AppImage neovim-x86_64-linux.AppImage && \ + --extra-experimental-features flakes .#full && \ + mv $(realpath nvim-x86_64.AppImage) neovim-x86_64-linux.AppImage && \ + nix-collect-garbage + +RUN nix bundle \ + --bundler github:ralismark/nix-appimage \ + --extra-experimental-features nix-command \ + --extra-experimental-features flakes .#minimal && \ + mv $(realpath nvim-x86_64.AppImage) neovim-x86_64-linux-minimal.AppImage && \ nix-collect-garbage From f9ae40f53c649c1b3c62884547a516ba482d76e6 Mon Sep 17 00:00:00 2001 From: iofq Date: Sat, 27 May 2023 03:34:05 -0500 Subject: [PATCH 010/160] update CI --- .github/workflows/main.yml | 4 ++-- Dockerfile | 24 ++++++++++++------------ config/lua/git-conf.lua | 2 -- config/lua/lsp-conf.lua | 3 +-- plugins.nix | 3 +++ 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0469fb1..03da694 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -25,7 +25,7 @@ jobs: push: true tags: ghcr.io/iofq/nvim:latest - - name: Extract .tar.gz from container + name: Extract full .tar.gz from container uses: shrink/actions-docker-extract@v1 id: extract with: @@ -33,7 +33,7 @@ jobs: path: /app/neovim-x86_64-linux.AppImage - - name: Extract .tar.gz from container + name: Extract minimal .tar.gz from container uses: shrink/actions-docker-extract@v1 id: extract-minimal with: diff --git a/Dockerfile b/Dockerfile index 04ff68f..039223f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,15 +4,15 @@ WORKDIR /app COPY . . RUN nix bundle \ - --bundler github:ralismark/nix-appimage \ - --extra-experimental-features nix-command \ - --extra-experimental-features flakes .#full && \ - mv $(realpath nvim-x86_64.AppImage) neovim-x86_64-linux.AppImage && \ - nix-collect-garbage - -RUN nix bundle \ - --bundler github:ralismark/nix-appimage \ - --extra-experimental-features nix-command \ - --extra-experimental-features flakes .#minimal && \ - mv $(realpath nvim-x86_64.AppImage) neovim-x86_64-linux-minimal.AppImage && \ - nix-collect-garbage + -o nvim.AppImage \ + --bundler github:ralismark/nix-appimage \ + --extra-experimental-features nix-command \ + --extra-experimental-features flakes .#full && \ + mv $(realpath nvim.AppImage) neovim-x86_64-linux.AppImage && \ + nix bundle \ + -o nvim-minimal.AppImage \ + --bundler github:ralismark/nix-appimage \ + --extra-experimental-features nix-command \ + --extra-experimental-features flakes .#minimal && \ + mv $(realpath nvim-minimal.AppImage) neovim-x86_64-linux-minimal.AppImage && \ + nix-collect-garbage diff --git a/config/lua/git-conf.lua b/config/lua/git-conf.lua index f809a97..c8017dc 100644 --- a/config/lua/git-conf.lua +++ b/config/lua/git-conf.lua @@ -26,5 +26,3 @@ require('gitsigns').setup{ return '' end, {expr=true}) end } - -require("neogit").setup() diff --git a/config/lua/lsp-conf.lua b/config/lua/lsp-conf.lua index e047466..d645068 100644 --- a/config/lua/lsp-conf.lua +++ b/config/lua/lsp-conf.lua @@ -1,7 +1,6 @@ -- Setup language servers. local lspconfig = require('lspconfig') lspconfig.gopls.setup {} -lspconfig.phpactor.setup {} -- Global mappings. -- See `:help vim.diagnostic.*` for documentation on any of the below functions @@ -31,7 +30,7 @@ vim.api.nvim_create_autocmd('LspAttach', { vim.keymap.set({ 'n', 'v' }, 'ca', vim.lsp.buf.code_action, opts) vim.keymap.set("n", "gd", "Telescope lsp_definitions", { buffer = bufnr }) vim.keymap.set("n", "gi", "Telescope lsp_implementations", { buffer = bufnr }) - vim.keymap.set("n", "gr", "Telescope lsp_references", { buffer = bufnr }) + vim.keymap.set("n", "gR", "Telescope lsp_references", { buffer = bufnr }) vim.keymap.set("n", "dt", "Telescope lsp_type_definitions", { buffer = bufnr }) vim.keymap.set("n", "ds", "Telescope lsp_document_symbols", { buffer = bufnr }) vim.keymap.set("n", "dS", "Telescope lsp_dynamic_workspace_symbols", { buffer = bufnr }) diff --git a/plugins.nix b/plugins.nix index 5f4e66c..d238021 100644 --- a/plugins.nix +++ b/plugins.nix @@ -17,6 +17,7 @@ tree-sitter-c tree-sitter-dockerfile tree-sitter-go + tree-sitter-html tree-sitter-javascript tree-sitter-json tree-sitter-lua @@ -24,6 +25,8 @@ tree-sitter-markdown-inline tree-sitter-php tree-sitter-python + tree-sitter-svelte + tree-sitter-typescript tree-sitter-yaml ] ) From aad58f1d6b3fa104c8fc6ecc6240adf5985c32b9 Mon Sep 17 00:00:00 2001 From: iofq Date: Sat, 27 May 2023 03:59:31 -0500 Subject: [PATCH 011/160] update CI --- .github/workflows/main.yml | 24 ++++++++++-------------- .gitignore | 2 +- Dockerfile | 14 +++++++++----- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 03da694..fb087ac 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -11,36 +11,32 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - - - name: Login to ghcr.io + - name: Login to ghcr.io uses: docker/login-action@v1 with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - - - name: Build container and push to ghcr.io + - name: Build container and push to ghcr.io uses: docker/build-push-action@v2 with: push: true tags: ghcr.io/iofq/nvim:latest - - - name: Extract full .tar.gz from container + - name: Extract full .tar.gz from container uses: shrink/actions-docker-extract@v1 id: extract with: image: ghcr.io/iofq/nvim:latest - path: /app/neovim-x86_64-linux.AppImage + path: /out/neovim-x86_64-linux.AppImage - - - name: Extract minimal .tar.gz from container + - name: Extract minimal .tar.gz from container uses: shrink/actions-docker-extract@v1 id: extract-minimal with: image: ghcr.io/iofq/nvim:latest - path: /app/neovim-x86_64-linux-minimal.AppImage - - - name: Upload archive to release + path: /out/neovim-x86_64-linux-minimal.AppImage + + - name: Upload archive to release uses: xresloader/upload-to-github-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -48,8 +44,8 @@ jobs: file: ${{ steps.extract.outputs.destination }} update_latest_release: true overwrite: true - - - name: Upload archive to release + + - name: Upload archive to release uses: xresloader/upload-to-github-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index f7676fd..7d2c056 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ *.AppImage -squashfs_root +squashfs-root diff --git a/Dockerfile b/Dockerfile index 039223f..14379fd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,18 +1,22 @@ -FROM nixos/nix +FROM nixos/nix as build WORKDIR /app COPY . . -RUN nix bundle \ +RUN mkdir -p /out && \ + nix bundle \ -o nvim.AppImage \ --bundler github:ralismark/nix-appimage \ --extra-experimental-features nix-command \ --extra-experimental-features flakes .#full && \ - mv $(realpath nvim.AppImage) neovim-x86_64-linux.AppImage && \ + mv $(realpath nvim.AppImage) /out/neovim-x86_64-linux.AppImage && \ nix bundle \ -o nvim-minimal.AppImage \ --bundler github:ralismark/nix-appimage \ --extra-experimental-features nix-command \ --extra-experimental-features flakes .#minimal && \ - mv $(realpath nvim-minimal.AppImage) neovim-x86_64-linux-minimal.AppImage && \ - nix-collect-garbage + mv $(realpath nvim-minimal.AppImage) /out/neovim-x86_64-linux-minimal.AppImage + +FROM scratch +WORKDIR /out +COPY --from=build /out /out From f2eb47953bd7a0f70265e882573857c46a55d025 Mon Sep 17 00:00:00 2001 From: iofq Date: Sat, 27 May 2023 04:12:23 -0500 Subject: [PATCH 012/160] update CI --- .github/workflows/main.yml | 1 + Dockerfile | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index fb087ac..78d9a6e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -22,6 +22,7 @@ jobs: with: push: true tags: ghcr.io/iofq/nvim:latest + - name: Extract full .tar.gz from container uses: shrink/actions-docker-extract@v1 id: extract diff --git a/Dockerfile b/Dockerfile index 14379fd..d200138 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,5 @@ FROM nixos/nix as build -WORKDIR /app COPY . . RUN mkdir -p /out && \ @@ -19,4 +18,4 @@ RUN mkdir -p /out && \ FROM scratch WORKDIR /out -COPY --from=build /out /out +COPY --from=build /out/* /out/ From 2388fb9bda9f812c93ba5c86a24aaabecf254e31 Mon Sep 17 00:00:00 2001 From: iofq Date: Sat, 27 May 2023 05:14:15 -0500 Subject: [PATCH 013/160] update CI --- Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index d200138..14379fd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,6 @@ FROM nixos/nix as build +WORKDIR /app COPY . . RUN mkdir -p /out && \ @@ -18,4 +19,4 @@ RUN mkdir -p /out && \ FROM scratch WORKDIR /out -COPY --from=build /out/* /out/ +COPY --from=build /out /out From 387b1ef3be3ea23e81675154bd33452fedd8d784 Mon Sep 17 00:00:00 2001 From: iofq Date: Sat, 27 May 2023 05:39:30 -0500 Subject: [PATCH 014/160] update CI --- .github/workflows/main.yml | 6 ++---- Dockerfile | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 78d9a6e..ef05c7f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -23,15 +23,13 @@ jobs: push: true tags: ghcr.io/iofq/nvim:latest - - name: Extract full .tar.gz from container - uses: shrink/actions-docker-extract@v1 + - uses: shrink/actions-docker-extract@v1 id: extract with: image: ghcr.io/iofq/nvim:latest path: /out/neovim-x86_64-linux.AppImage - - name: Extract minimal .tar.gz from container - uses: shrink/actions-docker-extract@v1 + - uses: shrink/actions-docker-extract@v1 id: extract-minimal with: image: ghcr.io/iofq/nvim:latest diff --git a/Dockerfile b/Dockerfile index 14379fd..1cb3e60 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,6 +17,6 @@ RUN mkdir -p /out && \ --extra-experimental-features flakes .#minimal && \ mv $(realpath nvim-minimal.AppImage) /out/neovim-x86_64-linux-minimal.AppImage -FROM scratch +FROM busybox:alpine WORKDIR /out COPY --from=build /out /out From e260bac77b7b27453a2b04e3fc6c804a82718e31 Mon Sep 17 00:00:00 2001 From: iofq Date: Sat, 27 May 2023 05:47:26 -0500 Subject: [PATCH 015/160] update CI --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 1cb3e60..b75f29e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,6 +17,6 @@ RUN mkdir -p /out && \ --extra-experimental-features flakes .#minimal && \ mv $(realpath nvim-minimal.AppImage) /out/neovim-x86_64-linux-minimal.AppImage -FROM busybox:alpine +FROM busybox WORKDIR /out COPY --from=build /out /out From 8b0a7ef1a65131703930c87d27c700f95f13997f Mon Sep 17 00:00:00 2001 From: iofq Date: Sun, 6 Aug 2023 09:46:19 -0500 Subject: [PATCH 016/160] lsp changes, mini.ai --- config/lua/lsp-conf.lua | 6 +++-- config/lua/mini-conf.lua | 12 +++++++++ config/lua/nvim-treesitter-conf.lua | 18 +++++++++---- plugins.nix | 39 ++++++----------------------- 4 files changed, 37 insertions(+), 38 deletions(-) diff --git a/config/lua/lsp-conf.lua b/config/lua/lsp-conf.lua index d645068..13b5e57 100644 --- a/config/lua/lsp-conf.lua +++ b/config/lua/lsp-conf.lua @@ -1,6 +1,9 @@ -- Setup language servers. local lspconfig = require('lspconfig') -lspconfig.gopls.setup {} +lspconfig.gopls.setup { on_attach = function(_, bufnr) + vim.api.nvim_command("au BufWritePost lua vim.lsp.buf.format { async = true }") +end +} -- Global mappings. -- See `:help vim.diagnostic.*` for documentation on any of the below functions @@ -20,7 +23,6 @@ vim.api.nvim_create_autocmd('LspAttach', { callback = function(ev) -- Enable completion triggered by vim.bo[ev.buf].omnifunc = 'v:lua.vim.lsp.omnifunc' - -- Buffer local mappings. -- See `:help vim.lsp.*` for documentation on any of the below functions local opts = { buffer = ev.buf } diff --git a/config/lua/mini-conf.lua b/config/lua/mini-conf.lua index 5d476fa..d8bae90 100644 --- a/config/lua/mini-conf.lua +++ b/config/lua/mini-conf.lua @@ -1,3 +1,5 @@ +-- din( dina +require('mini.ai').setup() -- gc gcc require('mini.comment').setup() -- alt hjkl @@ -62,3 +64,13 @@ indent.setup({ draw = { delay = 0 } }) indent.gen_animation.none() + +-- +require('mini.completion').setup({ + delay = {completion = 10^7}, + window = { + info = { height = 25, width = 80, border = 'single' }, + signature = { height = 25, width = 80, border = 'single' }, + }, + fallback_action = "" +}) diff --git a/config/lua/nvim-treesitter-conf.lua b/config/lua/nvim-treesitter-conf.lua index 07e9132..559c7f5 100644 --- a/config/lua/nvim-treesitter-conf.lua +++ b/config/lua/nvim-treesitter-conf.lua @@ -13,7 +13,8 @@ require("nvim-treesitter.configs").setup { keymaps = { ["af"] = "@function.outer", ["if"] = "@function.inner", - ["aa"] = "@call.inner", + ["aa"] = "@statement.outer", + ["ia"] = "@parameter.inner", }, }, move = { @@ -21,19 +22,26 @@ require("nvim-treesitter.configs").setup { set_jumps = true, -- whether to set jumps in the jumplist goto_next_start = { [']]'] = '@function.outer', - [']m'] = '@class.outer', + [']a'] = '@parameter.inner', }, goto_previous_start = { ['[['] = '@function.outer', - ['[m'] = '@class.outer', + ['[a'] = '@parameter.inner', }, }, - }, + swap = { + enable = true, + swap_next = { + ["p]"] = "@parameter.inner", + }, + swap_previous = { + ["p["] = "@parameter.inner", + }, + }, }, incremental_selection = { enable = true, keymaps = { init_selection = '', - scope_incremental = '', node_incremental = '', node_decremental = '', }, diff --git a/plugins.nix b/plugins.nix index d238021..1549d06 100644 --- a/plugins.nix +++ b/plugins.nix @@ -8,34 +8,11 @@ gitsigns-nvim oil-nvim rose-pine - - #treesitter - (nvim-treesitter.withPlugins - ( - plugins: with plugins; [ - tree-sitter-bash - tree-sitter-c - tree-sitter-dockerfile - tree-sitter-go - tree-sitter-html - tree-sitter-javascript - tree-sitter-json - tree-sitter-lua - tree-sitter-markdown - tree-sitter-markdown-inline - tree-sitter-php - tree-sitter-python - tree-sitter-svelte - tree-sitter-typescript - tree-sitter-yaml - ] - ) - ) - nvim-treesitter-textobjects - ]; - extra = with pkgs.vimPlugins; [ - vim-nix - #lsp - nvim-lspconfig - ]; - } + nvim-lspconfig + nvim-treesitter.withAllGrammars + nvim-treesitter-textobjects + ]; + extra = with pkgs.vimPlugins; [ + vim-nix + ]; +} From dc80e6953dbad5ad78be591eb7536b1eeb404d79 Mon Sep 17 00:00:00 2001 From: iofq Date: Wed, 20 Sep 2023 21:07:28 -0500 Subject: [PATCH 017/160] fix gofmt --- config/lua/lsp-conf.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/lua/lsp-conf.lua b/config/lua/lsp-conf.lua index 13b5e57..70f0a93 100644 --- a/config/lua/lsp-conf.lua +++ b/config/lua/lsp-conf.lua @@ -1,7 +1,7 @@ -- Setup language servers. local lspconfig = require('lspconfig') lspconfig.gopls.setup { on_attach = function(_, bufnr) - vim.api.nvim_command("au BufWritePost lua vim.lsp.buf.format { async = true }") + vim.api.nvim_command("au BufWritePre lua vim.lsp.buf.format { async = false }") end } From b0024a47ee20602c7d8e86d93a854fb69571ff97 Mon Sep 17 00:00:00 2001 From: iofq Date: Thu, 21 Dec 2023 22:27:20 -0600 Subject: [PATCH 018/160] update to nvim 0.9.4 --- flake.lock | 12 ++++++------ flake.nix | 15 ++++++++------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/flake.lock b/flake.lock index b9d384b..042ccd9 100644 --- a/flake.lock +++ b/flake.lock @@ -5,11 +5,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1681202837, - "narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=", + "lastModified": 1701680307, + "narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=", "owner": "numtide", "repo": "flake-utils", - "rev": "cfacdce06f30d2b68473a46042957675eebb3401", + "rev": "4022d587cbbfd70fe950c1e2083a02621806a725", "type": "github" }, "original": { @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1683717387, - "narHash": "sha256-b4GSeKtDH+7wzw9VptHqIWOyIq28j7++rvRqhCEWFQ8=", + "lastModified": 1703134684, + "narHash": "sha256-SQmng1EnBFLzS7WSRyPM9HgmZP2kLJcPAz+Ug/nug6o=", "owner": "nixos", "repo": "nixpkgs", - "rev": "1e8ab5db89c84b1bb29d8d10ea60766bb5cee1f2", + "rev": "d6863cbcbbb80e71cecfc03356db1cda38919523", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 8aef94b..9db1d54 100644 --- a/flake.nix +++ b/flake.nix @@ -30,23 +30,24 @@ withRuby = false; withPython3 = false; }; - dependancies = with pkgs; [ + dependencies = with pkgs; [ ripgrep ]; - full-dependancies = with pkgs; [ + full-dependencies = with pkgs; [ gopls - ] ++ dependancies; + ] ++ dependencies; neovim-with-deps = recursiveMerge [ pkgs.neovim-unwrapped - { buildInputs = dependancies; } + { buildInputs = dependencies; } ]; neovim-with-full-deps = recursiveMerge [ pkgs.neovim-unwrapped - { buildInputs = full-dependancies; } + { buildInputs = full-dependencies; } ]; in rec { packages.full = pkgs.wrapNeovim neovim-with-full-deps (base // { - extraMakeWrapperArgs = ''--prefix PATH : "${pkgs.lib.makeBinPath full-dependancies}"''; + withPython3 = true; + extraMakeWrapperArgs = ''--prefix PATH : "${pkgs.lib.makeBinPath full-dependencies}"''; configure = { customRC = '' @@ -64,7 +65,7 @@ }; }); packages.minimal = pkgs.wrapNeovim neovim-with-deps (base // { - extraMakeWrapperArgs = ''--prefix PATH : "${pkgs.lib.makeBinPath dependancies}"''; + extraMakeWrapperArgs = ''--prefix PATH : "${pkgs.lib.makeBinPath dependencies}"''; configure = { customRC = '' From 0c397bd3c752daa6b5e5c27c029723a5ca00ffde Mon Sep 17 00:00:00 2001 From: iofq Date: Fri, 22 Dec 2023 01:44:20 -0600 Subject: [PATCH 019/160] add py, nix lsps --- config/lua/lsp-conf.lua | 10 ++++++---- flake.nix | 2 ++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/config/lua/lsp-conf.lua b/config/lua/lsp-conf.lua index 70f0a93..407aa14 100644 --- a/config/lua/lsp-conf.lua +++ b/config/lua/lsp-conf.lua @@ -4,6 +4,8 @@ lspconfig.gopls.setup { on_attach = function(_, bufnr) vim.api.nvim_command("au BufWritePre lua vim.lsp.buf.format { async = false }") end } +lspconfig.pyright.setup {} +lspconfig.nil_ls.setup {} -- Global mappings. -- See `:help vim.diagnostic.*` for documentation on any of the below functions @@ -27,12 +29,12 @@ vim.api.nvim_create_autocmd('LspAttach', { -- See `:help vim.lsp.*` for documentation on any of the below functions local opts = { buffer = ev.buf } vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts) - vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, opts) + vim.keymap.set('n', 'dD', vim.lsp.buf.declaration, opts) vim.keymap.set('n', 'rn', vim.lsp.buf.rename, opts) vim.keymap.set({ 'n', 'v' }, 'ca', vim.lsp.buf.code_action, opts) - vim.keymap.set("n", "gd", "Telescope lsp_definitions", { buffer = bufnr }) - vim.keymap.set("n", "gi", "Telescope lsp_implementations", { buffer = bufnr }) - vim.keymap.set("n", "gR", "Telescope lsp_references", { buffer = bufnr }) + vim.keymap.set("n", "dd", "Telescope lsp_definitions", { buffer = bufnr }) + vim.keymap.set("n", "di", "Telescope lsp_implementations", { buffer = bufnr }) + vim.keymap.set("n", "dr", "Telescope lsp_references", { buffer = bufnr }) vim.keymap.set("n", "dt", "Telescope lsp_type_definitions", { buffer = bufnr }) vim.keymap.set("n", "ds", "Telescope lsp_document_symbols", { buffer = bufnr }) vim.keymap.set("n", "dS", "Telescope lsp_dynamic_workspace_symbols", { buffer = bufnr }) diff --git a/flake.nix b/flake.nix index 9db1d54..d067005 100644 --- a/flake.nix +++ b/flake.nix @@ -35,6 +35,8 @@ ]; full-dependencies = with pkgs; [ gopls + pyright + nil ] ++ dependencies; neovim-with-deps = recursiveMerge [ pkgs.neovim-unwrapped From a503ddc9c4871de96d52bd83f335a7d360d1a915 Mon Sep 17 00:00:00 2001 From: iofq Date: Fri, 22 Dec 2023 01:44:20 -0600 Subject: [PATCH 020/160] add py, nix lsps --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 042ccd9..c3d8025 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1703134684, - "narHash": "sha256-SQmng1EnBFLzS7WSRyPM9HgmZP2kLJcPAz+Ug/nug6o=", + "lastModified": 1703499205, + "narHash": "sha256-lF9rK5mSUfIZJgZxC3ge40tp1gmyyOXZ+lRY3P8bfbg=", "owner": "nixos", "repo": "nixpkgs", - "rev": "d6863cbcbbb80e71cecfc03356db1cda38919523", + "rev": "e1fa12d4f6c6fe19ccb59cac54b5b3f25e160870", "type": "github" }, "original": { From a81697463d226c755b80fdca0c2da294fb38190a Mon Sep 17 00:00:00 2001 From: iofq Date: Sat, 20 Jan 2024 03:06:59 -0600 Subject: [PATCH 021/160] Jan 24 updates --- config/init.lua | 3 +++ config/lua/git-conf.lua | 6 +++++- config/lua/lsp-conf.lua | 5 +---- config/lua/mini-conf.lua | 21 +++++++++++++++++---- config/lua/nvim-treesitter-conf.lua | 4 ++-- config/lua/telescope-conf.lua | 8 +++----- config/lua/toggleterm-conf.lua | 3 ++- config/minimal-init.lua | 3 --- flake.lock | 12 ++++++------ flake.nix | 29 +++++++++++------------------ plugins.nix | 7 +++---- 11 files changed, 53 insertions(+), 48 deletions(-) diff --git a/config/init.lua b/config/init.lua index cad3a73..8414969 100644 --- a/config/init.lua +++ b/config/init.lua @@ -1,3 +1,6 @@ require("minimal-init") require("nvim-treesitter-conf") require("lsp-conf") +require("colors") +require("git-conf") +require("oil-conf") diff --git a/config/lua/git-conf.lua b/config/lua/git-conf.lua index c8017dc..e11b066 100644 --- a/config/lua/git-conf.lua +++ b/config/lua/git-conf.lua @@ -6,10 +6,13 @@ require('gitsigns').setup{ vim.keymap.set("n", "gg", gs.preview_hunk) vim.keymap.set('n', 'gs', gs.stage_hunk) vim.keymap.set('n', 'gr', gs.reset_hunk) + vim.keymap.set('v', 'gs', function() gs.stage_hunk {vim.fn.line('.'), vim.fn.line('v')} end) + vim.keymap.set('v', 'gr', function() gs.reset_hunk {vim.fn.line('.'), vim.fn.line('v')} end) vim.keymap.set('n', 'gu', gs.undo_stage_hunk) vim.keymap.set('n', 'gS', gs.stage_buffer) vim.keymap.set('n', 'gR', gs.reset_buffer) vim.keymap.set('n', 'gb', function() gs.blame_line{full=true} end) + vim.keymap.set('n', 'gb', gs.toggle_current_line_blame) vim.keymap.set('n', 'gd', gs.diffthis) vim.keymap.set('n', 'gD', function() gs.diffthis('~') end) vim.keymap.set('n', 'gt', gs.toggle_deleted) @@ -24,5 +27,6 @@ require('gitsigns').setup{ if vim.wo.diff then return '[c' end vim.schedule(function() gs.prev_hunk() end) return '' - end, {expr=true}) end + end, {expr=true}) + end } diff --git a/config/lua/lsp-conf.lua b/config/lua/lsp-conf.lua index 407aa14..5880906 100644 --- a/config/lua/lsp-conf.lua +++ b/config/lua/lsp-conf.lua @@ -29,18 +29,15 @@ vim.api.nvim_create_autocmd('LspAttach', { -- See `:help vim.lsp.*` for documentation on any of the below functions local opts = { buffer = ev.buf } vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts) - vim.keymap.set('n', 'dD', vim.lsp.buf.declaration, opts) vim.keymap.set('n', 'rn', vim.lsp.buf.rename, opts) - vim.keymap.set({ 'n', 'v' }, 'ca', vim.lsp.buf.code_action, opts) + vim.keymap.set({ 'n', 'v' }, 'ac', vim.lsp.buf.code_action, opts) vim.keymap.set("n", "dd", "Telescope lsp_definitions", { buffer = bufnr }) vim.keymap.set("n", "di", "Telescope lsp_implementations", { buffer = bufnr }) vim.keymap.set("n", "dr", "Telescope lsp_references", { buffer = bufnr }) vim.keymap.set("n", "dt", "Telescope lsp_type_definitions", { buffer = bufnr }) vim.keymap.set("n", "ds", "Telescope lsp_document_symbols", { buffer = bufnr }) - vim.keymap.set("n", "dS", "Telescope lsp_dynamic_workspace_symbols", { buffer = bufnr }) vim.keymap.set('n', 'df', function() vim.lsp.buf.format { async = true } end, opts) - end, }) diff --git a/config/lua/mini-conf.lua b/config/lua/mini-conf.lua index d8bae90..e98605e 100644 --- a/config/lua/mini-conf.lua +++ b/config/lua/mini-conf.lua @@ -2,10 +2,8 @@ require('mini.ai').setup() -- gc gcc require('mini.comment').setup() --- alt hjkl -require('mini.move').setup() --- Add surrounding with sa +-- Add surrounding with sa -- Delete surrounding with sd. -- Replace surrounding with sr. -- Find surrounding with sf or sF (move cursor right or left). @@ -49,7 +47,18 @@ require('mini.splitjoin').setup({ } }) -require('mini.pairs').setup() +require('mini.pairs').setup( +{ + modes = { insert = true, command = false, terminal = false }, + mappings = { + ['['] = { action = 'open', pair = '[]', neigh_pattern = '[^\\].' }, + ['{'] = { action = 'open', pair = '{}', neigh_pattern = '[^\\].' }, + + [']'] = { action = 'close', pair = '[]', neigh_pattern = '[^\\].' }, + ['}'] = { action = 'close', pair = '{}', neigh_pattern = '[^\\].' }, + }, +} +) vim.cmd([[ hi MiniCursorwordCurrent ctermfg=240 ]]) -- f F t T @@ -72,5 +81,9 @@ require('mini.completion').setup({ info = { height = 25, width = 80, border = 'single' }, signature = { height = 25, width = 80, border = 'single' }, }, + lsp_completion = { + source_func = 'completefunc', + auto_setup = true, + }, fallback_action = "" }) diff --git a/config/lua/nvim-treesitter-conf.lua b/config/lua/nvim-treesitter-conf.lua index 559c7f5..ad245c7 100644 --- a/config/lua/nvim-treesitter-conf.lua +++ b/config/lua/nvim-treesitter-conf.lua @@ -32,10 +32,10 @@ require("nvim-treesitter.configs").setup { swap = { enable = true, swap_next = { - ["p]"] = "@parameter.inner", + ["A]"] = "@parameter.inner", }, swap_previous = { - ["p["] = "@parameter.inner", + ["A["] = "@parameter.inner", }, }, }, incremental_selection = { diff --git a/config/lua/telescope-conf.lua b/config/lua/telescope-conf.lua index 08d2b13..b733c37 100644 --- a/config/lua/telescope-conf.lua +++ b/config/lua/telescope-conf.lua @@ -3,12 +3,10 @@ vim.keymap.set("n", "fb", telescope.buffers, {noremap = true, silent = t vim.keymap.set("n", "ff", telescope.find_files, {noremap = true, silent = true}) vim.keymap.set("n", "fg", telescope.git_files, {noremap = true, silent = true}) vim.keymap.set("n", "fv", telescope.command_history, {noremap = true, silent = true}) -vim.keymap.set("n", "", telescope.live_grep, {noremap = true, silent = true}) -vim.keymap.set("n", "8", telescope.grep_string, {noremap = true, silent = true}) -vim.keymap.set("n", "", telescope.resume, {noremap = true, silent = true}) +vim.keymap.set("n", "fa", telescope.live_grep, {noremap = true, silent = true}) +vim.keymap.set("n", "f8", telescope.grep_string, {noremap = true, silent = true}) +vim.keymap.set("n", "f", telescope.resume, {noremap = true, silent = true}) vim.keymap.set("n", "fs", telescope.git_status, {noremap = true, silent = true}) -vim.keymap.set("n", "fd", telescope.lsp_definitions, {noremap = true, silent = true}) -vim.keymap.set("n", "fr", telescope.lsp_references, {noremap = true, silent = true}) local telescope = require("telescope") telescope.setup({ diff --git a/config/lua/toggleterm-conf.lua b/config/lua/toggleterm-conf.lua index 49ac716..0b22131 100644 --- a/config/lua/toggleterm-conf.lua +++ b/config/lua/toggleterm-conf.lua @@ -1,4 +1,5 @@ require("toggleterm").setup{ open_mapping = [[]], - size = vim.o.lines * 0.4 + direction = "float", + close_on_exit = true, } diff --git a/config/minimal-init.lua b/config/minimal-init.lua index c15c163..5a828bf 100644 --- a/config/minimal-init.lua +++ b/config/minimal-init.lua @@ -1,8 +1,5 @@ -require("colors") require("mini-conf") require("toggleterm-conf") require("telescope-conf") -require("git-conf") -require("oil-conf") -- include our config last to override require("nvim-conf") diff --git a/flake.lock b/flake.lock index c3d8025..87c6826 100644 --- a/flake.lock +++ b/flake.lock @@ -5,11 +5,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1701680307, - "narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=", + "lastModified": 1705309234, + "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", "owner": "numtide", "repo": "flake-utils", - "rev": "4022d587cbbfd70fe950c1e2083a02621806a725", + "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", "type": "github" }, "original": { @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1703499205, - "narHash": "sha256-lF9rK5mSUfIZJgZxC3ge40tp1gmyyOXZ+lRY3P8bfbg=", + "lastModified": 1705666311, + "narHash": "sha256-VYdSQm7zq3AStyHhRr3SBCTA8fVzrl6WtIlXTs2Wlts=", "owner": "nixos", "repo": "nixpkgs", - "rev": "e1fa12d4f6c6fe19ccb59cac54b5b3f25e160870", + "rev": "a455c5fb3ee513e2f443838a0e84d52b035adb67", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index d067005..2300728 100644 --- a/flake.nix +++ b/flake.nix @@ -46,22 +46,21 @@ pkgs.neovim-unwrapped { buildInputs = full-dependencies; } ]; + baseRC = '' + lua << EOF + package.path = "${self}/config/?.lua;" .. "${self}/config/lua/?.lua;" .. package.path + vim.o.runtimepath = "${self}/config," .. vim.o.runtimepath + ''; in rec { packages.full = pkgs.wrapNeovim neovim-with-full-deps (base // { withPython3 = true; extraMakeWrapperArgs = ''--prefix PATH : "${pkgs.lib.makeBinPath full-dependencies}"''; configure = { customRC = - '' - lua << EOF - package.path = "${self}/config/?.lua;" .. "${self}/config/lua/?.lua;" .. package.path - vim.o.runtimepath = "${self}/config," .. vim.o.runtimepath - '' + baseRC + pkgs.lib.readFile ./config/init.lua - + '' - EOF - ''; - packages.plugins = with pkgs.vimPlugins; { + + ''EOF''; + packages.plugins = { start = plugins.base ++ plugins.extra; }; }; @@ -70,16 +69,10 @@ extraMakeWrapperArgs = ''--prefix PATH : "${pkgs.lib.makeBinPath dependencies}"''; configure = { customRC = - '' - lua << EOF - package.path = "${self}/config/?.lua;" .. "${self}/config/lua/?.lua;" .. package.path - vim.o.runtimepath = "${self}/config," .. vim.o.runtimepath - '' + baseRC + pkgs.lib.readFile ./config/minimal-init.lua - + '' - EOF - ''; - packages.plugins = with pkgs.vimPlugins; { + + ''EOF''; + packages.plugins = { start = plugins.base; }; }; diff --git a/plugins.nix b/plugins.nix index 1549d06..055b19b 100644 --- a/plugins.nix +++ b/plugins.nix @@ -5,14 +5,13 @@ telescope-fzf-native-nvim toggleterm-nvim mini-nvim + ]; + extra = with pkgs.vimPlugins; [ + rose-pine gitsigns-nvim oil-nvim - rose-pine nvim-lspconfig nvim-treesitter.withAllGrammars nvim-treesitter-textobjects ]; - extra = with pkgs.vimPlugins; [ - vim-nix - ]; } From 34c4d4d7eb3d2509893886227a7d4e7e079f47cd Mon Sep 17 00:00:00 2001 From: iofq Date: Sat, 27 Jan 2024 13:38:47 -0600 Subject: [PATCH 022/160] fix append delay --- config/lua/nvim-treesitter-conf.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/lua/nvim-treesitter-conf.lua b/config/lua/nvim-treesitter-conf.lua index ad245c7..a6abaec 100644 --- a/config/lua/nvim-treesitter-conf.lua +++ b/config/lua/nvim-treesitter-conf.lua @@ -32,10 +32,10 @@ require("nvim-treesitter.configs").setup { swap = { enable = true, swap_next = { - ["A]"] = "@parameter.inner", + ["P]"] = "@parameter.inner", }, swap_previous = { - ["A["] = "@parameter.inner", + ["P["] = "@parameter.inner", }, }, }, incremental_selection = { From 8bd50ae3b2f028dccdd586bbedaa96361b301cca Mon Sep 17 00:00:00 2001 From: iofq Date: Sat, 27 Jan 2024 13:56:44 -0600 Subject: [PATCH 023/160] Fix paste delay --- config/lua/nvim-treesitter-conf.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/lua/nvim-treesitter-conf.lua b/config/lua/nvim-treesitter-conf.lua index a6abaec..e28c124 100644 --- a/config/lua/nvim-treesitter-conf.lua +++ b/config/lua/nvim-treesitter-conf.lua @@ -32,10 +32,10 @@ require("nvim-treesitter.configs").setup { swap = { enable = true, swap_next = { - ["P]"] = "@parameter.inner", + ["s]"] = "@parameter.inner", }, swap_previous = { - ["P["] = "@parameter.inner", + ["s["] = "@parameter.inner", }, }, }, incremental_selection = { From 1d10de72aa4c26b9963357ba57b55881e4cf88e6 Mon Sep 17 00:00:00 2001 From: iofq Date: Sat, 27 Jan 2024 15:40:50 -0600 Subject: [PATCH 024/160] add vim-nix --- plugins.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins.nix b/plugins.nix index 055b19b..ae9b05f 100644 --- a/plugins.nix +++ b/plugins.nix @@ -13,5 +13,6 @@ nvim-lspconfig nvim-treesitter.withAllGrammars nvim-treesitter-textobjects + vim-nix ]; } From fecb8220bd12f1035151c4c6f9d3906a0d9546d0 Mon Sep 17 00:00:00 2001 From: iofq Date: Sun, 28 Jan 2024 18:45:55 -0600 Subject: [PATCH 025/160] test new workflow --- .github/workflows/main.yml | 63 +++++++++++++------------------------- 1 file changed, 22 insertions(+), 41 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ef05c7f..564d344 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -8,47 +8,28 @@ jobs: build: runs-on: ubuntu-latest steps: - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 + - uses: actions/checkout@v3 + - uses: DeterminateSystems/nix-installer-action@main + - uses: DeterminateSystems/magic-nix-cache-action@main + - name: Run `nix bundle` + id: build + run: | + mkdir -p /out && cd /out + nix bundle \ + -o nvim.AppImage \ + --bundler github:ralismark/nix-appimage \ + --extra-experimental-features nix-command \ + --extra-experimental-features flakes .#full + nix bundle \ + -o nvim-minimal.AppImage \ + --bundler github:ralismark/nix-appimage \ + --extra-experimental-features nix-command \ + --extra-experimental-features flakes .#minimal + gzip *.AppImage - - name: Login to ghcr.io - uses: docker/login-action@v1 + - name: Upload bundle to release + uses: svenstaro/upload-release-action@v2 with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.GITHUB_TOKEN }} - - name: Build container and push to ghcr.io - uses: docker/build-push-action@v2 - with: - push: true - tags: ghcr.io/iofq/nvim:latest - - - uses: shrink/actions-docker-extract@v1 - id: extract - with: - image: ghcr.io/iofq/nvim:latest - path: /out/neovim-x86_64-linux.AppImage - - - uses: shrink/actions-docker-extract@v1 - id: extract-minimal - with: - image: ghcr.io/iofq/nvim:latest - path: /out/neovim-x86_64-linux-minimal.AppImage - - - name: Upload archive to release - uses: xresloader/upload-to-github-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - file: ${{ steps.extract.outputs.destination }} - update_latest_release: true - overwrite: true - - - name: Upload archive to release - uses: xresloader/upload-to-github-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - file: ${{ steps.extract-minimal.outputs.destination }} - update_latest_release: true + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: /out/*.AppImage.gz overwrite: true From f5731f1a5285dc0a8cc244260b4a3c9d2e1379f2 Mon Sep 17 00:00:00 2001 From: iofq Date: Sun, 28 Jan 2024 18:47:06 -0600 Subject: [PATCH 026/160] test new workflow --- .github/workflows/main.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 564d344..531b3aa 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -14,7 +14,6 @@ jobs: - name: Run `nix bundle` id: build run: | - mkdir -p /out && cd /out nix bundle \ -o nvim.AppImage \ --bundler github:ralismark/nix-appimage \ @@ -31,5 +30,5 @@ jobs: uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} - file: /out/*.AppImage.gz + file: *.AppImage.gz overwrite: true From 2ae53ff3bdbc383a41472b3c0bb2447844a625fe Mon Sep 17 00:00:00 2001 From: iofq Date: Sun, 28 Jan 2024 18:50:58 -0600 Subject: [PATCH 027/160] test new workflow --- .github/workflows/main.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 531b3aa..b424cea 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -24,11 +24,10 @@ jobs: --bundler github:ralismark/nix-appimage \ --extra-experimental-features nix-command \ --extra-experimental-features flakes .#minimal - gzip *.AppImage - name: Upload bundle to release uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} - file: *.AppImage.gz + file: *.AppImage overwrite: true From 379ff5fd9a6d550077c5bb03e469820e826d1a6c Mon Sep 17 00:00:00 2001 From: iofq Date: Sun, 28 Jan 2024 18:51:44 -0600 Subject: [PATCH 028/160] test new workflow --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b424cea..7dd245c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -29,5 +29,5 @@ jobs: uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} - file: *.AppImage + file: /*.AppImage overwrite: true From f3c760e01f7d18547e6c6eed6079d392e84f3dee Mon Sep 17 00:00:00 2001 From: iofq Date: Sun, 28 Jan 2024 19:04:00 -0600 Subject: [PATCH 029/160] test new workflow --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 7dd245c..658fc91 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -29,5 +29,5 @@ jobs: uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} - file: /*.AppImage + file: ./*.AppImage overwrite: true From 7a85a7aff4fa7d98d6b6042e001eef46bc501018 Mon Sep 17 00:00:00 2001 From: iofq Date: Sun, 28 Jan 2024 19:10:17 -0600 Subject: [PATCH 030/160] test workflow --- .github/workflows/inputs.yml | 26 ++++++++++++++++++++++++++ .github/workflows/main.yml | 2 +- 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/inputs.yml diff --git a/.github/workflows/inputs.yml b/.github/workflows/inputs.yml new file mode 100644 index 0000000..f4a5052 --- /dev/null +++ b/.github/workflows/inputs.yml @@ -0,0 +1,26 @@ +name: "Update Nix Flake Inputs" +on: + workflow_dispatch: + schedule: + - cron: "0 10 1,14 * *" +jobs: + update: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v3 + - name: Install Nix + uses: cachix/install-nix-action@v20 + - name: Update flake inputs + id: update + uses: DeterminateSystems/update-flake-lock@v19 + with: + pr-title: "chore: update flake.lock" + commit-msg: "chore: update flake.lock" + pr-reviewers: iofq + pr-labels: | + dependencies + automated + auto-merge + - name: Print PR number + run: echo Pull request number is ${{ steps.update.outputs.pull-request-number }}. diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 658fc91..2c4e9d8 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -29,5 +29,5 @@ jobs: uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} - file: ./*.AppImage + file: "./*.AppImage" overwrite: true From d28f5708de87af1aa3d143883283578f007e2cbb Mon Sep 17 00:00:00 2001 From: iofq Date: Sun, 28 Jan 2024 19:18:16 -0600 Subject: [PATCH 031/160] test workflow --- .github/workflows/main.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2c4e9d8..483da13 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,6 +1,8 @@ name: build on: + pull_request: + types: opened push: branches: - master @@ -24,6 +26,7 @@ jobs: --bundler github:ralismark/nix-appimage \ --extra-experimental-features nix-command \ --extra-experimental-features flakes .#minimal + ls -lahrt && pwd - name: Upload bundle to release uses: svenstaro/upload-release-action@v2 From 72f3adeca11250df4d4122d2243d63126425083f Mon Sep 17 00:00:00 2001 From: iofq Date: Sun, 28 Jan 2024 19:26:59 -0600 Subject: [PATCH 032/160] test workflow --- .github/workflows/main.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 483da13..45185b8 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -9,6 +9,11 @@ on: jobs: build: runs-on: ubuntu-latest + strategy: + matrix: + include: + - package_name: full + - package_name: minimal steps: - uses: actions/checkout@v3 - uses: DeterminateSystems/nix-installer-action@main @@ -17,20 +22,15 @@ jobs: id: build run: | nix bundle \ - -o nvim.AppImage \ + -o nvim-${{ matrix.package_name }}.AppImage \ --bundler github:ralismark/nix-appimage \ --extra-experimental-features nix-command \ - --extra-experimental-features flakes .#full - nix bundle \ - -o nvim-minimal.AppImage \ - --bundler github:ralismark/nix-appimage \ - --extra-experimental-features nix-command \ - --extra-experimental-features flakes .#minimal - ls -lahrt && pwd - + --extra-experimental-features flakes .#${{ matrix.package_name }} - name: Upload bundle to release + if: github.ref == 'master' && ${{ success() }} uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} - file: "./*.AppImage" + file: "nvim-${{ matrix.package_name }}.AppImage" + tag: latest overwrite: true From 82f941926b25ae32d35170947fe99029fc6502f9 Mon Sep 17 00:00:00 2001 From: iofq Date: Sun, 28 Jan 2024 19:31:13 -0600 Subject: [PATCH 033/160] test workflow --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 45185b8..587c967 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -31,6 +31,6 @@ jobs: uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} - file: "nvim-${{ matrix.package_name }}.AppImage" + file: "nvim-x86_64-linux-${{ matrix.package_name }}.AppImage" tag: latest overwrite: true From 4aa9b5271fbdd7f17a063a1ca5adae46d7f35f51 Mon Sep 17 00:00:00 2001 From: iofq Date: Sun, 28 Jan 2024 19:42:06 -0600 Subject: [PATCH 034/160] test workflow --- .github/workflows/main.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 587c967..38d6597 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -2,7 +2,8 @@ name: build on: pull_request: - types: opened + branches: [master] + types: [opened] push: branches: - master From d876f0871a6502b34e7df7caf5f667e6e66612e8 Mon Sep 17 00:00:00 2001 From: iofq Date: Sun, 28 Jan 2024 19:51:54 -0600 Subject: [PATCH 035/160] test workflow --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 38d6597..eb49779 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -28,7 +28,7 @@ jobs: --extra-experimental-features nix-command \ --extra-experimental-features flakes .#${{ matrix.package_name }} - name: Upload bundle to release - if: github.ref == 'master' && ${{ success() }} + if: github.ref == 'master' && steps.build.outcome == 'success' uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} From b9c7dd064778e5af7b319e1c5f4047eacfd65e9f Mon Sep 17 00:00:00 2001 From: iofq Date: Sun, 28 Jan 2024 19:54:40 -0600 Subject: [PATCH 036/160] test workflow --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index eb49779..ccbfcf5 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -28,7 +28,7 @@ jobs: --extra-experimental-features nix-command \ --extra-experimental-features flakes .#${{ matrix.package_name }} - name: Upload bundle to release - if: github.ref == 'master' && steps.build.outcome == 'success' + if: github.ref == 'master' uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} From f7d54806873f9ed47802895d767388f1fa9f7498 Mon Sep 17 00:00:00 2001 From: iofq Date: Sun, 28 Jan 2024 19:56:55 -0600 Subject: [PATCH 037/160] test workflow --- .github/workflows/main.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ccbfcf5..6feae3a 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -27,6 +27,8 @@ jobs: --bundler github:ralismark/nix-appimage \ --extra-experimental-features nix-command \ --extra-experimental-features flakes .#${{ matrix.package_name }} + echo "Done building AppImage for nvim-${{ matrix.package_name }}" + echo ${{ github.ref }} - name: Upload bundle to release if: github.ref == 'master' uses: svenstaro/upload-release-action@v2 From f81b86ba900006186878f9e760f7aea137da6aca Mon Sep 17 00:00:00 2001 From: iofq Date: Sun, 28 Jan 2024 19:59:58 -0600 Subject: [PATCH 038/160] test workflow --- .github/workflows/main.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 6feae3a..929ba64 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -28,9 +28,8 @@ jobs: --extra-experimental-features nix-command \ --extra-experimental-features flakes .#${{ matrix.package_name }} echo "Done building AppImage for nvim-${{ matrix.package_name }}" - echo ${{ github.ref }} - name: Upload bundle to release - if: github.ref == 'master' + if: github.ref == 'refs/heads/master' uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} From 36af04e4ee49d77f626053fc915a692a3418716e Mon Sep 17 00:00:00 2001 From: iofq Date: Sun, 28 Jan 2024 20:01:43 -0600 Subject: [PATCH 039/160] test workflow --- .github/workflows/main.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 929ba64..75c7610 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -33,6 +33,7 @@ jobs: uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} - file: "nvim-x86_64-linux-${{ matrix.package_name }}.AppImage" + file: "nvim-${{ matrix.package_name }}.AppImage" + asset_name: "nvim-x86_64-linux-${{ matrix.package_name }}.AppImage" tag: latest overwrite: true From a25de2a52f08227e82aa46c80aa13d0610331579 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 29 Jan 2024 02:14:40 +0000 Subject: [PATCH 040/160] 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 'nixpkgs': 'github:nixos/nixpkgs/a455c5fb3ee513e2f443838a0e84d52b035adb67' (2024-01-19) → 'github:nixos/nixpkgs/160b762eda6d139ac10ae081f8f78d640dd523eb' (2024-01-27) --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 87c6826..b69d2c3 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1705666311, - "narHash": "sha256-VYdSQm7zq3AStyHhRr3SBCTA8fVzrl6WtIlXTs2Wlts=", + "lastModified": 1706367331, + "narHash": "sha256-AqgkGHRrI6h/8FWuVbnkfFmXr4Bqsr4fV23aISqj/xg=", "owner": "nixos", "repo": "nixpkgs", - "rev": "a455c5fb3ee513e2f443838a0e84d52b035adb67", + "rev": "160b762eda6d139ac10ae081f8f78d640dd523eb", "type": "github" }, "original": { From eccc73bdfa5f4d4617357a0f3be6e9f7e2492d58 Mon Sep 17 00:00:00 2001 From: iofq Date: Sun, 28 Jan 2024 20:36:53 -0600 Subject: [PATCH 041/160] Remove Dockerfile, add README --- Dockerfile | 22 ---------------------- README.md | 16 ++++++++++++++++ 2 files changed, 16 insertions(+), 22 deletions(-) delete mode 100644 Dockerfile create mode 100644 README.md diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index b75f29e..0000000 --- a/Dockerfile +++ /dev/null @@ -1,22 +0,0 @@ -FROM nixos/nix as build - -WORKDIR /app -COPY . . - -RUN mkdir -p /out && \ - nix bundle \ - -o nvim.AppImage \ - --bundler github:ralismark/nix-appimage \ - --extra-experimental-features nix-command \ - --extra-experimental-features flakes .#full && \ - mv $(realpath nvim.AppImage) /out/neovim-x86_64-linux.AppImage && \ - nix bundle \ - -o nvim-minimal.AppImage \ - --bundler github:ralismark/nix-appimage \ - --extra-experimental-features nix-command \ - --extra-experimental-features flakes .#minimal && \ - mv $(realpath nvim-minimal.AppImage) /out/neovim-x86_64-linux-minimal.AppImage - -FROM busybox -WORKDIR /out -COPY --from=build /out /out diff --git a/README.md b/README.md new file mode 100644 index 0000000..63c4ce8 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +## nvim.nix - personal Neovim config that runs on nixOS but doesn't sacrifice portability + +## Usage +```bash +nix run "github:iofq/nvim.nix" #full +``` + +Or, grab an AppImage from the Releases page. + +## What the hell? + +This is a flake to build a Neovim package that includes my custom Lua config and dependencies. It then is bundled via CI into an AppImage. + +## Why the hell though? + +I use these AppImages because I develop in a number of airgapped environments that make traditional dotfile management a nightmare. Downloading a single AppImage and copying it around is a more suckless way of managing this. From 140ffead01c6ec6fd80f9dd1a4b787587ca77d94 Mon Sep 17 00:00:00 2001 From: iofq Date: Mon, 29 Jan 2024 07:01:14 +0000 Subject: [PATCH 042/160] Revert "chore: update flake.lock" --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index b69d2c3..87c6826 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1706367331, - "narHash": "sha256-AqgkGHRrI6h/8FWuVbnkfFmXr4Bqsr4fV23aISqj/xg=", + "lastModified": 1705666311, + "narHash": "sha256-VYdSQm7zq3AStyHhRr3SBCTA8fVzrl6WtIlXTs2Wlts=", "owner": "nixos", "repo": "nixpkgs", - "rev": "160b762eda6d139ac10ae081f8f78d640dd523eb", + "rev": "a455c5fb3ee513e2f443838a0e84d52b035adb67", "type": "github" }, "original": { From 22c8209f113c2d364fbaaeb5deeda630434c1cef Mon Sep 17 00:00:00 2001 From: iofq Date: Mon, 29 Jan 2024 01:17:53 -0600 Subject: [PATCH 043/160] fix rose-pine italics --- .gitignore | 1 + flake.lock | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 7d2c056..e4f792f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.AppImage squashfs-root +result diff --git a/flake.lock b/flake.lock index 87c6826..b69d2c3 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1705666311, - "narHash": "sha256-VYdSQm7zq3AStyHhRr3SBCTA8fVzrl6WtIlXTs2Wlts=", + "lastModified": 1706367331, + "narHash": "sha256-AqgkGHRrI6h/8FWuVbnkfFmXr4Bqsr4fV23aISqj/xg=", "owner": "nixos", "repo": "nixpkgs", - "rev": "a455c5fb3ee513e2f443838a0e84d52b035adb67", + "rev": "160b762eda6d139ac10ae081f8f78d640dd523eb", "type": "github" }, "original": { From 8ac02ba12e3e492619d6830eda14e4e5e08ae87a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 1 Feb 2024 10:13:49 +0000 Subject: [PATCH 044/160] 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 'nixpkgs': 'github:nixos/nixpkgs/160b762eda6d139ac10ae081f8f78d640dd523eb' (2024-01-27) → 'github:nixos/nixpkgs/5ad9903c16126a7d949101687af0aa589b1d7d3d' (2024-01-31) --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index b69d2c3..5a7e817 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1706367331, - "narHash": "sha256-AqgkGHRrI6h/8FWuVbnkfFmXr4Bqsr4fV23aISqj/xg=", + "lastModified": 1706683685, + "narHash": "sha256-FtPPshEpxH/ewBOsdKBNhlsL2MLEFv1hEnQ19f/bFsQ=", "owner": "nixos", "repo": "nixpkgs", - "rev": "160b762eda6d139ac10ae081f8f78d640dd523eb", + "rev": "5ad9903c16126a7d949101687af0aa589b1d7d3d", "type": "github" }, "original": { From b6d3c5a7e2f36f0d0ca514154fd52eb18ba2d71a Mon Sep 17 00:00:00 2001 From: iofq Date: Sat, 3 Feb 2024 17:53:24 -0600 Subject: [PATCH 045/160] Update rose-pine options --- config/lua/colors.lua | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/config/lua/colors.lua b/config/lua/colors.lua index a46e555..5a5093b 100644 --- a/config/lua/colors.lua +++ b/config/lua/colors.lua @@ -1,8 +1,10 @@ require("rose-pine").setup({ variant = "moon", - disable_background = true, - disable_italics = true, - disable_float_background = true + styles = { + bold = false, + italic = false, + transparency = true, + }, }) vim.cmd.colorscheme "rose-pine-main" From 27ffd7b0aff17940cc49b552758c38e0f6f20244 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 14 Feb 2024 10:13:00 +0000 Subject: [PATCH 046/160] 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 'nixpkgs': 'github:nixos/nixpkgs/5ad9903c16126a7d949101687af0aa589b1d7d3d' (2024-01-31) → 'github:nixos/nixpkgs/2d627a2a704708673e56346fcb13d25344b8eaf3' (2024-02-12) --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 5a7e817..0d63100 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1706683685, - "narHash": "sha256-FtPPshEpxH/ewBOsdKBNhlsL2MLEFv1hEnQ19f/bFsQ=", + "lastModified": 1707743206, + "narHash": "sha256-AehgH64b28yKobC/DAWYZWkJBxL/vP83vkY+ag2Hhy4=", "owner": "nixos", "repo": "nixpkgs", - "rev": "5ad9903c16126a7d949101687af0aa589b1d7d3d", + "rev": "2d627a2a704708673e56346fcb13d25344b8eaf3", "type": "github" }, "original": { From 013643b21f5234d07ab4c0ff6e8431a1a4fa9add Mon Sep 17 00:00:00 2001 From: Cal Jurgella Date: Fri, 16 Feb 2024 19:08:46 -0600 Subject: [PATCH 047/160] rice from work --- config/lua/git-conf.lua | 15 +- config/lua/nvim-conf.lua | 16 +- filewatch.py | 334 +++++++++++++++++++++++++++++++++++++++ flake.nix | 1 + plugins.nix | 1 + 5 files changed, 351 insertions(+), 16 deletions(-) create mode 100755 filewatch.py diff --git a/config/lua/git-conf.lua b/config/lua/git-conf.lua index e11b066..a515364 100644 --- a/config/lua/git-conf.lua +++ b/config/lua/git-conf.lua @@ -4,18 +4,11 @@ require('gitsigns').setup{ on_attach = function() local gs = package.loaded.gitsigns vim.keymap.set("n", "gg", gs.preview_hunk) + vim.keymap.set('n', 'gb', function() gs.blame_line{full=true} end) vim.keymap.set('n', 'gs', gs.stage_hunk) vim.keymap.set('n', 'gr', gs.reset_hunk) - vim.keymap.set('v', 'gs', function() gs.stage_hunk {vim.fn.line('.'), vim.fn.line('v')} end) vim.keymap.set('v', 'gr', function() gs.reset_hunk {vim.fn.line('.'), vim.fn.line('v')} end) - vim.keymap.set('n', 'gu', gs.undo_stage_hunk) - vim.keymap.set('n', 'gS', gs.stage_buffer) - vim.keymap.set('n', 'gR', gs.reset_buffer) - vim.keymap.set('n', 'gb', function() gs.blame_line{full=true} end) - vim.keymap.set('n', 'gb', gs.toggle_current_line_blame) - vim.keymap.set('n', 'gd', gs.diffthis) - vim.keymap.set('n', 'gD', function() gs.diffthis('~') end) - vim.keymap.set('n', 'gt', gs.toggle_deleted) + vim.keymap.set('v', 'gs', function() gs.stage_hunk {vim.fn.line('.'), vim.fn.line('v')} end) -- Navigation vim.keymap.set('n', ']g', function() if vim.wo.diff then return ']c' end @@ -30,3 +23,7 @@ require('gitsigns').setup{ end, {expr=true}) end } + +local neogit = require('neogit') +neogit.setup {} +vim.keymap.set('n', 'ng', neogit.open) diff --git a/config/lua/nvim-conf.lua b/config/lua/nvim-conf.lua index bd2be05..b2afb85 100644 --- a/config/lua/nvim-conf.lua +++ b/config/lua/nvim-conf.lua @@ -7,8 +7,8 @@ vim.opt.expandtab = true -- insert tabs as spaces vim.opt.inccommand = "split" -- incremental live completion vim.opt.laststatus = 1 vim.opt.list = true -vim.opt.listchars:append("trail:·") -vim.opt.listchars:append("leadmultispace:╎ ") +-- vim.opt.listchars:append("trail:·") +-- vim.opt.listchars:append("leadmultispace:╎ ") vim.opt.nrformats:append("alpha") -- let Ctrl-a do letters as well vim.opt.path:append("**") -- enable fuzzy :find ing vim.opt.relativenumber = true @@ -18,7 +18,7 @@ vim.opt.showmatch = true -- highlight matching brackets vim.opt.showmode = true vim.opt.softtabstop = -1 -- backspace removes tabstop vim.opt.swapfile = false -vim.opt.tabstop = 4 -- 4 space tabs +vim.opt.tabstop = 2 -- 2 space tabs are based vim.opt.updatetime = 250 -- decrease update time vim.opt.virtualedit = "onemore" @@ -40,10 +40,12 @@ remap("v", "wq", "l") remap("n","gr", "gT") remap("n","n", "nzz") remap("n", "N", "Nzz") -remap("n", "Y", "y$") -remap("n","[", ":put!=repeat([''],v:count)']+1") -remap("n","]", ":put =repeat([''],v:count)'[-1") -remap("n","M", "m0i`0") +remap("n","", "m0i`0") + +-- Switch tab length on the fly +vim.keymap.set("n", "\\t", function() + vim.o.tabstop = vim.o.tabstop == 2 and 4 or 2 +end, { silent = true }) -- autocmd ---------------------------------------- diff --git a/filewatch.py b/filewatch.py new file mode 100755 index 0000000..190ead0 --- /dev/null +++ b/filewatch.py @@ -0,0 +1,334 @@ +#!/usr/bin/python + +import os +import subprocess +import time +import glob +import syslog +import multiprocessing as mp +from datetime import datetime +from epicutils import getpretend,setpretend + +#-----------------------------------------------------------------------------# +# This script is used to transfer files between Epic and Hosting. Files in # +# /home/epichosted.com//to_epichosting will go to # +# /nfs/temp//from_epic, and files in /nfs/temp//to_epic will go # +# to /home/epichosted.com//from_epichosting. Along the way, a forever # +# copy of each file is taken. # +#-----------------------------------------------------------------------------# + +# Some initial settings are needed +setpretend(False) +domain = subprocess.check_output('realm list --name-only'.split()).strip() +# domain = subprocess.check_output('dnsdomainname').strip() +tempdir = "/nfs/temp" +homedir = "/home/{0}".format(domain) +largedir = "/nfs/temp/large" +log = ("./{0}.log_{1}".format( + "filewatch", datetime.today().strftime("%m%d%Y") + ) + ) +logfile = open(log,'a') + +def parseArgs(): + import argparse + parser = argparse.ArgumentParser(description='File transfer') + parser.add_argument('--type', choices=['epic', 'hosting', 'testlab'], + required=False, + help="Where files from this server are coming from and going to." + ) + args = parser.parse_args() + if args.type: + return args.type + else: + return None + +# Logging utility +def tolog(message): + tosyslog(message) + +def tosyslog(message): + if not getpretend(): + syslog.syslog(message) + +# Alert email +def emailBody(file): + import datetime + import os + body = ("This alert is about your recent SFTP file transfer.\n\n" + "Digital Guardian has classified your file as containing sensitive information " + "including PHI or PII. Your file has been quarantined but can be moved pending " + "additional review.\n\n" + "File: {0}\n" + "Size: {1}kB\n" + "Date: {2}\n\n" + "If your file contains PHI:\n\tProvide the Security Team with the Sherlock SLG " + "you will be attaching the file to.\n\n" + "If your file does not contain PHI:\n\tProvide the Security Team a short description " + "of the contents so we can improve our flagging rules.\n\n" + "If this is an after-hours case and you need the file immediately:\n\tCall the " + "Security on-call representative.\n" + ).format( + file, (os.path.getsize(file)/1000.0), datetime.datetime.now() + ) + return body + +# Send email +def sendEmail(file): + import smtplib + import socket + from email.mime.text import MIMEText + siemList = "soc@epichosted.com" + msg = MIMEText(emailBody(file)) + msg['Subject'] = "Digital Guardian File Transfer Quarantine" + msg['From'] = "tdcr-sftp01@test.lab" + msg['To'] = "{0}@{1}, {2}".format(file.split('/')[3], ('.').join(socket.getfqdn().split('.')[1:]), siemList) + s = smtplib.SMTP('localhost') + s.sendmail(msg['From'], msg['To'].split(','), msg.as_string()) + s.quit() + +# Check if a file is too large to send. +def checkfilesize(file): + # Get file size in bytes + size = os.path.getsize(file) + # Arbitrarily set at 100MB + if file.startswith(homedir) and file.split('/')[4] == 'hosting': + maxsize = 0 + else: + # maxsize = 100000000 + return True + # If the file is too big, stop it from sending. + if size >= maxsize: + return False + else: + return True + +# Scan file +def scanfileav(file): + cmd = ["uvscan", file] + try: + result = subprocess.check_output(cmd) + except Exception, e: + tolog("{0} failed its file scan.".format(file)) + return False + else: + tolog(result) + return True + +# DG classification flags to stop +def taginDgClassFlags(tag): + tolog("Tag is {0}.".format(tag)) + #flags = ["PCI_DATA_LOW", "PCI_DATA_MEDIUM", "PCI_DATA_HIGH", + # "PHI_DATA_LOW", "PHI_DATA_MEDIUM", "PHI_DATA_HIGH", + # "PII_DATA_LOW", "PII_DATA_MEDIUM", "PII_DATA_HIGH", + # "TEST"] + flags = ["DLP_PHI_DATA", "DLP_PII_DATA"] + if tag in flags: + return True + else: + return False + +# Check DG classification +def scanfiledlp(file): + import subprocess + # Need to do read on file to classify with DG + open(file, 'r').close() + output = subprocess.Popen(["/dgagent/dgciapp", file], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + if output.stdout: + outputOut = output.stdout.read() + lines = outputOut.split('#012')[0].split('\n') + for line in lines: + if line.startswith("tag:"): + tag = line.split(":")[1].strip().split('\'')[1] + return tag + if not output.stdout and output.stderr: + tolog("A DG error occurred: {0}".format(output.stderr.read())) + return None + +# Check if tag is okay to move +def checkDGscan(file): + #tolog("Checking DG classification of {0}.".format(file)) + #tag = scanfiledlp(file) + #if tag: + # if taginDgClassFlags(tag): + # tolog("{0} was tagged by DG: {1}. Moving to quarantine.".format(file, tag)) + # return False + return True + +# Copy a file from one place to another. +def copyfile(source, destination): + try: + # Only do the copy if we're not pretending. + if not getpretend(): + p = subprocess.Popen( + ['cp','--preserve=mode,ownership',source,destination] + ) + p.wait() + # Catch OS errors + except OSError, e: + tolog("Couldn't copy {0} to {1}. Error: {2}.".format( + source, destination, e + ) + ) + tosyslog("ERROR,{0},{1},{2}".format(source,destination,e)) + else: + tosyslog("COMPLETE,{0},{1},{2}".format( + source,destination,os.path.getsize(destination) + ) + ) + +# Get forever location +def getforever(source, timestamp): + direlems = source.split('/') + direlems[1]="nfs" + direlems[2]="forever" + direlems.insert(5, str(timestamp)) + direlems.pop(-1) + # Rebuild directory in /nfs/forever + forevercopydir = '/'.join(direlems) + return forevercopydir + +# Copy a file to /nfs/forever. +def copytoforever(file, timestamp): + forevercopydir = getforever(file, timestamp) + forevercopy = os.path.join(forevercopydir,os.path.basename(file)) + copyfile(file,forevercopy) + subprocess.check_call(['gzip',forevercopy]) + +# Move a file from one place to another. This will delete the original +# at the end. +def movefile(source, destination, timestamp): + try: + # Copy the file to /nfs/forever + copytoforever(source, timestamp) + destdir = os.path.dirname(destination) + if not getpretend(): + # Copy the file, then delete it. + copyfile(source, destination) + os.remove(source) + # Catch OS errors + except OSError, e: + tolog("Could not move {0} to {1}. Error: {2}.".format( + source, destination, e + ) + ) + tosyslog("ERROR,{0},{1},{2}".format(source,destination,e)) + +# Move a large file to be handled by CSMs +def movetolarge(source, timestamp): + direlems = source.split('/') + direlems[1] = "nfs" + direlems[2] = "temp" + direlems.insert(3, "large") + largedest = '/'.join(direlems) + if not os.path.isdir(os.path.dirname(largedest)): + os.makedirs(os.path.dirname(largedest)) + movefile(source, largedest, timestamp) + +# Check if file is open. There is a race condition here, but there's not much +# I can do about that. +def checkclosed(file): + size1 = os.path.getsize(file) + time.sleep(5) + size2 = os.path.getsize(file) + if size1 == size2: + return True + else: + return False + +def processonefile(args): + source = args[0] + destination = args[1] + timestamp = args[2] + closed = False + closed = checkclosed(source) + if not closed: + tolog("{0} is open. Skipping.".format(source)) + return + #sizeok = checkfilesize(source) + scanok = scanfileav(source) + dgok = checkDGscan(source) + if scanok and dgok: + movefile(source, destination, timestamp) + else: + tolog("{0} is too large and will have to be moved manually. Moving to " + "/nfs/temp/large.".format(source)) + tosyslog("LARGE,{0},{1}.".format(source, os.path.getsize(source))) + sendEmail(source) + movetolarge(source, timestamp) + +# Get destination +def getdest(direction, source): + destination = "" + if direction == "to": + destination = source.replace(homedir,tempdir,1).replace( + "outgoing","incoming",1) + elif direction == "from": + destination = source.replace(tempdir,homedir,1).replace( + "outgoing","incoming",1) + return destination + +# Build destination directories +def builddestdirs(jobs): + dirs = [] + for job in jobs: + source = job[0] + destination = job[1] + timestamp = job[2] + dest = os.path.dirname(destination) + if not dest in dirs: + dirs.append(dest) + forever = getforever(source, timestamp) + if not forever in dirs: + dirs.append(forever) + for dir in dirs: + if not os.path.isdir(dir): + # tolog("Creating {0}.".format(dir)) + os.makedirs(dir) + +# Go through each user directory in /nfs/temp and /home/ +def walktree(basedir, direction): + jobs = [] + timestamp = time.time() + for userdir in os.listdir(basedir): + if xferType: + userdir = userdir + '/{0}'.format(xferType) + if direction == "to": + filedir = os.path.join(basedir,userdir,"outgoing") + elif direction == "from": + filedir = os.path.join(basedir,userdir,"outgoing") + if not os.path.isdir(os.path.join(basedir,userdir)): + next + for root, dirs, files in os.walk(filedir): + for file in files: + source = os.path.join(root, file) + destination = getdest(direction, source) + jobs.append([source,destination,str(timestamp)]) + for dir in dirs: + fulldir = os.path.join(root,dir) + if os.listdir(fulldir) == []: + try: + os.rmdir(fulldir) + except OSError, e: + tolog("Could not remove {0} because an error " + "occurred. Error: {1}.".format(fulldir, e)) + if jobs == []: + return + builddestdirs(jobs) + pool.map(processonefile, jobs) + +pool = mp.Pool(processes=50) +xferType = parseArgs() +while True: + if logfile.closed: + logfile = open(log,'a') + try: + walktree(homedir,"to") + walktree(tempdir,"from") + except Exception, e: + tosyslog("An error occurred: {0}.".format(e)) + raise Exception("An error occurred: {0}.".format(e)) + else: + time.sleep(5) + logfile.close() + diff --git a/flake.nix b/flake.nix index 2300728..7f1dcf7 100644 --- a/flake.nix +++ b/flake.nix @@ -77,6 +77,7 @@ }; }; }); + apps.full = flake-utils.lib.mkApp { drv = packages.full; name = "neovim"; exePath = "/bin/nvim"; }; diff --git a/plugins.nix b/plugins.nix index ae9b05f..d672391 100644 --- a/plugins.nix +++ b/plugins.nix @@ -14,5 +14,6 @@ nvim-treesitter.withAllGrammars nvim-treesitter-textobjects vim-nix + neogit ]; } From 78c53dc879158ec83667ba220b8361f78cd9d67f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 15 Mar 2024 03:06:37 +0000 Subject: [PATCH 048/160] 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 'flake-utils': 'github:numtide/flake-utils/1ef2e671c3b0c19053962c07dbda38332dcebf26?narHash=sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA%3D' (2024-01-15) → 'github:numtide/flake-utils/b1d9ab70662946ef0850d488da1c9019f3a9752a?narHash=sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ%3D' (2024-03-11) • Updated input 'nixpkgs': 'github:nixos/nixpkgs/2d627a2a704708673e56346fcb13d25344b8eaf3?narHash=sha256-AehgH64b28yKobC/DAWYZWkJBxL/vP83vkY%2Bag2Hhy4%3D' (2024-02-12) → 'github:nixos/nixpkgs/bd5ddf2c6bfafff031edf80221e1ee94e86ca10a?narHash=sha256-YpSGYZR96I8g5OK/Fdm0O4%2BmHLen6YPA1cPanqqNqT0%3D' (2024-03-14) --- flake.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/flake.lock b/flake.lock index 0d63100..3068397 100644 --- a/flake.lock +++ b/flake.lock @@ -5,11 +5,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1705309234, - "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", "owner": "numtide", "repo": "flake-utils", - "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", "type": "github" }, "original": { @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1707743206, - "narHash": "sha256-AehgH64b28yKobC/DAWYZWkJBxL/vP83vkY+ag2Hhy4=", + "lastModified": 1710408871, + "narHash": "sha256-YpSGYZR96I8g5OK/Fdm0O4+mHLen6YPA1cPanqqNqT0=", "owner": "nixos", "repo": "nixpkgs", - "rev": "2d627a2a704708673e56346fcb13d25344b8eaf3", + "rev": "bd5ddf2c6bfafff031edf80221e1ee94e86ca10a", "type": "github" }, "original": { From 024daaa09a322aadac5b67b478cf77196613dd07 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 1 Apr 2024 10:14:12 +0000 Subject: [PATCH 049/160] 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 'nixpkgs': 'github:nixos/nixpkgs/bd5ddf2c6bfafff031edf80221e1ee94e86ca10a?narHash=sha256-YpSGYZR96I8g5OK/Fdm0O4%2BmHLen6YPA1cPanqqNqT0%3D' (2024-03-14) → 'github:nixos/nixpkgs/807c549feabce7eddbf259dbdcec9e0600a0660d?narHash=sha256-9slQ609YqT9bT/MNX9%2B5k5jltL9zgpn36DpFB7TkttM%3D' (2024-03-29) --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 3068397..f8cf523 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1710408871, - "narHash": "sha256-YpSGYZR96I8g5OK/Fdm0O4+mHLen6YPA1cPanqqNqT0=", + "lastModified": 1711715736, + "narHash": "sha256-9slQ609YqT9bT/MNX9+5k5jltL9zgpn36DpFB7TkttM=", "owner": "nixos", "repo": "nixpkgs", - "rev": "bd5ddf2c6bfafff031edf80221e1ee94e86ca10a", + "rev": "807c549feabce7eddbf259dbdcec9e0600a0660d", "type": "github" }, "original": { From b5a0c7992246510b241eb694ff733ef6098db528 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 14 Apr 2024 12:02:15 +0000 Subject: [PATCH 050/160] 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 'nixpkgs': 'github:nixos/nixpkgs/807c549feabce7eddbf259dbdcec9e0600a0660d?narHash=sha256-9slQ609YqT9bT/MNX9%2B5k5jltL9zgpn36DpFB7TkttM%3D' (2024-03-29) → 'github:nixos/nixpkgs/a0c9e3aee1000ac2bfb0e5b98c94c946a5d180a9?narHash=sha256-icE1IJE9fHcbDfJ0%2BqWoDdcBXUoZCcIJxME4lMHwvSM%3D' (2024-04-12) --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index f8cf523..fcaab2b 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1711715736, - "narHash": "sha256-9slQ609YqT9bT/MNX9+5k5jltL9zgpn36DpFB7TkttM=", + "lastModified": 1712883908, + "narHash": "sha256-icE1IJE9fHcbDfJ0+qWoDdcBXUoZCcIJxME4lMHwvSM=", "owner": "nixos", "repo": "nixpkgs", - "rev": "807c549feabce7eddbf259dbdcec9e0600a0660d", + "rev": "a0c9e3aee1000ac2bfb0e5b98c94c946a5d180a9", "type": "github" }, "original": { From f66e3dde6a48bbba94b41a970425f76b982c2c63 Mon Sep 17 00:00:00 2001 From: iofq Date: Fri, 26 Jul 2024 23:11:06 -0500 Subject: [PATCH 051/160] Clean up rice --- .github/workflows/main.yml | 11 +- config/init.lua | 251 ++++++++++++++++++++- config/lua/colors.lua | 10 - config/lua/git-conf.lua | 29 --- config/lua/lsp-conf.lua | 43 ---- config/lua/mini-conf.lua | 2 +- config/lua/nvim-treesitter-conf.lua | 49 ---- config/lua/oil-conf.lua | 14 -- config/lua/telescope-conf.lua | 39 ---- config/lua/toggleterm-conf.lua | 5 - config/minimal-init.lua | 5 - filewatch.py | 334 ---------------------------- flake.lock | 6 +- flake.nix | 123 +++++----- plugins.nix | 25 ++- 15 files changed, 317 insertions(+), 629 deletions(-) delete mode 100644 config/lua/colors.lua delete mode 100644 config/lua/git-conf.lua delete mode 100644 config/lua/lsp-conf.lua delete mode 100644 config/lua/nvim-treesitter-conf.lua delete mode 100644 config/lua/oil-conf.lua delete mode 100644 config/lua/toggleterm-conf.lua delete mode 100644 config/minimal-init.lua delete mode 100755 filewatch.py diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 75c7610..9f64720 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -13,8 +13,7 @@ jobs: strategy: matrix: include: - - package_name: full - - package_name: minimal + - package_name: neovim steps: - uses: actions/checkout@v3 - uses: DeterminateSystems/nix-installer-action@main @@ -23,17 +22,17 @@ jobs: id: build run: | nix bundle \ - -o nvim-${{ matrix.package_name }}.AppImage \ + -o ${{ matrix.package_name }}.AppImage \ --bundler github:ralismark/nix-appimage \ --extra-experimental-features nix-command \ --extra-experimental-features flakes .#${{ matrix.package_name }} - echo "Done building AppImage for nvim-${{ matrix.package_name }}" + echo "Done building AppImage for ${{ matrix.package_name }}" - name: Upload bundle to release if: github.ref == 'refs/heads/master' uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} - file: "nvim-${{ matrix.package_name }}.AppImage" - asset_name: "nvim-x86_64-linux-${{ matrix.package_name }}.AppImage" + file: "${{ matrix.package_name }}.AppImage" + asset_name: "${{ matrix.package_name }}-x86_64-linux.AppImage" tag: latest overwrite: true diff --git a/config/init.lua b/config/init.lua index 8414969..3a204ed 100644 --- a/config/init.lua +++ b/config/init.lua @@ -1,6 +1,245 @@ -require("minimal-init") -require("nvim-treesitter-conf") -require("lsp-conf") -require("colors") -require("git-conf") -require("oil-conf") +-------------------- +-- Mini +-------------------- +require("mini-conf") + +-------------------- +-- Toggleterm +-------------------- +require("toggleterm").setup{ + open_mapping = [[]], + direction = "float", + close_on_exit = true, +} + +-------------------- +-- Telescope +-------------------- +local telescope = require("telescope.builtin") +vim.keymap.set("n", "fb", telescope.buffers, {noremap = true, silent = true}) +vim.keymap.set("n", "ff", telescope.find_files, {noremap = true, silent = true}) +vim.keymap.set("n", "fg", telescope.git_files, {noremap = true, silent = true}) +vim.keymap.set("n", "fv", telescope.command_history, {noremap = true, silent = true}) +vim.keymap.set("n", "fa", telescope.live_grep, {noremap = true, silent = true}) +vim.keymap.set("n", "f8", telescope.grep_string, {noremap = true, silent = true}) +vim.keymap.set("n", "f", telescope.resume, {noremap = true, silent = true}) +vim.keymap.set("n", "fs", telescope.git_status, {noremap = true, silent = true}) + +local telescope = require("telescope") +telescope.setup({ + defaults = { + layout_strategy = "vertical", + layout_config = { width = .90, }, + prompt_title = false, + results_title = false, + preview_title = false, + vimgrep_arguments = { + "rg", + "--color=never", + "--no-heading", + "--hidden", + "--with-filename", + "--line-number", + "--column", + "--smart-case" + }, + mappings = { + i = { + ["wq"] = require("telescope.actions").close, + [""] = require("telescope.actions").close, + [""] = require("telescope.actions").move_selection_previous, + [""] = require("telescope.actions").move_selection_next, + }, + }, + }, +}) +telescope.load_extension("fzf") + +-------------------- +-- Treesitter +-------------------- +require("nvim-treesitter.configs").setup { + ensure_installed = {}, + highlight = { + enable = true, + }, + indent = { + enable = true, + }, + textobjects = { + select = { + enable = true, + lookahead = true, + keymaps = { + ["af"] = "@function.outer", + ["if"] = "@function.inner", + ["aa"] = "@statement.outer", + ["ia"] = "@parameter.inner", + }, + }, + move = { + enable = true, + set_jumps = true, -- whether to set jumps in the jumplist + goto_next_start = { + [']]'] = '@function.outer', + [']a'] = '@parameter.inner', + }, + goto_previous_start = { + ['[['] = '@function.outer', + ['[a'] = '@parameter.inner', + }, + }, + swap = { + enable = true, + swap_next = { + ["s]"] = "@parameter.inner", + }, + swap_previous = { + ["s["] = "@parameter.inner", + }, + }, }, + incremental_selection = { + enable = true, + keymaps = { + init_selection = '', + node_incremental = '', + node_decremental = '', + }, + }, +} + +-------------------- +-- LSP Config +-------------------- + +-- Setup language servers. +local lspconfig = require('lspconfig') +lspconfig.gopls.setup { on_attach = function(_, bufnr) + vim.api.nvim_command("au BufWritePre lua vim.lsp.buf.format { async = false }") +end +} +lspconfig.pyright.setup {} +lspconfig.nil_ls.setup {} +lspconfig.phpactor.setup {} + +-- Global mappings. +-- See `:help vim.diagnostic.*` for documentation on any of the below functions +vim.keymap.set('n', 'de', vim.diagnostic.open_float) +vim.keymap.set('n', '[d', vim.diagnostic.goto_prev) +vim.keymap.set('n', ']d', vim.diagnostic.goto_next) + +vim.diagnostic.config({ + virtual_text = true, + underline = true, + update_in_insert = false, +}) +-- Use LspAttach autocommand to only map the following keys +-- after the language server attaches to the current buffer +vim.api.nvim_create_autocmd('LspAttach', { + group = vim.api.nvim_create_augroup('UserLspConfig', {}), + callback = function(ev) + -- Enable completion triggered by + vim.bo[ev.buf].omnifunc = 'v:lua.vim.lsp.omnifunc' + -- Buffer local mappings. + -- See `:help vim.lsp.*` for documentation on any of the below functions + local opts = { buffer = ev.buf } + vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts) + vim.keymap.set('n', 'rn', vim.lsp.buf.rename, opts) + vim.keymap.set({ 'n', 'v' }, 'da', vim.lsp.buf.code_action, opts) + vim.keymap.set("n", "dd", "Telescope lsp_definitions", { buffer = bufnr }) + vim.keymap.set("n", "di", "Telescope lsp_implementations", { buffer = bufnr }) + vim.keymap.set("n", "dr", "Telescope lsp_references", { buffer = bufnr }) + vim.keymap.set("n", "dt", "Telescope lsp_type_definitions", { buffer = bufnr }) + vim.keymap.set("n", "ds", "Telescope lsp_document_symbols", { buffer = bufnr }) + vim.keymap.set('n', 'df', function() + vim.lsp.buf.format { async = true } + end, opts) + end, +}) + +-------------------- +-- Git +-------------------- +require('gitsigns').setup{ + signcolumn = false, + numhl = true, + on_attach = function() + local gs = package.loaded.gitsigns + vim.keymap.set("n", "gg", gs.preview_hunk) + vim.keymap.set('n', 'gb', function() gs.blame_line{full=true} end) + vim.keymap.set('n', 'gr', gs.reset_hunk) + vim.keymap.set('v', 'gr', function() gs.reset_hunk {vim.fn.line('.'), vim.fn.line('v')} end) + -- Navigation + vim.keymap.set('n', ']g', function() + if vim.wo.diff then return ']c' end + vim.schedule(function() gs.next_hunk() end) + return '' + end, {expr=true}) + + vim.keymap.set('n', '[g', function() + if vim.wo.diff then return '[c' end + vim.schedule(function() gs.prev_hunk() end) + return '' + end, {expr=true}) + end +} + +local neogit = require('neogit') +neogit.setup {integrations = {diffview = true}} +vim.keymap.set('n', 'ng', neogit.open) + +require("diffview") + +-------------------- +-- Oil & Undo +-------------------- +local oil = require('oil') +oil.setup({ + columns = { + "permissions", + "size" + }, + view_options = { + show_hidden = true + }, + keymaps = { + ["wq"] = "actions.close" + } +}) +vim.keymap.set("n", "c", oil.toggle_float, {noremap = true, silent = true}); + +vim.keymap.set("n", "u", "UndotreeToggle") + +-------------------- +-- Refactoring +-------------------- +require('refactoring').setup({ + prompt_func_return_type = { go = true, }, + prompt_func_param_type = { go = true, }, + show_success_message = true, +}) + +require("telescope").load_extension("refactoring") +vim.keymap.set( + {"n"}, + "rr", + function() require('telescope').extensions.refactoring.refactors() end +) +-------------------- +-- Colors +-------------------- + +require("rose-pine").setup({ + variant = "moon", + styles = { + bold = false, + italic = false, + transparency = true, + }, +}) +vim.cmd.colorscheme "rose-pine-main" + +-------------------- +-- include our config last to override +-------------------- +require("nvim-conf") diff --git a/config/lua/colors.lua b/config/lua/colors.lua deleted file mode 100644 index 5a5093b..0000000 --- a/config/lua/colors.lua +++ /dev/null @@ -1,10 +0,0 @@ -require("rose-pine").setup({ - variant = "moon", - styles = { - bold = false, - italic = false, - transparency = true, - }, -}) - -vim.cmd.colorscheme "rose-pine-main" diff --git a/config/lua/git-conf.lua b/config/lua/git-conf.lua deleted file mode 100644 index a515364..0000000 --- a/config/lua/git-conf.lua +++ /dev/null @@ -1,29 +0,0 @@ -require('gitsigns').setup{ - signcolumn = false, - numhl = true, - on_attach = function() - local gs = package.loaded.gitsigns - vim.keymap.set("n", "gg", gs.preview_hunk) - vim.keymap.set('n', 'gb', function() gs.blame_line{full=true} end) - vim.keymap.set('n', 'gs', gs.stage_hunk) - vim.keymap.set('n', 'gr', gs.reset_hunk) - vim.keymap.set('v', 'gr', function() gs.reset_hunk {vim.fn.line('.'), vim.fn.line('v')} end) - vim.keymap.set('v', 'gs', function() gs.stage_hunk {vim.fn.line('.'), vim.fn.line('v')} end) - -- Navigation - vim.keymap.set('n', ']g', function() - if vim.wo.diff then return ']c' end - vim.schedule(function() gs.next_hunk() end) - return '' - end, {expr=true}) - - vim.keymap.set('n', '[g', function() - if vim.wo.diff then return '[c' end - vim.schedule(function() gs.prev_hunk() end) - return '' - end, {expr=true}) - end -} - -local neogit = require('neogit') -neogit.setup {} -vim.keymap.set('n', 'ng', neogit.open) diff --git a/config/lua/lsp-conf.lua b/config/lua/lsp-conf.lua deleted file mode 100644 index 5880906..0000000 --- a/config/lua/lsp-conf.lua +++ /dev/null @@ -1,43 +0,0 @@ --- Setup language servers. -local lspconfig = require('lspconfig') -lspconfig.gopls.setup { on_attach = function(_, bufnr) - vim.api.nvim_command("au BufWritePre lua vim.lsp.buf.format { async = false }") -end -} -lspconfig.pyright.setup {} -lspconfig.nil_ls.setup {} - --- Global mappings. --- See `:help vim.diagnostic.*` for documentation on any of the below functions -vim.keymap.set('n', 'de', vim.diagnostic.open_float) -vim.keymap.set('n', '[d', vim.diagnostic.goto_prev) -vim.keymap.set('n', ']d', vim.diagnostic.goto_next) - -vim.diagnostic.config({ - virtual_text = true, - underline = true, - update_in_insert = false, -}) --- Use LspAttach autocommand to only map the following keys --- after the language server attaches to the current buffer -vim.api.nvim_create_autocmd('LspAttach', { - group = vim.api.nvim_create_augroup('UserLspConfig', {}), - callback = function(ev) - -- Enable completion triggered by - vim.bo[ev.buf].omnifunc = 'v:lua.vim.lsp.omnifunc' - -- Buffer local mappings. - -- See `:help vim.lsp.*` for documentation on any of the below functions - local opts = { buffer = ev.buf } - vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts) - vim.keymap.set('n', 'rn', vim.lsp.buf.rename, opts) - vim.keymap.set({ 'n', 'v' }, 'ac', vim.lsp.buf.code_action, opts) - vim.keymap.set("n", "dd", "Telescope lsp_definitions", { buffer = bufnr }) - vim.keymap.set("n", "di", "Telescope lsp_implementations", { buffer = bufnr }) - vim.keymap.set("n", "dr", "Telescope lsp_references", { buffer = bufnr }) - vim.keymap.set("n", "dt", "Telescope lsp_type_definitions", { buffer = bufnr }) - vim.keymap.set("n", "ds", "Telescope lsp_document_symbols", { buffer = bufnr }) - vim.keymap.set('n', 'df', function() - vim.lsp.buf.format { async = true } - end, opts) - end, -}) diff --git a/config/lua/mini-conf.lua b/config/lua/mini-conf.lua index e98605e..fb06196 100644 --- a/config/lua/mini-conf.lua +++ b/config/lua/mini-conf.lua @@ -49,7 +49,7 @@ require('mini.splitjoin').setup({ require('mini.pairs').setup( { - modes = { insert = true, command = false, terminal = false }, + modes = {insert = true, command = false, terminal = false}, mappings = { ['['] = { action = 'open', pair = '[]', neigh_pattern = '[^\\].' }, ['{'] = { action = 'open', pair = '{}', neigh_pattern = '[^\\].' }, diff --git a/config/lua/nvim-treesitter-conf.lua b/config/lua/nvim-treesitter-conf.lua deleted file mode 100644 index e28c124..0000000 --- a/config/lua/nvim-treesitter-conf.lua +++ /dev/null @@ -1,49 +0,0 @@ -require("nvim-treesitter.configs").setup { - ensure_installed = {}, - highlight = { - enable = true, - }, - indent = { - enable = true, - }, - textobjects = { - select = { - enable = true, - lookahead = true, - keymaps = { - ["af"] = "@function.outer", - ["if"] = "@function.inner", - ["aa"] = "@statement.outer", - ["ia"] = "@parameter.inner", - }, - }, - move = { - enable = true, - set_jumps = true, -- whether to set jumps in the jumplist - goto_next_start = { - [']]'] = '@function.outer', - [']a'] = '@parameter.inner', - }, - goto_previous_start = { - ['[['] = '@function.outer', - ['[a'] = '@parameter.inner', - }, - }, - swap = { - enable = true, - swap_next = { - ["s]"] = "@parameter.inner", - }, - swap_previous = { - ["s["] = "@parameter.inner", - }, - }, }, - incremental_selection = { - enable = true, - keymaps = { - init_selection = '', - node_incremental = '', - node_decremental = '', - }, - }, -} diff --git a/config/lua/oil-conf.lua b/config/lua/oil-conf.lua deleted file mode 100644 index 80cada3..0000000 --- a/config/lua/oil-conf.lua +++ /dev/null @@ -1,14 +0,0 @@ -local oil = require('oil') -oil.setup({ - columns = { - "permissions", - "size" - }, - view_options = { - show_hidden = true - }, - keymaps = { - ["wq"] = "actions.close" - } -}) -vim.keymap.set("n", "c", oil.toggle_float, {noremap = true, silent = true}); diff --git a/config/lua/telescope-conf.lua b/config/lua/telescope-conf.lua index b733c37..e69de29 100644 --- a/config/lua/telescope-conf.lua +++ b/config/lua/telescope-conf.lua @@ -1,39 +0,0 @@ -local telescope = require("telescope.builtin") -vim.keymap.set("n", "fb", telescope.buffers, {noremap = true, silent = true}) -vim.keymap.set("n", "ff", telescope.find_files, {noremap = true, silent = true}) -vim.keymap.set("n", "fg", telescope.git_files, {noremap = true, silent = true}) -vim.keymap.set("n", "fv", telescope.command_history, {noremap = true, silent = true}) -vim.keymap.set("n", "fa", telescope.live_grep, {noremap = true, silent = true}) -vim.keymap.set("n", "f8", telescope.grep_string, {noremap = true, silent = true}) -vim.keymap.set("n", "f", telescope.resume, {noremap = true, silent = true}) -vim.keymap.set("n", "fs", telescope.git_status, {noremap = true, silent = true}) - -local telescope = require("telescope") -telescope.setup({ - defaults = { - layout_strategy = "vertical", - layout_config = { width = .90, }, - prompt_title = false, - results_title = false, - preview_title = false, - vimgrep_arguments = { - "rg", - "--color=never", - "--no-heading", - "--hidden", - "--with-filename", - "--line-number", - "--column", - "--smart-case" - }, - mappings = { - i = { - ["wq"] = require("telescope.actions").close, - [""] = require("telescope.actions").close, - [""] = require("telescope.actions").move_selection_previous, - [""] = require("telescope.actions").move_selection_next, - }, - }, - }, -}) -telescope.load_extension("fzf") diff --git a/config/lua/toggleterm-conf.lua b/config/lua/toggleterm-conf.lua deleted file mode 100644 index 0b22131..0000000 --- a/config/lua/toggleterm-conf.lua +++ /dev/null @@ -1,5 +0,0 @@ -require("toggleterm").setup{ - open_mapping = [[]], - direction = "float", - close_on_exit = true, -} diff --git a/config/minimal-init.lua b/config/minimal-init.lua deleted file mode 100644 index 5a828bf..0000000 --- a/config/minimal-init.lua +++ /dev/null @@ -1,5 +0,0 @@ -require("mini-conf") -require("toggleterm-conf") -require("telescope-conf") --- include our config last to override -require("nvim-conf") diff --git a/filewatch.py b/filewatch.py deleted file mode 100755 index 190ead0..0000000 --- a/filewatch.py +++ /dev/null @@ -1,334 +0,0 @@ -#!/usr/bin/python - -import os -import subprocess -import time -import glob -import syslog -import multiprocessing as mp -from datetime import datetime -from epicutils import getpretend,setpretend - -#-----------------------------------------------------------------------------# -# This script is used to transfer files between Epic and Hosting. Files in # -# /home/epichosted.com//to_epichosting will go to # -# /nfs/temp//from_epic, and files in /nfs/temp//to_epic will go # -# to /home/epichosted.com//from_epichosting. Along the way, a forever # -# copy of each file is taken. # -#-----------------------------------------------------------------------------# - -# Some initial settings are needed -setpretend(False) -domain = subprocess.check_output('realm list --name-only'.split()).strip() -# domain = subprocess.check_output('dnsdomainname').strip() -tempdir = "/nfs/temp" -homedir = "/home/{0}".format(domain) -largedir = "/nfs/temp/large" -log = ("./{0}.log_{1}".format( - "filewatch", datetime.today().strftime("%m%d%Y") - ) - ) -logfile = open(log,'a') - -def parseArgs(): - import argparse - parser = argparse.ArgumentParser(description='File transfer') - parser.add_argument('--type', choices=['epic', 'hosting', 'testlab'], - required=False, - help="Where files from this server are coming from and going to." - ) - args = parser.parse_args() - if args.type: - return args.type - else: - return None - -# Logging utility -def tolog(message): - tosyslog(message) - -def tosyslog(message): - if not getpretend(): - syslog.syslog(message) - -# Alert email -def emailBody(file): - import datetime - import os - body = ("This alert is about your recent SFTP file transfer.\n\n" - "Digital Guardian has classified your file as containing sensitive information " - "including PHI or PII. Your file has been quarantined but can be moved pending " - "additional review.\n\n" - "File: {0}\n" - "Size: {1}kB\n" - "Date: {2}\n\n" - "If your file contains PHI:\n\tProvide the Security Team with the Sherlock SLG " - "you will be attaching the file to.\n\n" - "If your file does not contain PHI:\n\tProvide the Security Team a short description " - "of the contents so we can improve our flagging rules.\n\n" - "If this is an after-hours case and you need the file immediately:\n\tCall the " - "Security on-call representative.\n" - ).format( - file, (os.path.getsize(file)/1000.0), datetime.datetime.now() - ) - return body - -# Send email -def sendEmail(file): - import smtplib - import socket - from email.mime.text import MIMEText - siemList = "soc@epichosted.com" - msg = MIMEText(emailBody(file)) - msg['Subject'] = "Digital Guardian File Transfer Quarantine" - msg['From'] = "tdcr-sftp01@test.lab" - msg['To'] = "{0}@{1}, {2}".format(file.split('/')[3], ('.').join(socket.getfqdn().split('.')[1:]), siemList) - s = smtplib.SMTP('localhost') - s.sendmail(msg['From'], msg['To'].split(','), msg.as_string()) - s.quit() - -# Check if a file is too large to send. -def checkfilesize(file): - # Get file size in bytes - size = os.path.getsize(file) - # Arbitrarily set at 100MB - if file.startswith(homedir) and file.split('/')[4] == 'hosting': - maxsize = 0 - else: - # maxsize = 100000000 - return True - # If the file is too big, stop it from sending. - if size >= maxsize: - return False - else: - return True - -# Scan file -def scanfileav(file): - cmd = ["uvscan", file] - try: - result = subprocess.check_output(cmd) - except Exception, e: - tolog("{0} failed its file scan.".format(file)) - return False - else: - tolog(result) - return True - -# DG classification flags to stop -def taginDgClassFlags(tag): - tolog("Tag is {0}.".format(tag)) - #flags = ["PCI_DATA_LOW", "PCI_DATA_MEDIUM", "PCI_DATA_HIGH", - # "PHI_DATA_LOW", "PHI_DATA_MEDIUM", "PHI_DATA_HIGH", - # "PII_DATA_LOW", "PII_DATA_MEDIUM", "PII_DATA_HIGH", - # "TEST"] - flags = ["DLP_PHI_DATA", "DLP_PII_DATA"] - if tag in flags: - return True - else: - return False - -# Check DG classification -def scanfiledlp(file): - import subprocess - # Need to do read on file to classify with DG - open(file, 'r').close() - output = subprocess.Popen(["/dgagent/dgciapp", file], stdout=subprocess.PIPE, stderr=subprocess.PIPE) - if output.stdout: - outputOut = output.stdout.read() - lines = outputOut.split('#012')[0].split('\n') - for line in lines: - if line.startswith("tag:"): - tag = line.split(":")[1].strip().split('\'')[1] - return tag - if not output.stdout and output.stderr: - tolog("A DG error occurred: {0}".format(output.stderr.read())) - return None - -# Check if tag is okay to move -def checkDGscan(file): - #tolog("Checking DG classification of {0}.".format(file)) - #tag = scanfiledlp(file) - #if tag: - # if taginDgClassFlags(tag): - # tolog("{0} was tagged by DG: {1}. Moving to quarantine.".format(file, tag)) - # return False - return True - -# Copy a file from one place to another. -def copyfile(source, destination): - try: - # Only do the copy if we're not pretending. - if not getpretend(): - p = subprocess.Popen( - ['cp','--preserve=mode,ownership',source,destination] - ) - p.wait() - # Catch OS errors - except OSError, e: - tolog("Couldn't copy {0} to {1}. Error: {2}.".format( - source, destination, e - ) - ) - tosyslog("ERROR,{0},{1},{2}".format(source,destination,e)) - else: - tosyslog("COMPLETE,{0},{1},{2}".format( - source,destination,os.path.getsize(destination) - ) - ) - -# Get forever location -def getforever(source, timestamp): - direlems = source.split('/') - direlems[1]="nfs" - direlems[2]="forever" - direlems.insert(5, str(timestamp)) - direlems.pop(-1) - # Rebuild directory in /nfs/forever - forevercopydir = '/'.join(direlems) - return forevercopydir - -# Copy a file to /nfs/forever. -def copytoforever(file, timestamp): - forevercopydir = getforever(file, timestamp) - forevercopy = os.path.join(forevercopydir,os.path.basename(file)) - copyfile(file,forevercopy) - subprocess.check_call(['gzip',forevercopy]) - -# Move a file from one place to another. This will delete the original -# at the end. -def movefile(source, destination, timestamp): - try: - # Copy the file to /nfs/forever - copytoforever(source, timestamp) - destdir = os.path.dirname(destination) - if not getpretend(): - # Copy the file, then delete it. - copyfile(source, destination) - os.remove(source) - # Catch OS errors - except OSError, e: - tolog("Could not move {0} to {1}. Error: {2}.".format( - source, destination, e - ) - ) - tosyslog("ERROR,{0},{1},{2}".format(source,destination,e)) - -# Move a large file to be handled by CSMs -def movetolarge(source, timestamp): - direlems = source.split('/') - direlems[1] = "nfs" - direlems[2] = "temp" - direlems.insert(3, "large") - largedest = '/'.join(direlems) - if not os.path.isdir(os.path.dirname(largedest)): - os.makedirs(os.path.dirname(largedest)) - movefile(source, largedest, timestamp) - -# Check if file is open. There is a race condition here, but there's not much -# I can do about that. -def checkclosed(file): - size1 = os.path.getsize(file) - time.sleep(5) - size2 = os.path.getsize(file) - if size1 == size2: - return True - else: - return False - -def processonefile(args): - source = args[0] - destination = args[1] - timestamp = args[2] - closed = False - closed = checkclosed(source) - if not closed: - tolog("{0} is open. Skipping.".format(source)) - return - #sizeok = checkfilesize(source) - scanok = scanfileav(source) - dgok = checkDGscan(source) - if scanok and dgok: - movefile(source, destination, timestamp) - else: - tolog("{0} is too large and will have to be moved manually. Moving to " - "/nfs/temp/large.".format(source)) - tosyslog("LARGE,{0},{1}.".format(source, os.path.getsize(source))) - sendEmail(source) - movetolarge(source, timestamp) - -# Get destination -def getdest(direction, source): - destination = "" - if direction == "to": - destination = source.replace(homedir,tempdir,1).replace( - "outgoing","incoming",1) - elif direction == "from": - destination = source.replace(tempdir,homedir,1).replace( - "outgoing","incoming",1) - return destination - -# Build destination directories -def builddestdirs(jobs): - dirs = [] - for job in jobs: - source = job[0] - destination = job[1] - timestamp = job[2] - dest = os.path.dirname(destination) - if not dest in dirs: - dirs.append(dest) - forever = getforever(source, timestamp) - if not forever in dirs: - dirs.append(forever) - for dir in dirs: - if not os.path.isdir(dir): - # tolog("Creating {0}.".format(dir)) - os.makedirs(dir) - -# Go through each user directory in /nfs/temp and /home/ -def walktree(basedir, direction): - jobs = [] - timestamp = time.time() - for userdir in os.listdir(basedir): - if xferType: - userdir = userdir + '/{0}'.format(xferType) - if direction == "to": - filedir = os.path.join(basedir,userdir,"outgoing") - elif direction == "from": - filedir = os.path.join(basedir,userdir,"outgoing") - if not os.path.isdir(os.path.join(basedir,userdir)): - next - for root, dirs, files in os.walk(filedir): - for file in files: - source = os.path.join(root, file) - destination = getdest(direction, source) - jobs.append([source,destination,str(timestamp)]) - for dir in dirs: - fulldir = os.path.join(root,dir) - if os.listdir(fulldir) == []: - try: - os.rmdir(fulldir) - except OSError, e: - tolog("Could not remove {0} because an error " - "occurred. Error: {1}.".format(fulldir, e)) - if jobs == []: - return - builddestdirs(jobs) - pool.map(processonefile, jobs) - -pool = mp.Pool(processes=50) -xferType = parseArgs() -while True: - if logfile.closed: - logfile = open(log,'a') - try: - walktree(homedir,"to") - walktree(tempdir,"from") - except Exception, e: - tosyslog("An error occurred: {0}.".format(e)) - raise Exception("An error occurred: {0}.".format(e)) - else: - time.sleep(5) - logfile.close() - diff --git a/flake.lock b/flake.lock index fcaab2b..23edc03 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1712883908, - "narHash": "sha256-icE1IJE9fHcbDfJ0+qWoDdcBXUoZCcIJxME4lMHwvSM=", + "lastModified": 1722009787, + "narHash": "sha256-JIAhqboOU/JZ8p49lTzTqZbYvPmV6ciUDoQhpLab94w=", "owner": "nixos", "repo": "nixpkgs", - "rev": "a0c9e3aee1000ac2bfb0e5b98c94c946a5d180a9", + "rev": "9014875e6f995a84dd72072e5ef73313e5665faa", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 7f1dcf7..70300ee 100644 --- a/flake.nix +++ b/flake.nix @@ -4,87 +4,64 @@ nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; flake-utils.url = "github:numtide/flake-utils"; }; - outputs = inputs @ {self, nixpkgs, flake-utils, ...}: - flake-utils.lib.eachDefaultSystem (system: let - recursiveMerge = attrList: let - f = attrPath: - builtins.zipAttrsWith (n: values: - if pkgs.lib.tail values == [] - then pkgs.lib.head values - else if pkgs.lib.all pkgs.lib.isList values - then pkgs.lib.unique (pkgs.lib.concatLists values) - else if pkgs.lib.all pkgs.lib.isAttrs values - then f (attrPath ++ [n]) values - else pkgs.lib.last values); - in - f [] attrList; - pkgs = import nixpkgs { - inherit system; - }; - plugins = import ./plugins.nix { - inherit pkgs; - }; - base = { - viAlias = true; - vimAlias = true; - withRuby = false; - withPython3 = false; - }; - dependencies = with pkgs; [ - ripgrep - ]; - full-dependencies = with pkgs; [ - gopls - pyright - nil - ] ++ dependencies; - neovim-with-deps = recursiveMerge [ - pkgs.neovim-unwrapped - { buildInputs = dependencies; } - ]; - neovim-with-full-deps = recursiveMerge [ - pkgs.neovim-unwrapped - { buildInputs = full-dependencies; } - ]; - baseRC = '' + outputs = {self, nixpkgs, flake-utils, ...}: + flake-utils.lib.eachDefaultSystem (system: let + recursiveMerge = attrList: let + f = attrPath: + builtins.zipAttrsWith (n: values: + if pkgs.lib.tail values == [] + then pkgs.lib.head values + else if pkgs.lib.all pkgs.lib.isList values + then pkgs.lib.unique (pkgs.lib.concatLists values) + else if pkgs.lib.all pkgs.lib.isAttrs values + then f (attrPath ++ [n]) values + else pkgs.lib.last values); + in + f [] attrList; + pkgs = import nixpkgs { + inherit system; + }; + plugins = import ./plugins.nix { + inherit pkgs; + }; + dependencies = with pkgs; [ + ripgrep + gopls + pyright + nil + phpactor + ]; + neovim-with-deps = recursiveMerge [ + pkgs.neovim-unwrapped + { buildInputs = dependencies; } + ]; + baseRC = '' lua << EOF package.path = "${self}/config/?.lua;" .. "${self}/config/lua/?.lua;" .. package.path vim.o.runtimepath = "${self}/config," .. vim.o.runtimepath - ''; - in rec { - packages.full = pkgs.wrapNeovim neovim-with-full-deps (base // { - withPython3 = true; - extraMakeWrapperArgs = ''--prefix PATH : "${pkgs.lib.makeBinPath full-dependencies}"''; - configure = { - customRC = - baseRC - + pkgs.lib.readFile ./config/init.lua - + ''EOF''; - packages.plugins = { - start = plugins.base ++ plugins.extra; - }; - }; - }); - packages.minimal = pkgs.wrapNeovim neovim-with-deps (base // { + ''; + in rec { + packages.neovim = pkgs.wrapNeovim neovim-with-deps ({ + viAlias = true; + vimAlias = true; + withRuby = false; + withPython3 = true; extraMakeWrapperArgs = ''--prefix PATH : "${pkgs.lib.makeBinPath dependencies}"''; configure = { customRC = baseRC - + pkgs.lib.readFile ./config/minimal-init.lua + + pkgs.lib.readFile ./config/init.lua + ''EOF''; - packages.plugins = { - start = plugins.base; - }; + packages.plugins = { + start = plugins.base; }; - }); - - apps.full = flake-utils.lib.mkApp { - drv = packages.full; name = "neovim"; exePath = "/bin/nvim"; }; - apps.minimal = flake-utils.lib.mkApp { - drv = packages.minimal; name = "neovim"; exePath = "/bin/nvim"; - }; - apps.default = apps.full; - packages.default = packages.full; }); - } + + apps.neovim = flake-utils.lib.mkApp { + drv = packages.neovim; name = "neovim"; exePath = "/bin/nvim"; + }; + apps.default = apps.neovim; + packages.default = packages.neovim; + }); +} diff --git a/plugins.nix b/plugins.nix index d672391..e4dc663 100644 --- a/plugins.nix +++ b/plugins.nix @@ -1,19 +1,20 @@ {pkgs, ...}: { base = with pkgs.vimPlugins; [ - telescope-nvim - telescope-fzf-native-nvim - toggleterm-nvim - mini-nvim - ]; - extra = with pkgs.vimPlugins; [ - rose-pine + diffview-nvim gitsigns-nvim - oil-nvim - nvim-lspconfig - nvim-treesitter.withAllGrammars - nvim-treesitter-textobjects - vim-nix + mini-nvim neogit + nvim-lspconfig + nvim-treesitter-textobjects + nvim-treesitter.withAllGrammars + oil-nvim + refactoring-nvim + rose-pine + telescope-fzf-native-nvim + telescope-nvim + toggleterm-nvim + undotree + vim-nix ]; } From 062f6cd5a14d05c978bbd77ec9672cb7038c29ce Mon Sep 17 00:00:00 2001 From: iofq Date: Fri, 26 Jul 2024 23:40:26 -0500 Subject: [PATCH 052/160] Shrink image size --- config/init.lua | 1 - flake.nix | 6 ++---- plugins.nix | 28 +++++++++++++++++++++++++++- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/config/init.lua b/config/init.lua index 3a204ed..3e97421 100644 --- a/config/init.lua +++ b/config/init.lua @@ -120,7 +120,6 @@ end } lspconfig.pyright.setup {} lspconfig.nil_ls.setup {} -lspconfig.phpactor.setup {} -- Global mappings. -- See `:help vim.diagnostic.*` for documentation on any of the below functions diff --git a/flake.nix b/flake.nix index 70300ee..8733756 100644 --- a/flake.nix +++ b/flake.nix @@ -29,7 +29,6 @@ gopls pyright nil - phpactor ]; neovim-with-deps = recursiveMerge [ pkgs.neovim-unwrapped @@ -42,10 +41,10 @@ ''; in rec { packages.neovim = pkgs.wrapNeovim neovim-with-deps ({ - viAlias = true; + viAlias = false; vimAlias = true; withRuby = false; - withPython3 = true; + withPython3 = false; extraMakeWrapperArgs = ''--prefix PATH : "${pkgs.lib.makeBinPath dependencies}"''; configure = { customRC = @@ -57,7 +56,6 @@ }; }; }); - apps.neovim = flake-utils.lib.mkApp { drv = packages.neovim; name = "neovim"; exePath = "/bin/nvim"; }; diff --git a/plugins.nix b/plugins.nix index e4dc663..aa4bf1c 100644 --- a/plugins.nix +++ b/plugins.nix @@ -7,7 +7,33 @@ neogit nvim-lspconfig nvim-treesitter-textobjects - nvim-treesitter.withAllGrammars + (nvim-treesitter.withPlugins(p: with p; [ + tree-sitter-bash + tree-sitter-c + tree-sitter-comment + tree-sitter-css + tree-sitter-dockerfile + tree-sitter-embedded-template + tree-sitter-go + tree-sitter-gomod + tree-sitter-hcl + tree-sitter-html + tree-sitter-javascript + tree-sitter-json + tree-sitter-lua + tree-sitter-make + tree-sitter-markdown + tree-sitter-markdown-inline + tree-sitter-nix + tree-sitter-php + tree-sitter-python + tree-sitter-regex + tree-sitter-ruby + tree-sitter-sql + tree-sitter-toml + tree-sitter-typescript + tree-sitter-yaml + ])) oil-nvim refactoring-nvim rose-pine From 62b7e838d9313eee44289b683f074dac225306d1 Mon Sep 17 00:00:00 2001 From: iofq Date: Sat, 27 Jul 2024 00:57:13 -0500 Subject: [PATCH 053/160] fix neogit --- README.md | 2 +- config/init.lua | 11 ++++++----- config/lua/telescope-conf.lua | 0 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 config/lua/telescope-conf.lua diff --git a/README.md b/README.md index 63c4ce8..f7968a9 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ## Usage ```bash -nix run "github:iofq/nvim.nix" #full +nix run "github:iofq/nvim.nix" #neovim ``` Or, grab an AppImage from the Releases page. diff --git a/config/init.lua b/config/init.lua index 3e97421..2b22b6f 100644 --- a/config/init.lua +++ b/config/init.lua @@ -16,14 +16,13 @@ require("toggleterm").setup{ -- Telescope -------------------- local telescope = require("telescope.builtin") -vim.keymap.set("n", "fb", telescope.buffers, {noremap = true, silent = true}) +vim.keymap.set("n", "", telescope.buffers, {noremap = true, silent = true}) vim.keymap.set("n", "ff", telescope.find_files, {noremap = true, silent = true}) vim.keymap.set("n", "fg", telescope.git_files, {noremap = true, silent = true}) -vim.keymap.set("n", "fv", telescope.command_history, {noremap = true, silent = true}) +vim.keymap.set("n", "fc", telescope.command_history, {noremap = true, silent = true}) vim.keymap.set("n", "fa", telescope.live_grep, {noremap = true, silent = true}) vim.keymap.set("n", "f8", telescope.grep_string, {noremap = true, silent = true}) vim.keymap.set("n", "f", telescope.resume, {noremap = true, silent = true}) -vim.keymap.set("n", "fs", telescope.git_status, {noremap = true, silent = true}) local telescope = require("telescope") telescope.setup({ @@ -183,12 +182,14 @@ require('gitsigns').setup{ end } +require("diffview").setup({ + use_icons = false, +}) + local neogit = require('neogit') neogit.setup {integrations = {diffview = true}} vim.keymap.set('n', 'ng', neogit.open) -require("diffview") - -------------------- -- Oil & Undo -------------------- diff --git a/config/lua/telescope-conf.lua b/config/lua/telescope-conf.lua deleted file mode 100644 index e69de29..0000000 From 2a6ff7e85a6718d975eecc16a646f2119e2c10be Mon Sep 17 00:00:00 2001 From: iofq Date: Thu, 8 Aug 2024 01:19:53 -0500 Subject: [PATCH 054/160] icmp and snip rice --- config/init.lua | 92 +++++++++++++++++++++++++++++++++++++++- config/lua/mini-conf.lua | 27 ++++++------ config/lua/nvim-conf.lua | 21 ++++----- config/lua/snippets.lua | 3 ++ plugins.nix | 10 +++++ 5 files changed, 126 insertions(+), 27 deletions(-) create mode 100644 config/lua/snippets.lua diff --git a/config/init.lua b/config/init.lua index 2b22b6f..d7ab949 100644 --- a/config/init.lua +++ b/config/init.lua @@ -22,6 +22,9 @@ vim.keymap.set("n", "fg", telescope.git_files, {noremap = true, silent = vim.keymap.set("n", "fc", telescope.command_history, {noremap = true, silent = true}) vim.keymap.set("n", "fa", telescope.live_grep, {noremap = true, silent = true}) vim.keymap.set("n", "f8", telescope.grep_string, {noremap = true, silent = true}) +vim.keymap.set("n", "fs", telescope.treesitter, {noremap = true, silent = true}) +vim.keymap.set("n", "fq", telescope.quickfix, {noremap = true, silent = true}) +vim.keymap.set("n", "fq", telescope.quickfix, {noremap = true, silent = true}) vim.keymap.set("n", "f", telescope.resume, {noremap = true, silent = true}) local telescope = require("telescope") @@ -113,12 +116,14 @@ require("nvim-treesitter.configs").setup { -- Setup language servers. local lspconfig = require('lspconfig') +local capabilities = require('cmp_nvim_lsp').default_capabilities() lspconfig.gopls.setup { on_attach = function(_, bufnr) + capabilities = capabilities vim.api.nvim_command("au BufWritePre lua vim.lsp.buf.format { async = false }") end } -lspconfig.pyright.setup {} -lspconfig.nil_ls.setup {} +lspconfig.pyright.setup { capabilities = capabilities } +lspconfig.nil_ls.setup { capabilities = capabilities } -- Global mappings. -- See `:help vim.diagnostic.*` for documentation on any of the below functions @@ -149,6 +154,8 @@ vim.api.nvim_create_autocmd('LspAttach', { vim.keymap.set("n", "dr", "Telescope lsp_references", { buffer = bufnr }) vim.keymap.set("n", "dt", "Telescope lsp_type_definitions", { buffer = bufnr }) vim.keymap.set("n", "ds", "Telescope lsp_document_symbols", { buffer = bufnr }) + vim.keymap.set('n', 'dl', vim.lsp.codelens.run) + vim.keymap.set('n', 'dg', vim.diagnostic.setqflist) vim.keymap.set('n', 'df', function() vim.lsp.buf.format { async = true } end, opts) @@ -239,6 +246,87 @@ require("rose-pine").setup({ }) vim.cmd.colorscheme "rose-pine-main" +-------------------- +-- Neogen +-------------------- +require("neogen").setup{} +vim.keymap.set("n","nd", "Neogen", {noremap = true, silent = true}) + +-------------------- +---Completion +-------------------- +local cmp = require'cmp' + +cmp.setup({ + snippet = { + expand = function(args) + require('luasnip').lsp_expand(args.body) + end, + }, + mapping = cmp.mapping.preset.insert({ + [''] = cmp.mapping.scroll_docs(-4), + [''] = cmp.mapping.scroll_docs(4), + [''] = cmp.mapping.complete(), + ['q'] = cmp.mapping.abort(), + [''] = cmp.mapping.confirm({ select = true }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. + }), + sources = cmp.config.sources({ + { name = 'nvim_lsp' }, + { name = 'luasnip' }, + }, { + { name = 'buffer' }, + }) +}) + +cmp.setup.cmdline({ '/', '?' }, { + mapping = cmp.mapping.preset.cmdline(), + sources = { + { name = 'buffer' } + } +}) + +cmp.setup.cmdline(':', { + mapping = cmp.mapping.preset.cmdline(), + sources = cmp.config.sources({ + { name = 'path' } + }, { + { name = 'cmdline' } + }), + matching = { disallow_symbol_nonprefix_matching = false } +}) + +-------------------- +-- Luasnip +-------------------- +local ls = require("luasnip") +ls.config.set_config { + history = true, + updateevents = "TextChanged, TextChangedI", +} +require("luasnip.loaders.from_vscode").lazy_load() + +vim.keymap.set({"i", "s"}, "", function() + if ls.expand_or_jumpable() then + ls.expand_or_jump() + end +end, {silent = true}) + +vim.keymap.set({"i", "s"}, "", function() + if ls.jumpable(-1) then + ls.jump(-1) + end +end, {silent = true}) + +vim.keymap.set({"i", "s"}, "", function() + if ls.choice_active() then + ls.change_choice(1) + end +end, {silent = true}) + +-------------------- +-- Snippets +-------------------- +require("snippets") -------------------- -- include our config last to override -------------------- diff --git a/config/lua/mini-conf.lua b/config/lua/mini-conf.lua index fb06196..184101f 100644 --- a/config/lua/mini-conf.lua +++ b/config/lua/mini-conf.lua @@ -53,9 +53,10 @@ require('mini.pairs').setup( mappings = { ['['] = { action = 'open', pair = '[]', neigh_pattern = '[^\\].' }, ['{'] = { action = 'open', pair = '{}', neigh_pattern = '[^\\].' }, - [']'] = { action = 'close', pair = '[]', neigh_pattern = '[^\\].' }, ['}'] = { action = 'close', pair = '{}', neigh_pattern = '[^\\].' }, + ['"'] = { }, + ['\''] = { }, }, } ) @@ -75,15 +76,15 @@ indent.setup({ indent.gen_animation.none() -- -require('mini.completion').setup({ - delay = {completion = 10^7}, - window = { - info = { height = 25, width = 80, border = 'single' }, - signature = { height = 25, width = 80, border = 'single' }, - }, - lsp_completion = { - source_func = 'completefunc', - auto_setup = true, - }, - fallback_action = "" -}) +-- require('mini.completion').setup({ +-- delay = {completion = 10^7}, +-- window = { +-- info = { height = 25, width = 80, border = 'single' }, +-- signature = { height = 25, width = 80, border = 'single' }, +-- }, +-- lsp_completion = { +-- source_func = 'completefunc', +-- auto_setup = true, +-- }, +-- fallback_action = "" +-- }) diff --git a/config/lua/nvim-conf.lua b/config/lua/nvim-conf.lua index b2afb85..c7f7014 100644 --- a/config/lua/nvim-conf.lua +++ b/config/lua/nvim-conf.lua @@ -1,7 +1,6 @@ -- vim settings ++ mini.nvim.basics ---------------------------------------- vim.opt.backspace = "indent,eol,start" -vim.opt.clipboard = "unnamedplus" -- use system clipboard vim.opt.completeopt = "menuone" vim.opt.expandtab = true -- insert tabs as spaces vim.opt.inccommand = "split" -- incremental live completion @@ -27,20 +26,18 @@ vim.g.indent_blankline_use_treesitter = true -- no highlight floats vim.cmd([[ hi NormalFloat ctermbg=none ]]) - -- mappings ---------------------------------------- -local remap = function(type, key, value) - vim.api.nvim_set_keymap(type,key,value,{noremap = true, silent = true}); -end - -remap("i", "wq", "l") -remap("v", "wq", "l") -remap("n","gr", "gT") -remap("n","n", "nzz") -remap("n", "N", "Nzz") -remap("n","", "m0i`0") +vim.keymap.set("n","gr", "gT", {noremap = true, silent = true}) +vim.keymap.set("n","n", "nzz", {noremap = true, silent = true}) +vim.keymap.set("n", "N", "Nzz", {noremap = true, silent = true}) +vim.keymap.set("n","", "m0i`0", {noremap = true, silent = true}) +vim.keymap.set({'v', 'i'}, 'wq', 'l', {noremap = true, silent = true}) +vim.keymap.set({'n', 'v', 'i'}, 'qwq', 'lwqa', {noremap = true, silent = true}) +vim.keymap.set({'n', 'v'}, 'yy', '"+y', {noremap = true, silent = true}) +vim.keymap.set({'n', 'v'}, 'yp', '"+p', {noremap = true, silent = true}) +vim.keymap.set({'n', 'v'}, 'yd', '"+d', {noremap = true, silent = true}) -- Switch tab length on the fly vim.keymap.set("n", "\\t", function() diff --git a/config/lua/snippets.lua b/config/lua/snippets.lua new file mode 100644 index 0000000..732c9f3 --- /dev/null +++ b/config/lua/snippets.lua @@ -0,0 +1,3 @@ +ls.add_snippets("go", { + s("ie", fmta("if err != nil {\n\treturn \n}", { err = i(1, "err") })), +}) diff --git a/plugins.nix b/plugins.nix index aa4bf1c..5c0f151 100644 --- a/plugins.nix +++ b/plugins.nix @@ -1,10 +1,20 @@ {pkgs, ...}: { base = with pkgs.vimPlugins; [ + cmp-buffer + cmp-cmdline + cmp-nvim-lsp + cmp-path + cmp-treesitter + cmp_luasnip diffview-nvim + friendly-snippets gitsigns-nvim + luasnip mini-nvim + neogen neogit + nvim-cmp nvim-lspconfig nvim-treesitter-textobjects (nvim-treesitter.withPlugins(p: with p; [ From 8c0ff1e4992ed90cd00319fad91f6c0f5c055e8a Mon Sep 17 00:00:00 2001 From: iofq Date: Thu, 8 Aug 2024 02:01:26 -0500 Subject: [PATCH 055/160] add aerial --- config/init.lua | 19 ++++++++++++++++++- config/lua/snippets.lua | 5 ++++- plugins.nix | 1 + 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/config/init.lua b/config/init.lua index d7ab949..bda5e1f 100644 --- a/config/init.lua +++ b/config/init.lua @@ -202,6 +202,7 @@ vim.keymap.set('n', 'ng', neogit.open) -------------------- local oil = require('oil') oil.setup({ + watch_for_changes = true, columns = { "permissions", "size" @@ -214,9 +215,25 @@ oil.setup({ } }) vim.keymap.set("n", "c", oil.toggle_float, {noremap = true, silent = true}); - vim.keymap.set("n", "u", "UndotreeToggle") +vim.g.undotree_ShortIndicators = 1 +vim.g.undotree_SetFocusWhenToggle = 1 +-------------------- +-- Aerial +-------------------- +require("aerial").setup({ + default_direction = "prefer_left", + autojump = true, + on_attach = function(bufnr) + vim.keymap.set("n", "{", "AerialPrev", { buffer = bufnr }) + vim.keymap.set("n", "}", "AerialNext", { buffer = bufnr }) + end, +}) +vim.keymap.set("n", "aa", "AerialToggle!") + + +--- -------------------- -- Refactoring -------------------- diff --git a/config/lua/snippets.lua b/config/lua/snippets.lua index 732c9f3..1a55309 100644 --- a/config/lua/snippets.lua +++ b/config/lua/snippets.lua @@ -1,3 +1,6 @@ +local ls = require "luasnip" + +local fmta = require("luasnip.extras.fmt").fmta ls.add_snippets("go", { - s("ie", fmta("if err != nil {\n\treturn \n}", { err = i(1, "err") })), + ls.snippet("ie", fmta("if err != nil {\n\treturn \n}", { err = ls.insert_node(1, "err") })), }) diff --git a/plugins.nix b/plugins.nix index 5c0f151..481752c 100644 --- a/plugins.nix +++ b/plugins.nix @@ -1,6 +1,7 @@ {pkgs, ...}: { base = with pkgs.vimPlugins; [ + aerial-nvim cmp-buffer cmp-cmdline cmp-nvim-lsp From 53bfda8bcd150bd3f502111d00439c3ca7f335b1 Mon Sep 17 00:00:00 2001 From: iofq Date: Thu, 8 Aug 2024 02:03:25 -0500 Subject: [PATCH 056/160] flake.lock: Update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'nixpkgs': 'github:nixos/nixpkgs/9014875e6f995a84dd72072e5ef73313e5665faa' (2024-07-26) → 'github:nixos/nixpkgs/f5129fb42b9c262318130a97b47516946da3e7d7' (2024-08-07) --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 23edc03..8d33b83 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1722009787, - "narHash": "sha256-JIAhqboOU/JZ8p49lTzTqZbYvPmV6ciUDoQhpLab94w=", + "lastModified": 1723019560, + "narHash": "sha256-O/kxmybNecC3Efr6ITOdtCzFv90/B2Iiedavj5aRWt0=", "owner": "nixos", "repo": "nixpkgs", - "rev": "9014875e6f995a84dd72072e5ef73313e5665faa", + "rev": "f5129fb42b9c262318130a97b47516946da3e7d7", "type": "github" }, "original": { From b33413dd18340d20b7c2baf7db91d95b196c8ef8 Mon Sep 17 00:00:00 2001 From: iofq Date: Sat, 10 Aug 2024 01:44:12 -0500 Subject: [PATCH 057/160] use kickstart-nix --- .envrc | 1 + .gitignore | 5 +- .stylua.toml | 6 + LICENSE | 339 +++++++++++++++++ README.md | 3 + config/ftplugin/nix.lua | 1 - config/init.lua | 350 ------------------ config/lua/snippets.lua | 6 - flake.lock | 76 +++- flake.nix | 109 +++--- nix/mkNeovim.nix | 202 ++++++++++ nix/neovim-overlay.nix | 105 ++++++ nvim/after/README.md | 8 + nvim/after/plugin/color.lua | 2 + nvim/ftplugin/.gitkeep | 0 config/lua/nvim-conf.lua => nvim/init.lua | 63 +++- nvim/lua/.gitkeep | 0 nvim/plugin/aerial.lua | 13 + nvim/plugin/colors.lua | 19 + nvim/plugin/completion.lua | 47 +++ nvim/plugin/diffview.lua | 7 + nvim/plugin/git.lua | 7 + nvim/plugin/gitsigns.lua | 30 ++ nvim/plugin/keymaps.lua | 13 + nvim/plugin/lsp.lua | 65 ++++ nvim/plugin/lualine.lua | 11 + nvim/plugin/luasnip.lua | 37 ++ .../lua/mini-conf.lua => nvim/plugin/mini.lua | 33 +- nvim/plugin/misc.lua | 20 + nvim/plugin/neogit.lua | 15 + nvim/plugin/oil.lua | 23 ++ nvim/plugin/statuscol.lua | 7 + nvim/plugin/telescope.lua | 62 ++++ nvim/plugin/treesitter.lua | 65 ++++ nvim/plugin/which-key.lua | 3 + plugins.nix | 57 --- 36 files changed, 1291 insertions(+), 519 deletions(-) create mode 100644 .envrc create mode 100644 .stylua.toml create mode 100644 LICENSE delete mode 100644 config/ftplugin/nix.lua delete mode 100644 config/init.lua delete mode 100644 config/lua/snippets.lua create mode 100644 nix/mkNeovim.nix create mode 100644 nix/neovim-overlay.nix create mode 100644 nvim/after/README.md create mode 100644 nvim/after/plugin/color.lua create mode 100644 nvim/ftplugin/.gitkeep rename config/lua/nvim-conf.lua => nvim/init.lua (50%) create mode 100644 nvim/lua/.gitkeep create mode 100644 nvim/plugin/aerial.lua create mode 100644 nvim/plugin/colors.lua create mode 100644 nvim/plugin/completion.lua create mode 100644 nvim/plugin/diffview.lua create mode 100644 nvim/plugin/git.lua create mode 100644 nvim/plugin/gitsigns.lua create mode 100644 nvim/plugin/keymaps.lua create mode 100644 nvim/plugin/lsp.lua create mode 100644 nvim/plugin/lualine.lua create mode 100644 nvim/plugin/luasnip.lua rename config/lua/mini-conf.lua => nvim/plugin/mini.lua (67%) create mode 100644 nvim/plugin/misc.lua create mode 100644 nvim/plugin/neogit.lua create mode 100644 nvim/plugin/oil.lua create mode 100644 nvim/plugin/statuscol.lua create mode 100644 nvim/plugin/telescope.lua create mode 100644 nvim/plugin/treesitter.lua create mode 100644 nvim/plugin/which-key.lua delete mode 100644 plugins.nix diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..a1d3540 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake . -Lv diff --git a/.gitignore b/.gitignore index e4f792f..a0a4ae3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ -*.AppImage -squashfs-root result +*.AppImage +.direnv +.luarc.json diff --git a/.stylua.toml b/.stylua.toml new file mode 100644 index 0000000..4fe0607 --- /dev/null +++ b/.stylua.toml @@ -0,0 +1,6 @@ +line_endings = "Unix" +indent_type = "Spaces" +indent_width = 2 +quote_style = "AutoPreferSingle" +call_parentheses = "NoSingleTable" +# collapse_simple_statement = "Never" diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/README.md b/README.md index f7968a9..53d45fa 100644 --- a/README.md +++ b/README.md @@ -14,3 +14,6 @@ This is a flake to build a Neovim package that includes my custom Lua config and ## Why the hell though? I use these AppImages because I develop in a number of airgapped environments that make traditional dotfile management a nightmare. Downloading a single AppImage and copying it around is a more suckless way of managing this. + +## kickstart-nix-nvim +This repo is based off https://github.com/nix-community/kickstart-nix.nvim diff --git a/config/ftplugin/nix.lua b/config/ftplugin/nix.lua deleted file mode 100644 index 3c844d9..0000000 --- a/config/ftplugin/nix.lua +++ /dev/null @@ -1 +0,0 @@ -vim.opt_local.tabstop = 2 diff --git a/config/init.lua b/config/init.lua deleted file mode 100644 index bda5e1f..0000000 --- a/config/init.lua +++ /dev/null @@ -1,350 +0,0 @@ --------------------- --- Mini --------------------- -require("mini-conf") - --------------------- --- Toggleterm --------------------- -require("toggleterm").setup{ - open_mapping = [[]], - direction = "float", - close_on_exit = true, -} - --------------------- --- Telescope --------------------- -local telescope = require("telescope.builtin") -vim.keymap.set("n", "", telescope.buffers, {noremap = true, silent = true}) -vim.keymap.set("n", "ff", telescope.find_files, {noremap = true, silent = true}) -vim.keymap.set("n", "fg", telescope.git_files, {noremap = true, silent = true}) -vim.keymap.set("n", "fc", telescope.command_history, {noremap = true, silent = true}) -vim.keymap.set("n", "fa", telescope.live_grep, {noremap = true, silent = true}) -vim.keymap.set("n", "f8", telescope.grep_string, {noremap = true, silent = true}) -vim.keymap.set("n", "fs", telescope.treesitter, {noremap = true, silent = true}) -vim.keymap.set("n", "fq", telescope.quickfix, {noremap = true, silent = true}) -vim.keymap.set("n", "fq", telescope.quickfix, {noremap = true, silent = true}) -vim.keymap.set("n", "f", telescope.resume, {noremap = true, silent = true}) - -local telescope = require("telescope") -telescope.setup({ - defaults = { - layout_strategy = "vertical", - layout_config = { width = .90, }, - prompt_title = false, - results_title = false, - preview_title = false, - vimgrep_arguments = { - "rg", - "--color=never", - "--no-heading", - "--hidden", - "--with-filename", - "--line-number", - "--column", - "--smart-case" - }, - mappings = { - i = { - ["wq"] = require("telescope.actions").close, - [""] = require("telescope.actions").close, - [""] = require("telescope.actions").move_selection_previous, - [""] = require("telescope.actions").move_selection_next, - }, - }, - }, -}) -telescope.load_extension("fzf") - --------------------- --- Treesitter --------------------- -require("nvim-treesitter.configs").setup { - ensure_installed = {}, - highlight = { - enable = true, - }, - indent = { - enable = true, - }, - textobjects = { - select = { - enable = true, - lookahead = true, - keymaps = { - ["af"] = "@function.outer", - ["if"] = "@function.inner", - ["aa"] = "@statement.outer", - ["ia"] = "@parameter.inner", - }, - }, - move = { - enable = true, - set_jumps = true, -- whether to set jumps in the jumplist - goto_next_start = { - [']]'] = '@function.outer', - [']a'] = '@parameter.inner', - }, - goto_previous_start = { - ['[['] = '@function.outer', - ['[a'] = '@parameter.inner', - }, - }, - swap = { - enable = true, - swap_next = { - ["s]"] = "@parameter.inner", - }, - swap_previous = { - ["s["] = "@parameter.inner", - }, - }, }, - incremental_selection = { - enable = true, - keymaps = { - init_selection = '', - node_incremental = '', - node_decremental = '', - }, - }, -} - --------------------- --- LSP Config --------------------- - --- Setup language servers. -local lspconfig = require('lspconfig') -local capabilities = require('cmp_nvim_lsp').default_capabilities() -lspconfig.gopls.setup { on_attach = function(_, bufnr) - capabilities = capabilities - vim.api.nvim_command("au BufWritePre lua vim.lsp.buf.format { async = false }") -end -} -lspconfig.pyright.setup { capabilities = capabilities } -lspconfig.nil_ls.setup { capabilities = capabilities } - --- Global mappings. --- See `:help vim.diagnostic.*` for documentation on any of the below functions -vim.keymap.set('n', 'de', vim.diagnostic.open_float) -vim.keymap.set('n', '[d', vim.diagnostic.goto_prev) -vim.keymap.set('n', ']d', vim.diagnostic.goto_next) - -vim.diagnostic.config({ - virtual_text = true, - underline = true, - update_in_insert = false, -}) --- Use LspAttach autocommand to only map the following keys --- after the language server attaches to the current buffer -vim.api.nvim_create_autocmd('LspAttach', { - group = vim.api.nvim_create_augroup('UserLspConfig', {}), - callback = function(ev) - -- Enable completion triggered by - vim.bo[ev.buf].omnifunc = 'v:lua.vim.lsp.omnifunc' - -- Buffer local mappings. - -- See `:help vim.lsp.*` for documentation on any of the below functions - local opts = { buffer = ev.buf } - vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts) - vim.keymap.set('n', 'rn', vim.lsp.buf.rename, opts) - vim.keymap.set({ 'n', 'v' }, 'da', vim.lsp.buf.code_action, opts) - vim.keymap.set("n", "dd", "Telescope lsp_definitions", { buffer = bufnr }) - vim.keymap.set("n", "di", "Telescope lsp_implementations", { buffer = bufnr }) - vim.keymap.set("n", "dr", "Telescope lsp_references", { buffer = bufnr }) - vim.keymap.set("n", "dt", "Telescope lsp_type_definitions", { buffer = bufnr }) - vim.keymap.set("n", "ds", "Telescope lsp_document_symbols", { buffer = bufnr }) - vim.keymap.set('n', 'dl', vim.lsp.codelens.run) - vim.keymap.set('n', 'dg', vim.diagnostic.setqflist) - vim.keymap.set('n', 'df', function() - vim.lsp.buf.format { async = true } - end, opts) - end, -}) - --------------------- --- Git --------------------- -require('gitsigns').setup{ - signcolumn = false, - numhl = true, - on_attach = function() - local gs = package.loaded.gitsigns - vim.keymap.set("n", "gg", gs.preview_hunk) - vim.keymap.set('n', 'gb', function() gs.blame_line{full=true} end) - vim.keymap.set('n', 'gr', gs.reset_hunk) - vim.keymap.set('v', 'gr', function() gs.reset_hunk {vim.fn.line('.'), vim.fn.line('v')} end) - -- Navigation - vim.keymap.set('n', ']g', function() - if vim.wo.diff then return ']c' end - vim.schedule(function() gs.next_hunk() end) - return '' - end, {expr=true}) - - vim.keymap.set('n', '[g', function() - if vim.wo.diff then return '[c' end - vim.schedule(function() gs.prev_hunk() end) - return '' - end, {expr=true}) - end -} - -require("diffview").setup({ - use_icons = false, -}) - -local neogit = require('neogit') -neogit.setup {integrations = {diffview = true}} -vim.keymap.set('n', 'ng', neogit.open) - --------------------- --- Oil & Undo --------------------- -local oil = require('oil') -oil.setup({ - watch_for_changes = true, - columns = { - "permissions", - "size" - }, - view_options = { - show_hidden = true - }, - keymaps = { - ["wq"] = "actions.close" - } -}) -vim.keymap.set("n", "c", oil.toggle_float, {noremap = true, silent = true}); -vim.keymap.set("n", "u", "UndotreeToggle") -vim.g.undotree_ShortIndicators = 1 -vim.g.undotree_SetFocusWhenToggle = 1 - --------------------- --- Aerial --------------------- -require("aerial").setup({ - default_direction = "prefer_left", - autojump = true, - on_attach = function(bufnr) - vim.keymap.set("n", "{", "AerialPrev", { buffer = bufnr }) - vim.keymap.set("n", "}", "AerialNext", { buffer = bufnr }) - end, -}) -vim.keymap.set("n", "aa", "AerialToggle!") - - ---- --------------------- --- Refactoring --------------------- -require('refactoring').setup({ - prompt_func_return_type = { go = true, }, - prompt_func_param_type = { go = true, }, - show_success_message = true, -}) - -require("telescope").load_extension("refactoring") -vim.keymap.set( - {"n"}, - "rr", - function() require('telescope').extensions.refactoring.refactors() end -) --------------------- --- Colors --------------------- - -require("rose-pine").setup({ - variant = "moon", - styles = { - bold = false, - italic = false, - transparency = true, - }, -}) -vim.cmd.colorscheme "rose-pine-main" - --------------------- --- Neogen --------------------- -require("neogen").setup{} -vim.keymap.set("n","nd", "Neogen", {noremap = true, silent = true}) - --------------------- ----Completion --------------------- -local cmp = require'cmp' - -cmp.setup({ - snippet = { - expand = function(args) - require('luasnip').lsp_expand(args.body) - end, - }, - mapping = cmp.mapping.preset.insert({ - [''] = cmp.mapping.scroll_docs(-4), - [''] = cmp.mapping.scroll_docs(4), - [''] = cmp.mapping.complete(), - ['q'] = cmp.mapping.abort(), - [''] = cmp.mapping.confirm({ select = true }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. - }), - sources = cmp.config.sources({ - { name = 'nvim_lsp' }, - { name = 'luasnip' }, - }, { - { name = 'buffer' }, - }) -}) - -cmp.setup.cmdline({ '/', '?' }, { - mapping = cmp.mapping.preset.cmdline(), - sources = { - { name = 'buffer' } - } -}) - -cmp.setup.cmdline(':', { - mapping = cmp.mapping.preset.cmdline(), - sources = cmp.config.sources({ - { name = 'path' } - }, { - { name = 'cmdline' } - }), - matching = { disallow_symbol_nonprefix_matching = false } -}) - --------------------- --- Luasnip --------------------- -local ls = require("luasnip") -ls.config.set_config { - history = true, - updateevents = "TextChanged, TextChangedI", -} -require("luasnip.loaders.from_vscode").lazy_load() - -vim.keymap.set({"i", "s"}, "", function() - if ls.expand_or_jumpable() then - ls.expand_or_jump() - end -end, {silent = true}) - -vim.keymap.set({"i", "s"}, "", function() - if ls.jumpable(-1) then - ls.jump(-1) - end -end, {silent = true}) - -vim.keymap.set({"i", "s"}, "", function() - if ls.choice_active() then - ls.change_choice(1) - end -end, {silent = true}) - --------------------- --- Snippets --------------------- -require("snippets") --------------------- --- include our config last to override --------------------- -require("nvim-conf") diff --git a/config/lua/snippets.lua b/config/lua/snippets.lua deleted file mode 100644 index 1a55309..0000000 --- a/config/lua/snippets.lua +++ /dev/null @@ -1,6 +0,0 @@ -local ls = require "luasnip" - -local fmta = require("luasnip.extras.fmt").fmta -ls.add_snippets("go", { - ls.snippet("ie", fmta("if err != nil {\n\treturn \n}", { err = ls.insert_node(1, "err") })), -}) diff --git a/flake.lock b/flake.lock index 8d33b83..e72b4c6 100644 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,23 @@ { "nodes": { + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1717285511, + "narHash": "sha256-iKzJcpdXih14qYVcZ9QC9XuZYnPc6T8YImb6dX166kw=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "2a55567fcf15b1b1c7ed712a2c6fadaec7412ea8", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, "flake-utils": { "inputs": { "systems": "systems" @@ -18,18 +36,65 @@ "type": "github" } }, + "gen-luarc": { + "inputs": { + "flake-parts": "flake-parts", + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1718922730, + "narHash": "sha256-ykhhOPqA9NzdNBr3ii+3h2DkK2+wasNqQLfMF6BXxTE=", + "owner": "mrcjkb", + "repo": "nix-gen-luarc-json", + "rev": "021e8078e43884c6cdc70ca753d9a0b146cd55a4", + "type": "github" + }, + "original": { + "owner": "mrcjkb", + "repo": "nix-gen-luarc-json", + "type": "github" + } + }, "nixpkgs": { "locked": { - "lastModified": 1723019560, - "narHash": "sha256-O/kxmybNecC3Efr6ITOdtCzFv90/B2Iiedavj5aRWt0=", + "lastModified": 1718714799, + "narHash": "sha256-FUZpz9rg3gL8NVPKbqU8ei1VkPLsTIfAJ2fdAf5qjak=", "owner": "nixos", "repo": "nixpkgs", - "rev": "f5129fb42b9c262318130a97b47516946da3e7d7", + "rev": "c00d587b1a1afbf200b1d8f0b0e4ba9deb1c7f0e", "type": "github" }, "original": { "owner": "nixos", - "ref": "nixpkgs-unstable", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "lastModified": 1717284937, + "narHash": "sha256-lIbdfCsf8LMFloheeE6N31+BMIeixqyQWbSr2vk79EQ=", + "type": "tarball", + "url": "https://github.com/NixOS/nixpkgs/archive/eb9ceca17df2ea50a250b6b27f7bf6ab0186f198.tar.gz" + }, + "original": { + "type": "tarball", + "url": "https://github.com/NixOS/nixpkgs/archive/eb9ceca17df2ea50a250b6b27f7bf6ab0186f198.tar.gz" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1723175592, + "narHash": "sha256-M0xJ3FbDUc4fRZ84dPGx5VvgFsOzds77KiBMW/mMTnI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "5e0ca22929f3342b19569b21b2f3462f053e497b", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } @@ -37,7 +102,8 @@ "root": { "inputs": { "flake-utils": "flake-utils", - "nixpkgs": "nixpkgs" + "gen-luarc": "gen-luarc", + "nixpkgs": "nixpkgs_2" } }, "systems": { diff --git a/flake.nix b/flake.nix index 8733756..36a10c5 100644 --- a/flake.nix +++ b/flake.nix @@ -1,65 +1,64 @@ { - description = "..."; + description = "Neovim derivation"; + inputs = { - nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; + gen-luarc.url = "github:mrcjkb/nix-gen-luarc-json"; + + # 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 = {self, nixpkgs, flake-utils, ...}: - flake-utils.lib.eachDefaultSystem (system: let - recursiveMerge = attrList: let - f = attrPath: - builtins.zipAttrsWith (n: values: - if pkgs.lib.tail values == [] - then pkgs.lib.head values - else if pkgs.lib.all pkgs.lib.isList values - then pkgs.lib.unique (pkgs.lib.concatLists values) - else if pkgs.lib.all pkgs.lib.isAttrs values - then f (attrPath ++ [n]) values - else pkgs.lib.last values); - in - f [] attrList; + + outputs = inputs @ { + self, + nixpkgs, + flake-utils, + gen-luarc, + ... + }: let + supportedSystems = [ + "x86_64-linux" + "aarch64-linux" + "x86_64-darwin" + "aarch64-darwin" + ]; + neovim-overlay = import ./nix/neovim-overlay.nix {inherit inputs;}; + in + flake-utils.lib.eachSystem supportedSystems (system: let pkgs = import nixpkgs { inherit system; + overlays = [ + neovim-overlay + gen-luarc.overlays.default + ]; }; - plugins = import ./plugins.nix { - inherit pkgs; + shell = pkgs.mkShell { + name = "nvim-devShell"; + buildInputs = with pkgs; [ + lua-language-server + nil + stylua + luajitPackages.luacheck + ]; + shellHook = '' + ln -fs ${pkgs.nvim-luarc-json} .luarc.json + ''; }; - dependencies = with pkgs; [ - ripgrep - gopls - pyright - nil - ]; - neovim-with-deps = recursiveMerge [ - pkgs.neovim-unwrapped - { buildInputs = dependencies; } - ]; - baseRC = '' - lua << EOF - package.path = "${self}/config/?.lua;" .. "${self}/config/lua/?.lua;" .. package.path - vim.o.runtimepath = "${self}/config," .. vim.o.runtimepath - ''; - in rec { - packages.neovim = pkgs.wrapNeovim neovim-with-deps ({ - viAlias = false; - vimAlias = true; - withRuby = false; - withPython3 = false; - extraMakeWrapperArgs = ''--prefix PATH : "${pkgs.lib.makeBinPath dependencies}"''; - configure = { - customRC = - baseRC - + pkgs.lib.readFile ./config/init.lua - + ''EOF''; - packages.plugins = { - start = plugins.base; - }; - }; - }); - apps.neovim = flake-utils.lib.mkApp { - drv = packages.neovim; name = "neovim"; exePath = "/bin/nvim"; + in { + packages = rec { + default = nvim; + nvim = pkgs.nvim-pkg; }; - apps.default = apps.neovim; - packages.default = packages.neovim; - }); + devShells = { + default = shell; + }; + }) + // { + overlays.default = neovim-overlay; + }; } diff --git a/nix/mkNeovim.nix b/nix/mkNeovim.nix new file mode 100644 index 0000000..898b312 --- /dev/null +++ b/nix/mkNeovim.nix @@ -0,0 +1,202 @@ +# Function for creating a Neovim derivation +{ + 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 ? null, + # 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? + }: 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 = ; ... } + 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. + neovimConfig = pkgs-wrapNeovim.neovimUtils.makeNeovimConfig { + inherit extraPython3Packages withPython3 withRuby withNodeJs viAlias vimAlias; + plugins = normalizedPlugins; + }; + + # 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/nvim + mkdir -p $out/lua + rm init.lua + ''; + + installPhase = '' + cp -r after $out/after + rm -r after + cp -r lua $out/lua + rm -r lua + cp -r * $out/nvim + ''; + }; + + # 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 + # It also adds logic for bootstrapping dev plugins (for plugin developers) + initLua = + '' + vim.loader.enable() + -- prepend lua directory + vim.opt.rtp:prepend('${nvimRtp}/lua') + '' + # Wrap init.lua + + (builtins.readFile ../nvim/init.lua) + # Bootstrap/load dev plugins + + optionalString (devPlugins != []) ( + '' + local dev_pack_path = vim.fn.stdpath('data') .. '/site/pack/dev' + local dev_plugins_dir = dev_pack_path .. '/opt' + local dev_plugin_path + '' + + strings.concatMapStringsSep + "\n" + (plugin: '' + dev_plugin_path = dev_plugins_dir .. '/${plugin.name}' + if vim.fn.empty(vim.fn.glob(dev_plugin_path)) > 0 then + vim.notify('Bootstrapping dev plugin ${plugin.name} ...', vim.log.levels.INFO) + vim.cmd('!${pkgs.git}/bin/git clone ${plugin.url} ' .. dev_plugin_path) + end + vim.cmd('packadd! ${plugin.name}') + '') + devPlugins + ) + # Prepend nvim and after directories to the runtimepath + # NOTE: This is done after init.lua, + # because of a bug in Neovim that can cause filetype plugins + # to be sourced prematurely, see https://github.com/neovim/neovim/issues/19008 + # We prepend to ensure that user ftplugins are sourced before builtin ftplugins. + + '' + vim.opt.rtp:prepend('${nvimRtp}/nvim') + vim.opt.rtp:prepend('${nvimRtp}/after') + ''; + + # 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 = true; + }); + + isCustomAppName = appName != null && appName != "nvim"; + 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} + ''; + }) diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix new file mode 100644 index 0000000..be4e21a --- /dev/null +++ b/nix/neovim-overlay.nix @@ -0,0 +1,105 @@ +# This overlay, when applied to nixpkgs, adds the final neovim derivation to nixpkgs. +{inputs}: final: prev: +with final.pkgs.lib; let + pkgs = final; + + # Use this to create a plugin from a flake input + # mkNvimPlugin = src: pname: + # pkgs.vimUtils.buildVimPlugin { + # inherit pname src; + # version = src.lastModifiedDate; + # }; + + pkgs-wrapNeovim = inputs.nixpkgs.legacyPackages.${pkgs.system}; + + mkNeovim = pkgs.callPackage ./mkNeovim.nix { inherit pkgs-wrapNeovim; }; + + all-plugins = with pkgs.vimPlugins; [ + aerial-nvim + cmp-buffer + cmp-cmdline + cmp-nvim-lsp + cmp-path + cmp-treesitter + cmp_luasnip + diffview-nvim + friendly-snippets + gitsigns-nvim + lualine-nvim + luasnip + mini-nvim + neogen + neogit + nightfox-nvim + nvim-cmp + nvim-lspconfig + nvim-treesitter-context + nvim-treesitter-textobjects + (nvim-treesitter.withPlugins(p: with p; [ + tree-sitter-bash + tree-sitter-c + tree-sitter-comment + tree-sitter-css + tree-sitter-dockerfile + tree-sitter-embedded-template + tree-sitter-go + tree-sitter-gomod + tree-sitter-hcl + tree-sitter-html + tree-sitter-javascript + tree-sitter-json + tree-sitter-lua + tree-sitter-make + tree-sitter-markdown + tree-sitter-markdown-inline + tree-sitter-nix + tree-sitter-php + tree-sitter-python + tree-sitter-regex + tree-sitter-ruby + tree-sitter-sql + tree-sitter-toml + tree-sitter-typescript + tree-sitter-yaml + ])) + nvim-web-devicons + oil-nvim + rose-pine + telescope-fzf-native-nvim + telescope-nvim + toggleterm-nvim + undotree + which-key-nvim + ]; + + extraPackages = with pkgs; [ + ripgrep + gopls + pyright + nil + ]; +in { + nvim-pkg = mkNeovim { + plugins = all-plugins; + inherit extraPackages; + }; + + nvim-luarc-json = final.mk-luarc-json { + plugins = all-plugins; + }; + + # You can add as many derivations as you like. + # Use `ignoreConfigRegexes` to filter out config + # files you would not like to include. + # + # For example: + # + # nvim-pkg-no-telescope = mkNeovim { + # plugins = []; + # ignoreConfigRegexes = [ + # "^plugin/telescope.lua" + # "^ftplugin/.*.lua" + # ]; + # inherit extraPackages; + # }; +} diff --git a/nvim/after/README.md b/nvim/after/README.md new file mode 100644 index 0000000..a4b4ff2 --- /dev/null +++ b/nvim/after/README.md @@ -0,0 +1,8 @@ +## `after` directory + +Scripts put in + +- `after/plugin` will be sourced *after* init.lua + or any other scripts are sourced during startup. +- `after/ftplugin` will be sourced when opening a + filetype, *after* any other `ftplugin` scripts are sourced. diff --git a/nvim/after/plugin/color.lua b/nvim/after/plugin/color.lua new file mode 100644 index 0000000..565df80 --- /dev/null +++ b/nvim/after/plugin/color.lua @@ -0,0 +1,2 @@ +vim.cmd("colorscheme terafox") +vim.keymap.set("n", "aa", "AerialToggle!", { desc = "Toggle Aerial" }) diff --git a/nvim/ftplugin/.gitkeep b/nvim/ftplugin/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/config/lua/nvim-conf.lua b/nvim/init.lua similarity index 50% rename from config/lua/nvim-conf.lua rename to nvim/init.lua index c7f7014..b0074f2 100644 --- a/config/lua/nvim-conf.lua +++ b/nvim/init.lua @@ -6,8 +6,6 @@ vim.opt.expandtab = true -- insert tabs as spaces vim.opt.inccommand = "split" -- incremental live completion vim.opt.laststatus = 1 vim.opt.list = true --- vim.opt.listchars:append("trail:·") --- vim.opt.listchars:append("leadmultispace:╎ ") vim.opt.nrformats:append("alpha") -- let Ctrl-a do letters as well vim.opt.path:append("**") -- enable fuzzy :find ing vim.opt.relativenumber = true @@ -22,27 +20,14 @@ vim.opt.updatetime = 250 -- decrease update time vim.opt.virtualedit = "onemore" vim.g.fzf_layout = { window = { width = 0.9, height = 0.6 } } -vim.g.indent_blankline_use_treesitter = true -- no highlight floats vim.cmd([[ hi NormalFloat ctermbg=none ]]) --- mappings ----------------------------------------- - -vim.keymap.set("n","gr", "gT", {noremap = true, silent = true}) -vim.keymap.set("n","n", "nzz", {noremap = true, silent = true}) -vim.keymap.set("n", "N", "Nzz", {noremap = true, silent = true}) -vim.keymap.set("n","", "m0i`0", {noremap = true, silent = true}) -vim.keymap.set({'v', 'i'}, 'wq', 'l', {noremap = true, silent = true}) -vim.keymap.set({'n', 'v', 'i'}, 'qwq', 'lwqa', {noremap = true, silent = true}) -vim.keymap.set({'n', 'v'}, 'yy', '"+y', {noremap = true, silent = true}) -vim.keymap.set({'n', 'v'}, 'yp', '"+p', {noremap = true, silent = true}) -vim.keymap.set({'n', 'v'}, 'yd', '"+d', {noremap = true, silent = true}) -- Switch tab length on the fly vim.keymap.set("n", "\\t", function() vim.o.tabstop = vim.o.tabstop == 2 and 4 or 2 -end, { silent = true }) +end, { silent = true, desc = "toggle tabstop"}) -- autocmd ---------------------------------------- @@ -51,3 +36,49 @@ vim.api.nvim_create_autocmd("VimEnter", { command = "silent !mkdir -p " .. undopath, group = vim.api.nvim_create_augroup("Init", {}), }) + +-- Configure Neovim diagnostic messages +local function prefix_diagnostic(prefix, diagnostic) + return string.format(prefix .. ' %s', diagnostic.message) +end +vim.diagnostic.config { + virtual_text = { + prefix = '', + format = function(diagnostic) + local severity = diagnostic.severity + if severity == vim.diagnostic.severity.ERROR then + return prefix_diagnostic('󰅚', diagnostic) + end + if severity == vim.diagnostic.severity.WARN then + return prefix_diagnostic('⚠', diagnostic) + end + if severity == vim.diagnostic.severity.INFO then + return prefix_diagnostic('ⓘ', diagnostic) + end + if severity == vim.diagnostic.severity.HINT then + return prefix_diagnostic('󰌶', diagnostic) + end + return prefix_diagnostic('■', diagnostic) + end, + }, + update_in_insert = false, + underline = true, + severity_sort = true, + float = { + focusable = false, + style = 'minimal', + border = 'rounded', + source = 'if_many', + header = '', + prefix = '', + }, +} + +vim.keymap.set('n', 'ee', function() + local _, winid = vim.diagnostic.open_float(nil, { scope = 'line' }) + if not winid then + vim.notify('no diagnostics found', vim.log.levels.INFO) + return + end + vim.api.nvim_win_set_config(winid or 0, { focusable = true }) +end, { noremap = true, silent = true, desc = 'diagnostics floating window' }) diff --git a/nvim/lua/.gitkeep b/nvim/lua/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/nvim/plugin/aerial.lua b/nvim/plugin/aerial.lua new file mode 100644 index 0000000..30e63aa --- /dev/null +++ b/nvim/plugin/aerial.lua @@ -0,0 +1,13 @@ +if vim.g.did_load_aerial_plugin then + return +end +vim.g.did_load_aerial_plugin = true + +require("aerial").setup({ + default_direction = "left", + autojump = true, + on_attach = function(bufnr) + vim.keymap.set("n", "{", "AerialPrev", { buffer = bufnr }) + vim.keymap.set("n", "}", "AerialNext", { buffer = bufnr }) + end, +}) diff --git a/nvim/plugin/colors.lua b/nvim/plugin/colors.lua new file mode 100644 index 0000000..7ce4a3a --- /dev/null +++ b/nvim/plugin/colors.lua @@ -0,0 +1,19 @@ +if vim.g.did_load_colors_plugin then + return +end +vim.g.did_load_colors_plugin = true + +require("rose-pine").setup({ + variant = "moon", + styles = { + bold = false, + italic = false, + transparency = true, + }, +}) +require('nightfox').setup({ + options = { + transparent = true, -- Disable setting background + terminal_colors = false, -- Set terminal colors (vim.g.terminal_color_*) used in `:terminal` + }, +}) diff --git a/nvim/plugin/completion.lua b/nvim/plugin/completion.lua new file mode 100644 index 0000000..0e30873 --- /dev/null +++ b/nvim/plugin/completion.lua @@ -0,0 +1,47 @@ +if vim.g.did_load_completion_plugin then + return +end +vim.g.did_load_completion_plugin = true +local cmp = require'cmp' + +cmp.setup({ + snippet = { + expand = function(args) + require('luasnip').lsp_expand(args.body) + end, + }, + experimental = { + native_menu = false, + ghost_text = true, + }, + mapping = cmp.mapping.preset.insert({ + [''] = cmp.mapping.scroll_docs(-4), + [''] = cmp.mapping.scroll_docs(4), + [''] = cmp.mapping.complete(), + ['q'] = cmp.mapping.abort(), + [''] = cmp.mapping.confirm({ select = true }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. + }), + sources = cmp.config.sources({ + { name = 'nvim_lsp' }, + { name = 'luasnip' }, + }, { + { name = 'buffer' }, + }) +}) + +cmp.setup.cmdline({ '/', '?' }, { + mapping = cmp.mapping.preset.cmdline(), + sources = { + { name = 'buffer' } + } +}) + +cmp.setup.cmdline(':', { + mapping = cmp.mapping.preset.cmdline(), + sources = cmp.config.sources({ + { name = 'path' } + }, { + { name = 'cmdline' } + }), + matching = { disallow_symbol_nonprefix_matching = false } +}) diff --git a/nvim/plugin/diffview.lua b/nvim/plugin/diffview.lua new file mode 100644 index 0000000..f63b149 --- /dev/null +++ b/nvim/plugin/diffview.lua @@ -0,0 +1,7 @@ +if vim.g.did_load_diffview_plugin then + return +end +vim.g.did_load_diffview_plugin = true + +require("diffview").setup({ use_icons = false, }) +vim.keymap.set('n', 'gdd', vim.cmd.DiffviewOpen, { desc = '[g]it [d]iffview open' }) diff --git a/nvim/plugin/git.lua b/nvim/plugin/git.lua new file mode 100644 index 0000000..60125f1 --- /dev/null +++ b/nvim/plugin/git.lua @@ -0,0 +1,7 @@ +if vim.g.did_load_diffview_plugin then + return +end +vim.g.did_load_diffview_plugin = true +require("diffview").setup({ + use_icons = false, +}) diff --git a/nvim/plugin/gitsigns.lua b/nvim/plugin/gitsigns.lua new file mode 100644 index 0000000..96b55e3 --- /dev/null +++ b/nvim/plugin/gitsigns.lua @@ -0,0 +1,30 @@ +if vim.g.did_load_gitsigns_plugin then + return +end +vim.g.did_load_gitsigns_plugin = true + +vim.schedule(function() + require('gitsigns').setup{ + signcolumn = false, + numhl = true, + on_attach = function() + local gs = package.loaded.gitsigns + vim.keymap.set("n", "gg", gs.preview_hunk, {desc = "git preview hunk"}) + vim.keymap.set('n', 'gb', function() gs.blame_line{full=true} end, {desc = "git blame_line"}) + vim.keymap.set('n', 'gr', gs.reset_hunk, {desc = "git reset hunk"}) + vim.keymap.set('v', 'gr', function() gs.reset_hunk {vim.fn.line('.'), vim.fn.line('v')} end, {desc = "git reset hunk"}) + -- Navigation + vim.keymap.set('n', ']g', function() + if vim.wo.diff then return ']c' end + vim.schedule(function() gs.next_hunk() end) + return '' + end, {expr=true}) + + vim.keymap.set('n', '[g', function() + if vim.wo.diff then return '[c' end + vim.schedule(function() gs.prev_hunk() end) + return '' + end, {expr=true}) + end + } +end) diff --git a/nvim/plugin/keymaps.lua b/nvim/plugin/keymaps.lua new file mode 100644 index 0000000..4b19444 --- /dev/null +++ b/nvim/plugin/keymaps.lua @@ -0,0 +1,13 @@ +vim.keymap.set("n","gr", "gT", {noremap = true, silent = true}) +vim.keymap.set("n","n", "nzz", {noremap = true, silent = true}) +vim.keymap.set("n", "N", "Nzz", {noremap = true, silent = true}) +vim.keymap.set('n', '', 'zz') +vim.keymap.set('n', '', 'zz') +vim.keymap.set('n', '', 'zz') +vim.keymap.set('n', '', 'zz') +vim.keymap.set("n","", "m0i`0", {noremap = true, silent = true}) +vim.keymap.set({'v', 'i'}, 'wq', 'l', {noremap = true, silent = true}) +vim.keymap.set({'n', 'v', 'i'}, 'qwq', 'lwqa', {noremap = true, silent = true}) +vim.keymap.set({'n', 'v'}, 'yy', '"+y', {noremap = true, silent = true, desc = "Yank to clip"}) +vim.keymap.set({'n', 'v'}, 'yp', '"+p', {noremap = true, silent = true, desc = "Paste from clip"}) +vim.keymap.set({'n', 'v'}, 'yd', '"+d', {noremap = true, silent = true, desc = "Delete to clip"}) diff --git a/nvim/plugin/lsp.lua b/nvim/plugin/lsp.lua new file mode 100644 index 0000000..b124502 --- /dev/null +++ b/nvim/plugin/lsp.lua @@ -0,0 +1,65 @@ +if vim.g.did_load_lsp_plugin then + return +end +vim.g.did_load_lsp_plugin = true + +-- Setup language servers. +local lspconfig = require('lspconfig') +local capabilities = require('cmp_nvim_lsp').default_capabilities() + +lspconfig.gopls.setup { on_attach = function(_, bufnr) + capabilities = capabilities + vim.api.nvim_command("au BufWritePre lua vim.lsp.buf.format { async = false }") +end +} +lspconfig.pyright.setup { capabilities = capabilities } +lspconfig.nil_ls.setup { capabilities = capabilities } + +vim.keymap.set('n', 'de', vim.diagnostic.open_float, {desc = "Toggle diagnostic"}) +vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, {desc = "Prev diagnostic"}) +vim.keymap.set('n', ']d', vim.diagnostic.goto_next, {desc = "Next diagnostic"}) + +vim.diagnostic.config({ + virtual_text = true, + underline = true, + update_in_insert = false, +}) +-- Use LspAttach autocommand to only map the following keys +-- after the language server attaches to the current buffer +vim.api.nvim_create_autocmd('LspAttach', { + group = vim.api.nvim_create_augroup('UserLspConfig', {}), + callback = function(ev) + local bufnr = ev.buf + local client = vim.lsp.get_client_by_id(ev.data.client_id) + -- Buffer local mappings. + -- See `:help vim.lsp.*` for documentation on any of the below functions + vim.keymap.set('n', 'K', vim.lsp.buf.hover, { buffer = ev.buf, noremap = true, silent = true , desc = "LSP hover"}) + vim.keymap.set('n', 'rn', vim.lsp.buf.rename, { buffer = ev.buf, noremap = true, silent = true , desc = "LSP Rename"}) + vim.keymap.set({ 'n', 'v' }, 'da', vim.lsp.buf.code_action, { buffer = ev.buf, noremap = true, silent = true , desc = "LSP code action"}) + vim.keymap.set("n", "dd", "Telescope lsp_definitions", { buffer = ev.buf, noremap = true, silent = true , desc = "LSP definitions"}) + vim.keymap.set("n", "di", "Telescope lsp_implementations", { buffer = ev.buf, noremap = true, silent = true , desc = "LSP implementations"}) + vim.keymap.set("n", "dr", "Telescope lsp_references", { buffer = ev.buf, noremap = true, silent = true , desc = "LSP references"}) + vim.keymap.set("n", "dt", "Telescope lsp_type_definitions", { buffer = ev.buf, noremap = true, silent = true , desc = "LSP type defs"}) + vim.keymap.set("n", "ds", "Telescope lsp_document_symbols", { buffer = ev.buf, noremap = true, silent = true , desc = "LSP symbols"}) + vim.keymap.set('n', 'dl', vim.lsp.codelens.run, { buffer = ev.buf, noremap = true, silent = true , desc = "LSP codelens"}) + vim.keymap.set('n', 'df', function() + vim.lsp.buf.format { async = true } + end,{ buffer = ev.buf, noremap = true, silent = true , desc = "LSP format"}) + -- Auto-refresh code lenses + if not client then + return + end + local group = vim.api.nvim_create_augroup(string.format('lsp-%s-%s', bufnr, client.id), {}) + if client.server_capabilities.codeLensProvider then + vim.api.nvim_create_autocmd({ 'InsertLeave', 'BufWritePost', 'TextChanged' }, { + group = group, + callback = function() + vim.lsp.codelens.refresh { bufnr = bufnr } + end, + buffer = bufnr, + }) + vim.lsp.codelens.refresh { bufnr = bufnr } + end + end, +}) + diff --git a/nvim/plugin/lualine.lua b/nvim/plugin/lualine.lua new file mode 100644 index 0000000..7aff49c --- /dev/null +++ b/nvim/plugin/lualine.lua @@ -0,0 +1,11 @@ +if vim.g.did_load_lualine_plugin then + return +end +vim.g.did_load_lualine_plugin = true + +vim.schedule(function() + require('lualine').setup { + globalstatus = true, + extensions = { 'fugitive', 'fzf', 'toggleterm', 'quickfix' }, + } +end) diff --git a/nvim/plugin/luasnip.lua b/nvim/plugin/luasnip.lua new file mode 100644 index 0000000..b6840d6 --- /dev/null +++ b/nvim/plugin/luasnip.lua @@ -0,0 +1,37 @@ +if vim.g.did_load_luasnip_plugin then + return +end +vim.g.did_load_luasnip_plugin = true + +local ls = require("luasnip") +ls.config.set_config { + history = true, + updateevents = "TextChanged, TextChangedI", +} +require("luasnip.loaders.from_vscode").lazy_load() + +vim.keymap.set({"i", "s"}, "", function() + if ls.expand_or_jumpable() then + ls.expand_or_jump() + end +end, {silent = true}) + +vim.keymap.set({"i", "s"}, "", function() + if ls.jumpable(-1) then + ls.jump(-1) + end +end, {silent = true}) + +vim.keymap.set({"i", "s"}, "", function() + if ls.choice_active() then + ls.change_choice(1) + end +end, {silent = true}) + +-------------------- +-- Snippets -- +-------------------- +local fmta = require("luasnip.extras.fmt").fmta +ls.add_snippets("go", { + ls.snippet("ie", fmta("if err != nil {\n\treturn \n}", { err = ls.insert_node(1, "err") })), +}) diff --git a/config/lua/mini-conf.lua b/nvim/plugin/mini.lua similarity index 67% rename from config/lua/mini-conf.lua rename to nvim/plugin/mini.lua index 184101f..166b99e 100644 --- a/config/lua/mini-conf.lua +++ b/nvim/plugin/mini.lua @@ -1,3 +1,8 @@ +if vim.g.did_load_mini_plugin then + return +end +vim.g.did_load_mini_plugin = true + -- din( dina require('mini.ai').setup() -- gc gcc @@ -47,19 +52,7 @@ require('mini.splitjoin').setup({ } }) -require('mini.pairs').setup( -{ - modes = {insert = true, command = false, terminal = false}, - mappings = { - ['['] = { action = 'open', pair = '[]', neigh_pattern = '[^\\].' }, - ['{'] = { action = 'open', pair = '{}', neigh_pattern = '[^\\].' }, - [']'] = { action = 'close', pair = '[]', neigh_pattern = '[^\\].' }, - ['}'] = { action = 'close', pair = '{}', neigh_pattern = '[^\\].' }, - ['"'] = { }, - ['\''] = { }, - }, -} -) +require('mini.pairs').setup() vim.cmd([[ hi MiniCursorwordCurrent ctermfg=240 ]]) -- f F t T @@ -74,17 +67,3 @@ indent.setup({ draw = { delay = 0 } }) indent.gen_animation.none() - --- --- require('mini.completion').setup({ --- delay = {completion = 10^7}, --- window = { --- info = { height = 25, width = 80, border = 'single' }, --- signature = { height = 25, width = 80, border = 'single' }, --- }, --- lsp_completion = { --- source_func = 'completefunc', --- auto_setup = true, --- }, --- fallback_action = "" --- }) diff --git a/nvim/plugin/misc.lua b/nvim/plugin/misc.lua new file mode 100644 index 0000000..9c4d310 --- /dev/null +++ b/nvim/plugin/misc.lua @@ -0,0 +1,20 @@ +if vim.g.did_load_plugins_plugin then + return +end +vim.g.did_load_plugins_plugin = true + +-- many plugins annoyingly require a call to a 'setup' function to be loaded, +-- even with default configs + +require("neogen").setup{} +vim.keymap.set("n","nd", "Neogen", {noremap = true, silent = true, desc = "Neogen - gen comments"}) + +require("toggleterm").setup{ + open_mapping = [[]], + direction = "float", + close_on_exit = true, +} + +require('which-key').setup { + preset = 'helix' +} diff --git a/nvim/plugin/neogit.lua b/nvim/plugin/neogit.lua new file mode 100644 index 0000000..3ef2047 --- /dev/null +++ b/nvim/plugin/neogit.lua @@ -0,0 +1,15 @@ +if vim.g.did_load_neogit_plugin then + return +end +vim.g.did_load_neogit_plugin = true + +local neogit = require('neogit') +neogit.setup { + disable_builtin_notifications = true, + integrations = { + diffview = true, + telescope = true, + fzf_lua = true, + }, +} +vim.keymap.set('n', 'ng', neogit.open, { noremap = true, silent = true, desc = "Neogit"}) diff --git a/nvim/plugin/oil.lua b/nvim/plugin/oil.lua new file mode 100644 index 0000000..1b38b6a --- /dev/null +++ b/nvim/plugin/oil.lua @@ -0,0 +1,23 @@ +if vim.g.did_load_oil_plugin then + return +end +vim.g.did_load_oil_plugin = true + +local oil = require('oil') +oil.setup({ + watch_for_changes = true, + columns = { + "permissions", + "size" + }, + view_options = { + show_hidden = true + }, + keymaps = { + ["wq"] = "actions.close" + } +}) +vim.keymap.set("n", "c", oil.toggle_float, {noremap = true, silent = true}); +vim.keymap.set("n", "u", "UndotreeToggle") +vim.g.undotree_ShortIndicators = 1 +vim.g.undotree_SetFocusWhenToggle = 1 diff --git a/nvim/plugin/statuscol.lua b/nvim/plugin/statuscol.lua new file mode 100644 index 0000000..60125f1 --- /dev/null +++ b/nvim/plugin/statuscol.lua @@ -0,0 +1,7 @@ +if vim.g.did_load_diffview_plugin then + return +end +vim.g.did_load_diffview_plugin = true +require("diffview").setup({ + use_icons = false, +}) diff --git a/nvim/plugin/telescope.lua b/nvim/plugin/telescope.lua new file mode 100644 index 0000000..ce35f8d --- /dev/null +++ b/nvim/plugin/telescope.lua @@ -0,0 +1,62 @@ +if vim.g.did_load_telescope_plugin then + return +end +vim.g.did_load_telescope_plugin = true + +local telescope = require("telescope.builtin") + +-- Fall back to find_files if not in a git repo +local project_files = function() + local opts = {} -- define here if you want to define something + local ok = pcall(telescope.git_files, opts) + if not ok then + telescope.find_files(opts) + end +end + +vim.keymap.set("n", "", telescope.buffers, {noremap = true, silent = true, desc = "Fuzzy find buffers"}) +vim.keymap.set("n", "ff", project_files, {noremap = true, silent = true, desc = "Fuzzy find git files"}) +vim.keymap.set("n", "fg", telescope.find_files, {noremap = true, silent = true, desc = "Fuzzy find files"}) +vim.keymap.set("n", "fc", telescope.command_history, {noremap = true, silent = true, desc = "Fuzzy find command_history"}) +vim.keymap.set("n", "fa", telescope.live_grep, {noremap = true, silent = true, desc = "Fuzzy find grep"}) +vim.keymap.set("n", "f8", telescope.grep_string, {noremap = true, silent = true, desc = "Fuzzy find grep current word"}) +vim.keymap.set("n", "fs", telescope.treesitter, {noremap = true, silent = true, desc = "Fuzzy find treesitter objects"}) +vim.keymap.set("n", "fq", telescope.quickfix, {noremap = true, silent = true, desc = "Fuzzy find quickfix"}) +vim.keymap.set("n", "f", telescope.resume, {noremap = true, silent = true, desc = "Fuzzy find resume"}) + +local telescope = require("telescope") +telescope.setup({ + defaults = { + layout_strategy = "vertical", + layout_config = { width = .90, }, + prompt_title = false, + results_title = false, + preview_title = false, + vimgrep_arguments = { + "rg", + '-L', + "--color=never", + "--no-heading", + "--hidden", + "--with-filename", + "--line-number", + "--column", + "--smart-case" + }, + preview = { + treesitter = true, + }, + path_display = { + 'truncate', + }, + mappings = { + i = { + ["wq"] = require("telescope.actions").close, + [""] = require("telescope.actions").close, + [""] = require("telescope.actions").move_selection_previous, + [""] = require("telescope.actions").move_selection_next, + }, + }, + }, +}) +telescope.load_extension("fzf") diff --git a/nvim/plugin/treesitter.lua b/nvim/plugin/treesitter.lua new file mode 100644 index 0000000..ed6e111 --- /dev/null +++ b/nvim/plugin/treesitter.lua @@ -0,0 +1,65 @@ +if vim.g.did_load_treesitter_plugin then + return +end +vim.g.did_load_treesitter_plugin = true + +require("nvim-treesitter.configs").setup { + ensure_installed = {}, + highlight = { + enable = true, + disable = function(_, buf) + local max_filesize = 100 * 1024 -- 100 KiB + local ok, stats = pcall(vim.loop.fs_stat, vim.api.nvim_buf_get_name(buf)) + if ok and stats and stats.size > max_filesize then + return true + end + end, + }, + indent = { + enable = true, + }, + textobjects = { + select = { + enable = true, + lookahead = true, + keymaps = { + ["af"] = "@function.outer", + ["if"] = "@function.inner", + ["aa"] = "@statement.outer", + ["ia"] = "@parameter.inner", + }, + }, + move = { + enable = true, + set_jumps = true, -- whether to set jumps in the jumplist + goto_next_start = { + [']]'] = '@function.outer', + [']a'] = '@parameter.inner', + }, + goto_previous_start = { + ['[['] = '@function.outer', + ['[a'] = '@parameter.inner', + }, + }, + swap = { + enable = true, + swap_next = { + ["s]"] = "@parameter.inner", + }, + swap_previous = { + ["s["] = "@parameter.inner", + }, + }, }, + incremental_selection = { + enable = true, + keymaps = { + init_selection = '', + node_incremental = '', + node_decremental = '', + }, + }, +} + +require('treesitter-context').setup { + max_lines = 3, +} diff --git a/nvim/plugin/which-key.lua b/nvim/plugin/which-key.lua new file mode 100644 index 0000000..def52f8 --- /dev/null +++ b/nvim/plugin/which-key.lua @@ -0,0 +1,3 @@ +require('which-key').setup { + preset = 'helix' +} diff --git a/plugins.nix b/plugins.nix deleted file mode 100644 index 481752c..0000000 --- a/plugins.nix +++ /dev/null @@ -1,57 +0,0 @@ -{pkgs, ...}: -{ - base = with pkgs.vimPlugins; [ - aerial-nvim - cmp-buffer - cmp-cmdline - cmp-nvim-lsp - cmp-path - cmp-treesitter - cmp_luasnip - diffview-nvim - friendly-snippets - gitsigns-nvim - luasnip - mini-nvim - neogen - neogit - nvim-cmp - nvim-lspconfig - nvim-treesitter-textobjects - (nvim-treesitter.withPlugins(p: with p; [ - tree-sitter-bash - tree-sitter-c - tree-sitter-comment - tree-sitter-css - tree-sitter-dockerfile - tree-sitter-embedded-template - tree-sitter-go - tree-sitter-gomod - tree-sitter-hcl - tree-sitter-html - tree-sitter-javascript - tree-sitter-json - tree-sitter-lua - tree-sitter-make - tree-sitter-markdown - tree-sitter-markdown-inline - tree-sitter-nix - tree-sitter-php - tree-sitter-python - tree-sitter-regex - tree-sitter-ruby - tree-sitter-sql - tree-sitter-toml - tree-sitter-typescript - tree-sitter-yaml - ])) - oil-nvim - refactoring-nvim - rose-pine - telescope-fzf-native-nvim - telescope-nvim - toggleterm-nvim - undotree - vim-nix - ]; -} From 9082d546f63f4cb56ff321f6e4124db3d843bed0 Mon Sep 17 00:00:00 2001 From: iofq Date: Sat, 10 Aug 2024 01:45:39 -0500 Subject: [PATCH 058/160] lint --- nvim/after/plugin/color.lua | 4 +- nvim/init.lua | 40 +++++------ nvim/plugin/aerial.lua | 10 +-- nvim/plugin/colors.lua | 26 ++++---- nvim/plugin/completion.lua | 24 +++---- nvim/plugin/diffview.lua | 2 +- nvim/plugin/git.lua | 4 +- nvim/plugin/gitsigns.lua | 54 +++++++++------ nvim/plugin/keymaps.lua | 18 ++--- nvim/plugin/lsp.lua | 130 +++++++++++++++++++++++------------- nvim/plugin/luasnip.lua | 34 +++++----- nvim/plugin/mini.lua | 42 ++++++------ nvim/plugin/misc.lua | 14 ++-- nvim/plugin/neogit.lua | 2 +- nvim/plugin/oil.lua | 30 ++++----- nvim/plugin/statuscol.lua | 4 +- nvim/plugin/telescope.lua | 110 +++++++++++++++++------------- nvim/plugin/treesitter.lua | 103 ++++++++++++++-------------- nvim/plugin/which-key.lua | 2 +- 19 files changed, 362 insertions(+), 291 deletions(-) diff --git a/nvim/after/plugin/color.lua b/nvim/after/plugin/color.lua index 565df80..18f2d6b 100644 --- a/nvim/after/plugin/color.lua +++ b/nvim/after/plugin/color.lua @@ -1,2 +1,2 @@ -vim.cmd("colorscheme terafox") -vim.keymap.set("n", "aa", "AerialToggle!", { desc = "Toggle Aerial" }) +vim.cmd('colorscheme terafox') +vim.keymap.set('n', 'aa', 'AerialToggle!', { desc = 'Toggle Aerial' }) diff --git a/nvim/init.lua b/nvim/init.lua index b0074f2..7ff6dec 100644 --- a/nvim/init.lua +++ b/nvim/init.lua @@ -1,23 +1,23 @@ -- vim settings ++ mini.nvim.basics ---------------------------------------- -vim.opt.backspace = "indent,eol,start" -vim.opt.completeopt = "menuone" -vim.opt.expandtab = true -- insert tabs as spaces -vim.opt.inccommand = "split" -- incremental live completion +vim.opt.backspace = 'indent,eol,start' +vim.opt.completeopt = 'menuone' +vim.opt.expandtab = true -- insert tabs as spaces +vim.opt.inccommand = 'split' -- incremental live completion vim.opt.laststatus = 1 vim.opt.list = true -vim.opt.nrformats:append("alpha") -- let Ctrl-a do letters as well -vim.opt.path:append("**") -- enable fuzzy :find ing +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 -vim.opt.shiftwidth = 0 -- >> shifts by tabstop -vim.opt.showmatch = true -- highlight matching brackets +vim.opt.shadafile = 'NONE' -- disable shada +vim.opt.shiftwidth = 0 -- >> shifts by tabstop +vim.opt.showmatch = true -- highlight matching brackets vim.opt.showmode = true -vim.opt.softtabstop = -1 -- backspace removes tabstop +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.tabstop = 2 -- 2 space tabs are based +vim.opt.updatetime = 250 -- decrease update time +vim.opt.virtualedit = 'onemore' vim.g.fzf_layout = { window = { width = 0.9, height = 0.6 } } @@ -25,16 +25,16 @@ vim.g.fzf_layout = { window = { width = 0.9, height = 0.6 } } vim.cmd([[ hi NormalFloat ctermbg=none ]]) -- Switch tab length on the fly -vim.keymap.set("n", "\\t", function() - vim.o.tabstop = vim.o.tabstop == 2 and 4 or 2 -end, { silent = true, desc = "toggle tabstop"}) +vim.keymap.set('n', '\\t', function() + vim.o.tabstop = vim.o.tabstop == 2 and 4 or 2 +end, { silent = true, desc = 'toggle tabstop' }) -- autocmd ---------------------------------------- -local undopath = "~/.local/share/nvim/undo" -vim.api.nvim_create_autocmd("VimEnter", { - command = "silent !mkdir -p " .. undopath, - group = vim.api.nvim_create_augroup("Init", {}), +local undopath = '~/.local/share/nvim/undo' +vim.api.nvim_create_autocmd('VimEnter', { + command = 'silent !mkdir -p ' .. undopath, + group = vim.api.nvim_create_augroup('Init', {}), }) -- Configure Neovim diagnostic messages diff --git a/nvim/plugin/aerial.lua b/nvim/plugin/aerial.lua index 30e63aa..22322fd 100644 --- a/nvim/plugin/aerial.lua +++ b/nvim/plugin/aerial.lua @@ -3,11 +3,11 @@ if vim.g.did_load_aerial_plugin then end vim.g.did_load_aerial_plugin = true -require("aerial").setup({ - default_direction = "left", +require('aerial').setup { + default_direction = 'left', autojump = true, on_attach = function(bufnr) - vim.keymap.set("n", "{", "AerialPrev", { buffer = bufnr }) - vim.keymap.set("n", "}", "AerialNext", { buffer = bufnr }) + vim.keymap.set('n', '{', 'AerialPrev', { buffer = bufnr }) + vim.keymap.set('n', '}', 'AerialNext', { buffer = bufnr }) end, -}) +} diff --git a/nvim/plugin/colors.lua b/nvim/plugin/colors.lua index 7ce4a3a..d76a039 100644 --- a/nvim/plugin/colors.lua +++ b/nvim/plugin/colors.lua @@ -3,17 +3,17 @@ if vim.g.did_load_colors_plugin then end vim.g.did_load_colors_plugin = true -require("rose-pine").setup({ - variant = "moon", - styles = { - bold = false, - italic = false, - transparency = true, - }, -}) -require('nightfox').setup({ - options = { - transparent = true, -- Disable setting background - terminal_colors = false, -- Set terminal colors (vim.g.terminal_color_*) used in `:terminal` +require('rose-pine').setup { + variant = 'moon', + styles = { + bold = false, + italic = false, + transparency = true, }, -}) +} +require('nightfox').setup { + options = { + transparent = true, -- Disable setting background + terminal_colors = false, -- Set terminal colors (vim.g.terminal_color_*) used in `:terminal` + }, +} diff --git a/nvim/plugin/completion.lua b/nvim/plugin/completion.lua index 0e30873..0b68498 100644 --- a/nvim/plugin/completion.lua +++ b/nvim/plugin/completion.lua @@ -2,9 +2,9 @@ if vim.g.did_load_completion_plugin then return end vim.g.did_load_completion_plugin = true -local cmp = require'cmp' +local cmp = require('cmp') -cmp.setup({ +cmp.setup { snippet = { expand = function(args) require('luasnip').lsp_expand(args.body) @@ -14,34 +14,34 @@ cmp.setup({ native_menu = false, ghost_text = true, }, - mapping = cmp.mapping.preset.insert({ + mapping = cmp.mapping.preset.insert { [''] = cmp.mapping.scroll_docs(-4), [''] = cmp.mapping.scroll_docs(4), [''] = cmp.mapping.complete(), ['q'] = cmp.mapping.abort(), - [''] = cmp.mapping.confirm({ select = true }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. - }), + [''] = cmp.mapping.confirm { select = true }, -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. + }, sources = cmp.config.sources({ { name = 'nvim_lsp' }, { name = 'luasnip' }, }, { { name = 'buffer' }, - }) -}) + }), +} cmp.setup.cmdline({ '/', '?' }, { mapping = cmp.mapping.preset.cmdline(), sources = { - { name = 'buffer' } - } + { name = 'buffer' }, + }, }) cmp.setup.cmdline(':', { mapping = cmp.mapping.preset.cmdline(), sources = cmp.config.sources({ - { name = 'path' } + { name = 'path' }, }, { - { name = 'cmdline' } + { name = 'cmdline' }, }), - matching = { disallow_symbol_nonprefix_matching = false } + matching = { disallow_symbol_nonprefix_matching = false }, }) diff --git a/nvim/plugin/diffview.lua b/nvim/plugin/diffview.lua index f63b149..01592e7 100644 --- a/nvim/plugin/diffview.lua +++ b/nvim/plugin/diffview.lua @@ -3,5 +3,5 @@ if vim.g.did_load_diffview_plugin then end vim.g.did_load_diffview_plugin = true -require("diffview").setup({ use_icons = false, }) +require('diffview').setup { use_icons = false } vim.keymap.set('n', 'gdd', vim.cmd.DiffviewOpen, { desc = '[g]it [d]iffview open' }) diff --git a/nvim/plugin/git.lua b/nvim/plugin/git.lua index 60125f1..1cc61f1 100644 --- a/nvim/plugin/git.lua +++ b/nvim/plugin/git.lua @@ -2,6 +2,6 @@ if vim.g.did_load_diffview_plugin then return end vim.g.did_load_diffview_plugin = true -require("diffview").setup({ +require('diffview').setup { use_icons = false, -}) +} diff --git a/nvim/plugin/gitsigns.lua b/nvim/plugin/gitsigns.lua index 96b55e3..1d61095 100644 --- a/nvim/plugin/gitsigns.lua +++ b/nvim/plugin/gitsigns.lua @@ -4,27 +4,39 @@ end vim.g.did_load_gitsigns_plugin = true vim.schedule(function() - require('gitsigns').setup{ - signcolumn = false, - numhl = true, - on_attach = function() - local gs = package.loaded.gitsigns - vim.keymap.set("n", "gg", gs.preview_hunk, {desc = "git preview hunk"}) - vim.keymap.set('n', 'gb', function() gs.blame_line{full=true} end, {desc = "git blame_line"}) - vim.keymap.set('n', 'gr', gs.reset_hunk, {desc = "git reset hunk"}) - vim.keymap.set('v', 'gr', function() gs.reset_hunk {vim.fn.line('.'), vim.fn.line('v')} end, {desc = "git reset hunk"}) - -- Navigation - vim.keymap.set('n', ']g', function() - if vim.wo.diff then return ']c' end - vim.schedule(function() gs.next_hunk() end) - return '' - end, {expr=true}) + require('gitsigns').setup { + signcolumn = false, + numhl = true, + on_attach = function() + local gs = package.loaded.gitsigns + vim.keymap.set('n', 'gg', gs.preview_hunk, { desc = 'git preview hunk' }) + vim.keymap.set('n', 'gb', function() + gs.blame_line { full = true } + end, { desc = 'git blame_line' }) + vim.keymap.set('n', 'gr', gs.reset_hunk, { desc = 'git reset hunk' }) + vim.keymap.set('v', 'gr', function() + gs.reset_hunk { vim.fn.line('.'), vim.fn.line('v') } + end, { desc = 'git reset hunk' }) + -- Navigation + vim.keymap.set('n', ']g', function() + if vim.wo.diff then + return ']c' + end + vim.schedule(function() + gs.next_hunk() + end) + return '' + end, { expr = true }) - vim.keymap.set('n', '[g', function() - if vim.wo.diff then return '[c' end - vim.schedule(function() gs.prev_hunk() end) - return '' - end, {expr=true}) - end + vim.keymap.set('n', '[g', function() + if vim.wo.diff then + return '[c' + end + vim.schedule(function() + gs.prev_hunk() + end) + return '' + end, { expr = true }) + end, } end) diff --git a/nvim/plugin/keymaps.lua b/nvim/plugin/keymaps.lua index 4b19444..8787061 100644 --- a/nvim/plugin/keymaps.lua +++ b/nvim/plugin/keymaps.lua @@ -1,13 +1,13 @@ -vim.keymap.set("n","gr", "gT", {noremap = true, silent = true}) -vim.keymap.set("n","n", "nzz", {noremap = true, silent = true}) -vim.keymap.set("n", "N", "Nzz", {noremap = true, silent = true}) +vim.keymap.set('n', 'gr', 'gT', { noremap = true, silent = true }) +vim.keymap.set('n', 'n', 'nzz', { noremap = true, silent = true }) +vim.keymap.set('n', 'N', 'Nzz', { noremap = true, silent = true }) vim.keymap.set('n', '', 'zz') vim.keymap.set('n', '', 'zz') vim.keymap.set('n', '', 'zz') vim.keymap.set('n', '', 'zz') -vim.keymap.set("n","", "m0i`0", {noremap = true, silent = true}) -vim.keymap.set({'v', 'i'}, 'wq', 'l', {noremap = true, silent = true}) -vim.keymap.set({'n', 'v', 'i'}, 'qwq', 'lwqa', {noremap = true, silent = true}) -vim.keymap.set({'n', 'v'}, 'yy', '"+y', {noremap = true, silent = true, desc = "Yank to clip"}) -vim.keymap.set({'n', 'v'}, 'yp', '"+p', {noremap = true, silent = true, desc = "Paste from clip"}) -vim.keymap.set({'n', 'v'}, 'yd', '"+d', {noremap = true, silent = true, desc = "Delete to clip"}) +vim.keymap.set('n', '', 'm0i`0', { noremap = true, silent = true }) +vim.keymap.set({ 'v', 'i' }, 'wq', 'l', { noremap = true, silent = true }) +vim.keymap.set({ 'n', 'v', 'i' }, 'qwq', 'lwqa', { noremap = true, silent = true }) +vim.keymap.set({ 'n', 'v' }, 'yy', '"+y', { noremap = true, silent = true, desc = 'Yank to clip' }) +vim.keymap.set({ 'n', 'v' }, 'yp', '"+p', { noremap = true, silent = true, desc = 'Paste from clip' }) +vim.keymap.set({ 'n', 'v' }, 'yd', '"+d', { noremap = true, silent = true, desc = 'Delete to clip' }) diff --git a/nvim/plugin/lsp.lua b/nvim/plugin/lsp.lua index b124502..5dde0b3 100644 --- a/nvim/plugin/lsp.lua +++ b/nvim/plugin/lsp.lua @@ -7,59 +7,99 @@ vim.g.did_load_lsp_plugin = true local lspconfig = require('lspconfig') local capabilities = require('cmp_nvim_lsp').default_capabilities() -lspconfig.gopls.setup { on_attach = function(_, bufnr) +lspconfig.gopls.setup { + on_attach = function(_, bufnr) capabilities = capabilities - vim.api.nvim_command("au BufWritePre lua vim.lsp.buf.format { async = false }") -end + vim.api.nvim_command('au BufWritePre lua vim.lsp.buf.format { async = false }') + end, } lspconfig.pyright.setup { capabilities = capabilities } lspconfig.nil_ls.setup { capabilities = capabilities } -vim.keymap.set('n', 'de', vim.diagnostic.open_float, {desc = "Toggle diagnostic"}) -vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, {desc = "Prev diagnostic"}) -vim.keymap.set('n', ']d', vim.diagnostic.goto_next, {desc = "Next diagnostic"}) +vim.keymap.set('n', 'de', vim.diagnostic.open_float, { desc = 'Toggle diagnostic' }) +vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, { desc = 'Prev diagnostic' }) +vim.keymap.set('n', ']d', vim.diagnostic.goto_next, { desc = 'Next diagnostic' }) -vim.diagnostic.config({ - virtual_text = true, - underline = true, - update_in_insert = false, -}) +vim.diagnostic.config { + virtual_text = true, + underline = true, + update_in_insert = false, +} -- Use LspAttach autocommand to only map the following keys -- after the language server attaches to the current buffer vim.api.nvim_create_autocmd('LspAttach', { - group = vim.api.nvim_create_augroup('UserLspConfig', {}), - callback = function(ev) - local bufnr = ev.buf - local client = vim.lsp.get_client_by_id(ev.data.client_id) - -- Buffer local mappings. - -- See `:help vim.lsp.*` for documentation on any of the below functions - vim.keymap.set('n', 'K', vim.lsp.buf.hover, { buffer = ev.buf, noremap = true, silent = true , desc = "LSP hover"}) - vim.keymap.set('n', 'rn', vim.lsp.buf.rename, { buffer = ev.buf, noremap = true, silent = true , desc = "LSP Rename"}) - vim.keymap.set({ 'n', 'v' }, 'da', vim.lsp.buf.code_action, { buffer = ev.buf, noremap = true, silent = true , desc = "LSP code action"}) - vim.keymap.set("n", "dd", "Telescope lsp_definitions", { buffer = ev.buf, noremap = true, silent = true , desc = "LSP definitions"}) - vim.keymap.set("n", "di", "Telescope lsp_implementations", { buffer = ev.buf, noremap = true, silent = true , desc = "LSP implementations"}) - vim.keymap.set("n", "dr", "Telescope lsp_references", { buffer = ev.buf, noremap = true, silent = true , desc = "LSP references"}) - vim.keymap.set("n", "dt", "Telescope lsp_type_definitions", { buffer = ev.buf, noremap = true, silent = true , desc = "LSP type defs"}) - vim.keymap.set("n", "ds", "Telescope lsp_document_symbols", { buffer = ev.buf, noremap = true, silent = true , desc = "LSP symbols"}) - vim.keymap.set('n', 'dl', vim.lsp.codelens.run, { buffer = ev.buf, noremap = true, silent = true , desc = "LSP codelens"}) - vim.keymap.set('n', 'df', function() - vim.lsp.buf.format { async = true } - end,{ buffer = ev.buf, noremap = true, silent = true , desc = "LSP format"}) - -- Auto-refresh code lenses - if not client then - return - end - local group = vim.api.nvim_create_augroup(string.format('lsp-%s-%s', bufnr, client.id), {}) - if client.server_capabilities.codeLensProvider then - vim.api.nvim_create_autocmd({ 'InsertLeave', 'BufWritePost', 'TextChanged' }, { - group = group, - callback = function() - vim.lsp.codelens.refresh { bufnr = bufnr } - end, - buffer = bufnr, - }) + group = vim.api.nvim_create_augroup('UserLspConfig', {}), + callback = function(ev) + local bufnr = ev.buf + local client = vim.lsp.get_client_by_id(ev.data.client_id) + -- Buffer local mappings. + -- See `:help vim.lsp.*` for documentation on any of the below functions + vim.keymap.set('n', 'K', vim.lsp.buf.hover, { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP hover' }) + vim.keymap.set( + 'n', + 'rn', + vim.lsp.buf.rename, + { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP Rename' } + ) + vim.keymap.set( + { 'n', 'v' }, + 'da', + vim.lsp.buf.code_action, + { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP code action' } + ) + vim.keymap.set( + 'n', + 'dd', + 'Telescope lsp_definitions', + { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP definitions' } + ) + vim.keymap.set( + 'n', + 'di', + 'Telescope lsp_implementations', + { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP implementations' } + ) + vim.keymap.set( + 'n', + 'dr', + 'Telescope lsp_references', + { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP references' } + ) + vim.keymap.set( + 'n', + 'dt', + 'Telescope lsp_type_definitions', + { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP type defs' } + ) + vim.keymap.set( + 'n', + 'ds', + 'Telescope lsp_document_symbols', + { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP symbols' } + ) + vim.keymap.set( + 'n', + 'dl', + vim.lsp.codelens.run, + { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP codelens' } + ) + vim.keymap.set('n', 'df', function() + vim.lsp.buf.format { async = true } + end, { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP format' }) + -- Auto-refresh code lenses + if not client then + return + end + local group = vim.api.nvim_create_augroup(string.format('lsp-%s-%s', bufnr, client.id), {}) + if client.server_capabilities.codeLensProvider then + vim.api.nvim_create_autocmd({ 'InsertLeave', 'BufWritePost', 'TextChanged' }, { + group = group, + callback = function() vim.lsp.codelens.refresh { bufnr = bufnr } - end - end, + end, + buffer = bufnr, + }) + vim.lsp.codelens.refresh { bufnr = bufnr } + end + end, }) - diff --git a/nvim/plugin/luasnip.lua b/nvim/plugin/luasnip.lua index b6840d6..4fc038b 100644 --- a/nvim/plugin/luasnip.lua +++ b/nvim/plugin/luasnip.lua @@ -3,35 +3,35 @@ if vim.g.did_load_luasnip_plugin then end vim.g.did_load_luasnip_plugin = true -local ls = require("luasnip") +local ls = require('luasnip') ls.config.set_config { history = true, - updateevents = "TextChanged, TextChangedI", + updateevents = 'TextChanged, TextChangedI', } -require("luasnip.loaders.from_vscode").lazy_load() +require('luasnip.loaders.from_vscode').lazy_load() -vim.keymap.set({"i", "s"}, "", function() +vim.keymap.set({ 'i', 's' }, '', function() if ls.expand_or_jumpable() then ls.expand_or_jump() - end -end, {silent = true}) + end +end, { silent = true }) -vim.keymap.set({"i", "s"}, "", function() +vim.keymap.set({ 'i', 's' }, '', function() if ls.jumpable(-1) then ls.jump(-1) - end -end, {silent = true}) + end +end, { silent = true }) -vim.keymap.set({"i", "s"}, "", function() - if ls.choice_active() then - ls.change_choice(1) - end -end, {silent = true}) +vim.keymap.set({ 'i', 's' }, '', function() + if ls.choice_active() then + ls.change_choice(1) + end +end, { silent = true }) -------------------- -- Snippets -- -------------------- -local fmta = require("luasnip.extras.fmt").fmta -ls.add_snippets("go", { - ls.snippet("ie", fmta("if err != nil {\n\treturn \n}", { err = ls.insert_node(1, "err") })), +local fmta = require('luasnip.extras.fmt').fmta +ls.add_snippets('go', { + ls.snippet('ie', fmta('if err != nil {\n\treturn \n}', { err = ls.insert_node(1, 'err') })), }) diff --git a/nvim/plugin/mini.lua b/nvim/plugin/mini.lua index 166b99e..e36b970 100644 --- a/nvim/plugin/mini.lua +++ b/nvim/plugin/mini.lua @@ -21,11 +21,9 @@ require('mini.surround').setup() -- :Trim require('mini.trailspace').setup() -vim.api.nvim_create_user_command('Trim', - function() - require("mini.trailspace").trim() - end, {} -) +vim.api.nvim_create_user_command('Trim', function() + require('mini.trailspace').trim() +end, {}) -- prefix \ -- `b` - |'background'|. @@ -39,31 +37,31 @@ vim.api.nvim_create_user_command('Trim', -- `r` - |'relativenumber'|. -- `s` - |'spell'|. -- `w` - |'wrap'|. -require('mini.basics').setup({ - mappings = { - windows = true - } -}) +require('mini.basics').setup { + mappings = { + windows = true, + }, +} -- gS -require('mini.splitjoin').setup({ - detect = { - separator = '[,;\n]' - } -}) +require('mini.splitjoin').setup { + detect = { + separator = '[,;\n]', + }, +} require('mini.pairs').setup() vim.cmd([[ hi MiniCursorwordCurrent ctermfg=240 ]]) -- f F t T require('mini.jump').setup() -require('mini.jump2d').setup({ - mappings = { start_jumping = 's' } -}) +require('mini.jump2d').setup { + mappings = { start_jumping = 's' }, +} indent = require('mini.indentscope') -indent.setup({ - options = { try_as_border = false }, - draw = { delay = 0 } -}) +indent.setup { + options = { try_as_border = false }, + draw = { delay = 0 }, +} indent.gen_animation.none() diff --git a/nvim/plugin/misc.lua b/nvim/plugin/misc.lua index 9c4d310..c567fcc 100644 --- a/nvim/plugin/misc.lua +++ b/nvim/plugin/misc.lua @@ -6,15 +6,15 @@ vim.g.did_load_plugins_plugin = true -- many plugins annoyingly require a call to a 'setup' function to be loaded, -- even with default configs -require("neogen").setup{} -vim.keymap.set("n","nd", "Neogen", {noremap = true, silent = true, desc = "Neogen - gen comments"}) +require('neogen').setup {} +vim.keymap.set('n', 'nd', 'Neogen', { noremap = true, silent = true, desc = 'Neogen - gen comments' }) -require("toggleterm").setup{ - open_mapping = [[]], - direction = "float", - close_on_exit = true, +require('toggleterm').setup { + open_mapping = [[]], + direction = 'float', + close_on_exit = true, } require('which-key').setup { - preset = 'helix' + preset = 'helix', } diff --git a/nvim/plugin/neogit.lua b/nvim/plugin/neogit.lua index 3ef2047..27e8bf2 100644 --- a/nvim/plugin/neogit.lua +++ b/nvim/plugin/neogit.lua @@ -12,4 +12,4 @@ neogit.setup { fzf_lua = true, }, } -vim.keymap.set('n', 'ng', neogit.open, { noremap = true, silent = true, desc = "Neogit"}) +vim.keymap.set('n', 'ng', neogit.open, { noremap = true, silent = true, desc = 'Neogit' }) diff --git a/nvim/plugin/oil.lua b/nvim/plugin/oil.lua index 1b38b6a..1c4a521 100644 --- a/nvim/plugin/oil.lua +++ b/nvim/plugin/oil.lua @@ -4,20 +4,20 @@ end vim.g.did_load_oil_plugin = true local oil = require('oil') -oil.setup({ - watch_for_changes = true, - columns = { - "permissions", - "size" - }, - view_options = { - show_hidden = true - }, - keymaps = { - ["wq"] = "actions.close" - } -}) -vim.keymap.set("n", "c", oil.toggle_float, {noremap = true, silent = true}); -vim.keymap.set("n", "u", "UndotreeToggle") +oil.setup { + watch_for_changes = true, + columns = { + 'permissions', + 'size', + }, + view_options = { + show_hidden = true, + }, + keymaps = { + ['wq'] = 'actions.close', + }, +} +vim.keymap.set('n', 'c', oil.toggle_float, { noremap = true, silent = true }) +vim.keymap.set('n', 'u', 'UndotreeToggle') vim.g.undotree_ShortIndicators = 1 vim.g.undotree_SetFocusWhenToggle = 1 diff --git a/nvim/plugin/statuscol.lua b/nvim/plugin/statuscol.lua index 60125f1..1cc61f1 100644 --- a/nvim/plugin/statuscol.lua +++ b/nvim/plugin/statuscol.lua @@ -2,6 +2,6 @@ if vim.g.did_load_diffview_plugin then return end vim.g.did_load_diffview_plugin = true -require("diffview").setup({ +require('diffview').setup { use_icons = false, -}) +} diff --git a/nvim/plugin/telescope.lua b/nvim/plugin/telescope.lua index ce35f8d..5d332f0 100644 --- a/nvim/plugin/telescope.lua +++ b/nvim/plugin/telescope.lua @@ -3,7 +3,7 @@ if vim.g.did_load_telescope_plugin then end vim.g.did_load_telescope_plugin = true -local telescope = require("telescope.builtin") +local telescope = require('telescope.builtin') -- Fall back to find_files if not in a git repo local project_files = function() @@ -14,49 +14,69 @@ local project_files = function() end end -vim.keymap.set("n", "", telescope.buffers, {noremap = true, silent = true, desc = "Fuzzy find buffers"}) -vim.keymap.set("n", "ff", project_files, {noremap = true, silent = true, desc = "Fuzzy find git files"}) -vim.keymap.set("n", "fg", telescope.find_files, {noremap = true, silent = true, desc = "Fuzzy find files"}) -vim.keymap.set("n", "fc", telescope.command_history, {noremap = true, silent = true, desc = "Fuzzy find command_history"}) -vim.keymap.set("n", "fa", telescope.live_grep, {noremap = true, silent = true, desc = "Fuzzy find grep"}) -vim.keymap.set("n", "f8", telescope.grep_string, {noremap = true, silent = true, desc = "Fuzzy find grep current word"}) -vim.keymap.set("n", "fs", telescope.treesitter, {noremap = true, silent = true, desc = "Fuzzy find treesitter objects"}) -vim.keymap.set("n", "fq", telescope.quickfix, {noremap = true, silent = true, desc = "Fuzzy find quickfix"}) -vim.keymap.set("n", "f", telescope.resume, {noremap = true, silent = true, desc = "Fuzzy find resume"}) +vim.keymap.set( + 'n', + '', + telescope.buffers, + { noremap = true, silent = true, desc = 'Fuzzy find buffers' } +) +vim.keymap.set('n', 'ff', project_files, { noremap = true, silent = true, desc = 'Fuzzy find git files' }) +vim.keymap.set('n', 'fg', telescope.find_files, { noremap = true, silent = true, desc = 'Fuzzy find files' }) +vim.keymap.set( + 'n', + 'fc', + telescope.command_history, + { noremap = true, silent = true, desc = 'Fuzzy find command_history' } +) +vim.keymap.set('n', 'fa', telescope.live_grep, { noremap = true, silent = true, desc = 'Fuzzy find grep' }) +vim.keymap.set( + 'n', + 'f8', + telescope.grep_string, + { noremap = true, silent = true, desc = 'Fuzzy find grep current word' } +) +vim.keymap.set( + 'n', + 'fs', + telescope.treesitter, + { noremap = true, silent = true, desc = 'Fuzzy find treesitter objects' } +) +vim.keymap.set('n', 'fq', telescope.quickfix, { noremap = true, silent = true, desc = 'Fuzzy find quickfix' }) +vim.keymap.set('n', 'f', telescope.resume, { noremap = true, silent = true, desc = 'Fuzzy find resume' }) -local telescope = require("telescope") -telescope.setup({ - defaults = { - layout_strategy = "vertical", - layout_config = { width = .90, }, - prompt_title = false, - results_title = false, - preview_title = false, - vimgrep_arguments = { - "rg", - '-L', - "--color=never", - "--no-heading", - "--hidden", - "--with-filename", - "--line-number", - "--column", - "--smart-case" - }, - preview = { - treesitter = true, - }, - path_display = { - 'truncate', - }, - mappings = { - i = { - ["wq"] = require("telescope.actions").close, - [""] = require("telescope.actions").close, - [""] = require("telescope.actions").move_selection_previous, - [""] = require("telescope.actions").move_selection_next, - }, - }, +local telescope = require('telescope') +telescope.setup { + defaults = { + layout_strategy = 'vertical', + layout_config = { width = 0.90 }, + prompt_title = false, + results_title = false, + preview_title = false, + vimgrep_arguments = { + 'rg', + '-L', + '--color=never', + '--no-heading', + '--hidden', + '--with-filename', + '--line-number', + '--column', + '--smart-case', }, -}) -telescope.load_extension("fzf") + preview = { + treesitter = true, + }, + path_display = { + 'truncate', + }, + mappings = { + i = { + ['wq'] = require('telescope.actions').close, + [''] = require('telescope.actions').close, + [''] = require('telescope.actions').move_selection_previous, + [''] = require('telescope.actions').move_selection_next, + }, + }, + }, +} +telescope.load_extension('fzf') diff --git a/nvim/plugin/treesitter.lua b/nvim/plugin/treesitter.lua index ed6e111..0ac66cd 100644 --- a/nvim/plugin/treesitter.lua +++ b/nvim/plugin/treesitter.lua @@ -3,61 +3,62 @@ if vim.g.did_load_treesitter_plugin then end vim.g.did_load_treesitter_plugin = true -require("nvim-treesitter.configs").setup { - ensure_installed = {}, - highlight = { +require('nvim-treesitter.configs').setup { + ensure_installed = {}, + highlight = { + enable = true, + disable = function(_, buf) + local max_filesize = 100 * 1024 -- 100 KiB + local ok, stats = pcall(vim.loop.fs_stat, vim.api.nvim_buf_get_name(buf)) + if ok and stats and stats.size > max_filesize then + return true + end + end, + }, + indent = { + enable = true, + }, + textobjects = { + select = { enable = true, - disable = function(_, buf) - local max_filesize = 100 * 1024 -- 100 KiB - local ok, stats = pcall(vim.loop.fs_stat, vim.api.nvim_buf_get_name(buf)) - if ok and stats and stats.size > max_filesize then - return true - end - end, + lookahead = true, + keymaps = { + ['af'] = '@function.outer', + ['if'] = '@function.inner', + ['aa'] = '@statement.outer', + ['ia'] = '@parameter.inner', + }, }, - indent = { - enable = true, + move = { + enable = true, + set_jumps = true, -- whether to set jumps in the jumplist + goto_next_start = { + [']]'] = '@function.outer', + [']a'] = '@parameter.inner', + }, + goto_previous_start = { + ['[['] = '@function.outer', + ['[a'] = '@parameter.inner', + }, }, - textobjects = { - select = { - enable = true, - lookahead = true, - keymaps = { - ["af"] = "@function.outer", - ["if"] = "@function.inner", - ["aa"] = "@statement.outer", - ["ia"] = "@parameter.inner", - }, - }, - move = { - enable = true, - set_jumps = true, -- whether to set jumps in the jumplist - goto_next_start = { - [']]'] = '@function.outer', - [']a'] = '@parameter.inner', - }, - goto_previous_start = { - ['[['] = '@function.outer', - ['[a'] = '@parameter.inner', - }, - }, - swap = { - enable = true, - swap_next = { - ["s]"] = "@parameter.inner", - }, - swap_previous = { - ["s["] = "@parameter.inner", - }, - }, }, - incremental_selection = { - enable = true, - keymaps = { - init_selection = '', - node_incremental = '', - node_decremental = '', - }, + swap = { + enable = true, + swap_next = { + ['s]'] = '@parameter.inner', + }, + swap_previous = { + ['s['] = '@parameter.inner', + }, }, + }, + incremental_selection = { + enable = true, + keymaps = { + init_selection = '', + node_incremental = '', + node_decremental = '', + }, + }, } require('treesitter-context').setup { diff --git a/nvim/plugin/which-key.lua b/nvim/plugin/which-key.lua index def52f8..89030a5 100644 --- a/nvim/plugin/which-key.lua +++ b/nvim/plugin/which-key.lua @@ -1,3 +1,3 @@ require('which-key').setup { - preset = 'helix' + preset = 'helix', } From adef2193d6fcae7b1e5678ea46cf466e5cad5456 Mon Sep 17 00:00:00 2001 From: iofq Date: Sat, 10 Aug 2024 01:51:23 -0500 Subject: [PATCH 059/160] fix gh workflow --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 9f64720..478c58a 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: include: - - package_name: neovim + - package_name: nvim steps: - uses: actions/checkout@v3 - uses: DeterminateSystems/nix-installer-action@main From b25deb86c142b675351a34c37add06cef9b25b2b Mon Sep 17 00:00:00 2001 From: iofq Date: Sat, 10 Aug 2024 02:14:53 -0500 Subject: [PATCH 060/160] add vim alias --- nix/neovim-overlay.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index be4e21a..27095b0 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -81,6 +81,7 @@ with final.pkgs.lib; let in { nvim-pkg = mkNeovim { plugins = all-plugins; + appName = "nvim"; inherit extraPackages; }; From 3f579483604516da6d79f46763ae5787c56fac4d Mon Sep 17 00:00:00 2001 From: iofq Date: Sat, 10 Aug 2024 14:27:25 -0500 Subject: [PATCH 061/160] add eyeliner, trouble --- nix/neovim-overlay.nix | 2 ++ nvim/after/plugin/color.lua | 2 ++ nvim/init.lua | 9 ----- nvim/plugin/diffview.lua | 7 ---- nvim/plugin/git.lua | 7 ---- nvim/plugin/gitsigns.lua | 70 ++++++++++++++++++------------------- nvim/plugin/keymaps.lua | 6 ++-- nvim/plugin/lsp.lua | 2 +- nvim/plugin/mini.lua | 2 -- nvim/plugin/misc.lua | 2 ++ nvim/plugin/statuscol.lua | 7 ---- nvim/plugin/treesitter.lua | 1 + 12 files changed, 45 insertions(+), 72 deletions(-) delete mode 100644 nvim/plugin/diffview.lua delete mode 100644 nvim/plugin/git.lua delete mode 100644 nvim/plugin/statuscol.lua diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index 27095b0..99a98c7 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -23,6 +23,7 @@ with final.pkgs.lib; let cmp-treesitter cmp_luasnip diffview-nvim + eyeliner-nvim friendly-snippets gitsigns-nvim lualine-nvim @@ -68,6 +69,7 @@ with final.pkgs.lib; let telescope-fzf-native-nvim telescope-nvim toggleterm-nvim + trouble-nvim undotree which-key-nvim ]; diff --git a/nvim/after/plugin/color.lua b/nvim/after/plugin/color.lua index 18f2d6b..68bb744 100644 --- a/nvim/after/plugin/color.lua +++ b/nvim/after/plugin/color.lua @@ -1,2 +1,4 @@ vim.cmd('colorscheme terafox') vim.keymap.set('n', 'aa', 'AerialToggle!', { desc = 'Toggle Aerial' }) +vim.keymap.set('n', 'nb', vim.cmd.DiffviewOpen, { noremap = true, desc = '[g]it [d]iffview open' }) +vim.keymap.set('n', 't', "Trouble diagnostics toggle focus=true filter.buf=0", { noremap = true, desc = 'Trouble diagnostics' }) diff --git a/nvim/init.lua b/nvim/init.lua index 7ff6dec..e748f34 100644 --- a/nvim/init.lua +++ b/nvim/init.lua @@ -73,12 +73,3 @@ vim.diagnostic.config { prefix = '', }, } - -vim.keymap.set('n', 'ee', function() - local _, winid = vim.diagnostic.open_float(nil, { scope = 'line' }) - if not winid then - vim.notify('no diagnostics found', vim.log.levels.INFO) - return - end - vim.api.nvim_win_set_config(winid or 0, { focusable = true }) -end, { noremap = true, silent = true, desc = 'diagnostics floating window' }) diff --git a/nvim/plugin/diffview.lua b/nvim/plugin/diffview.lua deleted file mode 100644 index 01592e7..0000000 --- a/nvim/plugin/diffview.lua +++ /dev/null @@ -1,7 +0,0 @@ -if vim.g.did_load_diffview_plugin then - return -end -vim.g.did_load_diffview_plugin = true - -require('diffview').setup { use_icons = false } -vim.keymap.set('n', 'gdd', vim.cmd.DiffviewOpen, { desc = '[g]it [d]iffview open' }) diff --git a/nvim/plugin/git.lua b/nvim/plugin/git.lua deleted file mode 100644 index 1cc61f1..0000000 --- a/nvim/plugin/git.lua +++ /dev/null @@ -1,7 +0,0 @@ -if vim.g.did_load_diffview_plugin then - return -end -vim.g.did_load_diffview_plugin = true -require('diffview').setup { - use_icons = false, -} diff --git a/nvim/plugin/gitsigns.lua b/nvim/plugin/gitsigns.lua index 1d61095..5dd0de8 100644 --- a/nvim/plugin/gitsigns.lua +++ b/nvim/plugin/gitsigns.lua @@ -3,40 +3,38 @@ if vim.g.did_load_gitsigns_plugin then end vim.g.did_load_gitsigns_plugin = true -vim.schedule(function() - require('gitsigns').setup { - signcolumn = false, - numhl = true, - on_attach = function() - local gs = package.loaded.gitsigns - vim.keymap.set('n', 'gg', gs.preview_hunk, { desc = 'git preview hunk' }) - vim.keymap.set('n', 'gb', function() - gs.blame_line { full = true } - end, { desc = 'git blame_line' }) - vim.keymap.set('n', 'gr', gs.reset_hunk, { desc = 'git reset hunk' }) - vim.keymap.set('v', 'gr', function() - gs.reset_hunk { vim.fn.line('.'), vim.fn.line('v') } - end, { desc = 'git reset hunk' }) - -- Navigation - vim.keymap.set('n', ']g', function() - if vim.wo.diff then - return ']c' - end - vim.schedule(function() - gs.next_hunk() - end) - return '' - end, { expr = true }) +require('gitsigns').setup { + signcolumn = false, + numhl = true, + on_attach = function() + local gs = package.loaded.gitsigns + vim.keymap.set('n', 'gg', gs.preview_hunk, { desc = 'git preview hunk' }) + vim.keymap.set('n', 'gb', function() + gs.blame_line { full = true } + end, { desc = 'git blame_line' }) + vim.keymap.set('n', 'gr', gs.reset_hunk, { desc = 'git reset hunk' }) + vim.keymap.set('v', 'gr', function() + gs.reset_hunk { vim.fn.line('.'), vim.fn.line('v') } + end, { desc = 'git reset hunk' }) + -- Navigation + vim.keymap.set('n', ']g', function() + if vim.wo.diff then + return ']c' + end + vim.schedule(function() + gs.next_hunk() + end) + return '' + end, { expr = true }) - vim.keymap.set('n', '[g', function() - if vim.wo.diff then - return '[c' - end - vim.schedule(function() - gs.prev_hunk() - end) - return '' - end, { expr = true }) - end, - } -end) + vim.keymap.set('n', '[g', function() + if vim.wo.diff then + return '[c' + end + vim.schedule(function() + gs.prev_hunk() + end) + return '' + end, { expr = true }) + end, +} diff --git a/nvim/plugin/keymaps.lua b/nvim/plugin/keymaps.lua index 8787061..9a5056e 100644 --- a/nvim/plugin/keymaps.lua +++ b/nvim/plugin/keymaps.lua @@ -8,6 +8,6 @@ vim.keymap.set('n', '', 'zz') vim.keymap.set('n', '', 'm0i`0', { noremap = true, silent = true }) vim.keymap.set({ 'v', 'i' }, 'wq', 'l', { noremap = true, silent = true }) vim.keymap.set({ 'n', 'v', 'i' }, 'qwq', 'lwqa', { noremap = true, silent = true }) -vim.keymap.set({ 'n', 'v' }, 'yy', '"+y', { noremap = true, silent = true, desc = 'Yank to clip' }) -vim.keymap.set({ 'n', 'v' }, 'yp', '"+p', { noremap = true, silent = true, desc = 'Paste from clip' }) -vim.keymap.set({ 'n', 'v' }, 'yd', '"+d', { noremap = true, silent = true, desc = 'Delete to clip' }) +vim.keymap.set({ 'n', 'v' }, 'yy', '"*y', { noremap = true, silent = true, desc = 'Yank to clip' }) +vim.keymap.set({ 'n', 'v' }, 'yp', '"*p', { noremap = true, silent = true, desc = 'Paste from clip' }) +vim.keymap.set({ 'n', 'v' }, 'yd', '"*d', { noremap = true, silent = true, desc = 'Delete to clip' }) diff --git a/nvim/plugin/lsp.lua b/nvim/plugin/lsp.lua index 5dde0b3..6156159 100644 --- a/nvim/plugin/lsp.lua +++ b/nvim/plugin/lsp.lua @@ -16,9 +16,9 @@ lspconfig.gopls.setup { lspconfig.pyright.setup { capabilities = capabilities } lspconfig.nil_ls.setup { capabilities = capabilities } -vim.keymap.set('n', 'de', vim.diagnostic.open_float, { desc = 'Toggle diagnostic' }) vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, { desc = 'Prev diagnostic' }) vim.keymap.set('n', ']d', vim.diagnostic.goto_next, { desc = 'Next diagnostic' }) +vim.keymap.set('n', 'de', vim.diagnostic.open_float, { desc = 'Toggle diagnostic' }) vim.diagnostic.config { virtual_text = true, diff --git a/nvim/plugin/mini.lua b/nvim/plugin/mini.lua index e36b970..39d1729 100644 --- a/nvim/plugin/mini.lua +++ b/nvim/plugin/mini.lua @@ -53,8 +53,6 @@ require('mini.splitjoin').setup { require('mini.pairs').setup() vim.cmd([[ hi MiniCursorwordCurrent ctermfg=240 ]]) --- f F t T -require('mini.jump').setup() require('mini.jump2d').setup { mappings = { start_jumping = 's' }, } diff --git a/nvim/plugin/misc.lua b/nvim/plugin/misc.lua index c567fcc..9d08c8d 100644 --- a/nvim/plugin/misc.lua +++ b/nvim/plugin/misc.lua @@ -18,3 +18,5 @@ require('toggleterm').setup { require('which-key').setup { preset = 'helix', } +require('trouble').setup {} +require('eyeliner').setup {} diff --git a/nvim/plugin/statuscol.lua b/nvim/plugin/statuscol.lua deleted file mode 100644 index 1cc61f1..0000000 --- a/nvim/plugin/statuscol.lua +++ /dev/null @@ -1,7 +0,0 @@ -if vim.g.did_load_diffview_plugin then - return -end -vim.g.did_load_diffview_plugin = true -require('diffview').setup { - use_icons = false, -} diff --git a/nvim/plugin/treesitter.lua b/nvim/plugin/treesitter.lua index 0ac66cd..ab11674 100644 --- a/nvim/plugin/treesitter.lua +++ b/nvim/plugin/treesitter.lua @@ -63,4 +63,5 @@ require('nvim-treesitter.configs').setup { require('treesitter-context').setup { max_lines = 3, + min_window_height = 50 } From bdaba979acff49035aa85d53bbc8f583d191d0b7 Mon Sep 17 00:00:00 2001 From: iofq Date: Tue, 13 Aug 2024 02:50:48 -0500 Subject: [PATCH 062/160] add a few plugins like neoclip, markvieww --- flake.lock | 19 ++++++++++++++++++- flake.nix | 11 ++++------- nix/neovim-overlay.nix | 12 +++++------- nvim/after/plugin/color.lua | 18 +++++++++++++++++- nvim/init.lua | 2 +- nvim/plugin/aerial.lua | 9 ++++++--- nvim/plugin/completion.lua | 2 +- nvim/plugin/keymaps.lua | 11 +++++------ nvim/plugin/lsp.lua | 1 - nvim/plugin/lualine.lua | 9 ++++++++- nvim/plugin/mini.lua | 4 +++- nvim/plugin/misc.lua | 6 ++++++ nvim/plugin/telescope.lua | 8 +------- nvim/plugin/treesitter.lua | 4 +--- 14 files changed, 76 insertions(+), 40 deletions(-) diff --git a/flake.lock b/flake.lock index e72b4c6..a379f8a 100644 --- a/flake.lock +++ b/flake.lock @@ -99,11 +99,28 @@ "type": "github" } }, + "render-markdown-nvim": { + "flake": false, + "locked": { + "lastModified": 1723453943, + "narHash": "sha256-fpmR6cqjnRcyJO2rP/8WXbu+mSSH+yblI5yyt/5yL6w=", + "owner": "MeanderingProgrammer", + "repo": "render-markdown.nvim", + "rev": "72688baea4ef0ed605033bf654b54d801b6a5f01", + "type": "github" + }, + "original": { + "owner": "MeanderingProgrammer", + "repo": "render-markdown.nvim", + "type": "github" + } + }, "root": { "inputs": { "flake-utils": "flake-utils", "gen-luarc": "gen-luarc", - "nixpkgs": "nixpkgs_2" + "nixpkgs": "nixpkgs_2", + "render-markdown-nvim": "render-markdown-nvim" } }, "systems": { diff --git a/flake.nix b/flake.nix index 36a10c5..dfe24b7 100644 --- a/flake.nix +++ b/flake.nix @@ -5,13 +5,10 @@ nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; gen-luarc.url = "github:mrcjkb/nix-gen-luarc-json"; - - # 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; - # }; + render-markdown-nvim = { + url = "github:MeanderingProgrammer/render-markdown.nvim"; + flake = false; + }; }; outputs = inputs @ { diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index 99a98c7..701f427 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -3,13 +3,6 @@ with final.pkgs.lib; let pkgs = final; - # Use this to create a plugin from a flake input - # mkNvimPlugin = src: pname: - # pkgs.vimUtils.buildVimPlugin { - # inherit pname src; - # version = src.lastModifiedDate; - # }; - pkgs-wrapNeovim = inputs.nixpkgs.legacyPackages.${pkgs.system}; mkNeovim = pkgs.callPackage ./mkNeovim.nix { inherit pkgs-wrapNeovim; }; @@ -23,17 +16,21 @@ with final.pkgs.lib; let cmp-treesitter cmp_luasnip diffview-nvim + dressing-nvim + everforest eyeliner-nvim friendly-snippets gitsigns-nvim lualine-nvim luasnip + markview-nvim mini-nvim neogen neogit nightfox-nvim nvim-cmp nvim-lspconfig + nvim-neoclip-lua nvim-treesitter-context nvim-treesitter-textobjects (nvim-treesitter.withPlugins(p: with p; [ @@ -66,6 +63,7 @@ with final.pkgs.lib; let nvim-web-devicons oil-nvim rose-pine + scope-nvim telescope-fzf-native-nvim telescope-nvim toggleterm-nvim diff --git a/nvim/after/plugin/color.lua b/nvim/after/plugin/color.lua index 68bb744..aeae73a 100644 --- a/nvim/after/plugin/color.lua +++ b/nvim/after/plugin/color.lua @@ -1,4 +1,20 @@ +vim.keymap.set('n', 'x', '"rd', { remap = true, silent = true }) vim.cmd('colorscheme terafox') +vim.api.nvim_set_hl(0, 'TabLineSel', { ctermbg=none, underline = true}) +vim.api.nvim_set_hl(0, 'TabLine', { ctermbg=none, underline = false}) + vim.keymap.set('n', 'aa', 'AerialToggle!', { desc = 'Toggle Aerial' }) vim.keymap.set('n', 'nb', vim.cmd.DiffviewOpen, { noremap = true, desc = '[g]it [d]iffview open' }) -vim.keymap.set('n', 't', "Trouble diagnostics toggle focus=true filter.buf=0", { noremap = true, desc = 'Trouble diagnostics' }) +vim.keymap.set('n', 'de', "Trouble diagnostics toggle focus=true filter.buf=0", { noremap = true, desc = 'Trouble diagnostics' }) + +vim.api.nvim_set_hl(0, 'EyelinerPrimary', { underline = true }) +vim.api.nvim_set_hl(0, 'EyelinerSecondary', { underline = true }) + +local ts = require("telescope") +ts.load_extension("aerial") +vim.keymap.set( + 'n', + 'fs', + ts.extensions.aerial.aerial, + { noremap = true, silent = true, desc = 'Fuzzy find treesitter objects' } +) diff --git a/nvim/init.lua b/nvim/init.lua index e748f34..39aba7e 100644 --- a/nvim/init.lua +++ b/nvim/init.lua @@ -1,6 +1,7 @@ -- vim settings ++ mini.nvim.basics ---------------------------------------- vim.opt.backspace = 'indent,eol,start' +vim.opt.clipboard = 'unnamedplus' vim.opt.completeopt = 'menuone' vim.opt.expandtab = true -- insert tabs as spaces vim.opt.inccommand = 'split' -- incremental live completion @@ -18,7 +19,6 @@ 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.g.fzf_layout = { window = { width = 0.9, height = 0.6 } } -- no highlight floats diff --git a/nvim/plugin/aerial.lua b/nvim/plugin/aerial.lua index 22322fd..4e27aa7 100644 --- a/nvim/plugin/aerial.lua +++ b/nvim/plugin/aerial.lua @@ -4,10 +4,13 @@ end vim.g.did_load_aerial_plugin = true require('aerial').setup { - default_direction = 'left', autojump = true, on_attach = function(bufnr) - vim.keymap.set('n', '{', 'AerialPrev', { buffer = bufnr }) - vim.keymap.set('n', '}', 'AerialNext', { buffer = bufnr }) + vim.keymap.set('n', '[[', 'AerialPrev', { buffer = bufnr }) + vim.keymap.set('n', ']]', 'AerialNext', { buffer = bufnr }) end, + close_autonatic_events = { + unfocus, + switch_buffer, + }, } diff --git a/nvim/plugin/completion.lua b/nvim/plugin/completion.lua index 0b68498..5e3e1b4 100644 --- a/nvim/plugin/completion.lua +++ b/nvim/plugin/completion.lua @@ -18,7 +18,7 @@ cmp.setup { [''] = cmp.mapping.scroll_docs(-4), [''] = cmp.mapping.scroll_docs(4), [''] = cmp.mapping.complete(), - ['q'] = cmp.mapping.abort(), + [''] = cmp.mapping.abort(), [''] = cmp.mapping.confirm { select = true }, -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. }, sources = cmp.config.sources({ diff --git a/nvim/plugin/keymaps.lua b/nvim/plugin/keymaps.lua index 9a5056e..ea6cd6f 100644 --- a/nvim/plugin/keymaps.lua +++ b/nvim/plugin/keymaps.lua @@ -1,13 +1,12 @@ -vim.keymap.set('n', 'gr', 'gT', { noremap = true, silent = true }) +vim.keymap.set('n', 'tt', vim.cmd.tabnext, { silent = true }) +vim.keymap.set('n', 'tr', vim.cmd.tabprev, { silent = true }) +vim.keymap.set('n', 'gt', vim.cmd.bnext, { silent = true }) +vim.keymap.set('n', 'gr', vim.cmd.bprev, { noremap = true, silent = true }) +vim.keymap.set('n', 'gq', vim.cmd.bdelete, { silent = true }) vim.keymap.set('n', 'n', 'nzz', { noremap = true, silent = true }) vim.keymap.set('n', 'N', 'Nzz', { noremap = true, silent = true }) vim.keymap.set('n', '', 'zz') vim.keymap.set('n', '', 'zz') vim.keymap.set('n', '', 'zz') vim.keymap.set('n', '', 'zz') -vim.keymap.set('n', '', 'm0i`0', { noremap = true, silent = true }) vim.keymap.set({ 'v', 'i' }, 'wq', 'l', { noremap = true, silent = true }) -vim.keymap.set({ 'n', 'v', 'i' }, 'qwq', 'lwqa', { noremap = true, silent = true }) -vim.keymap.set({ 'n', 'v' }, 'yy', '"*y', { noremap = true, silent = true, desc = 'Yank to clip' }) -vim.keymap.set({ 'n', 'v' }, 'yp', '"*p', { noremap = true, silent = true, desc = 'Paste from clip' }) -vim.keymap.set({ 'n', 'v' }, 'yd', '"*d', { noremap = true, silent = true, desc = 'Delete to clip' }) diff --git a/nvim/plugin/lsp.lua b/nvim/plugin/lsp.lua index 6156159..765da6b 100644 --- a/nvim/plugin/lsp.lua +++ b/nvim/plugin/lsp.lua @@ -18,7 +18,6 @@ lspconfig.nil_ls.setup { capabilities = capabilities } vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, { desc = 'Prev diagnostic' }) vim.keymap.set('n', ']d', vim.diagnostic.goto_next, { desc = 'Next diagnostic' }) -vim.keymap.set('n', 'de', vim.diagnostic.open_float, { desc = 'Toggle diagnostic' }) vim.diagnostic.config { virtual_text = true, diff --git a/nvim/plugin/lualine.lua b/nvim/plugin/lualine.lua index 7aff49c..257326d 100644 --- a/nvim/plugin/lualine.lua +++ b/nvim/plugin/lualine.lua @@ -6,6 +6,13 @@ vim.g.did_load_lualine_plugin = true vim.schedule(function() require('lualine').setup { globalstatus = true, - extensions = { 'fugitive', 'fzf', 'toggleterm', 'quickfix' }, + extensions = { 'oil', 'trouble', 'aerial', 'fzf', 'toggleterm', 'quickfix' }, + sections = { + lualine_x = {'filetype'} + }, + tabline = { + lualine_a = {'buffers'}, + lualine_z = {'tabs'}, + } } end) diff --git a/nvim/plugin/mini.lua b/nvim/plugin/mini.lua index 39d1729..aedb8c5 100644 --- a/nvim/plugin/mini.lua +++ b/nvim/plugin/mini.lua @@ -54,7 +54,7 @@ require('mini.pairs').setup() vim.cmd([[ hi MiniCursorwordCurrent ctermfg=240 ]]) require('mini.jump2d').setup { - mappings = { start_jumping = 's' }, + mappings = { start_jumping = 'S' }, } indent = require('mini.indentscope') @@ -63,3 +63,5 @@ indent.setup { draw = { delay = 0 }, } indent.gen_animation.none() + +require('mini.icons').setup() diff --git a/nvim/plugin/misc.lua b/nvim/plugin/misc.lua index 9d08c8d..b389bea 100644 --- a/nvim/plugin/misc.lua +++ b/nvim/plugin/misc.lua @@ -13,6 +13,7 @@ require('toggleterm').setup { open_mapping = [[]], direction = 'float', close_on_exit = true, + autochdir = true, } require('which-key').setup { @@ -20,3 +21,8 @@ require('which-key').setup { } require('trouble').setup {} require('eyeliner').setup {} +require('dressing').setup {} +require('markview').setup() +require('scope').setup({}) +require('neoclip').setup({default_register='+'}) +vim.keymap.set('n', 'fp', 'Telescope neoclip', { noremap = true, silent = true, desc = 'Pick clipboard history' }) diff --git a/nvim/plugin/telescope.lua b/nvim/plugin/telescope.lua index 5d332f0..f33f0b3 100644 --- a/nvim/plugin/telescope.lua +++ b/nvim/plugin/telescope.lua @@ -16,7 +16,7 @@ end vim.keymap.set( 'n', - '', + 'fb', telescope.buffers, { noremap = true, silent = true, desc = 'Fuzzy find buffers' } ) @@ -35,12 +35,6 @@ vim.keymap.set( telescope.grep_string, { noremap = true, silent = true, desc = 'Fuzzy find grep current word' } ) -vim.keymap.set( - 'n', - 'fs', - telescope.treesitter, - { noremap = true, silent = true, desc = 'Fuzzy find treesitter objects' } -) vim.keymap.set('n', 'fq', telescope.quickfix, { noremap = true, silent = true, desc = 'Fuzzy find quickfix' }) vim.keymap.set('n', 'f', telescope.resume, { noremap = true, silent = true, desc = 'Fuzzy find resume' }) diff --git a/nvim/plugin/treesitter.lua b/nvim/plugin/treesitter.lua index ab11674..84f43b6 100644 --- a/nvim/plugin/treesitter.lua +++ b/nvim/plugin/treesitter.lua @@ -33,11 +33,9 @@ require('nvim-treesitter.configs').setup { enable = true, set_jumps = true, -- whether to set jumps in the jumplist goto_next_start = { - [']]'] = '@function.outer', [']a'] = '@parameter.inner', }, goto_previous_start = { - ['[['] = '@function.outer', ['[a'] = '@parameter.inner', }, }, @@ -62,6 +60,6 @@ require('nvim-treesitter.configs').setup { } require('treesitter-context').setup { - max_lines = 3, + max_lines = 2, min_window_height = 50 } From 4e88567cac61106c704c7bd4929830f9437a0414 Mon Sep 17 00:00:00 2001 From: iofq Date: Tue, 13 Aug 2024 02:56:48 -0500 Subject: [PATCH 063/160] lint --- nvim/after/plugin/color.lua | 15 ++++++++++----- nvim/plugin/lualine.lua | 8 ++++---- nvim/plugin/misc.lua | 11 ++++++++--- nvim/plugin/telescope.lua | 7 +------ nvim/plugin/treesitter.lua | 2 +- 5 files changed, 24 insertions(+), 19 deletions(-) diff --git a/nvim/after/plugin/color.lua b/nvim/after/plugin/color.lua index aeae73a..1c5fda6 100644 --- a/nvim/after/plugin/color.lua +++ b/nvim/after/plugin/color.lua @@ -1,17 +1,22 @@ vim.keymap.set('n', 'x', '"rd', { remap = true, silent = true }) vim.cmd('colorscheme terafox') -vim.api.nvim_set_hl(0, 'TabLineSel', { ctermbg=none, underline = true}) -vim.api.nvim_set_hl(0, 'TabLine', { ctermbg=none, underline = false}) +vim.api.nvim_set_hl(0, 'TabLineSel', { ctermbg = none, underline = true }) +vim.api.nvim_set_hl(0, 'TabLine', { ctermbg = none, underline = false }) vim.keymap.set('n', 'aa', 'AerialToggle!', { desc = 'Toggle Aerial' }) vim.keymap.set('n', 'nb', vim.cmd.DiffviewOpen, { noremap = true, desc = '[g]it [d]iffview open' }) -vim.keymap.set('n', 'de', "Trouble diagnostics toggle focus=true filter.buf=0", { noremap = true, desc = 'Trouble diagnostics' }) +vim.keymap.set( + 'n', + 'de', + 'Trouble diagnostics toggle focus=true filter.buf=0', + { noremap = true, desc = 'Trouble diagnostics' } +) vim.api.nvim_set_hl(0, 'EyelinerPrimary', { underline = true }) vim.api.nvim_set_hl(0, 'EyelinerSecondary', { underline = true }) -local ts = require("telescope") -ts.load_extension("aerial") +local ts = require('telescope') +ts.load_extension('aerial') vim.keymap.set( 'n', 'fs', diff --git a/nvim/plugin/lualine.lua b/nvim/plugin/lualine.lua index 257326d..a7c1653 100644 --- a/nvim/plugin/lualine.lua +++ b/nvim/plugin/lualine.lua @@ -8,11 +8,11 @@ vim.schedule(function() globalstatus = true, extensions = { 'oil', 'trouble', 'aerial', 'fzf', 'toggleterm', 'quickfix' }, sections = { - lualine_x = {'filetype'} + lualine_x = { 'filetype' }, }, tabline = { - lualine_a = {'buffers'}, - lualine_z = {'tabs'}, - } + lualine_a = { 'buffers' }, + lualine_z = { 'tabs' }, + }, } end) diff --git a/nvim/plugin/misc.lua b/nvim/plugin/misc.lua index b389bea..420ca4e 100644 --- a/nvim/plugin/misc.lua +++ b/nvim/plugin/misc.lua @@ -23,6 +23,11 @@ require('trouble').setup {} require('eyeliner').setup {} require('dressing').setup {} require('markview').setup() -require('scope').setup({}) -require('neoclip').setup({default_register='+'}) -vim.keymap.set('n', 'fp', 'Telescope neoclip', { noremap = true, silent = true, desc = 'Pick clipboard history' }) +require('scope').setup {} +require('neoclip').setup { default_register = '+' } +vim.keymap.set( + 'n', + 'fp', + 'Telescope neoclip', + { noremap = true, silent = true, desc = 'Pick clipboard history' } +) diff --git a/nvim/plugin/telescope.lua b/nvim/plugin/telescope.lua index f33f0b3..b7f295e 100644 --- a/nvim/plugin/telescope.lua +++ b/nvim/plugin/telescope.lua @@ -14,12 +14,7 @@ local project_files = function() end end -vim.keymap.set( - 'n', - 'fb', - telescope.buffers, - { noremap = true, silent = true, desc = 'Fuzzy find buffers' } -) +vim.keymap.set('n', 'fb', telescope.buffers, { noremap = true, silent = true, desc = 'Fuzzy find buffers' }) vim.keymap.set('n', 'ff', project_files, { noremap = true, silent = true, desc = 'Fuzzy find git files' }) vim.keymap.set('n', 'fg', telescope.find_files, { noremap = true, silent = true, desc = 'Fuzzy find files' }) vim.keymap.set( diff --git a/nvim/plugin/treesitter.lua b/nvim/plugin/treesitter.lua index 84f43b6..0444ac3 100644 --- a/nvim/plugin/treesitter.lua +++ b/nvim/plugin/treesitter.lua @@ -61,5 +61,5 @@ require('nvim-treesitter.configs').setup { require('treesitter-context').setup { max_lines = 2, - min_window_height = 50 + min_window_height = 50, } From ca7d7b657d264dc6c102676b6df160257a011893 Mon Sep 17 00:00:00 2001 From: iofq Date: Tue, 13 Aug 2024 02:57:29 -0500 Subject: [PATCH 064/160] flake.lock: Update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'nixpkgs': 'github:NixOS/nixpkgs/5e0ca22929f3342b19569b21b2f3462f053e497b' (2024-08-09) → 'github:NixOS/nixpkgs/a58bc8ad779655e790115244571758e8de055e3d' (2024-08-11) --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index a379f8a..ee4235b 100644 --- a/flake.lock +++ b/flake.lock @@ -85,11 +85,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1723175592, - "narHash": "sha256-M0xJ3FbDUc4fRZ84dPGx5VvgFsOzds77KiBMW/mMTnI=", + "lastModified": 1723362943, + "narHash": "sha256-dFZRVSgmJkyM0bkPpaYRtG/kRMRTorUIDj8BxoOt1T4=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "5e0ca22929f3342b19569b21b2f3462f053e497b", + "rev": "a58bc8ad779655e790115244571758e8de055e3d", "type": "github" }, "original": { From 305d17c608c6dc3c2373c1a3fc5a8cc7e15e530c Mon Sep 17 00:00:00 2001 From: iofq Date: Tue, 13 Aug 2024 03:07:45 -0500 Subject: [PATCH 065/160] rm old flake --- flake.lock | 19 +------------------ flake.nix | 4 ---- 2 files changed, 1 insertion(+), 22 deletions(-) diff --git a/flake.lock b/flake.lock index ee4235b..0adc5ef 100644 --- a/flake.lock +++ b/flake.lock @@ -99,28 +99,11 @@ "type": "github" } }, - "render-markdown-nvim": { - "flake": false, - "locked": { - "lastModified": 1723453943, - "narHash": "sha256-fpmR6cqjnRcyJO2rP/8WXbu+mSSH+yblI5yyt/5yL6w=", - "owner": "MeanderingProgrammer", - "repo": "render-markdown.nvim", - "rev": "72688baea4ef0ed605033bf654b54d801b6a5f01", - "type": "github" - }, - "original": { - "owner": "MeanderingProgrammer", - "repo": "render-markdown.nvim", - "type": "github" - } - }, "root": { "inputs": { "flake-utils": "flake-utils", "gen-luarc": "gen-luarc", - "nixpkgs": "nixpkgs_2", - "render-markdown-nvim": "render-markdown-nvim" + "nixpkgs": "nixpkgs_2" } }, "systems": { diff --git a/flake.nix b/flake.nix index dfe24b7..a76b1fa 100644 --- a/flake.nix +++ b/flake.nix @@ -5,10 +5,6 @@ nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; gen-luarc.url = "github:mrcjkb/nix-gen-luarc-json"; - render-markdown-nvim = { - url = "github:MeanderingProgrammer/render-markdown.nvim"; - flake = false; - }; }; outputs = inputs @ { From 0f3ee6ed18a0e33a82106af77098638ad563608b Mon Sep 17 00:00:00 2001 From: iofq Date: Tue, 13 Aug 2024 20:12:48 -0500 Subject: [PATCH 066/160] use leader^2 for buffers --- nvim/after/plugin/color.lua | 2 ++ nvim/plugin/telescope.lua | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/nvim/after/plugin/color.lua b/nvim/after/plugin/color.lua index 1c5fda6..82447b9 100644 --- a/nvim/after/plugin/color.lua +++ b/nvim/after/plugin/color.lua @@ -23,3 +23,5 @@ vim.keymap.set( ts.extensions.aerial.aerial, { noremap = true, silent = true, desc = 'Fuzzy find treesitter objects' } ) +require("telescope").load_extension("scope") +vim.keymap.set('n', '', 'Telescope scope buffers', { noremap = true, silent = true, desc = 'Pick buffers (scope.nvim)' }) diff --git a/nvim/plugin/telescope.lua b/nvim/plugin/telescope.lua index b7f295e..7182b81 100644 --- a/nvim/plugin/telescope.lua +++ b/nvim/plugin/telescope.lua @@ -14,7 +14,6 @@ local project_files = function() end end -vim.keymap.set('n', 'fb', telescope.buffers, { noremap = true, silent = true, desc = 'Fuzzy find buffers' }) vim.keymap.set('n', 'ff', project_files, { noremap = true, silent = true, desc = 'Fuzzy find git files' }) vim.keymap.set('n', 'fg', telescope.find_files, { noremap = true, silent = true, desc = 'Fuzzy find files' }) vim.keymap.set( From bff0f4c78b28e5cf516af0e1f0e39e2993a2d31b Mon Sep 17 00:00:00 2001 From: iofq Date: Thu, 15 Aug 2024 22:40:41 -0500 Subject: [PATCH 067/160] flake.lock: Update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'nixpkgs': 'github:NixOS/nixpkgs/a58bc8ad779655e790115244571758e8de055e3d' (2024-08-11) → 'github:NixOS/nixpkgs/c3aa7b8938b17aebd2deecf7be0636000d62a2b9' (2024-08-14) --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 0adc5ef..505a9ab 100644 --- a/flake.lock +++ b/flake.lock @@ -85,11 +85,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1723362943, - "narHash": "sha256-dFZRVSgmJkyM0bkPpaYRtG/kRMRTorUIDj8BxoOt1T4=", + "lastModified": 1723637854, + "narHash": "sha256-med8+5DSWa2UnOqtdICndjDAEjxr5D7zaIiK4pn0Q7c=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "a58bc8ad779655e790115244571758e8de055e3d", + "rev": "c3aa7b8938b17aebd2deecf7be0636000d62a2b9", "type": "github" }, "original": { From 26575fa66e32a0bed85cb5ed2ac207fc38692936 Mon Sep 17 00:00:00 2001 From: iofq Date: Fri, 16 Aug 2024 02:09:15 -0500 Subject: [PATCH 068/160] tonight's rice --- flake.lock | 19 +++++++++++++++++- flake.nix | 4 ++++ nix/neovim-overlay.nix | 16 ++++++++++++--- nvim/after/plugin/color.lua | 20 +++++++++++-------- nvim/plugin/colors.lua | 8 -------- nvim/plugin/keymaps.lua | 1 + nvim/plugin/lsp.lua | 40 +++++++++++++++++++++++++++++++++++++ nvim/plugin/misc.lua | 9 ++++++++- nvim/plugin/neogit.lua | 7 ++++++- 9 files changed, 102 insertions(+), 22 deletions(-) diff --git a/flake.lock b/flake.lock index 505a9ab..49d6df2 100644 --- a/flake.lock +++ b/flake.lock @@ -103,7 +103,24 @@ "inputs": { "flake-utils": "flake-utils", "gen-luarc": "gen-luarc", - "nixpkgs": "nixpkgs_2" + "nixpkgs": "nixpkgs_2", + "snipe-nvim": "snipe-nvim" + } + }, + "snipe-nvim": { + "flake": false, + "locked": { + "lastModified": 1722790509, + "narHash": "sha256-DhJ2ss0p64mpaVo9rri72pEoaWbOOL05klM9AydnqJk=", + "owner": "leath-dub", + "repo": "snipe.nvim", + "rev": "854a47c970413405361487c13e2b1e9aa9a3696e", + "type": "github" + }, + "original": { + "owner": "leath-dub", + "repo": "snipe.nvim", + "type": "github" } }, "systems": { diff --git a/flake.nix b/flake.nix index a76b1fa..864835f 100644 --- a/flake.nix +++ b/flake.nix @@ -5,6 +5,10 @@ nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; gen-luarc.url = "github:mrcjkb/nix-gen-luarc-json"; + snipe-nvim = { + url = "github:leath-dub/snipe.nvim"; + flake = false; + }; }; outputs = inputs @ { diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index 701f427..ffc41ed 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -5,6 +5,13 @@ with final.pkgs.lib; let pkgs-wrapNeovim = inputs.nixpkgs.legacyPackages.${pkgs.system}; + mkNvimPlugin = src: pname: + pkgs.vimUtils.buildVimPlugin { + inherit pname src; + version = src.lastModifiedDate; + }; + snipe-nvim = mkNvimPlugin inputs.snipe-nvim "snipe-nvim"; + mkNeovim = pkgs.callPackage ./mkNeovim.nix { inherit pkgs-wrapNeovim; }; all-plugins = with pkgs.vimPlugins; [ @@ -16,8 +23,6 @@ with final.pkgs.lib; let cmp-treesitter cmp_luasnip diffview-nvim - dressing-nvim - everforest eyeliner-nvim friendly-snippets gitsigns-nvim @@ -27,6 +32,7 @@ with final.pkgs.lib; let mini-nvim neogen neogit + none-ls-nvim nightfox-nvim nvim-cmp nvim-lspconfig @@ -62,8 +68,8 @@ with final.pkgs.lib; let ])) nvim-web-devicons oil-nvim - rose-pine scope-nvim + snipe-nvim telescope-fzf-native-nvim telescope-nvim toggleterm-nvim @@ -74,9 +80,13 @@ with final.pkgs.lib; let extraPackages = with pkgs; [ ripgrep + yamllint + puppet-lint gopls pyright nil + phpactor + golangci-lint ]; in { nvim-pkg = mkNeovim { diff --git a/nvim/after/plugin/color.lua b/nvim/after/plugin/color.lua index 82447b9..c5f3a8b 100644 --- a/nvim/after/plugin/color.lua +++ b/nvim/after/plugin/color.lua @@ -1,7 +1,9 @@ -vim.keymap.set('n', 'x', '"rd', { remap = true, silent = true }) vim.cmd('colorscheme terafox') -vim.api.nvim_set_hl(0, 'TabLineSel', { ctermbg = none, underline = true }) -vim.api.nvim_set_hl(0, 'TabLine', { ctermbg = none, underline = false }) +vim.api.nvim_set_hl(0, 'GitSignsAdd', { fg = "green", bold = true }) +vim.api.nvim_set_hl(0, 'GitSignsDelete', { fg = "red", bold = true}) +vim.api.nvim_set_hl(0, 'GitSignsChange', { fg = "green", bold = true}) +vim.api.nvim_set_hl(0, 'EyelinerPrimary', { underline = true }) +vim.api.nvim_set_hl(0, 'EyelinerSecondary', { underline = true }) vim.keymap.set('n', 'aa', 'AerialToggle!', { desc = 'Toggle Aerial' }) vim.keymap.set('n', 'nb', vim.cmd.DiffviewOpen, { noremap = true, desc = '[g]it [d]iffview open' }) @@ -12,9 +14,6 @@ vim.keymap.set( { noremap = true, desc = 'Trouble diagnostics' } ) -vim.api.nvim_set_hl(0, 'EyelinerPrimary', { underline = true }) -vim.api.nvim_set_hl(0, 'EyelinerSecondary', { underline = true }) - local ts = require('telescope') ts.load_extension('aerial') vim.keymap.set( @@ -23,5 +22,10 @@ vim.keymap.set( ts.extensions.aerial.aerial, { noremap = true, silent = true, desc = 'Fuzzy find treesitter objects' } ) -require("telescope").load_extension("scope") -vim.keymap.set('n', '', 'Telescope scope buffers', { noremap = true, silent = true, desc = 'Pick buffers (scope.nvim)' }) +ts.load_extension("scope") +vim.keymap.set( + 'n', + 'fb', + 'Telescope scope buffers', + { noremap = true, silent = true, desc = 'Pick buffers (scope.nvim)' } +) diff --git a/nvim/plugin/colors.lua b/nvim/plugin/colors.lua index d76a039..3986737 100644 --- a/nvim/plugin/colors.lua +++ b/nvim/plugin/colors.lua @@ -3,14 +3,6 @@ if vim.g.did_load_colors_plugin then end vim.g.did_load_colors_plugin = true -require('rose-pine').setup { - variant = 'moon', - styles = { - bold = false, - italic = false, - transparency = true, - }, -} require('nightfox').setup { options = { transparent = true, -- Disable setting background diff --git a/nvim/plugin/keymaps.lua b/nvim/plugin/keymaps.lua index ea6cd6f..6e4bcf9 100644 --- a/nvim/plugin/keymaps.lua +++ b/nvim/plugin/keymaps.lua @@ -10,3 +10,4 @@ vim.keymap.set('n', '', 'zz') vim.keymap.set('n', '', 'zz') vim.keymap.set('n', '', 'zz') vim.keymap.set({ 'v', 'i' }, 'wq', 'l', { noremap = true, silent = true }) +vim.keymap.set('n', 'x', '"rd', { remap = true, silent = true }) diff --git a/nvim/plugin/lsp.lua b/nvim/plugin/lsp.lua index 765da6b..0fa5daa 100644 --- a/nvim/plugin/lsp.lua +++ b/nvim/plugin/lsp.lua @@ -8,6 +8,28 @@ local lspconfig = require('lspconfig') local capabilities = require('cmp_nvim_lsp').default_capabilities() lspconfig.gopls.setup { + settings = { + gopls = { + gofumpt = true, + codelenses = { + gc_details = true, + test = true, + }, + analyses = { + unusedvariable = true, + shadow = true, + }, + hints = { + assignVariableTypes = true, + constantValues = true, + functionTypeParameters = true, + rangeVariableTypes = true, + }, + usePlaceholders = true, + staticcheck = true, + }, + }, + capabilities = capabilities, on_attach = function(_, bufnr) capabilities = capabilities vim.api.nvim_command('au BufWritePre lua vim.lsp.buf.format { async = false }') @@ -15,6 +37,7 @@ lspconfig.gopls.setup { } lspconfig.pyright.setup { capabilities = capabilities } lspconfig.nil_ls.setup { capabilities = capabilities } +lspconfig.phpactor.setup { capabilities = capabilities } vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, { desc = 'Prev diagnostic' }) vim.keymap.set('n', ']d', vim.diagnostic.goto_next, { desc = 'Next diagnostic' }) @@ -82,6 +105,14 @@ vim.api.nvim_create_autocmd('LspAttach', { vim.lsp.codelens.run, { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP codelens' } ) + vim.keymap.set( + 'n', + 'dh', + function() + vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled()) + end, + { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP hints toggle' } + ) vim.keymap.set('n', 'df', function() vim.lsp.buf.format { async = true } end, { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP format' }) @@ -102,3 +133,12 @@ vim.api.nvim_create_autocmd('LspAttach', { end end, }) + +local none = require('null-ls') +none.setup({ + sources = { + none.builtins.diagnostics.golangci_lint, + none.builtins.diagnostics.puppet_lint, + none.builtins.diagnostics.yamllint, + }, +}) diff --git a/nvim/plugin/misc.lua b/nvim/plugin/misc.lua index 420ca4e..47ae014 100644 --- a/nvim/plugin/misc.lua +++ b/nvim/plugin/misc.lua @@ -21,7 +21,6 @@ require('which-key').setup { } require('trouble').setup {} require('eyeliner').setup {} -require('dressing').setup {} require('markview').setup() require('scope').setup {} require('neoclip').setup { default_register = '+' } @@ -31,3 +30,11 @@ vim.keymap.set( 'Telescope neoclip', { noremap = true, silent = true, desc = 'Pick clipboard history' } ) +local snipe = require("snipe") +snipe.setup({ + ui = { + position = "center", + }, + sort = "last", +}) +vim.keymap.set('n', '', snipe.open_buffer_menu, { noremap = true, silent = true, desc = 'Pick buffers (snipe.nvim)' }) diff --git a/nvim/plugin/neogit.lua b/nvim/plugin/neogit.lua index 27e8bf2..795c8e6 100644 --- a/nvim/plugin/neogit.lua +++ b/nvim/plugin/neogit.lua @@ -2,7 +2,12 @@ if vim.g.did_load_neogit_plugin then return end vim.g.did_load_neogit_plugin = true - +require("diffview").setup({ + enhanced_diff_hl = true, + default_args = { + DiffviewOpen = {"--imply-local"}, + }, +}) local neogit = require('neogit') neogit.setup { disable_builtin_notifications = true, From 85f2c16817be93cd5b0c7fcef95b220b3ec6dba9 Mon Sep 17 00:00:00 2001 From: iofq Date: Fri, 16 Aug 2024 02:39:48 -0500 Subject: [PATCH 069/160] add nvim min --- .github/workflows/main.yml | 1 + flake.nix | 1 + nix/neovim-overlay.nix | 9 +++++++-- nvim/after/plugin/color.lua | 8 ++++---- nvim/plugin/lsp.lua | 26 ++++++++++---------------- nvim/plugin/misc.lua | 17 +++++++++++------ nvim/plugin/neogit.lua | 6 +++--- 7 files changed, 37 insertions(+), 31 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 478c58a..c018500 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -14,6 +14,7 @@ jobs: matrix: include: - package_name: nvim + - package:name: nvim-min steps: - uses: actions/checkout@v3 - uses: DeterminateSystems/nix-installer-action@main diff --git a/flake.nix b/flake.nix index 864835f..a7a38fe 100644 --- a/flake.nix +++ b/flake.nix @@ -50,6 +50,7 @@ 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 ffc41ed..40896cb 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -83,10 +83,9 @@ with final.pkgs.lib; let yamllint puppet-lint gopls - pyright + python312Packages.jedi-language-server nil phpactor - golangci-lint ]; in { nvim-pkg = mkNeovim { @@ -95,6 +94,12 @@ in { inherit extraPackages; }; + nvim-min-pkg = mkNeovim { + plugins = all-plugins; + appName = "nvim"; + extraPackages = []; + }; + nvim-luarc-json = final.mk-luarc-json { plugins = all-plugins; }; diff --git a/nvim/after/plugin/color.lua b/nvim/after/plugin/color.lua index c5f3a8b..0013e1b 100644 --- a/nvim/after/plugin/color.lua +++ b/nvim/after/plugin/color.lua @@ -1,7 +1,7 @@ vim.cmd('colorscheme terafox') -vim.api.nvim_set_hl(0, 'GitSignsAdd', { fg = "green", bold = true }) -vim.api.nvim_set_hl(0, 'GitSignsDelete', { fg = "red", bold = true}) -vim.api.nvim_set_hl(0, 'GitSignsChange', { fg = "green", bold = true}) +vim.api.nvim_set_hl(0, 'GitSignsAdd', { fg = 'green', bold = true }) +vim.api.nvim_set_hl(0, 'GitSignsDelete', { fg = 'red', bold = true }) +vim.api.nvim_set_hl(0, 'GitSignsChange', { fg = 'green', bold = true }) vim.api.nvim_set_hl(0, 'EyelinerPrimary', { underline = true }) vim.api.nvim_set_hl(0, 'EyelinerSecondary', { underline = true }) @@ -22,7 +22,7 @@ vim.keymap.set( ts.extensions.aerial.aerial, { noremap = true, silent = true, desc = 'Fuzzy find treesitter objects' } ) -ts.load_extension("scope") +ts.load_extension('scope') vim.keymap.set( 'n', 'fb', diff --git a/nvim/plugin/lsp.lua b/nvim/plugin/lsp.lua index 0fa5daa..887b316 100644 --- a/nvim/plugin/lsp.lua +++ b/nvim/plugin/lsp.lua @@ -35,7 +35,7 @@ lspconfig.gopls.setup { vim.api.nvim_command('au BufWritePre lua vim.lsp.buf.format { async = false }') end, } -lspconfig.pyright.setup { capabilities = capabilities } +lspconfig.jedi_language_server.setup { capabilities = capabilities } lspconfig.nil_ls.setup { capabilities = capabilities } lspconfig.phpactor.setup { capabilities = capabilities } @@ -105,14 +105,9 @@ vim.api.nvim_create_autocmd('LspAttach', { vim.lsp.codelens.run, { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP codelens' } ) - vim.keymap.set( - 'n', - 'dh', - function() - vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled()) - end, - { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP hints toggle' } - ) + vim.keymap.set('n', 'dh', function() + vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled()) + end, { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP hints toggle' }) vim.keymap.set('n', 'df', function() vim.lsp.buf.format { async = true } end, { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP format' }) @@ -135,10 +130,9 @@ vim.api.nvim_create_autocmd('LspAttach', { }) local none = require('null-ls') -none.setup({ - sources = { - none.builtins.diagnostics.golangci_lint, - none.builtins.diagnostics.puppet_lint, - none.builtins.diagnostics.yamllint, - }, -}) +none.setup { + sources = { + none.builtins.diagnostics.puppet_lint, + none.builtins.diagnostics.yamllint, + }, +} diff --git a/nvim/plugin/misc.lua b/nvim/plugin/misc.lua index 47ae014..acb37ef 100644 --- a/nvim/plugin/misc.lua +++ b/nvim/plugin/misc.lua @@ -30,11 +30,16 @@ vim.keymap.set( 'Telescope neoclip', { noremap = true, silent = true, desc = 'Pick clipboard history' } ) -local snipe = require("snipe") -snipe.setup({ +local snipe = require('snipe') +snipe.setup { ui = { - position = "center", + position = 'center', }, - sort = "last", -}) -vim.keymap.set('n', '', snipe.open_buffer_menu, { noremap = true, silent = true, desc = 'Pick buffers (snipe.nvim)' }) + sort = 'last', +} +vim.keymap.set( + 'n', + '', + snipe.open_buffer_menu, + { noremap = true, silent = true, desc = 'Pick buffers (snipe.nvim)' } +) diff --git a/nvim/plugin/neogit.lua b/nvim/plugin/neogit.lua index 795c8e6..533fe8f 100644 --- a/nvim/plugin/neogit.lua +++ b/nvim/plugin/neogit.lua @@ -2,12 +2,12 @@ if vim.g.did_load_neogit_plugin then return end vim.g.did_load_neogit_plugin = true -require("diffview").setup({ +require('diffview').setup { enhanced_diff_hl = true, default_args = { - DiffviewOpen = {"--imply-local"}, + DiffviewOpen = { '--imply-local' }, }, -}) +} local neogit = require('neogit') neogit.setup { disable_builtin_notifications = true, From 1eb2b1bc3c30018603212f40d2f573df91344c26 Mon Sep 17 00:00:00 2001 From: iofq Date: Fri, 16 Aug 2024 02:47:16 -0500 Subject: [PATCH 070/160] fix workflow --- .github/workflows/main.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c018500..c8e5cb1 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,9 +12,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - include: - - package_name: nvim - - package:name: nvim-min + package_name: ["nvim", "nvim-min"] steps: - uses: actions/checkout@v3 - uses: DeterminateSystems/nix-installer-action@main From ece2c1c6942d288f1057fc18811e0f709f8e0304 Mon Sep 17 00:00:00 2001 From: iofq Date: Mon, 19 Aug 2024 01:38:09 -0500 Subject: [PATCH 071/160] new lazy rice --- README.md | 30 ++++- flake.lock | 36 +++++- flake.nix | 8 ++ nix/mkNeovim.nix | 60 +++------ nix/neovim-overlay.nix | 31 ++++- nvim/after/README.md | 8 -- nvim/after/plugin/color.lua | 31 ----- nvim/ftplugin/.gitkeep | 0 nvim/init.lua | 100 ++++----------- nvim/lua/.gitkeep | 0 nvim/lua/config/init.lua | 92 +++++++++++++ nvim/lua/plugins/completion.lua | 98 ++++++++++++++ nvim/lua/plugins/debug.lua | 61 +++++++++ nvim/lua/plugins/lsp.lua | 197 ++++++++++++++++++++++++++++ nvim/lua/plugins/mini.lua | 155 ++++++++++++++++++++++ nvim/lua/plugins/misc.lua | 220 ++++++++++++++++++++++++++++++++ nvim/lua/plugins/telescope.lua | 95 ++++++++++++++ nvim/lua/plugins/treesitter.lua | 77 +++++++++++ nvim/plugin/aerial.lua | 16 --- nvim/plugin/colors.lua | 11 -- nvim/plugin/completion.lua | 47 ------- nvim/plugin/gitsigns.lua | 40 ------ nvim/plugin/keymaps.lua | 13 -- nvim/plugin/lsp.lua | 138 -------------------- nvim/plugin/lualine.lua | 18 --- nvim/plugin/luasnip.lua | 37 ------ nvim/plugin/mini.lua | 67 ---------- nvim/plugin/misc.lua | 45 ------- nvim/plugin/neogit.lua | 20 --- nvim/plugin/oil.lua | 23 ---- nvim/plugin/telescope.lua | 70 ---------- nvim/plugin/treesitter.lua | 65 ---------- nvim/plugin/which-key.lua | 3 - 33 files changed, 1132 insertions(+), 780 deletions(-) delete mode 100644 nvim/after/README.md delete mode 100644 nvim/after/plugin/color.lua delete mode 100644 nvim/ftplugin/.gitkeep delete mode 100644 nvim/lua/.gitkeep create mode 100644 nvim/lua/config/init.lua create mode 100644 nvim/lua/plugins/completion.lua create mode 100644 nvim/lua/plugins/debug.lua create mode 100644 nvim/lua/plugins/lsp.lua create mode 100644 nvim/lua/plugins/mini.lua create mode 100644 nvim/lua/plugins/misc.lua create mode 100644 nvim/lua/plugins/telescope.lua create mode 100644 nvim/lua/plugins/treesitter.lua delete mode 100644 nvim/plugin/aerial.lua delete mode 100644 nvim/plugin/colors.lua delete mode 100644 nvim/plugin/completion.lua delete mode 100644 nvim/plugin/gitsigns.lua delete mode 100644 nvim/plugin/keymaps.lua delete mode 100644 nvim/plugin/lsp.lua delete mode 100644 nvim/plugin/lualine.lua delete mode 100644 nvim/plugin/luasnip.lua delete mode 100644 nvim/plugin/mini.lua delete mode 100644 nvim/plugin/misc.lua delete mode 100644 nvim/plugin/neogit.lua delete mode 100644 nvim/plugin/oil.lua delete mode 100644 nvim/plugin/telescope.lua delete mode 100644 nvim/plugin/treesitter.lua delete mode 100644 nvim/plugin/which-key.lua diff --git a/README.md b/README.md index 53d45fa..2768641 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,39 @@ -## nvim.nix - personal Neovim config that runs on nixOS but doesn't sacrifice portability +## nvim.nix - personal Neovim config. First-class nix support, but doesn't sacrifice portability ## Usage +Try it out! ```bash -nix run "github:iofq/nvim.nix" #neovim +nix run "github:iofq/nvim.nix" #nvim-min +``` + +Or use in a flake: +```nix +nvim = { + url = "github:iofq/nvim.nix"; +}; +... +pkgs = import nixpkgs { + overlays = [inputs.nvim.overlays.default] +} +... in configuration.nix +environment.systemPackages = with pkgs; [nvim]; ``` Or, grab an AppImage from the Releases page. ## What the hell? -This is a flake to build a Neovim package that includes my custom Lua config and dependencies. It then is bundled via CI into an AppImage. +This is a flake to build a Neovim package that includes my custom Lua config and dependencies. It then is bundled via Github Actions CI into an AppImage. ## Why the hell though? -I use these AppImages because I develop in a number of airgapped environments that make traditional dotfile management a nightmare. Downloading a single AppImage and copying it around is a more suckless way of managing this. +I use these AppImages because I develop in a number of airgapped environments that make traditional dotfile management a nightmare. Downloading a single AppImage and copying it around is a more suckless way of managing this, especially because the non `-min` AppImage on the releases page includes runtime tooling like linters, LSPs, debuggers, etc, that can't be installed using `meson.nvim` without internet. A single ~200mb AppImage contains my entire IDE! + +The config uses `lazy.nvim` for loading lua modules, meaning we still get its awesome dependency ordering and lazy loading, and the entire config in the `nvim/` dir can actually be slapped into `~/.config/nvim` and work out of the box in a non-nix setting, using Lazy to download plugins. + +For best performance, extract the AppImage using `./nvim.AppImage --appimage-extract`, then run the resulting AppRun binary inside the folder. This prevents you from having to extract the whole AppImage on startup each time which HEAVILY speeds up launch times, at the cost of more disk space usage. ## kickstart-nix-nvim -This repo is based off https://github.com/nix-community/kickstart-nix.nvim +This repo is based off https://github.com/nix-community/kickstart-nix.nvim, with some changes to enable `lazy.nvim` instead of neovim's native plugin loading. + +The trick for enabling both nix and non-nix usage: in `mkNeovim.nix`, we prepend a `lazy_opts` variable to `init.lua` with some nix-specific Lazy configuration (we make Lazy treat each neovim plugin installed via nix as a local "dev" plugin, and show it where to find the lua files in the nix path via `packpath`). Later in the init file, we check for the existence of this variable. If it already is set, we know we're running from a nix config and can setup Lazy accordingly. If not, we can bootstrap Lazy for non-nix usage. diff --git a/flake.lock b/flake.lock index 49d6df2..2898d1d 100644 --- a/flake.lock +++ b/flake.lock @@ -99,12 +99,30 @@ "type": "github" } }, + "nvim-early-retirement": { + "flake": false, + "locked": { + "lastModified": 1723897376, + "narHash": "sha256-+W3AG99nzgr36t9Sg192hb/MH8s0uGAPD0cLBnil+og=", + "owner": "chrisgrieser", + "repo": "nvim-early-retirement", + "rev": "2c36a5671b9d8f0d9e11b77c5a55de802bc45e34", + "type": "github" + }, + "original": { + "owner": "chrisgrieser", + "repo": "nvim-early-retirement", + "type": "github" + } + }, "root": { "inputs": { "flake-utils": "flake-utils", "gen-luarc": "gen-luarc", "nixpkgs": "nixpkgs_2", - "snipe-nvim": "snipe-nvim" + "nvim-early-retirement": "nvim-early-retirement", + "snipe-nvim": "snipe-nvim", + "workspace-diagnostics-nvim": "workspace-diagnostics-nvim" } }, "snipe-nvim": { @@ -137,6 +155,22 @@ "repo": "default", "type": "github" } + }, + "workspace-diagnostics-nvim": { + "flake": false, + "locked": { + "lastModified": 1723294887, + "narHash": "sha256-lBj4KUPmmhtpffYky/HpaTwY++d/Q9socp/Ys+4VeX0=", + "owner": "artemave", + "repo": "workspace-diagnostics.nvim", + "rev": "573ff93c47898967efdfbc6587a1a39e3c2d365e", + "type": "github" + }, + "original": { + "owner": "artemave", + "repo": "workspace-diagnostics.nvim", + "type": "github" + } } }, "root": "root", diff --git a/flake.nix b/flake.nix index a7a38fe..b6eafa1 100644 --- a/flake.nix +++ b/flake.nix @@ -9,6 +9,14 @@ url = "github:leath-dub/snipe.nvim"; flake = false; }; + nvim-early-retirement = { + url = "github:chrisgrieser/nvim-early-retirement"; + flake = false; + }; + workspace-diagnostics-nvim = { + url = "github:artemave/workspace-diagnostics.nvim"; + flake = false; + }; }; outputs = inputs @ { diff --git a/nix/mkNeovim.nix b/nix/mkNeovim.nix index 898b312..289c987 100644 --- a/nix/mkNeovim.nix +++ b/nix/mkNeovim.nix @@ -91,60 +91,38 @@ with lib; src = nvimRtpSrc; buildPhase = '' - mkdir -p $out/nvim mkdir -p $out/lua - rm init.lua ''; installPhase = '' - cp -r after $out/after - rm -r after cp -r lua $out/lua rm -r lua - cp -r * $out/nvim ''; }; # 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 - # It also adds logic for bootstrapping dev plugins (for plugin developers) - initLua = - '' - vim.loader.enable() - -- prepend lua directory + initLua = '' vim.opt.rtp:prepend('${nvimRtp}/lua') - '' - # Wrap init.lua - + (builtins.readFile ../nvim/init.lua) - # Bootstrap/load dev plugins - + optionalString (devPlugins != []) ( - '' - local dev_pack_path = vim.fn.stdpath('data') .. '/site/pack/dev' - local dev_plugins_dir = dev_pack_path .. '/opt' - local dev_plugin_path - '' - + strings.concatMapStringsSep - "\n" - (plugin: '' - dev_plugin_path = dev_plugins_dir .. '/${plugin.name}' - if vim.fn.empty(vim.fn.glob(dev_plugin_path)) > 0 then - vim.notify('Bootstrapping dev plugin ${plugin.name} ...', vim.log.levels.INFO) - vim.cmd('!${pkgs.git}/bin/git clone ${plugin.url} ' .. dev_plugin_path) - end - vim.cmd('packadd! ${plugin.name}') - '') - devPlugins - ) - # Prepend nvim and after directories to the runtimepath - # NOTE: This is done after init.lua, - # because of a bug in Neovim that can cause filetype plugins - # to be sourced prematurely, see https://github.com/neovim/neovim/issues/19008 - # We prepend to ensure that user ftplugins are sourced before builtin ftplugins. - + '' - vim.opt.rtp:prepend('${nvimRtp}/nvim') - vim.opt.rtp:prepend('${nvimRtp}/after') - ''; + lazy_opts = { + performance = { + reset_packpath = false, + rtp = { reset = false, }, + }, + dev = { + path = "${pkgs.neovimUtils.packDir neovimConfig.packpathDirs}/pack/myNeovimPackages/start", + patterns = {""}, + }, + install = { missing = false, }, + spec = {{ import = "plugins" }}, + disabled_plugins = { + "netrwPlugin", + "tutor", + "zipPlugin", + }, + } + '' + (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 40896cb..d4cb123 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -11,6 +11,8 @@ with final.pkgs.lib; let version = src.lastModifiedDate; }; snipe-nvim = mkNvimPlugin inputs.snipe-nvim "snipe-nvim"; + nvim-early-retirement = mkNvimPlugin inputs.nvim-early-retirement "nvim-early-retirement"; + workspace-diagnostics-nvim = mkNvimPlugin inputs.workspace-diagnostics-nvim "workspace-diagnostics-nvim"; mkNeovim = pkgs.callPackage ./mkNeovim.nix { inherit pkgs-wrapNeovim; }; @@ -26,7 +28,7 @@ with final.pkgs.lib; let eyeliner-nvim friendly-snippets gitsigns-nvim - lualine-nvim + lazy-nvim luasnip markview-nvim mini-nvim @@ -35,8 +37,13 @@ with final.pkgs.lib; let none-ls-nvim nightfox-nvim nvim-cmp + nvim-dap + nvim-dap-go + nvim-dap-ui + nvim-early-retirement nvim-lspconfig nvim-neoclip-lua + nvim-nio nvim-treesitter-context nvim-treesitter-textobjects (nvim-treesitter.withPlugins(p: with p; [ @@ -68,6 +75,7 @@ with final.pkgs.lib; let ])) nvim-web-devicons oil-nvim + outline-nvim scope-nvim snipe-nvim telescope-fzf-native-nvim @@ -75,29 +83,38 @@ with final.pkgs.lib; let toggleterm-nvim trouble-nvim undotree - which-key-nvim + workspace-diagnostics-nvim ]; - extraPackages = with pkgs; [ + basePackages = with pkgs; [ ripgrep - yamllint + ]; + extraPackages = with pkgs; [ + # linters puppet-lint + yamllint + + # LSPs gopls - python312Packages.jedi-language-server + lua-language-server nil phpactor + python312Packages.jedi-language-server + + # debuggers + delve ]; in { nvim-pkg = mkNeovim { plugins = all-plugins; appName = "nvim"; - inherit extraPackages; + extraPackages = basePackages ++ extraPackages; }; nvim-min-pkg = mkNeovim { plugins = all-plugins; appName = "nvim"; - extraPackages = []; + extraPackages = basePackages; }; nvim-luarc-json = final.mk-luarc-json { diff --git a/nvim/after/README.md b/nvim/after/README.md deleted file mode 100644 index a4b4ff2..0000000 --- a/nvim/after/README.md +++ /dev/null @@ -1,8 +0,0 @@ -## `after` directory - -Scripts put in - -- `after/plugin` will be sourced *after* init.lua - or any other scripts are sourced during startup. -- `after/ftplugin` will be sourced when opening a - filetype, *after* any other `ftplugin` scripts are sourced. diff --git a/nvim/after/plugin/color.lua b/nvim/after/plugin/color.lua deleted file mode 100644 index 0013e1b..0000000 --- a/nvim/after/plugin/color.lua +++ /dev/null @@ -1,31 +0,0 @@ -vim.cmd('colorscheme terafox') -vim.api.nvim_set_hl(0, 'GitSignsAdd', { fg = 'green', bold = true }) -vim.api.nvim_set_hl(0, 'GitSignsDelete', { fg = 'red', bold = true }) -vim.api.nvim_set_hl(0, 'GitSignsChange', { fg = 'green', bold = true }) -vim.api.nvim_set_hl(0, 'EyelinerPrimary', { underline = true }) -vim.api.nvim_set_hl(0, 'EyelinerSecondary', { underline = true }) - -vim.keymap.set('n', 'aa', 'AerialToggle!', { desc = 'Toggle Aerial' }) -vim.keymap.set('n', 'nb', vim.cmd.DiffviewOpen, { noremap = true, desc = '[g]it [d]iffview open' }) -vim.keymap.set( - 'n', - 'de', - 'Trouble diagnostics toggle focus=true filter.buf=0', - { noremap = true, desc = 'Trouble diagnostics' } -) - -local ts = require('telescope') -ts.load_extension('aerial') -vim.keymap.set( - 'n', - 'fs', - ts.extensions.aerial.aerial, - { noremap = true, silent = true, desc = 'Fuzzy find treesitter objects' } -) -ts.load_extension('scope') -vim.keymap.set( - 'n', - 'fb', - 'Telescope scope buffers', - { noremap = true, silent = true, desc = 'Pick buffers (scope.nvim)' } -) diff --git a/nvim/ftplugin/.gitkeep b/nvim/ftplugin/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/nvim/init.lua b/nvim/init.lua index 39aba7e..cb810f8 100644 --- a/nvim/init.lua +++ b/nvim/init.lua @@ -1,75 +1,27 @@ --- vim settings ++ mini.nvim.basics ----------------------------------------- -vim.opt.backspace = 'indent,eol,start' -vim.opt.clipboard = 'unnamedplus' -vim.opt.completeopt = 'menuone' -vim.opt.expandtab = true -- insert tabs as spaces -vim.opt.inccommand = 'split' -- incremental live completion -vim.opt.laststatus = 1 -vim.opt.list = true -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 -vim.opt.shiftwidth = 0 -- >> shifts by tabstop -vim.opt.showmatch = true -- highlight matching brackets -vim.opt.showmode = true -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.g.fzf_layout = { window = { width = 0.9, height = 0.6 } } - --- no highlight floats -vim.cmd([[ hi NormalFloat ctermbg=none ]]) - --- Switch tab length on the fly -vim.keymap.set('n', '\\t', function() - vim.o.tabstop = vim.o.tabstop == 2 and 4 or 2 -end, { silent = true, desc = 'toggle tabstop' }) - --- autocmd ----------------------------------------- -local undopath = '~/.local/share/nvim/undo' -vim.api.nvim_create_autocmd('VimEnter', { - command = 'silent !mkdir -p ' .. undopath, - group = vim.api.nvim_create_augroup('Init', {}), -}) - --- Configure Neovim diagnostic messages -local function prefix_diagnostic(prefix, diagnostic) - return string.format(prefix .. ' %s', diagnostic.message) +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' } }, + disabled_plugins = { + 'netrwPlugin', + 'tutor', + 'zipPlugin', + }, + } end -vim.diagnostic.config { - virtual_text = { - prefix = '', - format = function(diagnostic) - local severity = diagnostic.severity - if severity == vim.diagnostic.severity.ERROR then - return prefix_diagnostic('󰅚', diagnostic) - end - if severity == vim.diagnostic.severity.WARN then - return prefix_diagnostic('⚠', diagnostic) - end - if severity == vim.diagnostic.severity.INFO then - return prefix_diagnostic('ⓘ', diagnostic) - end - if severity == vim.diagnostic.severity.HINT then - return prefix_diagnostic('󰌶', diagnostic) - end - return prefix_diagnostic('■', diagnostic) - end, - }, - update_in_insert = false, - underline = true, - severity_sort = true, - float = { - focusable = false, - style = 'minimal', - border = 'rounded', - source = 'if_many', - header = '', - prefix = '', - }, -} +require('lazy').setup(lazy_opts) +require('config') diff --git a/nvim/lua/.gitkeep b/nvim/lua/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/nvim/lua/config/init.lua b/nvim/lua/config/init.lua new file mode 100644 index 0000000..71c116f --- /dev/null +++ b/nvim/lua/config/init.lua @@ -0,0 +1,92 @@ +vim.opt.backspace = 'indent,eol,start' +vim.opt.clipboard = 'unnamedplus' +vim.opt.completeopt = 'menuone' +vim.opt.expandtab = true -- insert tabs as spaces +vim.opt.inccommand = 'split' -- incremental live completion +vim.opt.laststatus = 1 +vim.opt.list = true +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 +vim.opt.shiftwidth = 0 -- >> shifts by tabstop +vim.opt.showmatch = true -- highlight matching brackets +vim.opt.showmode = true +vim.opt.signcolumn = 'no' +vim.opt.spell = false +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.wrap = true +vim.g.fzf_layout = { window = { width = 0.9, height = 0.6 } } + +-- Switch tab length on the fly +vim.keymap.set('n', '\\t', function() + vim.o.tabstop = vim.o.tabstop == 2 and 4 or 2 +end, { silent = true, desc = 'toggle tabstop' }) + +-- autocmd +---------------------------------------- +local undopath = '~/.local/share/nvim/undo' +vim.api.nvim_create_autocmd('VimEnter', { + command = 'silent !mkdir -p ' .. undopath, + group = vim.api.nvim_create_augroup('Init', {}), +}) +-- open :g 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 = true + end + end, +}) + +-- Configure Neovim diagnostic messages +local function prefix_diagnostic(prefix, diagnostic) + return string.format(prefix .. ' %s', diagnostic.message) +end +vim.diagnostic.config { + virtual_text = { + prefix = '', + format = function(diagnostic) + local severity = diagnostic.severity + if severity == vim.diagnostic.severity.ERROR then + return prefix_diagnostic('󰅚', diagnostic) + end + if severity == vim.diagnostic.severity.WARN then + return prefix_diagnostic('⚠', diagnostic) + end + if severity == vim.diagnostic.severity.INFO then + return prefix_diagnostic('ⓘ', diagnostic) + end + if severity == vim.diagnostic.severity.HINT then + return prefix_diagnostic('󰌶', diagnostic) + end + return prefix_diagnostic('■', diagnostic) + end, + }, + update_in_insert = false, + underline = true, + severity_sort = true, + float = { + focusable = false, + style = 'minimal', + border = 'rounded', + source = 'if_many', + header = '', + prefix = '', + }, +} + +-- random keymaps +vim.keymap.set('n', 'gq', vim.cmd.bdelete, { silent = true }) +vim.keymap.set('n', 'gr', 'gT', { noremap = true, silent = true }) +vim.keymap.set('n', 'n', 'nzz', { noremap = true, silent = true }) +vim.keymap.set('n', 'N', 'Nzz', { noremap = true, silent = true }) +vim.keymap.set({ 'v', 'i' }, 'wq', 'l', { noremap = true, silent = true }) +vim.keymap.set('n', 'x', '"rd', { remap = true, silent = true }) diff --git a/nvim/lua/plugins/completion.lua b/nvim/lua/plugins/completion.lua new file mode 100644 index 0000000..fc4dcc7 --- /dev/null +++ b/nvim/lua/plugins/completion.lua @@ -0,0 +1,98 @@ +return { + { + 'hrsh7th/nvim-cmp', + event = 'VeryLazy', + dependencies = { + 'hrsh7th/cmp-buffer', + 'hrsh7th/cmp-cmdline', + 'hrsh7th/cmp-path', + 'hrsh7th/cmp-nvim-lsp', + 'ray-x/cmp-treesitter', + 'L3MON4D3/LuaSnip', + 'saadparwaiz1/cmp_luasnip', + }, + config = function() + local cmp = require('cmp') + cmp.setup { + snippet = { + expand = function(args) + require('luasnip').lsp_expand(args.body) + end, + }, + experimental = { + native_menu = false, + ghost_text = true, + }, + mapping = cmp.mapping.preset.insert { + [''] = cmp.mapping.scroll_docs(-4), + [''] = cmp.mapping.scroll_docs(4), + [''] = cmp.mapping.complete(), + [''] = cmp.mapping.abort(), + [''] = cmp.mapping.confirm { select = true }, -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. + }, + sources = cmp.config.sources({ + { name = 'nvim_lsp' }, + { name = 'luasnip' }, + }, { + { name = 'buffer' }, + }), + } + + cmp.setup.cmdline({ '/', '?' }, { + mapping = cmp.mapping.preset.cmdline(), + sources = { + { name = 'buffer' }, + }, + }) + + cmp.setup.cmdline(':', { + mapping = cmp.mapping.preset.cmdline(), + sources = cmp.config.sources({ + { name = 'path' }, + }, { + { name = 'cmdline' }, + }), + matching = { disallow_symbol_nonprefix_matching = false }, + }) + end, + }, + { + 'L3MON4D3/LuaSnip', + event = 'VeryLazy', + dependencies = { 'rafamadriz/friendly-snippets' }, + config = function() + local ls = require('luasnip') + ls.config.set_config { + history = true, + updateevents = 'TextChanged, TextChangedI', + } + require('luasnip.loaders.from_vscode').lazy_load() + + vim.keymap.set({ 'i', 's' }, '', function() + if ls.expand_or_jumpable() then + ls.expand_or_jump() + end + end, { silent = true }) + + vim.keymap.set({ 'i', 's' }, '', function() + if ls.jumpable(-1) then + ls.jump(-1) + end + end, { silent = true }) + + vim.keymap.set({ 'i', 's' }, '', function() + if ls.choice_active() then + ls.change_choice(1) + end + end, { silent = true }) + + -------------------- + -- Snippets -- + -------------------- + local fmta = require('luasnip.extras.fmt').fmta + ls.add_snippets('go', { + ls.snippet('ie', fmta('if err != nil {\n\treturn \n}', { err = ls.insert_node(1, 'err') })), + }) + end, + }, +} diff --git a/nvim/lua/plugins/debug.lua b/nvim/lua/plugins/debug.lua new file mode 100644 index 0000000..9de41c8 --- /dev/null +++ b/nvim/lua/plugins/debug.lua @@ -0,0 +1,61 @@ +return { + { + 'rcarriga/nvim-dap-ui', + event = 'VeryLazy', + dependencies = { + 'nvim-neotest/nvim-nio', + }, + }, + { + 'mfussenegger/nvim-dap', + event = 'VeryLazy', + dependencies = { + 'leoluz/nvim-dap-go', + 'rcarriga/nvim-dap-ui', + }, + config = function() + local d = require('dap') + local w = require('dap.ui.widgets') + local ui = require('dapui') + require('dap-go').setup() + ui.setup() + + local scopes = nil + vim.keymap.set('n', 'za', function() + ui.toggle() + end, { desc = 'toggle dapui' }) + vim.keymap.set('n', 'zz', function() + scopes = w.sidebar(w.scopes, {}, 'split') + d.continue() + end, { desc = 'start debugger' }) + vim.keymap.set('n', 'zn', function() + d.step_over() + end, { desc = 'step over' }) + vim.keymap.set('n', 'zi', function() + d.step_into() + end, { desc = 'step into' }) + vim.keymap.set('n', 'zo', function() + d.step_out() + end, { desc = 'step out' }) + vim.keymap.set('n', 'zx', function() + d.toggle_breakpoint() + end, { desc = 'toggle_breakpoint' }) + vim.keymap.set('n', 'zr', function() + d.run_last() + end, { desc = 'run prev' }) + vim.keymap.set({ 'n', 'v' }, 'zh', function() + ui.eval() + end, { desc = 'hover' }) + vim.keymap.set({ 'n', 'v' }, 'zp', function() + require('dap.ui.widgets').preview() + end, { desc = 'preview' }) + vim.keymap.set('n', 'zf', function() + local widgets = require('dap.ui.widgets') + widgets.centered_float(widgets.frames) + end, { desc = 'view frames' }) + vim.keymap.set('n', 'zs', function() + scopes.toggle() + end, { desc = 'toggle scope view' }) + end, + }, +} diff --git a/nvim/lua/plugins/lsp.lua b/nvim/lua/plugins/lsp.lua new file mode 100644 index 0000000..fbbdcf9 --- /dev/null +++ b/nvim/lua/plugins/lsp.lua @@ -0,0 +1,197 @@ +return { + { + 'folke/trouble.nvim', + event = 'VeryLazy', + dependencies = { + 'artemave/workspace-diagnostics.nvim', + }, + config = function() + require('trouble').setup() + vim.keymap.set( + 'n', + 'de', + 'Trouble diagnostics toggle focus=true', + { noremap = true, desc = 'Trouble diagnostics' } + ) + vim.keymap.set( + 'n', + 'dE', + 'Trouble diagnostics toggle focus=true filter.buf=0', + { noremap = true, desc = 'Trouble diagnostics (currrent buffer)' } + ) + vim.keymap.set('n', 'dw', function() + for _, client in ipairs(vim.lsp.get_clients { bufnr = 0 }) do + require('workspace-diagnostics').populate_workspace_diagnostics(client, 0) + end + end, { noremap = true, desc = 'Populate Trouble workspace diagnostics' }) + end, + }, + { + 'neovim/nvim-lspconfig', + event = 'VeryLazy', + dependencies = { + 'hrsh7th/cmp-nvim-lsp', + }, + config = function() + local lspconfig = require('lspconfig') + lspconfig.util.default_config.capabilities = vim.tbl_deep_extend( + 'force', + lspconfig.util.default_config.capabilities, + require('cmp_nvim_lsp').default_capabilities() + ) + + lspconfig.gopls.setup { + settings = { + gopls = { + gofumpt = true, + codelenses = { + gc_details = true, + test = true, + }, + analyses = { + unusedvariable = true, + shadow = true, + }, + hints = { + assignVariableTypes = true, + constantValues = true, + functionTypeParameters = true, + rangeVariableTypes = true, + }, + usePlaceholders = true, + staticcheck = true, + }, + }, + on_attach = function() + vim.api.nvim_command('au BufWritePre lua vim.lsp.buf.format { async = false }') + end, + } + lspconfig.jedi_language_server.setup {} + lspconfig.nil_ls.setup {} + lspconfig.phpactor.setup {} + lspconfig.lua_ls.setup { + on_init = function(client) + local path = client.workspace_folders[1].name + if vim.loop.fs_stat(path .. '/.luarc.json') or vim.loop.fs_stat(path .. '/.luarc.jsonc') then + return + end + + client.config.settings.Lua = vim.tbl_deep_extend('force', client.config.settings.Lua, { + runtime = { + version = 'LuaJIT', + }, + workspace = { + checkThirdParty = false, + library = { + vim.env.VIMRUNTIME, + }, + }, + }) + end, + settings = { + Lua = {}, + }, + } + vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, { desc = 'Prev diagnostic' }) + vim.keymap.set('n', ']d', vim.diagnostic.goto_next, { desc = 'Next diagnostic' }) + + vim.api.nvim_create_autocmd('LspAttach', { + group = vim.api.nvim_create_augroup('UserLspConfig', {}), + callback = function(ev) + local bufnr = ev.buf + local client = vim.lsp.get_client_by_id(ev.data.client_id) + require('workspace-diagnostics').populate_workspace_diagnostics(client, bufnr) + vim.keymap.set( + 'n', + 'K', + vim.lsp.buf.hover, + { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP hover' } + ) + vim.keymap.set( + 'n', + 'rn', + vim.lsp.buf.rename, + { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP Rename' } + ) + vim.keymap.set( + { 'n', 'v' }, + 'da', + vim.lsp.buf.code_action, + { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP code action' } + ) + vim.keymap.set( + 'n', + 'dd', + 'Telescope lsp_definitions', + { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP definitions' } + ) + vim.keymap.set( + 'n', + 'di', + 'Telescope lsp_implementations', + { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP implementations' } + ) + vim.keymap.set( + 'n', + 'dr', + 'Telescope lsp_references', + { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP references' } + ) + vim.keymap.set( + 'n', + 'dt', + 'Telescope lsp_type_definitions', + { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP type defs' } + ) + vim.keymap.set( + 'n', + 'ds', + 'Telescope lsp_document_symbols', + { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP symbols' } + ) + vim.keymap.set( + 'n', + 'dl', + vim.lsp.codelens.run, + { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP codelens' } + ) + vim.keymap.set('n', 'dh', function() + vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled()) + end, { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP hints toggle' }) + vim.keymap.set('n', 'df', function() + vim.lsp.buf.format { async = true } + end, { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP format' }) + -- Auto-refresh code lenses + if not client then + return + end + local group = vim.api.nvim_create_augroup(string.format('lsp-%s-%s', bufnr, client.id), {}) + if client.server_capabilities.codeLensProvider then + vim.api.nvim_create_autocmd({ 'InsertLeave', 'BufWritePost', 'TextChanged' }, { + group = group, + callback = function() + vim.lsp.codelens.refresh { bufnr = bufnr } + end, + buffer = bufnr, + }) + vim.lsp.codelens.refresh { bufnr = bufnr } + end + end, + }) + vim.api.nvim_exec_autocmds('FileType', {}) + end, + }, + { + 'nvimtools/none-ls.nvim', + event = 'VeryLazy', + config = function() + local null = require('null-ls') + null.setup { + sources = { + null.builtins.diagnostics.puppet_lint, + null.builtins.diagnostics.yamllint, + }, + } + end, + }, +} diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua new file mode 100644 index 0000000..ad495c8 --- /dev/null +++ b/nvim/lua/plugins/mini.lua @@ -0,0 +1,155 @@ +return { + { + 'echasnovski/mini.nvim', + event = 'VeryLazy', + config = function() + require('mini.ai').setup() + require('mini.comment').setup() + require('mini.pairs').setup() + require('mini.statusline').setup { + content = { + active = function() + local mode, mode_hl = MiniStatusline.section_mode {} + local git = function() + local summary = vim.b.gitsigns_head + if summary == nil then + return '' + end + summary = '~' .. summary + + return summary == '' and '' or summary + end + local diff = function() + local summary = vim.b.gitsigns_status + if summary == nil then + return '' + end + + return summary + end + local diagnostics = MiniStatusline.section_diagnostics { trunc_width = 75 } + local filename = MiniStatusline.section_filename { trunc_width = 140 } + local search = MiniStatusline.section_searchcount { trunc_width = 75 } + + return MiniStatusline.combine_groups { + { hl = mode_hl, strings = { mode } }, + '%<', -- Mark general truncate point + { hl = 'MiniStatuslineFilename', strings = { filename } }, + '%=', -- End left alignment + { hl = 'MiniStatusDevinfo', strings = { git(), diff(), diagnostics } }, + { hl = mode_hl, strings = { search } }, + } + end, + inactive = function() + local filename = MiniStatusline.section_filename { trunc_width = 140 } + + return MiniStatusline.combine_groups { + { hl = 'MiniStatuslineFilename', strings = { filename } }, + } + end, + }, + } + vim.opt.showmode = false + + 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' }, + }, + + clues = { + miniclue.gen_clues.g(), + miniclue.gen_clues.marks(), + miniclue.gen_clues.registers(), + miniclue.gen_clues.windows(), + miniclue.gen_clues.z(), + }, + } + -- Add surrounding with sa + -- Delete surrounding with sd. + -- Replace surrounding with sr. + -- Find surrounding with sf or sF (move cursor right or left). + -- Highlight surrounding with sh. + -- 'f' - function call (string of alphanumeric symbols or '_' or '.' followed by balanced '()'). In "input" finds function call, in "output" prompts user to enter function name. + -- 't' - tag. In "input" finds tag with same identifier, in "output" prompts user to enter tag name. + -- All symbols in brackets '()', '[]', '{}', '<>". + -- '?' - interactive. Prompts user to enter left and right parts. + require('mini.surround').setup() + + require('mini.trailspace').setup() + vim.api.nvim_create_user_command('Trim', function() + require('mini.trailspace').trim() + end, {}) + + -- prefix \ + -- `b` - |'background'|. + -- `c` - |'cursorline'|. + -- `C` - |'cursorcolumn'|. + -- `d` - diagnostic (via |vim.diagnostic.enable()| and |vim.diagnostic.disable()|). + -- `h` - |'hlsearch'| (or |v:hlsearch| to be precise). + -- `i` - |'ignorecase'|. + -- `l` - |'list'|. + -- `n` - |'number'|. + -- `r` - |'relativenumber'|. + -- `s` - |'spell'|. + -- `w` - |'wrap'|. + require('mini.basics').setup { + mappings = { + windows = true, + }, + } + + local map = require('mini.map') + map.setup { + symbols = { + scroll_line = '┃', + scroll_view = '', + }, + integrations = { + map.gen_integration.builtin_search(), + map.gen_integration.diagnostic(), + map.gen_integration.gitsigns(), + }, + window = { + show_integration_count = false, + winblend = 0, + width = 5, + }, + } + vim.keymap.set('n', 'nm', map.toggle, { noremap = true, desc = 'minimap open' }) + + -- gS + require('mini.splitjoin').setup { + detect = { separator = '[,;\n]' }, + } + + -- Replace text with register 'gr', + -- Sort text 'gs', + require('mini.operators').setup() + require('mini.jump2d').setup { mappings = { start_jumping = 'S' } } + + local indent = require('mini.indentscope') + indent.setup { + draw = { delay = 0 }, + } + indent.gen_animation.none() + + require('mini.notify').setup { + window = { + winblend = 0, + config = { + anchor = 'SE', + border = 'double', + row = vim.o.lines, + }, + }, + } + end, + }, +} diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua new file mode 100644 index 0000000..95bc26d --- /dev/null +++ b/nvim/lua/plugins/misc.lua @@ -0,0 +1,220 @@ +return { + { + 'danymat/neogen', + keys = { + { 'nd', 'Neogen', { noremap = true, silent = true, desc = 'Neogen - gen comments' } }, + }, + }, + { + 'akinsho/toggleterm.nvim', + event = 'VeryLazy', + opts = { + open_mapping = [[]], + direction = 'float', + close_on_exit = true, + autochdir = true, + }, + }, + { + 'jinh0/eyeliner.nvim', + event = 'VeryLazy', + config = function() + vim.api.nvim_set_hl(0, 'EyelinerPrimary', { underline = true }) + vim.api.nvim_set_hl(0, 'EyelinerSecondary', { underline = true }) + end, + }, + { 'OXY2DEV/markview.nvim', event = 'VeryLazy' }, + { 'tiagovla/scope.nvim', event = 'VeryLazy' }, + { + 'chrisgrieser/nvim-early-retirement', + event = 'VeryLazy', + opts = { minimumBufferNum = 6 }, + }, + { + 'AckslD/nvim-neoclip.lua', + event = 'VeryLazy', + dependencies = { + 'nvim-telescope/telescope.nvim', + }, + opts = { + default_register = '+', + }, + config = function(_, opts) + require('neoclip').setup(opts) + vim.keymap.set( + 'n', + 'fp', + 'Telescope neoclip', + { noremap = true, silent = true, desc = 'Pick clipboard history' } + ) + end, + }, + { + 'leath-dub/snipe.nvim', + event = 'VeryLazy', + opts = { + ui = { + position = 'center', + }, + sort = 'last', + }, + config = function(_, opts) + local snipe = require('snipe') + snipe.setup(opts) + vim.keymap.set( + 'n', + 'fb', + snipe.open_buffer_menu, + { noremap = true, silent = true, desc = 'Pick buffers (snipe.nvim)' } + ) + end, + }, + { + 'sindrets/diffview.nvim', + event = 'VeryLazy', + opts = { + enhanced_diff_hl = true, + default_args = { + DiffviewOpen = { '--imply-local' }, + }, + }, + config = function() + vim.keymap.set('n', 'nb', vim.cmd.DiffviewOpen, { noremap = true, desc = 'diffview open' }) + end, + }, + { + 'NeogitOrg/neogit', + opts = { + disable_builtin_notifications = true, + integrations = { + diffview = true, + telescope = true, + fzf_lua = true, + }, + }, + keys = { + { + 'ng', + function() + require('neogit').open() + end, + { noremap = true, silent = true, desc = 'Neogit' }, + }, + }, + }, + { + 'stevearc/oil.nvim', + opts = { + watch_for_changes = true, + columns = { + 'permissions', + 'size', + }, + view_options = { + show_hidden = true, + }, + keymaps = { + ['wq'] = 'actions.close', + }, + }, + keys = { + { + 'nc', + function() + require('oil').toggle_float() + end, + { noremap = true, silent = true }, + }, + }, + }, + { + 'mbbill/undotree', + event = 'VeryLazy', + keys = { + { 'nu', 'UndotreeToggle' }, + }, + config = function() + vim.g.undotree_ShortIndicators = 1 + vim.g.undotree_SetFocusWhenToggle = 1 + end, + }, + { + 'EdenEast/nightfox.nvim', + lazy = false, + priority = 10000, + opts = { + options = { + transparent = true, + terminal_colors = false, + }, + }, + config = function(_, opts) + require('nightfox').setup(opts) + vim.cmd('colorscheme terafox') + vim.api.nvim_set_hl(0, 'MiniNotifyNormal', { bg = 'none' }) + vim.api.nvim_set_hl(0, 'MiniNotifyTitle', { bg = 'none' }) + vim.api.nvim_set_hl(0, 'MiniNotifyBorder', { bg = 'none' }) + vim.api.nvim_set_hl(0, 'MiniMapNormal', { bg = 'none' }) + vim.api.nvim_set_hl(0, 'MiniClueNormal', { bg = 'none' }) + vim.api.nvim_set_hl(0, 'StatusLine', { bg = 'none' }) + vim.api.nvim_set_hl(0, 'StatusLineNC', { bg = 'none' }) + vim.api.nvim_set_hl(0, 'GitSignsAdd', { fg = 'green', bold = true }) + vim.api.nvim_set_hl(0, 'GitSignsDelete', { fg = 'red', bold = true }) + vim.api.nvim_set_hl(0, 'GitSignsChange', { fg = 'green', bold = true }) + end, + }, + { + 'lewis6991/gitsigns.nvim', + event = 'VeryLazy', + opts = { + signcolumn = false, + numhl = true, + on_attach = function() + local gs = package.loaded.gitsigns + vim.keymap.set('n', 'gg', gs.preview_hunk, { desc = 'git preview hunk' }) + vim.keymap.set('n', 'gr', gs.reset_hunk, { desc = 'git reset hunk' }) + vim.keymap.set('n', 'gb', function() + gs.blame_line { full = true } + end, { desc = 'git blame_line' }) + vim.keymap.set('v', 'gr', function() + gs.reset_hunk { vim.fn.line('.'), vim.fn.line('v') } + end, { desc = 'git reset hunk' }) + + -- Navigation + vim.keymap.set('n', ']g', function() + if vim.wo.diff then + return ']c' + end + vim.schedule(function() + gs.next_hunk() + end) + return '' + end, { expr = true }) + + vim.keymap.set('n', '[g', function() + if vim.wo.diff then + return '[c' + end + vim.schedule(function() + gs.prev_hunk() + end) + return '' + end, { expr = true }) + end, + }, + }, + { + 'hedyhli/outline.nvim', + cmd = { 'Outline', 'OutlineOpen' }, + keys = { + { 'no', 'Outline', desc = 'Toggle outline' }, + }, + opts = { + outline_window = { + position = 'left', + width = 30, + auto_close = true, + }, + }, + }, +} diff --git a/nvim/lua/plugins/telescope.lua b/nvim/lua/plugins/telescope.lua new file mode 100644 index 0000000..e6321aa --- /dev/null +++ b/nvim/lua/plugins/telescope.lua @@ -0,0 +1,95 @@ +return { + { + 'nvim-telescope/telescope-fzf-native.nvim', + event = 'VeryLazy', + build = 'make', + }, + { + 'nvim-telescope/telescope.nvim', + event = 'VeryLazy', + dependencies = { + 'nvim-lua/plenary.nvim', + 'nvim-telescope/telescope-fzf-native.nvim', + 'nvim-tree/nvim-web-devicons', + 'nvim-treesitter/nvim-treesitter', + 'tiagovla/scope.nvim', + }, + config = function() + local telescope = require('telescope') + local actions = require('telescope.actions') + telescope.setup { + defaults = { + layout_strategy = 'vertical', + layout_config = { width = 0.90 }, + prompt_title = false, + results_title = false, + preview_title = false, + vimgrep_arguments = { + 'rg', + '-L', + '--color=never', + '--no-heading', + '--hidden', + '--with-filename', + '--line-number', + '--column', + '--smart-case', + }, + preview = { treesitter = true }, + path_display = { 'truncate' }, + mappings = { + i = { + ['wq'] = actions.close, + [''] = actions.close, + [''] = actions.move_selection_previous, + [''] = actions.move_selection_next, + }, + }, + }, + } + telescope.load_extension('fzf') + telescope.load_extension('scope') + + local b = require('telescope.builtin') + -- Fall back to find_files if not in a git repo + local project_files = function() + local opts = {} -- define here if you want to define something + local ok = pcall(b.git_files, opts) + if not ok then + b.find_files(opts) + end + end + + vim.keymap.set('n', 'ff', project_files, { noremap = true, silent = true, desc = 'Fuzzy find git files' }) + vim.keymap.set('n', 'fg', b.find_files, { noremap = true, silent = true, desc = 'Fuzzy find files' }) + vim.keymap.set( + 'n', + 'fc', + b.command_history, + { noremap = true, silent = true, desc = 'Fuzzy find command_history' } + ) + vim.keymap.set('n', 'fa', b.live_grep, { noremap = true, silent = true, desc = 'Fuzzy find grep' }) + vim.keymap.set( + 'n', + 'f8', + b.grep_string, + { noremap = true, silent = true, desc = 'Fuzzy find grep current word' } + ) + vim.keymap.set('n', 'fq', b.quickfix, { noremap = true, silent = true, desc = 'Fuzzy find quickfix' }) + vim.keymap.set('n', 'f?', b.builtin, { noremap = true, silent = true, desc = 'See all pickers' }) + vim.keymap.set('n', 'f', b.resume, { noremap = true, silent = true, desc = 'Fuzzy find resume' }) + vim.keymap.set( + 'n', + 'fs', + b.lsp_document_symbols, + { noremap = true, silent = true, desc = 'Fuzzy find treesitter objects' } + ) + vim.keymap.set( + 'n', + '', + 'Telescope scope buffers', + { noremap = true, silent = true, desc = 'Pick buffers (scope.nvim)' } + ) + end, + }, +} diff --git a/nvim/lua/plugins/treesitter.lua b/nvim/lua/plugins/treesitter.lua new file mode 100644 index 0000000..44c53e5 --- /dev/null +++ b/nvim/lua/plugins/treesitter.lua @@ -0,0 +1,77 @@ +return { + { + 'nvim-treesitter/nvim-treesitter', + event = 'VeryLazy', + dependencies = { + 'nvim-treesitter/nvim-treesitter-context', + 'nvim-treesitter/nvim-treesitter-textobjects', + }, + config = function() + require('nvim-treesitter.configs').setup { + ensure_installed = {}, + highlight = { + enable = true, + disable = function(_, buf) + local max_filesize = 100 * 1024 -- 100 KiB + local ok, stats = pcall(vim.loop.fs_stat, vim.api.nvim_buf_get_name(buf)) + if ok and stats and stats.size > max_filesize then + return true + end + end, + additional_vim_regex_highlighting = false, + }, + indent = { + enable = true, + }, + autopairs = { + enable = true, + }, + textobjects = { + select = { + enable = true, + lookahead = true, + keymaps = { + ['af'] = '@function.outer', + ['if'] = '@function.inner', + ['aa'] = '@statement.outer', + ['ia'] = '@parameter.inner', + }, + }, + move = { + enable = true, + goto_next_start = { + [']a'] = '@parameter.inner', + [']f'] = '@function.outer', + }, + goto_previous_start = { + ['[a'] = '@parameter.inner', + ['[f'] = '@function.outer', + }, + }, + swap = { + enable = true, + swap_next = { + ['s]'] = '@parameter.inner', + }, + swap_previous = { + ['s['] = '@parameter.inner', + }, + }, + }, + incremental_selection = { + enable = true, + keymaps = { + init_selection = '', + node_incremental = '', + node_decremental = '', + }, + }, + } + + require('treesitter-context').setup { + max_lines = 2, + min_window_height = 50, + } + end, + }, +} diff --git a/nvim/plugin/aerial.lua b/nvim/plugin/aerial.lua deleted file mode 100644 index 4e27aa7..0000000 --- a/nvim/plugin/aerial.lua +++ /dev/null @@ -1,16 +0,0 @@ -if vim.g.did_load_aerial_plugin then - return -end -vim.g.did_load_aerial_plugin = true - -require('aerial').setup { - autojump = true, - on_attach = function(bufnr) - vim.keymap.set('n', '[[', 'AerialPrev', { buffer = bufnr }) - vim.keymap.set('n', ']]', 'AerialNext', { buffer = bufnr }) - end, - close_autonatic_events = { - unfocus, - switch_buffer, - }, -} diff --git a/nvim/plugin/colors.lua b/nvim/plugin/colors.lua deleted file mode 100644 index 3986737..0000000 --- a/nvim/plugin/colors.lua +++ /dev/null @@ -1,11 +0,0 @@ -if vim.g.did_load_colors_plugin then - return -end -vim.g.did_load_colors_plugin = true - -require('nightfox').setup { - options = { - transparent = true, -- Disable setting background - terminal_colors = false, -- Set terminal colors (vim.g.terminal_color_*) used in `:terminal` - }, -} diff --git a/nvim/plugin/completion.lua b/nvim/plugin/completion.lua deleted file mode 100644 index 5e3e1b4..0000000 --- a/nvim/plugin/completion.lua +++ /dev/null @@ -1,47 +0,0 @@ -if vim.g.did_load_completion_plugin then - return -end -vim.g.did_load_completion_plugin = true -local cmp = require('cmp') - -cmp.setup { - snippet = { - expand = function(args) - require('luasnip').lsp_expand(args.body) - end, - }, - experimental = { - native_menu = false, - ghost_text = true, - }, - mapping = cmp.mapping.preset.insert { - [''] = cmp.mapping.scroll_docs(-4), - [''] = cmp.mapping.scroll_docs(4), - [''] = cmp.mapping.complete(), - [''] = cmp.mapping.abort(), - [''] = cmp.mapping.confirm { select = true }, -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. - }, - sources = cmp.config.sources({ - { name = 'nvim_lsp' }, - { name = 'luasnip' }, - }, { - { name = 'buffer' }, - }), -} - -cmp.setup.cmdline({ '/', '?' }, { - mapping = cmp.mapping.preset.cmdline(), - sources = { - { name = 'buffer' }, - }, -}) - -cmp.setup.cmdline(':', { - mapping = cmp.mapping.preset.cmdline(), - sources = cmp.config.sources({ - { name = 'path' }, - }, { - { name = 'cmdline' }, - }), - matching = { disallow_symbol_nonprefix_matching = false }, -}) diff --git a/nvim/plugin/gitsigns.lua b/nvim/plugin/gitsigns.lua deleted file mode 100644 index 5dd0de8..0000000 --- a/nvim/plugin/gitsigns.lua +++ /dev/null @@ -1,40 +0,0 @@ -if vim.g.did_load_gitsigns_plugin then - return -end -vim.g.did_load_gitsigns_plugin = true - -require('gitsigns').setup { - signcolumn = false, - numhl = true, - on_attach = function() - local gs = package.loaded.gitsigns - vim.keymap.set('n', 'gg', gs.preview_hunk, { desc = 'git preview hunk' }) - vim.keymap.set('n', 'gb', function() - gs.blame_line { full = true } - end, { desc = 'git blame_line' }) - vim.keymap.set('n', 'gr', gs.reset_hunk, { desc = 'git reset hunk' }) - vim.keymap.set('v', 'gr', function() - gs.reset_hunk { vim.fn.line('.'), vim.fn.line('v') } - end, { desc = 'git reset hunk' }) - -- Navigation - vim.keymap.set('n', ']g', function() - if vim.wo.diff then - return ']c' - end - vim.schedule(function() - gs.next_hunk() - end) - return '' - end, { expr = true }) - - vim.keymap.set('n', '[g', function() - if vim.wo.diff then - return '[c' - end - vim.schedule(function() - gs.prev_hunk() - end) - return '' - end, { expr = true }) - end, -} diff --git a/nvim/plugin/keymaps.lua b/nvim/plugin/keymaps.lua deleted file mode 100644 index 6e4bcf9..0000000 --- a/nvim/plugin/keymaps.lua +++ /dev/null @@ -1,13 +0,0 @@ -vim.keymap.set('n', 'tt', vim.cmd.tabnext, { silent = true }) -vim.keymap.set('n', 'tr', vim.cmd.tabprev, { silent = true }) -vim.keymap.set('n', 'gt', vim.cmd.bnext, { silent = true }) -vim.keymap.set('n', 'gr', vim.cmd.bprev, { noremap = true, silent = true }) -vim.keymap.set('n', 'gq', vim.cmd.bdelete, { silent = true }) -vim.keymap.set('n', 'n', 'nzz', { noremap = true, silent = true }) -vim.keymap.set('n', 'N', 'Nzz', { noremap = true, silent = true }) -vim.keymap.set('n', '', 'zz') -vim.keymap.set('n', '', 'zz') -vim.keymap.set('n', '', 'zz') -vim.keymap.set('n', '', 'zz') -vim.keymap.set({ 'v', 'i' }, 'wq', 'l', { noremap = true, silent = true }) -vim.keymap.set('n', 'x', '"rd', { remap = true, silent = true }) diff --git a/nvim/plugin/lsp.lua b/nvim/plugin/lsp.lua deleted file mode 100644 index 887b316..0000000 --- a/nvim/plugin/lsp.lua +++ /dev/null @@ -1,138 +0,0 @@ -if vim.g.did_load_lsp_plugin then - return -end -vim.g.did_load_lsp_plugin = true - --- Setup language servers. -local lspconfig = require('lspconfig') -local capabilities = require('cmp_nvim_lsp').default_capabilities() - -lspconfig.gopls.setup { - settings = { - gopls = { - gofumpt = true, - codelenses = { - gc_details = true, - test = true, - }, - analyses = { - unusedvariable = true, - shadow = true, - }, - hints = { - assignVariableTypes = true, - constantValues = true, - functionTypeParameters = true, - rangeVariableTypes = true, - }, - usePlaceholders = true, - staticcheck = true, - }, - }, - capabilities = capabilities, - on_attach = function(_, bufnr) - capabilities = capabilities - vim.api.nvim_command('au BufWritePre lua vim.lsp.buf.format { async = false }') - end, -} -lspconfig.jedi_language_server.setup { capabilities = capabilities } -lspconfig.nil_ls.setup { capabilities = capabilities } -lspconfig.phpactor.setup { capabilities = capabilities } - -vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, { desc = 'Prev diagnostic' }) -vim.keymap.set('n', ']d', vim.diagnostic.goto_next, { desc = 'Next diagnostic' }) - -vim.diagnostic.config { - virtual_text = true, - underline = true, - update_in_insert = false, -} --- Use LspAttach autocommand to only map the following keys --- after the language server attaches to the current buffer -vim.api.nvim_create_autocmd('LspAttach', { - group = vim.api.nvim_create_augroup('UserLspConfig', {}), - callback = function(ev) - local bufnr = ev.buf - local client = vim.lsp.get_client_by_id(ev.data.client_id) - -- Buffer local mappings. - -- See `:help vim.lsp.*` for documentation on any of the below functions - vim.keymap.set('n', 'K', vim.lsp.buf.hover, { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP hover' }) - vim.keymap.set( - 'n', - 'rn', - vim.lsp.buf.rename, - { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP Rename' } - ) - vim.keymap.set( - { 'n', 'v' }, - 'da', - vim.lsp.buf.code_action, - { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP code action' } - ) - vim.keymap.set( - 'n', - 'dd', - 'Telescope lsp_definitions', - { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP definitions' } - ) - vim.keymap.set( - 'n', - 'di', - 'Telescope lsp_implementations', - { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP implementations' } - ) - vim.keymap.set( - 'n', - 'dr', - 'Telescope lsp_references', - { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP references' } - ) - vim.keymap.set( - 'n', - 'dt', - 'Telescope lsp_type_definitions', - { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP type defs' } - ) - vim.keymap.set( - 'n', - 'ds', - 'Telescope lsp_document_symbols', - { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP symbols' } - ) - vim.keymap.set( - 'n', - 'dl', - vim.lsp.codelens.run, - { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP codelens' } - ) - vim.keymap.set('n', 'dh', function() - vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled()) - end, { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP hints toggle' }) - vim.keymap.set('n', 'df', function() - vim.lsp.buf.format { async = true } - end, { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP format' }) - -- Auto-refresh code lenses - if not client then - return - end - local group = vim.api.nvim_create_augroup(string.format('lsp-%s-%s', bufnr, client.id), {}) - if client.server_capabilities.codeLensProvider then - vim.api.nvim_create_autocmd({ 'InsertLeave', 'BufWritePost', 'TextChanged' }, { - group = group, - callback = function() - vim.lsp.codelens.refresh { bufnr = bufnr } - end, - buffer = bufnr, - }) - vim.lsp.codelens.refresh { bufnr = bufnr } - end - end, -}) - -local none = require('null-ls') -none.setup { - sources = { - none.builtins.diagnostics.puppet_lint, - none.builtins.diagnostics.yamllint, - }, -} diff --git a/nvim/plugin/lualine.lua b/nvim/plugin/lualine.lua deleted file mode 100644 index a7c1653..0000000 --- a/nvim/plugin/lualine.lua +++ /dev/null @@ -1,18 +0,0 @@ -if vim.g.did_load_lualine_plugin then - return -end -vim.g.did_load_lualine_plugin = true - -vim.schedule(function() - require('lualine').setup { - globalstatus = true, - extensions = { 'oil', 'trouble', 'aerial', 'fzf', 'toggleterm', 'quickfix' }, - sections = { - lualine_x = { 'filetype' }, - }, - tabline = { - lualine_a = { 'buffers' }, - lualine_z = { 'tabs' }, - }, - } -end) diff --git a/nvim/plugin/luasnip.lua b/nvim/plugin/luasnip.lua deleted file mode 100644 index 4fc038b..0000000 --- a/nvim/plugin/luasnip.lua +++ /dev/null @@ -1,37 +0,0 @@ -if vim.g.did_load_luasnip_plugin then - return -end -vim.g.did_load_luasnip_plugin = true - -local ls = require('luasnip') -ls.config.set_config { - history = true, - updateevents = 'TextChanged, TextChangedI', -} -require('luasnip.loaders.from_vscode').lazy_load() - -vim.keymap.set({ 'i', 's' }, '', function() - if ls.expand_or_jumpable() then - ls.expand_or_jump() - end -end, { silent = true }) - -vim.keymap.set({ 'i', 's' }, '', function() - if ls.jumpable(-1) then - ls.jump(-1) - end -end, { silent = true }) - -vim.keymap.set({ 'i', 's' }, '', function() - if ls.choice_active() then - ls.change_choice(1) - end -end, { silent = true }) - --------------------- --- Snippets -- --------------------- -local fmta = require('luasnip.extras.fmt').fmta -ls.add_snippets('go', { - ls.snippet('ie', fmta('if err != nil {\n\treturn \n}', { err = ls.insert_node(1, 'err') })), -}) diff --git a/nvim/plugin/mini.lua b/nvim/plugin/mini.lua deleted file mode 100644 index aedb8c5..0000000 --- a/nvim/plugin/mini.lua +++ /dev/null @@ -1,67 +0,0 @@ -if vim.g.did_load_mini_plugin then - return -end -vim.g.did_load_mini_plugin = true - --- din( dina -require('mini.ai').setup() --- gc gcc -require('mini.comment').setup() - --- Add surrounding with sa --- Delete surrounding with sd. --- Replace surrounding with sr. --- Find surrounding with sf or sF (move cursor right or left). --- Highlight surrounding with sh. --- 'f' - function call (string of alphanumeric symbols or '_' or '.' followed by balanced '()'). In "input" finds function call, in "output" prompts user to enter function name. --- 't' - tag. In "input" finds tag with same identifier, in "output" prompts user to enter tag name. --- All symbols in brackets '()', '[]', '{}', '<>". --- '?' - interactive. Prompts user to enter left and right parts. -require('mini.surround').setup() - --- :Trim -require('mini.trailspace').setup() -vim.api.nvim_create_user_command('Trim', function() - require('mini.trailspace').trim() -end, {}) - --- prefix \ --- `b` - |'background'|. --- `c` - |'cursorline'|. --- `C` - |'cursorcolumn'|. --- `d` - diagnostic (via |vim.diagnostic.enable()| and |vim.diagnostic.disable()|). --- `h` - |'hlsearch'| (or |v:hlsearch| to be precise). --- `i` - |'ignorecase'|. --- `l` - |'list'|. --- `n` - |'number'|. --- `r` - |'relativenumber'|. --- `s` - |'spell'|. --- `w` - |'wrap'|. -require('mini.basics').setup { - mappings = { - windows = true, - }, -} - --- gS -require('mini.splitjoin').setup { - detect = { - separator = '[,;\n]', - }, -} - -require('mini.pairs').setup() -vim.cmd([[ hi MiniCursorwordCurrent ctermfg=240 ]]) - -require('mini.jump2d').setup { - mappings = { start_jumping = 'S' }, -} - -indent = require('mini.indentscope') -indent.setup { - options = { try_as_border = false }, - draw = { delay = 0 }, -} -indent.gen_animation.none() - -require('mini.icons').setup() diff --git a/nvim/plugin/misc.lua b/nvim/plugin/misc.lua deleted file mode 100644 index acb37ef..0000000 --- a/nvim/plugin/misc.lua +++ /dev/null @@ -1,45 +0,0 @@ -if vim.g.did_load_plugins_plugin then - return -end -vim.g.did_load_plugins_plugin = true - --- many plugins annoyingly require a call to a 'setup' function to be loaded, --- even with default configs - -require('neogen').setup {} -vim.keymap.set('n', 'nd', 'Neogen', { noremap = true, silent = true, desc = 'Neogen - gen comments' }) - -require('toggleterm').setup { - open_mapping = [[]], - direction = 'float', - close_on_exit = true, - autochdir = true, -} - -require('which-key').setup { - preset = 'helix', -} -require('trouble').setup {} -require('eyeliner').setup {} -require('markview').setup() -require('scope').setup {} -require('neoclip').setup { default_register = '+' } -vim.keymap.set( - 'n', - 'fp', - 'Telescope neoclip', - { noremap = true, silent = true, desc = 'Pick clipboard history' } -) -local snipe = require('snipe') -snipe.setup { - ui = { - position = 'center', - }, - sort = 'last', -} -vim.keymap.set( - 'n', - '', - snipe.open_buffer_menu, - { noremap = true, silent = true, desc = 'Pick buffers (snipe.nvim)' } -) diff --git a/nvim/plugin/neogit.lua b/nvim/plugin/neogit.lua deleted file mode 100644 index 533fe8f..0000000 --- a/nvim/plugin/neogit.lua +++ /dev/null @@ -1,20 +0,0 @@ -if vim.g.did_load_neogit_plugin then - return -end -vim.g.did_load_neogit_plugin = true -require('diffview').setup { - enhanced_diff_hl = true, - default_args = { - DiffviewOpen = { '--imply-local' }, - }, -} -local neogit = require('neogit') -neogit.setup { - disable_builtin_notifications = true, - integrations = { - diffview = true, - telescope = true, - fzf_lua = true, - }, -} -vim.keymap.set('n', 'ng', neogit.open, { noremap = true, silent = true, desc = 'Neogit' }) diff --git a/nvim/plugin/oil.lua b/nvim/plugin/oil.lua deleted file mode 100644 index 1c4a521..0000000 --- a/nvim/plugin/oil.lua +++ /dev/null @@ -1,23 +0,0 @@ -if vim.g.did_load_oil_plugin then - return -end -vim.g.did_load_oil_plugin = true - -local oil = require('oil') -oil.setup { - watch_for_changes = true, - columns = { - 'permissions', - 'size', - }, - view_options = { - show_hidden = true, - }, - keymaps = { - ['wq'] = 'actions.close', - }, -} -vim.keymap.set('n', 'c', oil.toggle_float, { noremap = true, silent = true }) -vim.keymap.set('n', 'u', 'UndotreeToggle') -vim.g.undotree_ShortIndicators = 1 -vim.g.undotree_SetFocusWhenToggle = 1 diff --git a/nvim/plugin/telescope.lua b/nvim/plugin/telescope.lua deleted file mode 100644 index 7182b81..0000000 --- a/nvim/plugin/telescope.lua +++ /dev/null @@ -1,70 +0,0 @@ -if vim.g.did_load_telescope_plugin then - return -end -vim.g.did_load_telescope_plugin = true - -local telescope = require('telescope.builtin') - --- Fall back to find_files if not in a git repo -local project_files = function() - local opts = {} -- define here if you want to define something - local ok = pcall(telescope.git_files, opts) - if not ok then - telescope.find_files(opts) - end -end - -vim.keymap.set('n', 'ff', project_files, { noremap = true, silent = true, desc = 'Fuzzy find git files' }) -vim.keymap.set('n', 'fg', telescope.find_files, { noremap = true, silent = true, desc = 'Fuzzy find files' }) -vim.keymap.set( - 'n', - 'fc', - telescope.command_history, - { noremap = true, silent = true, desc = 'Fuzzy find command_history' } -) -vim.keymap.set('n', 'fa', telescope.live_grep, { noremap = true, silent = true, desc = 'Fuzzy find grep' }) -vim.keymap.set( - 'n', - 'f8', - telescope.grep_string, - { noremap = true, silent = true, desc = 'Fuzzy find grep current word' } -) -vim.keymap.set('n', 'fq', telescope.quickfix, { noremap = true, silent = true, desc = 'Fuzzy find quickfix' }) -vim.keymap.set('n', 'f', telescope.resume, { noremap = true, silent = true, desc = 'Fuzzy find resume' }) - -local telescope = require('telescope') -telescope.setup { - defaults = { - layout_strategy = 'vertical', - layout_config = { width = 0.90 }, - prompt_title = false, - results_title = false, - preview_title = false, - vimgrep_arguments = { - 'rg', - '-L', - '--color=never', - '--no-heading', - '--hidden', - '--with-filename', - '--line-number', - '--column', - '--smart-case', - }, - preview = { - treesitter = true, - }, - path_display = { - 'truncate', - }, - mappings = { - i = { - ['wq'] = require('telescope.actions').close, - [''] = require('telescope.actions').close, - [''] = require('telescope.actions').move_selection_previous, - [''] = require('telescope.actions').move_selection_next, - }, - }, - }, -} -telescope.load_extension('fzf') diff --git a/nvim/plugin/treesitter.lua b/nvim/plugin/treesitter.lua deleted file mode 100644 index 0444ac3..0000000 --- a/nvim/plugin/treesitter.lua +++ /dev/null @@ -1,65 +0,0 @@ -if vim.g.did_load_treesitter_plugin then - return -end -vim.g.did_load_treesitter_plugin = true - -require('nvim-treesitter.configs').setup { - ensure_installed = {}, - highlight = { - enable = true, - disable = function(_, buf) - local max_filesize = 100 * 1024 -- 100 KiB - local ok, stats = pcall(vim.loop.fs_stat, vim.api.nvim_buf_get_name(buf)) - if ok and stats and stats.size > max_filesize then - return true - end - end, - }, - indent = { - enable = true, - }, - textobjects = { - select = { - enable = true, - lookahead = true, - keymaps = { - ['af'] = '@function.outer', - ['if'] = '@function.inner', - ['aa'] = '@statement.outer', - ['ia'] = '@parameter.inner', - }, - }, - move = { - enable = true, - set_jumps = true, -- whether to set jumps in the jumplist - goto_next_start = { - [']a'] = '@parameter.inner', - }, - goto_previous_start = { - ['[a'] = '@parameter.inner', - }, - }, - swap = { - enable = true, - swap_next = { - ['s]'] = '@parameter.inner', - }, - swap_previous = { - ['s['] = '@parameter.inner', - }, - }, - }, - incremental_selection = { - enable = true, - keymaps = { - init_selection = '', - node_incremental = '', - node_decremental = '', - }, - }, -} - -require('treesitter-context').setup { - max_lines = 2, - min_window_height = 50, -} diff --git a/nvim/plugin/which-key.lua b/nvim/plugin/which-key.lua deleted file mode 100644 index 89030a5..0000000 --- a/nvim/plugin/which-key.lua +++ /dev/null @@ -1,3 +0,0 @@ -require('which-key').setup { - preset = 'helix', -} From b937ff2f1f6feb2f86cdcdfabfabca9eb712bc42 Mon Sep 17 00:00:00 2001 From: iofq Date: Mon, 19 Aug 2024 01:43:29 -0500 Subject: [PATCH 072/160] don't lazy load mini to stop flickering on load --- nvim/lua/plugins/mini.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index ad495c8..9e40332 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -1,7 +1,7 @@ return { { 'echasnovski/mini.nvim', - event = 'VeryLazy', + lazy = false, config = function() require('mini.ai').setup() require('mini.comment').setup() From bdaed4fa4dbfb4fb7941756450a62abc75c6762d Mon Sep 17 00:00:00 2001 From: iofq Date: Mon, 19 Aug 2024 02:00:41 -0500 Subject: [PATCH 073/160] race condition breaks statusline --- nvim/lua/plugins/mini.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index 9e40332..d4e3e98 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -1,7 +1,7 @@ return { { 'echasnovski/mini.nvim', - lazy = false, + event = "VeryLazy", config = function() require('mini.ai').setup() require('mini.comment').setup() From f8e0e41d63a51845064e77937b5913f276694a71 Mon Sep 17 00:00:00 2001 From: iofq Date: Mon, 19 Aug 2024 17:23:20 -0500 Subject: [PATCH 074/160] bugfixes --- nvim/lua/plugins/mini.lua | 4 ---- nvim/lua/plugins/misc.lua | 16 +++++++++++----- nvim/lua/plugins/telescope.lua | 2 +- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index d4e3e98..ce58930 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -128,10 +128,6 @@ return { require('mini.splitjoin').setup { detect = { separator = '[,;\n]' }, } - - -- Replace text with register 'gr', - -- Sort text 'gs', - require('mini.operators').setup() require('mini.jump2d').setup { mappings = { start_jumping = 'S' } } local indent = require('mini.indentscope') diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index 95bc26d..3edc23a 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -1,9 +1,8 @@ return { { 'danymat/neogen', - keys = { - { 'nd', 'Neogen', { noremap = true, silent = true, desc = 'Neogen - gen comments' } }, - }, + event = 'VeryLazy', + config = true, }, { 'akinsho/toggleterm.nvim', @@ -23,8 +22,15 @@ return { vim.api.nvim_set_hl(0, 'EyelinerSecondary', { underline = true }) end, }, - { 'OXY2DEV/markview.nvim', event = 'VeryLazy' }, - { 'tiagovla/scope.nvim', event = 'VeryLazy' }, + { + 'OXY2DEV/markview.nvim', + lazy = false, + dependencies = { + "nvim-treesitter/nvim-treesitter", + "nvim-tree/nvim-web-devicons" + } + }, + { 'tiagovla/scope.nvim', event = 'VeryLazy', config = true }, { 'chrisgrieser/nvim-early-retirement', event = 'VeryLazy', diff --git a/nvim/lua/plugins/telescope.lua b/nvim/lua/plugins/telescope.lua index e6321aa..80d56ce 100644 --- a/nvim/lua/plugins/telescope.lua +++ b/nvim/lua/plugins/telescope.lua @@ -77,7 +77,7 @@ return { ) vim.keymap.set('n', 'fq', b.quickfix, { noremap = true, silent = true, desc = 'Fuzzy find quickfix' }) vim.keymap.set('n', 'f?', b.builtin, { noremap = true, silent = true, desc = 'See all pickers' }) - vim.keymap.set('n', 'f', b.resume, { noremap = true, silent = true, desc = 'Fuzzy find resume' }) + vim.keymap.set('n', 'f.', b.resume, { noremap = true, silent = true, desc = 'Fuzzy find resume' }) vim.keymap.set( 'n', 'fs', From b0cd1f6bb85f8eea84f0299deccf48216d63270a Mon Sep 17 00:00:00 2001 From: iofq Date: Tue, 20 Aug 2024 22:50:19 -0500 Subject: [PATCH 075/160] update inputs --- flake.lock | 116 +++++++++++++++++++++++++++++++++++++++++++++-------- flake.nix | 5 ++- 2 files changed, 103 insertions(+), 18 deletions(-) diff --git a/flake.lock b/flake.lock index 2898d1d..97c935c 100644 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,21 @@ { "nodes": { + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, "flake-parts": { "inputs": { "nixpkgs-lib": "nixpkgs-lib" @@ -39,14 +55,18 @@ "gen-luarc": { "inputs": { "flake-parts": "flake-parts", - "nixpkgs": "nixpkgs" + "git-hooks": "git-hooks", + "luvit-meta": "luvit-meta", + "nixpkgs": [ + "nixpkgs" + ] }, "locked": { - "lastModified": 1718922730, - "narHash": "sha256-ykhhOPqA9NzdNBr3ii+3h2DkK2+wasNqQLfMF6BXxTE=", + "lastModified": 1724097937, + "narHash": "sha256-Q4tgm8ZHAQUdvsNft86MqIbHQAm7OF7RT/wwYWXqSdY=", "owner": "mrcjkb", "repo": "nix-gen-luarc-json", - "rev": "021e8078e43884c6cdc70ca753d9a0b146cd55a4", + "rev": "b36b69c4ded9f31b079523bc452e23458734cf00", "type": "github" }, "original": { @@ -55,17 +75,79 @@ "type": "github" } }, - "nixpkgs": { + "git-hooks": { + "inputs": { + "flake-compat": "flake-compat", + "gitignore": "gitignore", + "nixpkgs": [ + "gen-luarc", + "nixpkgs" + ], + "nixpkgs-stable": "nixpkgs-stable" + }, "locked": { - "lastModified": 1718714799, - "narHash": "sha256-FUZpz9rg3gL8NVPKbqU8ei1VkPLsTIfAJ2fdAf5qjak=", - "owner": "nixos", - "repo": "nixpkgs", - "rev": "c00d587b1a1afbf200b1d8f0b0e4ba9deb1c7f0e", + "lastModified": 1723803910, + "narHash": "sha256-yezvUuFiEnCFbGuwj/bQcqg7RykIEqudOy/RBrId0pc=", + "owner": "cachix", + "repo": "git-hooks.nix", + "rev": "bfef0ada09e2c8ac55bbcd0831bd0c9d42e651ba", "type": "github" }, "original": { - "owner": "nixos", + "owner": "cachix", + "repo": "git-hooks.nix", + "type": "github" + } + }, + "gitignore": { + "inputs": { + "nixpkgs": [ + "gen-luarc", + "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" + } + }, + "luvit-meta": { + "flake": false, + "locked": { + "lastModified": 1705776742, + "narHash": "sha256-zAAptV/oLuLAAsa2zSB/6fxlElk4+jNZd/cPr9oxFig=", + "owner": "Bilal2453", + "repo": "luvit-meta", + "rev": "ce76f6f6cdc9201523a5875a4471dcfe0186eb60", + "type": "github" + }, + "original": { + "owner": "Bilal2453", + "repo": "luvit-meta", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1723991338, + "narHash": "sha256-Grh5PF0+gootJfOJFenTTxDTYPidA3V28dqJ/WV7iis=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "8a3354191c0d7144db9756a74755672387b702ba", + "type": "github" + }, + "original": { + "owner": "NixOS", "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" @@ -83,18 +165,18 @@ "url": "https://github.com/NixOS/nixpkgs/archive/eb9ceca17df2ea50a250b6b27f7bf6ab0186f198.tar.gz" } }, - "nixpkgs_2": { + "nixpkgs-stable": { "locked": { - "lastModified": 1723637854, - "narHash": "sha256-med8+5DSWa2UnOqtdICndjDAEjxr5D7zaIiK4pn0Q7c=", + "lastModified": 1720386169, + "narHash": "sha256-NGKVY4PjzwAa4upkGtAMz1npHGoRzWotlSnVlqI40mo=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "c3aa7b8938b17aebd2deecf7be0636000d62a2b9", + "rev": "194846768975b7ad2c4988bdb82572c00222c0d7", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixos-unstable", + "ref": "nixos-24.05", "repo": "nixpkgs", "type": "github" } @@ -119,7 +201,7 @@ "inputs": { "flake-utils": "flake-utils", "gen-luarc": "gen-luarc", - "nixpkgs": "nixpkgs_2", + "nixpkgs": "nixpkgs", "nvim-early-retirement": "nvim-early-retirement", "snipe-nvim": "snipe-nvim", "workspace-diagnostics-nvim": "workspace-diagnostics-nvim" diff --git a/flake.nix b/flake.nix index b6eafa1..d578306 100644 --- a/flake.nix +++ b/flake.nix @@ -4,7 +4,10 @@ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; - gen-luarc.url = "github:mrcjkb/nix-gen-luarc-json"; + gen-luarc = { + url = "github:mrcjkb/nix-gen-luarc-json"; + inputs.nixpkgs.follows = "nixpkgs"; + }; snipe-nvim = { url = "github:leath-dub/snipe.nvim"; flake = false; From 4ceceff9bf5b5fd758faecb52799e7f8469c3674 Mon Sep 17 00:00:00 2001 From: iofq Date: Wed, 21 Aug 2024 00:30:13 -0500 Subject: [PATCH 076/160] bugfixes --- nix/neovim-overlay.nix | 6 ++++-- nvim/lua/config/init.lua | 3 +-- nvim/lua/plugins/completion.lua | 33 ++++++++++++--------------------- nvim/lua/plugins/lsp.lua | 1 - nvim/lua/plugins/mini.lua | 5 +++-- nvim/lua/plugins/misc.lua | 2 +- nvim/lua/plugins/treesitter.lua | 2 +- 7 files changed, 22 insertions(+), 30 deletions(-) diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index d4cb123..84f2153 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -17,7 +17,6 @@ with final.pkgs.lib; let mkNeovim = pkgs.callPackage ./mkNeovim.nix { inherit pkgs-wrapNeovim; }; all-plugins = with pkgs.vimPlugins; [ - aerial-nvim cmp-buffer cmp-cmdline cmp-nvim-lsp @@ -98,7 +97,6 @@ with final.pkgs.lib; let gopls lua-language-server nil - phpactor python312Packages.jedi-language-server # debuggers @@ -115,6 +113,10 @@ in { plugins = all-plugins; appName = "nvim"; extraPackages = basePackages; + ignoreConfigRegexes = [ + "*/lsp.lua" + "*/debug.lua" + ]; }; nvim-luarc-json = final.mk-luarc-json { diff --git a/nvim/lua/config/init.lua b/nvim/lua/config/init.lua index 71c116f..58ca894 100644 --- a/nvim/lua/config/init.lua +++ b/nvim/lua/config/init.lua @@ -1,9 +1,8 @@ vim.opt.backspace = 'indent,eol,start' vim.opt.clipboard = 'unnamedplus' -vim.opt.completeopt = 'menuone' +vim.opt.completeopt = {'menu', 'menuone', 'noselect'} vim.opt.expandtab = true -- insert tabs as spaces vim.opt.inccommand = 'split' -- incremental live completion -vim.opt.laststatus = 1 vim.opt.list = true vim.opt.nrformats:append('alpha') -- let Ctrl-a do letters as well vim.opt.path:append('**') -- enable fuzzy :find ing diff --git a/nvim/lua/plugins/completion.lua b/nvim/lua/plugins/completion.lua index fc4dcc7..beaf4e6 100644 --- a/nvim/lua/plugins/completion.lua +++ b/nvim/lua/plugins/completion.lua @@ -19,22 +19,21 @@ return { require('luasnip').lsp_expand(args.body) end, }, - experimental = { - native_menu = false, - ghost_text = true, - }, mapping = cmp.mapping.preset.insert { - [''] = cmp.mapping.scroll_docs(-4), - [''] = cmp.mapping.scroll_docs(4), - [''] = cmp.mapping.complete(), - [''] = cmp.mapping.abort(), - [''] = cmp.mapping.confirm { select = true }, -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. + [''] = cmp.mapping.scroll_docs(-4), + [''] = cmp.mapping.scroll_docs(4), + [''] = cmp.mapping.select_next_item { behavior = cmp.SelectBehavior.Insert }, + [''] = cmp.mapping.select_prev_item { behavior = cmp.SelectBehavior.Insert }, + [''] = cmp.mapping.confirm { + select = true, + behavior = cmp.SelectBehavior.Insert + }, }, sources = cmp.config.sources({ - { name = 'nvim_lsp' }, + { name = 'nvim_lsp', keyword_length = 1 }, { name = 'luasnip' }, - }, { { name = 'buffer' }, + { name = 'path' }, }), } @@ -68,13 +67,13 @@ return { } require('luasnip.loaders.from_vscode').lazy_load() - vim.keymap.set({ 'i', 's' }, '', function() + vim.keymap.set({ 'i', 's' }, '', function() if ls.expand_or_jumpable() then ls.expand_or_jump() end end, { silent = true }) - vim.keymap.set({ 'i', 's' }, '', function() + vim.keymap.set({ 'i', 's' }, '', function() if ls.jumpable(-1) then ls.jump(-1) end @@ -85,14 +84,6 @@ return { ls.change_choice(1) end end, { silent = true }) - - -------------------- - -- Snippets -- - -------------------- - local fmta = require('luasnip.extras.fmt').fmta - ls.add_snippets('go', { - ls.snippet('ie', fmta('if err != nil {\n\treturn \n}', { err = ls.insert_node(1, 'err') })), - }) end, }, } diff --git a/nvim/lua/plugins/lsp.lua b/nvim/lua/plugins/lsp.lua index fbbdcf9..cd5f603 100644 --- a/nvim/lua/plugins/lsp.lua +++ b/nvim/lua/plugins/lsp.lua @@ -68,7 +68,6 @@ return { } lspconfig.jedi_language_server.setup {} lspconfig.nil_ls.setup {} - lspconfig.phpactor.setup {} lspconfig.lua_ls.setup { on_init = function(client) local path = client.workspace_folders[1].name diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index ce58930..78be31d 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -1,7 +1,7 @@ return { { 'echasnovski/mini.nvim', - event = "VeryLazy", + lazy = false, config = function() require('mini.ai').setup() require('mini.comment').setup() @@ -28,6 +28,7 @@ return { return summary end local diagnostics = MiniStatusline.section_diagnostics { trunc_width = 75 } + local lsp = MiniStatusline.section_lsp { trunc_width = 75 } local filename = MiniStatusline.section_filename { trunc_width = 140 } local search = MiniStatusline.section_searchcount { trunc_width = 75 } @@ -36,7 +37,7 @@ return { '%<', -- Mark general truncate point { hl = 'MiniStatuslineFilename', strings = { filename } }, '%=', -- End left alignment - { hl = 'MiniStatusDevinfo', strings = { git(), diff(), diagnostics } }, + { hl = 'MiniStatusDevinfo', strings = { git(), diff(), diagnostics, lsp} }, { hl = mode_hl, strings = { search } }, } end, diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index 3edc23a..539b3df 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -24,7 +24,7 @@ return { }, { 'OXY2DEV/markview.nvim', - lazy = false, + event = 'VeryLazy', dependencies = { "nvim-treesitter/nvim-treesitter", "nvim-tree/nvim-web-devicons" diff --git a/nvim/lua/plugins/treesitter.lua b/nvim/lua/plugins/treesitter.lua index 44c53e5..625df5d 100644 --- a/nvim/lua/plugins/treesitter.lua +++ b/nvim/lua/plugins/treesitter.lua @@ -1,7 +1,7 @@ return { { 'nvim-treesitter/nvim-treesitter', - event = 'VeryLazy', + lazy = false, dependencies = { 'nvim-treesitter/nvim-treesitter-context', 'nvim-treesitter/nvim-treesitter-textobjects', From 14fec02d6387fd59645aecbc78c3f02acc13bf81 Mon Sep 17 00:00:00 2001 From: iofq Date: Wed, 21 Aug 2024 02:35:12 -0500 Subject: [PATCH 077/160] few bugfixes, mini.files --- nix/mkNeovim.nix | 18 +-- nix/neovim-overlay.nix | 3 +- nvim/init.lua | 19 +-- nvim/lua/config/init.lua | 7 +- nvim/lua/plugins/lsp.lua | 8 +- nvim/lua/plugins/mini.lua | 197 ++++++++++++++++---------------- nvim/lua/plugins/misc.lua | 56 +++------ nvim/lua/plugins/telescope.lua | 1 - nvim/lua/plugins/treesitter.lua | 2 +- 9 files changed, 149 insertions(+), 162 deletions(-) diff --git a/nix/mkNeovim.nix b/nix/mkNeovim.nix index 289c987..e71663a 100644 --- a/nix/mkNeovim.nix +++ b/nix/mkNeovim.nix @@ -105,22 +105,26 @@ with lib; # and prepends the nvim and after directory to the RTP initLua = '' vim.opt.rtp:prepend('${nvimRtp}/lua') - lazy_opts = { + LAZY_OPTS = { performance = { reset_packpath = false, - rtp = { reset = false, }, + rtp = { + reset = false, + disabled_plugins = { + "netrwPlugin", + "tutor", + }, + }, }, dev = { path = "${pkgs.neovimUtils.packDir neovimConfig.packpathDirs}/pack/myNeovimPackages/start", patterns = {""}, }, + checker = { + enabled = false, + }, install = { missing = false, }, spec = {{ import = "plugins" }}, - disabled_plugins = { - "netrwPlugin", - "tutor", - "zipPlugin", - }, } '' + (builtins.readFile ../nvim/init.lua); diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index 84f2153..8e8f382 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -43,6 +43,7 @@ with final.pkgs.lib; let nvim-lspconfig nvim-neoclip-lua nvim-nio + nvim-autopairs nvim-treesitter-context nvim-treesitter-textobjects (nvim-treesitter.withPlugins(p: with p; [ @@ -72,8 +73,6 @@ with final.pkgs.lib; let tree-sitter-typescript tree-sitter-yaml ])) - nvim-web-devicons - oil-nvim outline-nvim scope-nvim snipe-nvim diff --git a/nvim/init.lua b/nvim/init.lua index cb810f8..215be02 100644 --- a/nvim/init.lua +++ b/nvim/init.lua @@ -1,6 +1,6 @@ vim.g.mapleader = ' ' -- If lazy_opts is set, we're running in wrapped neovim via nix -if not lazy_opts then +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 @@ -14,14 +14,19 @@ if not lazy_opts then } end vim.opt.rtp:prepend(lazypath) - lazy_opts = { + LAZY_OPTS = { spec = { { import = 'plugins' } }, - disabled_plugins = { - 'netrwPlugin', - 'tutor', - 'zipPlugin', + performance = { + reset_packpath = false, + rtp = { + reset = false, + disabled_plugins = { + "netrwPlugin", + "tutor", + }, + }, }, } end -require('lazy').setup(lazy_opts) +require('lazy').setup(LAZY_OPTS) require('config') diff --git a/nvim/lua/config/init.lua b/nvim/lua/config/init.lua index 58ca894..87bd5a4 100644 --- a/nvim/lua/config/init.lua +++ b/nvim/lua/config/init.lua @@ -10,7 +10,7 @@ vim.opt.relativenumber = true vim.opt.shadafile = 'NONE' -- disable shada vim.opt.shiftwidth = 0 -- >> shifts by tabstop vim.opt.showmatch = true -- highlight matching brackets -vim.opt.showmode = true +vim.opt.showmode = false vim.opt.signcolumn = 'no' vim.opt.spell = false vim.opt.softtabstop = -1 -- backspace removes tabstop @@ -84,7 +84,10 @@ vim.diagnostic.config { -- random keymaps vim.keymap.set('n', 'gq', vim.cmd.bdelete, { silent = true }) -vim.keymap.set('n', 'gr', 'gT', { noremap = true, silent = true }) +vim.keymap.set('n', 'gt', vim.cmd.bnext, { silent = true }) +vim.keymap.set('n', 'gr', vim.cmd.bprev, { silent = true }) +vim.keymap.set('n', 'tr', 'gT', { noremap = true, silent = true }) +vim.keymap.set('n', 'tt', 'gt', { noremap = true, silent = true }) vim.keymap.set('n', 'n', 'nzz', { noremap = true, silent = true }) vim.keymap.set('n', 'N', 'Nzz', { noremap = true, silent = true }) vim.keymap.set({ 'v', 'i' }, 'wq', 'l', { noremap = true, silent = true }) diff --git a/nvim/lua/plugins/lsp.lua b/nvim/lua/plugins/lsp.lua index cd5f603..a4293e1 100644 --- a/nvim/lua/plugins/lsp.lua +++ b/nvim/lua/plugins/lsp.lua @@ -28,7 +28,7 @@ return { }, { 'neovim/nvim-lspconfig', - event = 'VeryLazy', + lazy = false, dependencies = { 'hrsh7th/cmp-nvim-lsp', }, @@ -39,7 +39,7 @@ return { lspconfig.util.default_config.capabilities, require('cmp_nvim_lsp').default_capabilities() ) - + vim.lsp.inlay_hint.enable(true) lspconfig.gopls.setup { settings = { gopls = { @@ -91,15 +91,12 @@ return { Lua = {}, }, } - vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, { desc = 'Prev diagnostic' }) - vim.keymap.set('n', ']d', vim.diagnostic.goto_next, { desc = 'Next diagnostic' }) vim.api.nvim_create_autocmd('LspAttach', { group = vim.api.nvim_create_augroup('UserLspConfig', {}), callback = function(ev) local bufnr = ev.buf local client = vim.lsp.get_client_by_id(ev.data.client_id) - require('workspace-diagnostics').populate_workspace_diagnostics(client, bufnr) vim.keymap.set( 'n', 'K', @@ -175,6 +172,7 @@ return { }) vim.lsp.codelens.refresh { bufnr = bufnr } end + require('workspace-diagnostics').populate_workspace_diagnostics(client, bufnr) end, }) vim.api.nvim_exec_autocmds('FileType', {}) diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index 78be31d..4472aa0 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -3,9 +3,10 @@ return { 'echasnovski/mini.nvim', lazy = false, config = function() - require('mini.ai').setup() - require('mini.comment').setup() - require('mini.pairs').setup() + require('mini.tabline').setup({ + tabpage_section = 'right', + show_icons = false, + }) require('mini.statusline').setup { content = { active = function() @@ -50,103 +51,103 @@ return { end, }, } - vim.opt.showmode = false + vim.schedule(function() + require('mini.ai').setup() + require('mini.align').setup() + require('mini.bracketed').setup() + require('mini.comment').setup() + require('mini.icons').setup() + require('mini.surround').setup() + require('mini.jump2d').setup { mappings = { start_jumping = 'S' } } + require('mini.splitjoin').setup { detect = { separator = '[,;\n]' }, } + require('mini.basics').setup { mappings = { windows = true, }, } + require('mini.trailspace').setup() + vim.api.nvim_create_user_command('Trim', function() + require('mini.trailspace').trim() + end, {}) + local indent = require('mini.indentscope') + indent.setup { + draw = { delay = 0 }, + } + indent.gen_animation.none() - 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' }, - }, - - clues = { - miniclue.gen_clues.g(), - miniclue.gen_clues.marks(), - miniclue.gen_clues.registers(), - miniclue.gen_clues.windows(), - miniclue.gen_clues.z(), - }, - } - -- Add surrounding with sa - -- Delete surrounding with sd. - -- Replace surrounding with sr. - -- Find surrounding with sf or sF (move cursor right or left). - -- Highlight surrounding with sh. - -- 'f' - function call (string of alphanumeric symbols or '_' or '.' followed by balanced '()'). In "input" finds function call, in "output" prompts user to enter function name. - -- 't' - tag. In "input" finds tag with same identifier, in "output" prompts user to enter tag name. - -- All symbols in brackets '()', '[]', '{}', '<>". - -- '?' - interactive. Prompts user to enter left and right parts. - require('mini.surround').setup() - - require('mini.trailspace').setup() - vim.api.nvim_create_user_command('Trim', function() - require('mini.trailspace').trim() - end, {}) - - -- prefix \ - -- `b` - |'background'|. - -- `c` - |'cursorline'|. - -- `C` - |'cursorcolumn'|. - -- `d` - diagnostic (via |vim.diagnostic.enable()| and |vim.diagnostic.disable()|). - -- `h` - |'hlsearch'| (or |v:hlsearch| to be precise). - -- `i` - |'ignorecase'|. - -- `l` - |'list'|. - -- `n` - |'number'|. - -- `r` - |'relativenumber'|. - -- `s` - |'spell'|. - -- `w` - |'wrap'|. - require('mini.basics').setup { - mappings = { - windows = true, - }, - } - - local map = require('mini.map') - map.setup { - symbols = { - scroll_line = '┃', - scroll_view = '', - }, - integrations = { - map.gen_integration.builtin_search(), - map.gen_integration.diagnostic(), - map.gen_integration.gitsigns(), - }, - window = { - show_integration_count = false, - winblend = 0, - width = 5, - }, - } - vim.keymap.set('n', 'nm', map.toggle, { noremap = true, desc = 'minimap open' }) - - -- gS - require('mini.splitjoin').setup { - detect = { separator = '[,;\n]' }, - } - require('mini.jump2d').setup { mappings = { start_jumping = 'S' } } - - local indent = require('mini.indentscope') - indent.setup { - draw = { delay = 0 }, - } - indent.gen_animation.none() - - require('mini.notify').setup { - window = { - winblend = 0, - config = { - anchor = 'SE', - border = 'double', - row = vim.o.lines, + 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' }, }, - }, - } + + clues = { + miniclue.gen_clues.g(), + miniclue.gen_clues.marks(), + miniclue.gen_clues.registers(), + miniclue.gen_clues.windows(), + miniclue.gen_clues.z(), + }, + } + + + local map = require('mini.map') + map.setup { + symbols = { + scroll_line = '┃', + scroll_view = '', + }, + integrations = { + map.gen_integration.builtin_search(), + map.gen_integration.diagnostic(), + map.gen_integration.gitsigns(), + }, + window = { + show_integration_count = false, + winblend = 0, + width = 5, + }, + } + vim.keymap.set('n', 'nm', map.toggle, { noremap = true, desc = 'minimap open' }) + + require('mini.notify').setup { + window = { + winblend = 0, + config = { + border = 'double', + }, + }, + } + local files = require("mini.files") + files.setup { + mappings = { + synchronize = "w", + go_in_plus="" + }, + windows = { + preview = true, + width_preview = 50, + } + } + vim.keymap.set('n', 'c', files.open, { noremap = true, desc = 'minifiles open' }) + vim.api.nvim_create_autocmd("User", { + pattern = "MiniFilesBufferCreate", + callback = function(args) + local buf_id = args.data.buf_id + vim.keymap.set( + "n", + "c", + function() + files.synchronize() + files.close() + end, + { buffer = buf_id } + ) + end, + }) + end) end, }, } diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index 539b3df..de9d412 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -1,4 +1,9 @@ return { + { + 'windwp/nvim-autopairs', + event = "InsertEnter", + config = true + }, { 'danymat/neogen', event = 'VeryLazy', @@ -27,7 +32,6 @@ return { event = 'VeryLazy', dependencies = { "nvim-treesitter/nvim-treesitter", - "nvim-tree/nvim-web-devicons" } }, { 'tiagovla/scope.nvim', event = 'VeryLazy', config = true }, @@ -59,9 +63,6 @@ return { 'leath-dub/snipe.nvim', event = 'VeryLazy', opts = { - ui = { - position = 'center', - }, sort = 'last', }, config = function(_, opts) @@ -108,31 +109,6 @@ return { }, }, }, - { - 'stevearc/oil.nvim', - opts = { - watch_for_changes = true, - columns = { - 'permissions', - 'size', - }, - view_options = { - show_hidden = true, - }, - keymaps = { - ['wq'] = 'actions.close', - }, - }, - keys = { - { - 'nc', - function() - require('oil').toggle_float() - end, - { noremap = true, silent = true }, - }, - }, - }, { 'mbbill/undotree', event = 'VeryLazy', @@ -157,16 +133,18 @@ return { config = function(_, opts) require('nightfox').setup(opts) vim.cmd('colorscheme terafox') - vim.api.nvim_set_hl(0, 'MiniNotifyNormal', { bg = 'none' }) - vim.api.nvim_set_hl(0, 'MiniNotifyTitle', { bg = 'none' }) - vim.api.nvim_set_hl(0, 'MiniNotifyBorder', { bg = 'none' }) - vim.api.nvim_set_hl(0, 'MiniMapNormal', { bg = 'none' }) - vim.api.nvim_set_hl(0, 'MiniClueNormal', { bg = 'none' }) - vim.api.nvim_set_hl(0, 'StatusLine', { bg = 'none' }) - vim.api.nvim_set_hl(0, 'StatusLineNC', { bg = 'none' }) - vim.api.nvim_set_hl(0, 'GitSignsAdd', { fg = 'green', bold = true }) - vim.api.nvim_set_hl(0, 'GitSignsDelete', { fg = 'red', bold = true }) - vim.api.nvim_set_hl(0, 'GitSignsChange', { fg = 'green', bold = true }) + vim.schedule(function() + vim.api.nvim_set_hl(0, 'MiniNotifyNormal', { bg = 'none' }) + vim.api.nvim_set_hl(0, 'MiniNotifyTitle', { bg = 'none' }) + vim.api.nvim_set_hl(0, 'MiniNotifyBorder', { bg = 'none' }) + vim.api.nvim_set_hl(0, 'MiniMapNormal', { bg = 'none' }) + vim.api.nvim_set_hl(0, 'MiniClueNormal', { bg = 'none' }) + vim.api.nvim_set_hl(0, 'StatusLine', { bg = 'none' }) + vim.api.nvim_set_hl(0, 'StatusLineNC', { bg = 'none' }) + vim.api.nvim_set_hl(0, 'GitSignsAdd', { fg = 'green', bold = true }) + vim.api.nvim_set_hl(0, 'GitSignsDelete', { fg = 'red', bold = true }) + vim.api.nvim_set_hl(0, 'GitSignsChange', { fg = 'green', bold = true }) + end) end, }, { diff --git a/nvim/lua/plugins/telescope.lua b/nvim/lua/plugins/telescope.lua index 80d56ce..7fe925e 100644 --- a/nvim/lua/plugins/telescope.lua +++ b/nvim/lua/plugins/telescope.lua @@ -10,7 +10,6 @@ return { dependencies = { 'nvim-lua/plenary.nvim', 'nvim-telescope/telescope-fzf-native.nvim', - 'nvim-tree/nvim-web-devicons', 'nvim-treesitter/nvim-treesitter', 'tiagovla/scope.nvim', }, diff --git a/nvim/lua/plugins/treesitter.lua b/nvim/lua/plugins/treesitter.lua index 625df5d..44c53e5 100644 --- a/nvim/lua/plugins/treesitter.lua +++ b/nvim/lua/plugins/treesitter.lua @@ -1,7 +1,7 @@ return { { 'nvim-treesitter/nvim-treesitter', - lazy = false, + event = 'VeryLazy', dependencies = { 'nvim-treesitter/nvim-treesitter-context', 'nvim-treesitter/nvim-treesitter-textobjects', From 80efd65a100502b21a5cc4a097416218ce6673ac Mon Sep 17 00:00:00 2001 From: iofq Date: Wed, 21 Aug 2024 02:37:08 -0500 Subject: [PATCH 078/160] fix min build --- nix/neovim-overlay.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index 8e8f382..b411998 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -113,8 +113,8 @@ in { appName = "nvim"; extraPackages = basePackages; ignoreConfigRegexes = [ - "*/lsp.lua" - "*/debug.lua" + ".*lsp.lua" + ".*debug.lua" ]; }; From 6d8480b8b5f5054a34ab15e45fae99b216162814 Mon Sep 17 00:00:00 2001 From: iofq Date: Thu, 22 Aug 2024 03:30:25 -0500 Subject: [PATCH 079/160] tweaks and ftplugins --- nix/mkNeovim.nix | 7 +++- nix/neovim-overlay.nix | 20 ++-------- nvim/ftplugin/go.lua | 1 + nvim/ftplugin/php.lua | 1 + nvim/lua/config/init.lua | 2 +- nvim/lua/plugins/completion.lua | 3 +- nvim/lua/plugins/lsp.lua | 10 ++--- nvim/lua/plugins/mini.lua | 38 ++++++------------ nvim/lua/plugins/misc.lua | 68 +++++++++++++++------------------ nvim/lua/plugins/telescope.lua | 64 ++++++++++++++++++++++++++++--- nvim/lua/plugins/treesitter.lua | 9 +++++ 11 files changed, 128 insertions(+), 95 deletions(-) create mode 100644 nvim/ftplugin/go.lua create mode 100644 nvim/ftplugin/php.lua diff --git a/nix/mkNeovim.nix b/nix/mkNeovim.nix index e71663a..a5e5036 100644 --- a/nix/mkNeovim.nix +++ b/nix/mkNeovim.nix @@ -92,11 +92,14 @@ with lib; buildPhase = '' mkdir -p $out/lua + mkdir -p $out/ftplugin ''; installPhase = '' - cp -r lua $out/lua + cp -r lua $out/ rm -r lua + cp -r ftplugin $out/ + rm -r ftplugin ''; }; @@ -104,7 +107,7 @@ with lib; # 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}/lua') + vim.opt.rtp:prepend('${nvimRtp}') LAZY_OPTS = { performance = { reset_packpath = false, diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index b411998..7e579cb 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -35,15 +35,14 @@ with final.pkgs.lib; let neogit none-ls-nvim nightfox-nvim + nvim-autopairs nvim-cmp nvim-dap nvim-dap-go nvim-dap-ui nvim-early-retirement nvim-lspconfig - nvim-neoclip-lua nvim-nio - nvim-autopairs nvim-treesitter-context nvim-treesitter-textobjects (nvim-treesitter.withPlugins(p: with p; [ @@ -81,11 +80,13 @@ with final.pkgs.lib; let toggleterm-nvim trouble-nvim undotree + yanky-nvim workspace-diagnostics-nvim ]; basePackages = with pkgs; [ ripgrep + fd ]; extraPackages = with pkgs; [ # linters @@ -121,19 +122,4 @@ in { nvim-luarc-json = final.mk-luarc-json { plugins = all-plugins; }; - - # You can add as many derivations as you like. - # Use `ignoreConfigRegexes` to filter out config - # files you would not like to include. - # - # For example: - # - # nvim-pkg-no-telescope = mkNeovim { - # plugins = []; - # ignoreConfigRegexes = [ - # "^plugin/telescope.lua" - # "^ftplugin/.*.lua" - # ]; - # inherit extraPackages; - # }; } diff --git a/nvim/ftplugin/go.lua b/nvim/ftplugin/go.lua new file mode 100644 index 0000000..3436b9c --- /dev/null +++ b/nvim/ftplugin/go.lua @@ -0,0 +1 @@ +vim.opt_local.expandtab = false diff --git a/nvim/ftplugin/php.lua b/nvim/ftplugin/php.lua new file mode 100644 index 0000000..3f3eef4 --- /dev/null +++ b/nvim/ftplugin/php.lua @@ -0,0 +1 @@ +vim.opt.tabstop = 4 diff --git a/nvim/lua/config/init.lua b/nvim/lua/config/init.lua index 87bd5a4..4e1ded1 100644 --- a/nvim/lua/config/init.lua +++ b/nvim/lua/config/init.lua @@ -33,7 +33,7 @@ vim.api.nvim_create_autocmd('VimEnter', { command = 'silent !mkdir -p ' .. undopath, group = vim.api.nvim_create_augroup('Init', {}), }) --- open :g in buffers +-- open :h in buffers vim.api.nvim_create_autocmd('BufWinEnter', { pattern = '*', callback = function(event) diff --git a/nvim/lua/plugins/completion.lua b/nvim/lua/plugins/completion.lua index beaf4e6..938be4b 100644 --- a/nvim/lua/plugins/completion.lua +++ b/nvim/lua/plugins/completion.lua @@ -34,6 +34,7 @@ return { { name = 'luasnip' }, { name = 'buffer' }, { name = 'path' }, + { name = 'treesitter', keyword_length = 3 }, }), } @@ -48,7 +49,7 @@ return { mapping = cmp.mapping.preset.cmdline(), sources = cmp.config.sources({ { name = 'path' }, - }, { + { name = 'buffer' }, { name = 'cmdline' }, }), matching = { disallow_symbol_nonprefix_matching = false }, diff --git a/nvim/lua/plugins/lsp.lua b/nvim/lua/plugins/lsp.lua index a4293e1..660e486 100644 --- a/nvim/lua/plugins/lsp.lua +++ b/nvim/lua/plugins/lsp.lua @@ -28,7 +28,7 @@ return { }, { 'neovim/nvim-lspconfig', - lazy = false, + event = 'VeryLazy', dependencies = { 'hrsh7th/cmp-nvim-lsp', }, @@ -39,7 +39,6 @@ return { lspconfig.util.default_config.capabilities, require('cmp_nvim_lsp').default_capabilities() ) - vim.lsp.inlay_hint.enable(true) lspconfig.gopls.setup { settings = { gopls = { @@ -54,17 +53,17 @@ return { }, hints = { assignVariableTypes = true, + compositeLiteralFields = true, + compositeLiteralTypes = true, constantValues = true, functionTypeParameters = true, rangeVariableTypes = true, + parameterNames = true, }, usePlaceholders = true, staticcheck = true, }, }, - on_attach = function() - vim.api.nvim_command('au BufWritePre lua vim.lsp.buf.format { async = false }') - end, } lspconfig.jedi_language_server.setup {} lspconfig.nil_ls.setup {} @@ -97,6 +96,7 @@ return { callback = function(ev) local bufnr = ev.buf local client = vim.lsp.get_client_by_id(ev.data.client_id) + vim.api.nvim_command('au BufWritePre lua vim.lsp.buf.format { async = false }') vim.keymap.set( 'n', 'K', diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index 4472aa0..7b035be 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -3,6 +3,7 @@ return { 'echasnovski/mini.nvim', lazy = false, config = function() + require('mini.basics').setup { mappings = { windows = true, }, } require('mini.tabline').setup({ tabpage_section = 'right', show_icons = false, @@ -12,21 +13,12 @@ return { active = function() local mode, mode_hl = MiniStatusline.section_mode {} local git = function() - local summary = vim.b.gitsigns_head - if summary == nil then - return '' - end - summary = '~' .. summary - - return summary == '' and '' or summary + local g = vim.b.gitsigns_head + return (g == nil) and '' or g end local diff = function() - local summary = vim.b.gitsigns_status - if summary == nil then - return '' - end - - return summary + local g = vim.b.gitsigns_status + return (g == nil) and '' or g end local diagnostics = MiniStatusline.section_diagnostics { trunc_width = 75 } local lsp = MiniStatusline.section_lsp { trunc_width = 75 } @@ -34,17 +26,16 @@ return { local search = MiniStatusline.section_searchcount { trunc_width = 75 } return MiniStatusline.combine_groups { - { hl = mode_hl, strings = { mode } }, + { hl = mode_hl, strings = { mode } }, '%<', -- Mark general truncate point { hl = 'MiniStatuslineFilename', strings = { filename } }, '%=', -- End left alignment - { hl = 'MiniStatusDevinfo', strings = { git(), diff(), diagnostics, lsp} }, - { hl = mode_hl, strings = { search } }, + { hl = 'MiniStatusDevinfo', strings = { git(), diff(), diagnostics, lsp } }, + { hl = mode_hl, strings = { search } }, } end, inactive = function() local filename = MiniStatusline.section_filename { trunc_width = 140 } - return MiniStatusline.combine_groups { { hl = 'MiniStatuslineFilename', strings = { filename } }, } @@ -60,16 +51,13 @@ return { require('mini.surround').setup() require('mini.jump2d').setup { mappings = { start_jumping = 'S' } } require('mini.splitjoin').setup { detect = { separator = '[,;\n]' }, } - require('mini.basics').setup { mappings = { windows = true, }, } require('mini.trailspace').setup() - vim.api.nvim_create_user_command('Trim', function() - require('mini.trailspace').trim() - end, {}) + vim.api.nvim_create_user_command('Trim', require('mini.trailspace').trim, {}) local indent = require('mini.indentscope') indent.setup { + symbol = '│', draw = { delay = 0 }, } - indent.gen_animation.none() local miniclue = require('mini.clue') miniclue.setup { @@ -92,7 +80,6 @@ return { }, } - local map = require('mini.map') map.setup { symbols = { @@ -124,7 +111,7 @@ return { files.setup { mappings = { synchronize = "w", - go_in_plus="" + go_in_plus = "" }, windows = { preview = true, @@ -135,7 +122,6 @@ return { vim.api.nvim_create_autocmd("User", { pattern = "MiniFilesBufferCreate", callback = function(args) - local buf_id = args.data.buf_id vim.keymap.set( "n", "c", @@ -143,7 +129,7 @@ return { files.synchronize() files.close() end, - { buffer = buf_id } + { buffer = args.data.buf_id } ) end, }) diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index de9d412..8cc8b72 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -38,26 +38,7 @@ return { { 'chrisgrieser/nvim-early-retirement', event = 'VeryLazy', - opts = { minimumBufferNum = 6 }, - }, - { - 'AckslD/nvim-neoclip.lua', - event = 'VeryLazy', - dependencies = { - 'nvim-telescope/telescope.nvim', - }, - opts = { - default_register = '+', - }, - config = function(_, opts) - require('neoclip').setup(opts) - vim.keymap.set( - 'n', - 'fp', - 'Telescope neoclip', - { noremap = true, silent = true, desc = 'Pick clipboard history' } - ) - end, + opts = { minimumBufferNum = 10 }, }, { 'leath-dub/snipe.nvim', @@ -84,10 +65,21 @@ return { default_args = { DiffviewOpen = { '--imply-local' }, }, + 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, noremap = true, desc = 'diffview open' } }, - config = function() - vim.keymap.set('n', 'nb', vim.cmd.DiffviewOpen, { noremap = true, desc = 'diffview open' }) - end, }, { 'NeogitOrg/neogit', @@ -123,7 +115,7 @@ return { { 'EdenEast/nightfox.nvim', lazy = false, - priority = 10000, + priority = 1000, opts = { options = { transparent = true, @@ -133,18 +125,18 @@ return { config = function(_, opts) require('nightfox').setup(opts) vim.cmd('colorscheme terafox') - vim.schedule(function() - vim.api.nvim_set_hl(0, 'MiniNotifyNormal', { bg = 'none' }) - vim.api.nvim_set_hl(0, 'MiniNotifyTitle', { bg = 'none' }) - vim.api.nvim_set_hl(0, 'MiniNotifyBorder', { bg = 'none' }) - vim.api.nvim_set_hl(0, 'MiniMapNormal', { bg = 'none' }) - vim.api.nvim_set_hl(0, 'MiniClueNormal', { bg = 'none' }) - vim.api.nvim_set_hl(0, 'StatusLine', { bg = 'none' }) - vim.api.nvim_set_hl(0, 'StatusLineNC', { bg = 'none' }) - vim.api.nvim_set_hl(0, 'GitSignsAdd', { fg = 'green', bold = true }) - vim.api.nvim_set_hl(0, 'GitSignsDelete', { fg = 'red', bold = true }) - vim.api.nvim_set_hl(0, 'GitSignsChange', { fg = 'green', bold = true }) - end) + vim.api.nvim_set_hl(0, 'MiniNotifyNormal', { bg = 'none' }) + vim.api.nvim_set_hl(0, 'MiniNotifyTitle', { bg = 'none' }) + vim.api.nvim_set_hl(0, 'MiniNotifyBorder', { bg = 'none' }) + vim.api.nvim_set_hl(0, 'MiniMapNormal', { bg = 'none' }) + vim.api.nvim_set_hl(0, 'MiniClueNormal', { bg = 'none' }) + vim.api.nvim_set_hl(0, 'MiniTablineFill', { bg = 'none' }) + vim.api.nvim_set_hl(0, 'StatusLine', { bg = 'none' }) + vim.api.nvim_set_hl(0, 'StatusLineNC', { bg = 'none' }) + vim.api.nvim_set_hl(0, 'GitSignsAdd', { fg = 'green', bold = true }) + vim.api.nvim_set_hl(0, 'GitSignsDelete', { fg = 'red', bold = true }) + vim.api.nvim_set_hl(0, 'GitSignsChange', { fg = 'green', bold = true }) + vim.api.nvim_set_hl(0, 'GitSignsCurrentLineBlame', { link = 'Comment' }) end, }, { @@ -157,9 +149,11 @@ return { local gs = package.loaded.gitsigns vim.keymap.set('n', 'gg', gs.preview_hunk, { desc = 'git preview hunk' }) vim.keymap.set('n', 'gr', gs.reset_hunk, { desc = 'git reset hunk' }) + vim.keymap.set('n', 'gd', gs.diffthis, { desc = 'git diff hunk' }) vim.keymap.set('n', 'gb', function() gs.blame_line { full = true } - end, { desc = 'git blame_line' }) + end, { desc = 'git blame_line current' }) + vim.keymap.set('n', 'gB', gs.toggle_current_line_blame, { desc = 'git blame_line toggle' }) vim.keymap.set('v', 'gr', function() gs.reset_hunk { vim.fn.line('.'), vim.fn.line('v') } end, { desc = 'git reset hunk' }) diff --git a/nvim/lua/plugins/telescope.lua b/nvim/lua/plugins/telescope.lua index 7fe925e..3b9c4df 100644 --- a/nvim/lua/plugins/telescope.lua +++ b/nvim/lua/plugins/telescope.lua @@ -12,6 +12,27 @@ return { 'nvim-telescope/telescope-fzf-native.nvim', 'nvim-treesitter/nvim-treesitter', 'tiagovla/scope.nvim', + { + 'gbprod/yanky.nvim', + config = function() + local mapping = require("yanky.telescope.mapping") + require("yanky").setup({ + picker = { + telescope = { + mappings = { + default = mapping.set_register( + require("yanky.utils").get_default_register() + ), + }, + }, + }, + ring = { + storage = "memory", + }, + }) + vim.keymap.set({"n","x"}, "y", "(YankyYank)") + end, + }, }, config = function() local telescope = require('telescope') @@ -48,6 +69,7 @@ return { } telescope.load_extension('fzf') telescope.load_extension('scope') + telescope.load_extension('yank_history') local b = require('telescope.builtin') -- Fall back to find_files if not in a git repo @@ -59,24 +81,48 @@ return { end end - vim.keymap.set('n', 'ff', project_files, { noremap = true, silent = true, desc = 'Fuzzy find git files' }) - vim.keymap.set('n', 'fg', b.find_files, { noremap = true, silent = true, desc = 'Fuzzy find files' }) + vim.keymap.set( + 'n', + 'ff', + project_files, + { noremap = true, silent = true, desc = 'Fuzzy find git files' } + ) + vim.keymap.set( + 'n', + 'fg', + b.find_files, + { noremap = true, silent = true, desc = 'Fuzzy find files' } + ) vim.keymap.set( 'n', 'fc', b.command_history, { noremap = true, silent = true, desc = 'Fuzzy find command_history' } ) - vim.keymap.set('n', 'fa', b.live_grep, { noremap = true, silent = true, desc = 'Fuzzy find grep' }) + vim.keymap.set( + 'n', + 'fa', + b.live_grep, + { noremap = true, silent = true, desc = 'Fuzzy find grep' } + ) vim.keymap.set( 'n', 'f8', b.grep_string, { noremap = true, silent = true, desc = 'Fuzzy find grep current word' } ) - vim.keymap.set('n', 'fq', b.quickfix, { noremap = true, silent = true, desc = 'Fuzzy find quickfix' }) - vim.keymap.set('n', 'f?', b.builtin, { noremap = true, silent = true, desc = 'See all pickers' }) - vim.keymap.set('n', 'f.', b.resume, { noremap = true, silent = true, desc = 'Fuzzy find resume' }) + vim.keymap.set( + 'n', + 'f?', + b.builtin, + { noremap = true, silent = true, desc = 'See all pickers' } + ) + vim.keymap.set( + 'n', + 'f.', + b.resume, + { noremap = true, silent = true, desc = 'Fuzzy find resume' } + ) vim.keymap.set( 'n', 'fs', @@ -89,6 +135,12 @@ return { 'Telescope scope buffers', { noremap = true, silent = true, desc = 'Pick buffers (scope.nvim)' } ) + vim.keymap.set( + 'n', + 'fp', + 'Telescope yank_history', + { noremap = true, silent = true, desc = 'Pick history (yanky.nvim)' } + ) end, }, } diff --git a/nvim/lua/plugins/treesitter.lua b/nvim/lua/plugins/treesitter.lua index 44c53e5..36bc496 100644 --- a/nvim/lua/plugins/treesitter.lua +++ b/nvim/lua/plugins/treesitter.lua @@ -26,6 +26,9 @@ return { autopairs = { enable = true, }, + matchup = { + enable = true, + }, textobjects = { select = { enable = true, @@ -35,6 +38,10 @@ return { ['if'] = '@function.inner', ['aa'] = '@statement.outer', ['ia'] = '@parameter.inner', + ["ik"] = "@assignment.lhs", + ["ak"] = "@assignment.inner", + ["iv"] = "@assignment.rhs", + ["av"] = "@assignment.outer", }, }, move = { @@ -42,10 +49,12 @@ return { goto_next_start = { [']a'] = '@parameter.inner', [']f'] = '@function.outer', + [']]'] = '@block.inner', }, goto_previous_start = { ['[a'] = '@parameter.inner', ['[f'] = '@function.outer', + ['[['] = '@block.inner', }, }, swap = { From 6831ace58929a09ffe33856f8a0e238a73ae36d2 Mon Sep 17 00:00:00 2001 From: iofq Date: Fri, 6 Sep 2024 02:53:00 -0500 Subject: [PATCH 080/160] tweaks including aerial, cd in mini.files --- flake.lock | 34 ------------------------ flake.nix | 8 ------ nix/neovim-overlay.nix | 6 +---- nvim/lua/config/init.lua | 24 +++++++---------- nvim/lua/plugins/completion.lua | 2 +- nvim/lua/plugins/debug.lua | 4 --- nvim/lua/plugins/lsp.lua | 7 +---- nvim/lua/plugins/mini.lua | 21 +++++++++++++-- nvim/lua/plugins/misc.lua | 47 +++++++++++---------------------- nvim/lua/plugins/telescope.lua | 8 +----- 10 files changed, 48 insertions(+), 113 deletions(-) diff --git a/flake.lock b/flake.lock index 97c935c..d4343f4 100644 --- a/flake.lock +++ b/flake.lock @@ -181,48 +181,14 @@ "type": "github" } }, - "nvim-early-retirement": { - "flake": false, - "locked": { - "lastModified": 1723897376, - "narHash": "sha256-+W3AG99nzgr36t9Sg192hb/MH8s0uGAPD0cLBnil+og=", - "owner": "chrisgrieser", - "repo": "nvim-early-retirement", - "rev": "2c36a5671b9d8f0d9e11b77c5a55de802bc45e34", - "type": "github" - }, - "original": { - "owner": "chrisgrieser", - "repo": "nvim-early-retirement", - "type": "github" - } - }, "root": { "inputs": { "flake-utils": "flake-utils", "gen-luarc": "gen-luarc", "nixpkgs": "nixpkgs", - "nvim-early-retirement": "nvim-early-retirement", - "snipe-nvim": "snipe-nvim", "workspace-diagnostics-nvim": "workspace-diagnostics-nvim" } }, - "snipe-nvim": { - "flake": false, - "locked": { - "lastModified": 1722790509, - "narHash": "sha256-DhJ2ss0p64mpaVo9rri72pEoaWbOOL05klM9AydnqJk=", - "owner": "leath-dub", - "repo": "snipe.nvim", - "rev": "854a47c970413405361487c13e2b1e9aa9a3696e", - "type": "github" - }, - "original": { - "owner": "leath-dub", - "repo": "snipe.nvim", - "type": "github" - } - }, "systems": { "locked": { "lastModified": 1681028828, diff --git a/flake.nix b/flake.nix index d578306..c48db06 100644 --- a/flake.nix +++ b/flake.nix @@ -8,14 +8,6 @@ url = "github:mrcjkb/nix-gen-luarc-json"; inputs.nixpkgs.follows = "nixpkgs"; }; - snipe-nvim = { - url = "github:leath-dub/snipe.nvim"; - flake = false; - }; - nvim-early-retirement = { - url = "github:chrisgrieser/nvim-early-retirement"; - flake = false; - }; workspace-diagnostics-nvim = { url = "github:artemave/workspace-diagnostics.nvim"; flake = false; diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index 7e579cb..1d11910 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -10,13 +10,12 @@ with final.pkgs.lib; let inherit pname src; version = src.lastModifiedDate; }; - snipe-nvim = mkNvimPlugin inputs.snipe-nvim "snipe-nvim"; - nvim-early-retirement = mkNvimPlugin inputs.nvim-early-retirement "nvim-early-retirement"; workspace-diagnostics-nvim = mkNvimPlugin inputs.workspace-diagnostics-nvim "workspace-diagnostics-nvim"; mkNeovim = pkgs.callPackage ./mkNeovim.nix { inherit pkgs-wrapNeovim; }; all-plugins = with pkgs.vimPlugins; [ + aerial-nvim cmp-buffer cmp-cmdline cmp-nvim-lsp @@ -40,7 +39,6 @@ with final.pkgs.lib; let nvim-dap nvim-dap-go nvim-dap-ui - nvim-early-retirement nvim-lspconfig nvim-nio nvim-treesitter-context @@ -72,9 +70,7 @@ with final.pkgs.lib; let tree-sitter-typescript tree-sitter-yaml ])) - outline-nvim scope-nvim - snipe-nvim telescope-fzf-native-nvim telescope-nvim toggleterm-nvim diff --git a/nvim/lua/config/init.lua b/nvim/lua/config/init.lua index 4e1ded1..ddc501b 100644 --- a/nvim/lua/config/init.lua +++ b/nvim/lua/config/init.lua @@ -1,25 +1,21 @@ vim.opt.backspace = 'indent,eol,start' vim.opt.clipboard = 'unnamedplus' -vim.opt.completeopt = {'menu', 'menuone', 'noselect'} -vim.opt.expandtab = true -- insert tabs as spaces -vim.opt.inccommand = 'split' -- incremental live completion +vim.opt.completeopt = { 'menu', 'menuone', 'noselect' } +vim.opt.expandtab = true -- insert tabs as spaces +vim.opt.inccommand = 'split' -- incremental live completion vim.opt.list = true vim.opt.nrformats:append('alpha') -- let Ctrl-a do letters as well -vim.opt.path:append('**') -- enable fuzzy :find ing +vim.opt.path:append('**') -- enable fuzzy :find ing vim.opt.relativenumber = true -vim.opt.shadafile = 'NONE' -- disable shada -vim.opt.shiftwidth = 0 -- >> shifts by tabstop -vim.opt.showmatch = true -- highlight matching brackets -vim.opt.showmode = false +vim.opt.shadafile = 'NONE' -- disable shada +vim.opt.shiftwidth = 0 -- >> shifts by tabstop +vim.opt.showmatch = true -- highlight matching brackets vim.opt.signcolumn = 'no' -vim.opt.spell = false -vim.opt.softtabstop = -1 -- backspace removes tabstop +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.tabstop = 2 -- 2 space tabs are based +vim.opt.updatetime = 250 -- decrease update time vim.opt.virtualedit = 'onemore' -vim.opt.wrap = true -vim.g.fzf_layout = { window = { width = 0.9, height = 0.6 } } -- Switch tab length on the fly vim.keymap.set('n', '\\t', function() diff --git a/nvim/lua/plugins/completion.lua b/nvim/lua/plugins/completion.lua index 938be4b..4ac9df8 100644 --- a/nvim/lua/plugins/completion.lua +++ b/nvim/lua/plugins/completion.lua @@ -30,7 +30,7 @@ return { }, }, sources = cmp.config.sources({ - { name = 'nvim_lsp', keyword_length = 1 }, + { name = 'nvim_lsp', keyword_length = 1 }, { name = 'luasnip' }, { name = 'buffer' }, { name = 'path' }, diff --git a/nvim/lua/plugins/debug.lua b/nvim/lua/plugins/debug.lua index 9de41c8..852e1c9 100644 --- a/nvim/lua/plugins/debug.lua +++ b/nvim/lua/plugins/debug.lua @@ -25,7 +25,6 @@ return { ui.toggle() end, { desc = 'toggle dapui' }) vim.keymap.set('n', 'zz', function() - scopes = w.sidebar(w.scopes, {}, 'split') d.continue() end, { desc = 'start debugger' }) vim.keymap.set('n', 'zn', function() @@ -53,9 +52,6 @@ return { local widgets = require('dap.ui.widgets') widgets.centered_float(widgets.frames) end, { desc = 'view frames' }) - vim.keymap.set('n', 'zs', function() - scopes.toggle() - end, { desc = 'toggle scope view' }) end, }, } diff --git a/nvim/lua/plugins/lsp.lua b/nvim/lua/plugins/lsp.lua index 660e486..32f3837 100644 --- a/nvim/lua/plugins/lsp.lua +++ b/nvim/lua/plugins/lsp.lua @@ -31,6 +31,7 @@ return { event = 'VeryLazy', dependencies = { 'hrsh7th/cmp-nvim-lsp', + 'artemave/workspace-diagnostics.nvim', }, config = function() local lspconfig = require('lspconfig') @@ -133,12 +134,6 @@ return { 'Telescope lsp_references', { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP references' } ) - vim.keymap.set( - 'n', - 'dt', - 'Telescope lsp_type_definitions', - { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP type defs' } - ) vim.keymap.set( 'n', 'ds', diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index 7b035be..64d4d8a 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -70,7 +70,9 @@ return { { mode = 'n', keys = '' }, { mode = 'n', keys = 'z' }, }, - + window = { + config = { width = 'auto', }, + }, clues = { miniclue.gen_clues.g(), miniclue.gen_clues.marks(), @@ -110,11 +112,11 @@ return { local files = require("mini.files") files.setup { mappings = { - synchronize = "w", go_in_plus = "" }, windows = { preview = true, + width_focus = 30, width_preview = 50, } } @@ -133,6 +135,21 @@ return { ) end, }) + vim.api.nvim_create_autocmd("User", { + pattern = "MiniFilesBufferCreate", + callback = function(args) + vim.keymap.set( + "n", + "`", + function() + local cur_entry_path = MiniFiles.get_fs_entry().path + local cur_directory = vim.fs.dirname(cur_entry_path) + vim.fn.chdir(cur_directory) + end, + { buffer = args.data.buf_id } + ) + end, + }) end) end, }, diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index 8cc8b72..a1a87f8 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -13,7 +13,6 @@ return { 'akinsho/toggleterm.nvim', event = 'VeryLazy', opts = { - open_mapping = [[]], direction = 'float', close_on_exit = true, autochdir = true, @@ -35,28 +34,6 @@ return { } }, { 'tiagovla/scope.nvim', event = 'VeryLazy', config = true }, - { - 'chrisgrieser/nvim-early-retirement', - event = 'VeryLazy', - opts = { minimumBufferNum = 10 }, - }, - { - 'leath-dub/snipe.nvim', - event = 'VeryLazy', - opts = { - sort = 'last', - }, - config = function(_, opts) - local snipe = require('snipe') - snipe.setup(opts) - vim.keymap.set( - 'n', - 'fb', - snipe.open_buffer_menu, - { noremap = true, silent = true, desc = 'Pick buffers (snipe.nvim)' } - ) - end, - }, { 'sindrets/diffview.nvim', event = 'VeryLazy', @@ -149,6 +126,7 @@ return { local gs = package.loaded.gitsigns vim.keymap.set('n', 'gg', gs.preview_hunk, { desc = 'git preview hunk' }) vim.keymap.set('n', 'gr', gs.reset_hunk, { desc = 'git reset hunk' }) + vim.keymap.set('n', 'gs', gs.stage_hunk, { desc = 'git stage hunk' }) vim.keymap.set('n', 'gd', gs.diffthis, { desc = 'git diff hunk' }) vim.keymap.set('n', 'gb', function() gs.blame_line { full = true } @@ -164,7 +142,7 @@ return { return ']c' end vim.schedule(function() - gs.next_hunk() + gs.next_hunk({ target = 'all' }) end) return '' end, { expr = true }) @@ -174,7 +152,7 @@ return { return '[c' end vim.schedule(function() - gs.prev_hunk() + gs.prev_hunk({ target = 'all' }) end) return '' end, { expr = true }) @@ -182,17 +160,22 @@ return { }, }, { - 'hedyhli/outline.nvim', - cmd = { 'Outline', 'OutlineOpen' }, + 'stevearc/aerial.nvim', + cmd = { 'AerialToggle' }, keys = { - { 'no', 'Outline', desc = 'Toggle outline' }, + { 'na', 'AerialToggle', desc = 'Toggle aerial' }, }, opts = { - outline_window = { - position = 'left', - width = 30, - auto_close = true, + backends = { + "lsp", + "treesitter", + "markdown" }, + filter_kind = false, + layout = { + default_direction = "left", + }, + autojump = true, }, }, } diff --git a/nvim/lua/plugins/telescope.lua b/nvim/lua/plugins/telescope.lua index 3b9c4df..f121f96 100644 --- a/nvim/lua/plugins/telescope.lua +++ b/nvim/lua/plugins/telescope.lua @@ -30,7 +30,7 @@ return { storage = "memory", }, }) - vim.keymap.set({"n","x"}, "y", "(YankyYank)") + vim.keymap.set({ "n", "x" }, "y", "(YankyYank)") end, }, }, @@ -93,12 +93,6 @@ return { b.find_files, { noremap = true, silent = true, desc = 'Fuzzy find files' } ) - vim.keymap.set( - 'n', - 'fc', - b.command_history, - { noremap = true, silent = true, desc = 'Fuzzy find command_history' } - ) vim.keymap.set( 'n', 'fa', From cee522f27d345337bc89a1282b199a6cd7f9be4e Mon Sep 17 00:00:00 2001 From: iofq Date: Sat, 7 Sep 2024 12:49:54 -0500 Subject: [PATCH 081/160] oops broke toggleterm --- nvim/lua/plugins/misc.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index a1a87f8..6d36966 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -13,6 +13,7 @@ return { 'akinsho/toggleterm.nvim', event = 'VeryLazy', opts = { + open_mapping = [[]], direction = 'float', close_on_exit = true, autochdir = true, From 327092ab640b7d3d7ea55d231107702a892d8b6f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 14 Oct 2024 10:17:32 +0000 Subject: [PATCH 082/160] 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 'flake-utils': 'github:numtide/flake-utils/b1d9ab70662946ef0850d488da1c9019f3a9752a?narHash=sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ%3D' (2024-03-11) → 'github:numtide/flake-utils/c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a?narHash=sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ%3D' (2024-09-17) • Updated input 'nixpkgs': 'github:NixOS/nixpkgs/8a3354191c0d7144db9756a74755672387b702ba?narHash=sha256-Grh5PF0%2BgootJfOJFenTTxDTYPidA3V28dqJ/WV7iis%3D' (2024-08-18) → 'github:NixOS/nixpkgs/5633bcff0c6162b9e4b5f1264264611e950c8ec7?narHash=sha256-9UTxR8eukdg%2BXZeHgxW5hQA9fIKHsKCdOIUycTryeVw%3D' (2024-10-09) --- flake.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/flake.lock b/flake.lock index d4343f4..a921669 100644 --- a/flake.lock +++ b/flake.lock @@ -39,11 +39,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1710146030, - "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "lastModified": 1726560853, + "narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=", "owner": "numtide", "repo": "flake-utils", - "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a", "type": "github" }, "original": { @@ -139,11 +139,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1723991338, - "narHash": "sha256-Grh5PF0+gootJfOJFenTTxDTYPidA3V28dqJ/WV7iis=", + "lastModified": 1728492678, + "narHash": "sha256-9UTxR8eukdg+XZeHgxW5hQA9fIKHsKCdOIUycTryeVw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "8a3354191c0d7144db9756a74755672387b702ba", + "rev": "5633bcff0c6162b9e4b5f1264264611e950c8ec7", "type": "github" }, "original": { From 1caac6ea4b0dae92836d9e450992801e9ec68d4c Mon Sep 17 00:00:00 2001 From: iofq Date: Sat, 26 Oct 2024 13:07:05 -0500 Subject: [PATCH 083/160] flake.lock: Update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'flake-utils': 'github:numtide/flake-utils/b1d9ab70662946ef0850d488da1c9019f3a9752a?narHash=sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ%3D' (2024-03-11) → 'github:numtide/flake-utils/c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a?narHash=sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ%3D' (2024-09-17) • Updated input 'nixpkgs': 'github:NixOS/nixpkgs/8a3354191c0d7144db9756a74755672387b702ba?narHash=sha256-Grh5PF0%2BgootJfOJFenTTxDTYPidA3V28dqJ/WV7iis%3D' (2024-08-18) → 'github:NixOS/nixpkgs/2768c7d042a37de65bb1b5b3268fc987e534c49d?narHash=sha256-AlcmCXJZPIlO5dmFzV3V2XF6x/OpNWUV8Y/FMPGd8Z4%3D' (2024-10-23) --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index a921669..434cd83 100644 --- a/flake.lock +++ b/flake.lock @@ -139,11 +139,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1728492678, - "narHash": "sha256-9UTxR8eukdg+XZeHgxW5hQA9fIKHsKCdOIUycTryeVw=", + "lastModified": 1729665710, + "narHash": "sha256-AlcmCXJZPIlO5dmFzV3V2XF6x/OpNWUV8Y/FMPGd8Z4=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "5633bcff0c6162b9e4b5f1264264611e950c8ec7", + "rev": "2768c7d042a37de65bb1b5b3268fc987e534c49d", "type": "github" }, "original": { From 85b85bec8abc57b903128e401412f2616ba1fdaf Mon Sep 17 00:00:00 2001 From: iofq Date: Sat, 26 Oct 2024 14:27:13 -0500 Subject: [PATCH 084/160] fix deprecated packpathDirs in upstream mkNeovimConfig --- nix/mkNeovim.nix | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/nix/mkNeovim.nix b/nix/mkNeovim.nix index a5e5036..95975ff 100644 --- a/nix/mkNeovim.nix +++ b/nix/mkNeovim.nix @@ -66,6 +66,10 @@ with lib; plugins = normalizedPlugins; }; + packDir = pkgs.neovimUtils.packDir({ + myNeovimPackages = pkgs.neovimUtils.normalizedPluginsToVimPackage normalizedPlugins; + }); + # This uses the ignoreConfigRegexes list to filter # the nvim directory nvimRtpSrc = let @@ -120,7 +124,7 @@ with lib; }, }, dev = { - path = "${pkgs.neovimUtils.packDir neovimConfig.packpathDirs}/pack/myNeovimPackages/start", + path = "${packDir}/pack/myNeovimPackages/start", patterns = {""}, }, checker = { From 96e970b31dd5ce48258f474b353ef4aa4e6d5a43 Mon Sep 17 00:00:00 2001 From: iofq Date: Sat, 26 Oct 2024 15:41:30 -0500 Subject: [PATCH 085/160] add phpactor lsp --- nix/neovim-overlay.nix | 1 + nvim/lua/plugins/lsp.lua | 1 + 2 files changed, 2 insertions(+) diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index 1d11910..fff68f2 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -94,6 +94,7 @@ with final.pkgs.lib; let lua-language-server nil python312Packages.jedi-language-server + phpactor # debuggers delve diff --git a/nvim/lua/plugins/lsp.lua b/nvim/lua/plugins/lsp.lua index 32f3837..f499f4a 100644 --- a/nvim/lua/plugins/lsp.lua +++ b/nvim/lua/plugins/lsp.lua @@ -68,6 +68,7 @@ return { } lspconfig.jedi_language_server.setup {} lspconfig.nil_ls.setup {} + lspconfig.phpactor.setup {} lspconfig.lua_ls.setup { on_init = function(client) local path = client.workspace_folders[1].name From eafb86aa5d1dde9d07505bc8dfe0d6dbcd65884a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 14 Nov 2024 10:17:08 +0000 Subject: [PATCH 086/160] 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 'flake-utils': 'github:numtide/flake-utils/c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a?narHash=sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ%3D' (2024-09-17) → 'github:numtide/flake-utils/11707dc2f618dd54ca8739b309ec4fc024de578b?narHash=sha256-l0KFg5HjrsfsO/JpG%2Br7fRrqm12kzFHyUHqHCVpMMbI%3D' (2024-11-13) • Updated input 'nixpkgs': 'github:NixOS/nixpkgs/2768c7d042a37de65bb1b5b3268fc987e534c49d?narHash=sha256-AlcmCXJZPIlO5dmFzV3V2XF6x/OpNWUV8Y/FMPGd8Z4%3D' (2024-10-23) → 'github:NixOS/nixpkgs/dc460ec76cbff0e66e269457d7b728432263166c?narHash=sha256-PbABj4tnbWFMfBp6OcUK5iGy1QY%2B/Z96ZcLpooIbuEI%3D' (2024-11-11) --- flake.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/flake.lock b/flake.lock index 434cd83..bc15587 100644 --- a/flake.lock +++ b/flake.lock @@ -39,11 +39,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1726560853, - "narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=", + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", "owner": "numtide", "repo": "flake-utils", - "rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", "type": "github" }, "original": { @@ -139,11 +139,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1729665710, - "narHash": "sha256-AlcmCXJZPIlO5dmFzV3V2XF6x/OpNWUV8Y/FMPGd8Z4=", + "lastModified": 1731319897, + "narHash": "sha256-PbABj4tnbWFMfBp6OcUK5iGy1QY+/Z96ZcLpooIbuEI=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "2768c7d042a37de65bb1b5b3268fc987e534c49d", + "rev": "dc460ec76cbff0e66e269457d7b728432263166c", "type": "github" }, "original": { From 372c943270df2a1ab57ba79ff6e9a1c8a03816be Mon Sep 17 00:00:00 2001 From: iofq Date: Fri, 20 Dec 2024 14:25:22 -0600 Subject: [PATCH 087/160] fix bad plugin names --- nix/neovim-overlay.nix | 2 +- nvim/lua/plugins/completion.lua | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index fff68f2..16b0179 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -10,7 +10,7 @@ with final.pkgs.lib; let inherit pname src; version = src.lastModifiedDate; }; - workspace-diagnostics-nvim = mkNvimPlugin inputs.workspace-diagnostics-nvim "workspace-diagnostics-nvim"; + workspace-diagnostics-nvim = mkNvimPlugin inputs.workspace-diagnostics-nvim "workspace-diagnostics.nvim"; mkNeovim = pkgs.callPackage ./mkNeovim.nix { inherit pkgs-wrapNeovim; }; diff --git a/nvim/lua/plugins/completion.lua b/nvim/lua/plugins/completion.lua index 4ac9df8..50935b5 100644 --- a/nvim/lua/plugins/completion.lua +++ b/nvim/lua/plugins/completion.lua @@ -8,7 +8,7 @@ return { 'hrsh7th/cmp-path', 'hrsh7th/cmp-nvim-lsp', 'ray-x/cmp-treesitter', - 'L3MON4D3/LuaSnip', + 'L3MON4D3/luasnip', 'saadparwaiz1/cmp_luasnip', }, config = function() @@ -57,7 +57,7 @@ return { end, }, { - 'L3MON4D3/LuaSnip', + 'L3MON4D3/luasnip', event = 'VeryLazy', dependencies = { 'rafamadriz/friendly-snippets' }, config = function() From 0f709befaba357c21d339ce8c734c86df19217ff Mon Sep 17 00:00:00 2001 From: iofq Date: Sun, 2 Feb 2025 02:10:50 -0600 Subject: [PATCH 088/160] flake.lock: Update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'blink/nixpkgs': 'github:nixos/nixpkgs/9189ac18287c599860e878e905da550aa6dec1cd?narHash=sha256-AYvaFBzt8dU0fcSK2jKD0Vg23K2eIRxfsVXIPCW9a0E%3D' (2025-01-31) → 'github:nixos/nixpkgs/b30f97d8c32d804d2d832ee837d0f1ca0695faa5?narHash=sha256-U47xeACNBpkSO6IcCm0XvahsVXpJXzjPIQG7TZlOToU%3D' (2025-01-06) • Updated input 'nixpkgs': 'github:NixOS/nixpkgs/dc460ec76cbff0e66e269457d7b728432263166c?narHash=sha256-PbABj4tnbWFMfBp6OcUK5iGy1QY%2B/Z96ZcLpooIbuEI%3D' (2024-11-11) → 'github:NixOS/nixpkgs/3a228057f5b619feb3186e986dbe76278d707b6e?narHash=sha256-xvTo0Aw0%2Bveek7hvEVLzErmJyQkEcRk6PSR4zsRQFEc%3D' (2025-02-01) --- flake.lock | 122 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 114 insertions(+), 8 deletions(-) diff --git a/flake.lock b/flake.lock index bc15587..b1e9731 100644 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,47 @@ { "nodes": { + "blink": { + "inputs": { + "fenix": "fenix", + "flake-parts": "flake-parts", + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1738451960, + "narHash": "sha256-6NgB253rpCaNlNabbZRYIC/x1ZOlm41ZMvQOSNhgef8=", + "owner": "Saghen", + "repo": "blink.cmp", + "rev": "cc34be8ff1145264811e59b017f59676ad81000e", + "type": "github" + }, + "original": { + "owner": "Saghen", + "repo": "blink.cmp", + "type": "github" + } + }, + "fenix": { + "inputs": { + "nixpkgs": [ + "blink", + "nixpkgs" + ], + "rust-analyzer-src": "rust-analyzer-src" + }, + "locked": { + "lastModified": 1734676450, + "narHash": "sha256-iwcxhTVe4h5TqW0HsNiOQP27eMBmbBshF+q2UjEy5aU=", + "owner": "nix-community", + "repo": "fenix", + "rev": "46e19fa0eb3260b2c3ee5b2cf89e73343c1296ab", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "fenix", + "type": "github" + } + }, "flake-compat": { "flake": false, "locked": { @@ -20,6 +62,24 @@ "inputs": { "nixpkgs-lib": "nixpkgs-lib" }, + "locked": { + "lastModified": 1733312601, + "narHash": "sha256-4pDvzqnegAfRkPwO3wmwBhVi/Sye1mzps0zHWYnP88c=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "205b12d8b7cd4802fbcb8e8ef6a0f1408781a4f9", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_2" + }, "locked": { "lastModified": 1717285511, "narHash": "sha256-iKzJcpdXih14qYVcZ9QC9XuZYnPc6T8YImb6dX166kw=", @@ -54,7 +114,7 @@ }, "gen-luarc": { "inputs": { - "flake-parts": "flake-parts", + "flake-parts": "flake-parts_2", "git-hooks": "git-hooks", "luvit-meta": "luvit-meta", "nixpkgs": [ @@ -139,21 +199,33 @@ }, "nixpkgs": { "locked": { - "lastModified": 1731319897, - "narHash": "sha256-PbABj4tnbWFMfBp6OcUK5iGy1QY+/Z96ZcLpooIbuEI=", - "owner": "NixOS", + "lastModified": 1736166416, + "narHash": "sha256-U47xeACNBpkSO6IcCm0XvahsVXpJXzjPIQG7TZlOToU=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "dc460ec76cbff0e66e269457d7b728432263166c", + "rev": "b30f97d8c32d804d2d832ee837d0f1ca0695faa5", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixos-unstable", + "owner": "nixos", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, "nixpkgs-lib": { + "locked": { + "lastModified": 1733096140, + "narHash": "sha256-1qRH7uAUsyQI7R1Uwl4T+XvdNv778H0Nb5njNrqvylY=", + "type": "tarball", + "url": "https://github.com/NixOS/nixpkgs/archive/5487e69da40cbd611ab2cadee0b4637225f7cfae.tar.gz" + }, + "original": { + "type": "tarball", + "url": "https://github.com/NixOS/nixpkgs/archive/5487e69da40cbd611ab2cadee0b4637225f7cfae.tar.gz" + } + }, + "nixpkgs-lib_2": { "locked": { "lastModified": 1717284937, "narHash": "sha256-lIbdfCsf8LMFloheeE6N31+BMIeixqyQWbSr2vk79EQ=", @@ -181,14 +253,48 @@ "type": "github" } }, + "nixpkgs_2": { + "locked": { + "lastModified": 1738410390, + "narHash": "sha256-xvTo0Aw0+veek7hvEVLzErmJyQkEcRk6PSR4zsRQFEc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3a228057f5b619feb3186e986dbe76278d707b6e", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "root": { "inputs": { + "blink": "blink", "flake-utils": "flake-utils", "gen-luarc": "gen-luarc", - "nixpkgs": "nixpkgs", + "nixpkgs": "nixpkgs_2", "workspace-diagnostics-nvim": "workspace-diagnostics-nvim" } }, + "rust-analyzer-src": { + "flake": false, + "locked": { + "lastModified": 1734622712, + "narHash": "sha256-2Oc2LbFypF1EG3zTVIVcuT5XFJ7R3oAwu2tS8B0qQ0I=", + "owner": "rust-lang", + "repo": "rust-analyzer", + "rev": "fe027d79d22f2a7645da4143f5cc0f5f56239b97", + "type": "github" + }, + "original": { + "owner": "rust-lang", + "ref": "nightly", + "repo": "rust-analyzer", + "type": "github" + } + }, "systems": { "locked": { "lastModified": 1681028828, From d88c03f005bdb0c1fa6a893f674a8de56351f807 Mon Sep 17 00:00:00 2001 From: iofq Date: Sun, 2 Feb 2025 22:38:46 -0600 Subject: [PATCH 089/160] add copilot, snacks --- flake.lock | 156 +++++--------------------------- flake.nix | 5 +- nix/mkNeovim.nix | 2 +- nix/neovim-overlay.nix | 53 +++-------- nvim/lua/plugins/ai.lua | 75 +++++++++++++++ nvim/lua/plugins/completion.lua | 143 +++++++++++++++++++---------- nvim/lua/plugins/lsp.lua | 63 +++++-------- nvim/lua/plugins/mini.lua | 15 --- nvim/lua/plugins/misc.lua | 47 ++++------ nvim/lua/plugins/snacks.lua | 76 ++++++++++++++++ nvim/lua/plugins/telescope.lua | 140 ---------------------------- 11 files changed, 325 insertions(+), 450 deletions(-) create mode 100644 nvim/lua/plugins/ai.lua create mode 100644 nvim/lua/plugins/snacks.lua delete mode 100644 nvim/lua/plugins/telescope.lua diff --git a/flake.lock b/flake.lock index b1e9731..4c4391a 100644 --- a/flake.lock +++ b/flake.lock @@ -1,47 +1,5 @@ { "nodes": { - "blink": { - "inputs": { - "fenix": "fenix", - "flake-parts": "flake-parts", - "nixpkgs": "nixpkgs" - }, - "locked": { - "lastModified": 1738451960, - "narHash": "sha256-6NgB253rpCaNlNabbZRYIC/x1ZOlm41ZMvQOSNhgef8=", - "owner": "Saghen", - "repo": "blink.cmp", - "rev": "cc34be8ff1145264811e59b017f59676ad81000e", - "type": "github" - }, - "original": { - "owner": "Saghen", - "repo": "blink.cmp", - "type": "github" - } - }, - "fenix": { - "inputs": { - "nixpkgs": [ - "blink", - "nixpkgs" - ], - "rust-analyzer-src": "rust-analyzer-src" - }, - "locked": { - "lastModified": 1734676450, - "narHash": "sha256-iwcxhTVe4h5TqW0HsNiOQP27eMBmbBshF+q2UjEy5aU=", - "owner": "nix-community", - "repo": "fenix", - "rev": "46e19fa0eb3260b2c3ee5b2cf89e73343c1296ab", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "fenix", - "type": "github" - } - }, "flake-compat": { "flake": false, "locked": { @@ -62,24 +20,6 @@ "inputs": { "nixpkgs-lib": "nixpkgs-lib" }, - "locked": { - "lastModified": 1733312601, - "narHash": "sha256-4pDvzqnegAfRkPwO3wmwBhVi/Sye1mzps0zHWYnP88c=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "205b12d8b7cd4802fbcb8e8ef6a0f1408781a4f9", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" - } - }, - "flake-parts_2": { - "inputs": { - "nixpkgs-lib": "nixpkgs-lib_2" - }, "locked": { "lastModified": 1717285511, "narHash": "sha256-iKzJcpdXih14qYVcZ9QC9XuZYnPc6T8YImb6dX166kw=", @@ -114,7 +54,7 @@ }, "gen-luarc": { "inputs": { - "flake-parts": "flake-parts_2", + "flake-parts": "flake-parts", "git-hooks": "git-hooks", "luvit-meta": "luvit-meta", "nixpkgs": [ @@ -199,33 +139,21 @@ }, "nixpkgs": { "locked": { - "lastModified": 1736166416, - "narHash": "sha256-U47xeACNBpkSO6IcCm0XvahsVXpJXzjPIQG7TZlOToU=", - "owner": "nixos", + "lastModified": 1738410390, + "narHash": "sha256-xvTo0Aw0+veek7hvEVLzErmJyQkEcRk6PSR4zsRQFEc=", + "owner": "NixOS", "repo": "nixpkgs", - "rev": "b30f97d8c32d804d2d832ee837d0f1ca0695faa5", + "rev": "3a228057f5b619feb3186e986dbe76278d707b6e", "type": "github" }, "original": { - "owner": "nixos", - "ref": "nixpkgs-unstable", + "owner": "NixOS", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } }, "nixpkgs-lib": { - "locked": { - "lastModified": 1733096140, - "narHash": "sha256-1qRH7uAUsyQI7R1Uwl4T+XvdNv778H0Nb5njNrqvylY=", - "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs/archive/5487e69da40cbd611ab2cadee0b4637225f7cfae.tar.gz" - }, - "original": { - "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs/archive/5487e69da40cbd611ab2cadee0b4637225f7cfae.tar.gz" - } - }, - "nixpkgs-lib_2": { "locked": { "lastModified": 1717284937, "narHash": "sha256-lIbdfCsf8LMFloheeE6N31+BMIeixqyQWbSr2vk79EQ=", @@ -237,6 +165,22 @@ "url": "https://github.com/NixOS/nixpkgs/archive/eb9ceca17df2ea50a250b6b27f7bf6ab0186f198.tar.gz" } }, + "nixpkgs-master": { + "locked": { + "lastModified": 1738490265, + "narHash": "sha256-lYo2OmtQ8Mz8BpmUQT93P8guOLnfGEwXbY55Eb55Thg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "7e26be4395f18f0aaaab3d704a55791f19764edd", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "master", + "repo": "nixpkgs", + "type": "github" + } + }, "nixpkgs-stable": { "locked": { "lastModified": 1720386169, @@ -253,46 +197,12 @@ "type": "github" } }, - "nixpkgs_2": { - "locked": { - "lastModified": 1738410390, - "narHash": "sha256-xvTo0Aw0+veek7hvEVLzErmJyQkEcRk6PSR4zsRQFEc=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "3a228057f5b619feb3186e986dbe76278d707b6e", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, "root": { "inputs": { - "blink": "blink", "flake-utils": "flake-utils", "gen-luarc": "gen-luarc", - "nixpkgs": "nixpkgs_2", - "workspace-diagnostics-nvim": "workspace-diagnostics-nvim" - } - }, - "rust-analyzer-src": { - "flake": false, - "locked": { - "lastModified": 1734622712, - "narHash": "sha256-2Oc2LbFypF1EG3zTVIVcuT5XFJ7R3oAwu2tS8B0qQ0I=", - "owner": "rust-lang", - "repo": "rust-analyzer", - "rev": "fe027d79d22f2a7645da4143f5cc0f5f56239b97", - "type": "github" - }, - "original": { - "owner": "rust-lang", - "ref": "nightly", - "repo": "rust-analyzer", - "type": "github" + "nixpkgs": "nixpkgs", + "nixpkgs-master": "nixpkgs-master" } }, "systems": { @@ -309,22 +219,6 @@ "repo": "default", "type": "github" } - }, - "workspace-diagnostics-nvim": { - "flake": false, - "locked": { - "lastModified": 1723294887, - "narHash": "sha256-lBj4KUPmmhtpffYky/HpaTwY++d/Q9socp/Ys+4VeX0=", - "owner": "artemave", - "repo": "workspace-diagnostics.nvim", - "rev": "573ff93c47898967efdfbc6587a1a39e3c2d365e", - "type": "github" - }, - "original": { - "owner": "artemave", - "repo": "workspace-diagnostics.nvim", - "type": "github" - } } }, "root": "root", diff --git a/flake.nix b/flake.nix index c48db06..1bec7e0 100644 --- a/flake.nix +++ b/flake.nix @@ -3,15 +3,12 @@ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + nixpkgs-master.url = "github:NixOS/nixpkgs/master"; flake-utils.url = "github:numtide/flake-utils"; gen-luarc = { url = "github:mrcjkb/nix-gen-luarc-json"; inputs.nixpkgs.follows = "nixpkgs"; }; - workspace-diagnostics-nvim = { - url = "github:artemave/workspace-diagnostics.nvim"; - flake = false; - }; }; outputs = inputs @ { diff --git a/nix/mkNeovim.nix b/nix/mkNeovim.nix index 95975ff..02725a1 100644 --- a/nix/mkNeovim.nix +++ b/nix/mkNeovim.nix @@ -28,7 +28,7 @@ with lib; 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? + withNodeJs ? true, # 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" diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index 16b0179..aaf9213 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -10,32 +10,28 @@ with final.pkgs.lib; let inherit pname src; version = src.lastModifiedDate; }; - workspace-diagnostics-nvim = mkNvimPlugin inputs.workspace-diagnostics-nvim "workspace-diagnostics.nvim"; - mkNeovim = pkgs.callPackage ./mkNeovim.nix { inherit pkgs-wrapNeovim; }; all-plugins = with pkgs.vimPlugins; [ aerial-nvim - cmp-buffer - cmp-cmdline - cmp-nvim-lsp - cmp-path - cmp-treesitter - cmp_luasnip + avante-nvim + inputs.nixpkgs-master.legacyPackages.${pkgs.system}.vimPlugins.blink-cmp + blink-cmp-copilot + blink-compat + blink-ripgrep-nvim + copilot-lua diffview-nvim eyeliner-nvim friendly-snippets gitsigns-nvim lazy-nvim luasnip - markview-nvim mini-nvim neogen neogit none-ls-nvim nightfox-nvim nvim-autopairs - nvim-cmp nvim-dap nvim-dap-go nvim-dap-ui @@ -43,41 +39,13 @@ with final.pkgs.lib; let nvim-nio nvim-treesitter-context nvim-treesitter-textobjects - (nvim-treesitter.withPlugins(p: with p; [ - tree-sitter-bash - tree-sitter-c - tree-sitter-comment - tree-sitter-css - tree-sitter-dockerfile - tree-sitter-embedded-template - tree-sitter-go - tree-sitter-gomod - tree-sitter-hcl - tree-sitter-html - tree-sitter-javascript - tree-sitter-json - tree-sitter-lua - tree-sitter-make - tree-sitter-markdown - tree-sitter-markdown-inline - tree-sitter-nix - tree-sitter-php - tree-sitter-python - tree-sitter-regex - tree-sitter-ruby - tree-sitter-sql - tree-sitter-toml - tree-sitter-typescript - tree-sitter-yaml - ])) + nvim-treesitter.withAllGrammars + render-markdown-nvim scope-nvim - telescope-fzf-native-nvim - telescope-nvim - toggleterm-nvim + snacks-nvim trouble-nvim undotree yanky-nvim - workspace-diagnostics-nvim ]; basePackages = with pkgs; [ @@ -93,8 +61,9 @@ with final.pkgs.lib; let gopls lua-language-server nil - python312Packages.jedi-language-server phpactor + python312Packages.jedi-language-server + ruby-lsp # debuggers delve diff --git a/nvim/lua/plugins/ai.lua b/nvim/lua/plugins/ai.lua new file mode 100644 index 0000000..3a48c16 --- /dev/null +++ b/nvim/lua/plugins/ai.lua @@ -0,0 +1,75 @@ +return { + { + "zbirenbaum/copilot.lua", + cmd = "Copilot", + event = "InsertEnter", + opts = { + panel = { enabled = false }, + suggestion = { + enabled = true, + keymap = { + accept = "", + next = "", + dismiss = "", + }, + }, + completion = { + documentation = { + auto_show = true, + }, + list = { + selection = { + preselect = false, + auto_insert = true, + } + }, + accept = { + auto_brackets = { + enabled = true + } + }, + }, + filetypes = { + go = true, + lua = true, + php = true, + python = true, + ruby = true, + sh = true, + puppet = true, + yaml = true, + markdown = true, + ["."] = false, + } + } + }, + { + "yetone/avante.nvim", + event = "VeryLazy", + lazy = false, + dependencies = { + "stevearc/dressing.nvim", + "nvim-lua/plenary.nvim", + "MunifTanjim/nui.nvim", + "folke/snacks.nvim", + "zbirenbaum/copilot.lua", + { + 'MeanderingProgrammer/render-markdown.nvim', + opts = { + file_types = { "markdown", "Avante" }, + }, + ft = { "markdown", "Avante" }, + }, + }, + opts = { + provider = "copilot", + auto_suggestions_provider = "copilot", + behavior = { + auto_suggestions = false, -- TODO + }, + file_selector = { + provider = "native", -- TODO snacks once it's ready + } + } + } +} diff --git a/nvim/lua/plugins/completion.lua b/nvim/lua/plugins/completion.lua index 50935b5..94e8136 100644 --- a/nvim/lua/plugins/completion.lua +++ b/nvim/lua/plugins/completion.lua @@ -1,60 +1,105 @@ return { { - 'hrsh7th/nvim-cmp', - event = 'VeryLazy', + 'saghen/blink.cmp', dependencies = { - 'hrsh7th/cmp-buffer', - 'hrsh7th/cmp-cmdline', - 'hrsh7th/cmp-path', - 'hrsh7th/cmp-nvim-lsp', - 'ray-x/cmp-treesitter', - 'L3MON4D3/luasnip', - 'saadparwaiz1/cmp_luasnip', + "yetone/avante.nvim", + 'saghen/blink.compat', + 'rafamadriz/friendly-snippets', + 'giuxtaposition/blink-cmp-copilot', + 'mikavilpas/blink-ripgrep.nvim' }, - config = function() - local cmp = require('cmp') - cmp.setup { - snippet = { - expand = function(args) - require('luasnip').lsp_expand(args.body) - end, - }, - mapping = cmp.mapping.preset.insert { - [''] = cmp.mapping.scroll_docs(-4), - [''] = cmp.mapping.scroll_docs(4), - [''] = cmp.mapping.select_next_item { behavior = cmp.SelectBehavior.Insert }, - [''] = cmp.mapping.select_prev_item { behavior = cmp.SelectBehavior.Insert }, - [''] = cmp.mapping.confirm { - select = true, - behavior = cmp.SelectBehavior.Insert - }, - }, - sources = cmp.config.sources({ - { name = 'nvim_lsp', keyword_length = 1 }, - { name = 'luasnip' }, - { name = 'buffer' }, - { name = 'path' }, - { name = 'treesitter', keyword_length = 3 }, - }), - } - - cmp.setup.cmdline({ '/', '?' }, { - mapping = cmp.mapping.preset.cmdline(), - sources = { - { name = 'buffer' }, - }, + config = function(_, opts) + require('blink.cmp').setup(opts) + vim.api.nvim_create_autocmd('User', { + pattern = 'BlinkCmpMenuOpen', + callback = function() + require("copilot.suggestion").dismiss() + vim.b.copilot_suggestion_hidden = true + end, }) - cmp.setup.cmdline(':', { - mapping = cmp.mapping.preset.cmdline(), - sources = cmp.config.sources({ - { name = 'path' }, - { name = 'buffer' }, - { name = 'cmdline' }, - }), - matching = { disallow_symbol_nonprefix_matching = false }, + vim.api.nvim_create_autocmd('User', { + pattern = 'BlinkCmpMenuClose', + callback = function() + vim.b.copilot_suggestion_hidden = false + end, }) end, + opts = { + sources = { + default = { + "lsp", + "path", + "snippets", + "buffer", + "ripgrep", + "avante_commands", + "avante_mentions", + "avante_files" + }, + providers = { + ripgrep = { + module = "blink-ripgrep", + name = "rg", + score_offset = -10, + }, + avante_commands = { + name = "avante_commands", + module = "blink.compat.source", + score_offset = 90, + opts = {}, + }, + avante_files = { + name = "avante_files", + module = "blink.compat.source", + score_offset = 100, + opts = {}, + }, + avante_mentions = { + name = "avante_mentions", + module = "blink.compat.source", + score_offset = 1000, + opts = {}, + } + } + }, + keymap = { + [""] = { "show", "select_and_accept" } + }, + completion = { + documentation = { + auto_show = true, + auto_show_delay_ms = 100 + }, + list = { + selection = { + preselect = false, + auto_insert = true, + } + }, + accept = { + auto_brackets = { + enabled = true + } + }, + menu = { + draw = { + treesitter = { "lsp" }, + columns = { + { "label", "label_description", gap = 1 }, + { "source_name", "kind", gap = 1 } + }, + } + }, + trigger = { + show_on_keyword = false, + } + }, + appearance = { + use_nvim_cmp_as_default = true, + }, + signature = { enabled = true } + } }, { 'L3MON4D3/luasnip', diff --git a/nvim/lua/plugins/lsp.lua b/nvim/lua/plugins/lsp.lua index f499f4a..e42d743 100644 --- a/nvim/lua/plugins/lsp.lua +++ b/nvim/lua/plugins/lsp.lua @@ -2,45 +2,27 @@ return { { 'folke/trouble.nvim', event = 'VeryLazy', - dependencies = { - 'artemave/workspace-diagnostics.nvim', - }, - config = function() - require('trouble').setup() - vim.keymap.set( - 'n', + config = true, + keys = { + { 'de', 'Trouble diagnostics toggle focus=true', { noremap = true, desc = 'Trouble diagnostics' } - ) - vim.keymap.set( - 'n', - 'dE', - 'Trouble diagnostics toggle focus=true filter.buf=0', - { noremap = true, desc = 'Trouble diagnostics (currrent buffer)' } - ) - vim.keymap.set('n', 'dw', function() - for _, client in ipairs(vim.lsp.get_clients { bufnr = 0 }) do - require('workspace-diagnostics').populate_workspace_diagnostics(client, 0) - end - end, { noremap = true, desc = 'Populate Trouble workspace diagnostics' }) - end, + } + } }, { 'neovim/nvim-lspconfig', event = 'VeryLazy', dependencies = { - 'hrsh7th/cmp-nvim-lsp', - 'artemave/workspace-diagnostics.nvim', + 'folke/snacks.nvim', + 'saghen/blink.cmp', }, config = function() local lspconfig = require('lspconfig') - lspconfig.util.default_config.capabilities = vim.tbl_deep_extend( - 'force', - lspconfig.util.default_config.capabilities, - require('cmp_nvim_lsp').default_capabilities() - ) + local capabilities = require("blink.cmp").get_lsp_capabilities() lspconfig.gopls.setup { + capabilities = capabilities, settings = { gopls = { gofumpt = true, @@ -66,10 +48,12 @@ return { }, }, } - lspconfig.jedi_language_server.setup {} - lspconfig.nil_ls.setup {} - lspconfig.phpactor.setup {} + lspconfig.jedi_language_server.setup { capabilities = capabilities } + lspconfig.nil_ls.setup { capabilities = capabilities } + lspconfig.phpactor.setup { capabilities = capabilities } + lspconfig.ruby_ls.setup { capabilities = capabilities } lspconfig.lua_ls.setup { + capabilities = capabilities, on_init = function(client) local path = client.workspace_folders[1].name if vim.loop.fs_stat(path .. '/.luarc.json') or vim.loop.fs_stat(path .. '/.luarc.jsonc') then @@ -120,27 +104,27 @@ return { vim.keymap.set( 'n', 'dd', - 'Telescope lsp_definitions', + function() Snacks.picker.diagnostics() end, + { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP diagnostics' } + ) + vim.keymap.set( + 'n', + 'df', + function() Snacks.picker.lsp_definitions() end, { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP definitions' } ) vim.keymap.set( 'n', 'di', - 'Telescope lsp_implementations', + function() Snacks.picker.lsp_implementations() end, { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP implementations' } ) vim.keymap.set( 'n', 'dr', - 'Telescope lsp_references', + function() Snacks.picker.lsp_references() end, { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP references' } ) - vim.keymap.set( - 'n', - 'ds', - 'Telescope lsp_document_symbols', - { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP symbols' } - ) vim.keymap.set( 'n', 'dl', @@ -168,7 +152,6 @@ return { }) vim.lsp.codelens.refresh { bufnr = bufnr } end - require('workspace-diagnostics').populate_workspace_diagnostics(client, bufnr) end, }) vim.api.nvim_exec_autocmds('FileType', {}) diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index 64d4d8a..76819f4 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -46,18 +46,11 @@ return { require('mini.ai').setup() require('mini.align').setup() require('mini.bracketed').setup() - require('mini.comment').setup() require('mini.icons').setup() require('mini.surround').setup() - require('mini.jump2d').setup { mappings = { start_jumping = 'S' } } require('mini.splitjoin').setup { detect = { separator = '[,;\n]' }, } require('mini.trailspace').setup() vim.api.nvim_create_user_command('Trim', require('mini.trailspace').trim, {}) - local indent = require('mini.indentscope') - indent.setup { - symbol = '│', - draw = { delay = 0 }, - } local miniclue = require('mini.clue') miniclue.setup { @@ -101,14 +94,6 @@ return { } vim.keymap.set('n', 'nm', map.toggle, { noremap = true, desc = 'minimap open' }) - require('mini.notify').setup { - window = { - winblend = 0, - config = { - border = 'double', - }, - }, - } local files = require("mini.files") files.setup { mappings = { diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index 6d36966..715bf34 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -9,16 +9,6 @@ return { event = 'VeryLazy', config = true, }, - { - 'akinsho/toggleterm.nvim', - event = 'VeryLazy', - opts = { - open_mapping = [[]], - direction = 'float', - close_on_exit = true, - autochdir = true, - }, - }, { 'jinh0/eyeliner.nvim', event = 'VeryLazy', @@ -27,13 +17,6 @@ return { vim.api.nvim_set_hl(0, 'EyelinerSecondary', { underline = true }) end, }, - { - 'OXY2DEV/markview.nvim', - event = 'VeryLazy', - dependencies = { - "nvim-treesitter/nvim-treesitter", - } - }, { 'tiagovla/scope.nvim', event = 'VeryLazy', config = true }, { 'sindrets/diffview.nvim', @@ -65,16 +48,12 @@ return { disable_builtin_notifications = true, integrations = { diffview = true, - telescope = true, - fzf_lua = true, }, }, keys = { { 'ng', - function() - require('neogit').open() - end, + function() require('neogit').open() end, { noremap = true, silent = true, desc = 'Neogit' }, }, }, @@ -98,17 +77,17 @@ return { options = { transparent = true, terminal_colors = false, + modules = { + "mini", + "treesitter", + "neogit", + "aerial" + } }, }, config = function(_, opts) require('nightfox').setup(opts) vim.cmd('colorscheme terafox') - vim.api.nvim_set_hl(0, 'MiniNotifyNormal', { bg = 'none' }) - vim.api.nvim_set_hl(0, 'MiniNotifyTitle', { bg = 'none' }) - vim.api.nvim_set_hl(0, 'MiniNotifyBorder', { bg = 'none' }) - vim.api.nvim_set_hl(0, 'MiniMapNormal', { bg = 'none' }) - vim.api.nvim_set_hl(0, 'MiniClueNormal', { bg = 'none' }) - vim.api.nvim_set_hl(0, 'MiniTablineFill', { bg = 'none' }) vim.api.nvim_set_hl(0, 'StatusLine', { bg = 'none' }) vim.api.nvim_set_hl(0, 'StatusLineNC', { bg = 'none' }) vim.api.nvim_set_hl(0, 'GitSignsAdd', { fg = 'green', bold = true }) @@ -179,4 +158,16 @@ return { autojump = true, }, }, + { + 'gbprod/yanky.nvim', + opts = { + ring = { + storage = "memory", + }, + }, + keys = { + { "y", "(YankyYank)", mode = { "n", "x" } }, + { "fp", "YankyRingHistory", { mode = { "n", "x" }, noremap = true, silent = true, desc = 'Pick history (yanky.nvim)' } } + }, + }, } diff --git a/nvim/lua/plugins/snacks.lua b/nvim/lua/plugins/snacks.lua new file mode 100644 index 0000000..22f28bf --- /dev/null +++ b/nvim/lua/plugins/snacks.lua @@ -0,0 +1,76 @@ +return { + { + "folke/snacks.nvim", + priority = 1000, + lazy = false, + opts = { + bigfile = { enabled = true }, + notifier = { enabled = true }, + scope = { enabled = true }, + terminal = { enabled = true }, + indent = { enabled = true }, + input = { enabled = true }, + words = { enabled = true }, + picker = { + enabled = true, + matcher = { frecency = true }, + layout = { + preset = function() + return vim.o.columns >= 120 and "telescope" or "vertical" + end + }, + win = { + input = { + keys = { + ["wq"] = { "close", mode = "i" }, + } + }, + list = { + keys = { + ["wq"] = { "close", mode = "i" }, + } + } + } + }, + }, + config = function(_, opts) + require("snacks").setup(opts) + vim.api.nvim_set_hl(0, 'SnacksPickerDir', { fg = '#cccccc' }) + end, + keys = { + { '', function() Snacks.terminal.toggle() end, mode = { "n", "t" }, noremap = true, desc = 'terminal open' }, + { 'm', function() Snacks.words.jump(1, true) end, noremap = true, desc = 'next reference' }, + { 'M', function() Snacks.words.jump(-1, true) end, noremap = true, desc = 'next reference' }, + { + 'ff', + function() Snacks.picker.smart() end, + { noremap = true, silent = true, desc = 'Fuzzy find git files' } + }, + { + 'fa', + function() Snacks.picker.grep() end, + { noremap = true, silent = true, desc = 'Fuzzy find grep' } + }, + { + 'f8', + function() Snacks.picker.grep_word() end, + { noremap = true, silent = true, desc = 'Fuzzy find grep word' } + }, + { + 'f?', + function() Snacks.picker.pickers() end, + { noremap = true, silent = true, desc = 'See all pickers' } + }, + { + 'f.', + function() Snacks.picker.resume() end, + { noremap = true, silent = true, desc = 'Fuzzy find resume' } + }, + { + '', + function() Snacks.picker.buffers() end, + { noremap = true, silent = true, desc = 'Fuzzy find buffers' } + }, + } + } +} diff --git a/nvim/lua/plugins/telescope.lua b/nvim/lua/plugins/telescope.lua deleted file mode 100644 index f121f96..0000000 --- a/nvim/lua/plugins/telescope.lua +++ /dev/null @@ -1,140 +0,0 @@ -return { - { - 'nvim-telescope/telescope-fzf-native.nvim', - event = 'VeryLazy', - build = 'make', - }, - { - 'nvim-telescope/telescope.nvim', - event = 'VeryLazy', - dependencies = { - 'nvim-lua/plenary.nvim', - 'nvim-telescope/telescope-fzf-native.nvim', - 'nvim-treesitter/nvim-treesitter', - 'tiagovla/scope.nvim', - { - 'gbprod/yanky.nvim', - config = function() - local mapping = require("yanky.telescope.mapping") - require("yanky").setup({ - picker = { - telescope = { - mappings = { - default = mapping.set_register( - require("yanky.utils").get_default_register() - ), - }, - }, - }, - ring = { - storage = "memory", - }, - }) - vim.keymap.set({ "n", "x" }, "y", "(YankyYank)") - end, - }, - }, - config = function() - local telescope = require('telescope') - local actions = require('telescope.actions') - telescope.setup { - defaults = { - layout_strategy = 'vertical', - layout_config = { width = 0.90 }, - prompt_title = false, - results_title = false, - preview_title = false, - vimgrep_arguments = { - 'rg', - '-L', - '--color=never', - '--no-heading', - '--hidden', - '--with-filename', - '--line-number', - '--column', - '--smart-case', - }, - preview = { treesitter = true }, - path_display = { 'truncate' }, - mappings = { - i = { - ['wq'] = actions.close, - [''] = actions.close, - [''] = actions.move_selection_previous, - [''] = actions.move_selection_next, - }, - }, - }, - } - telescope.load_extension('fzf') - telescope.load_extension('scope') - telescope.load_extension('yank_history') - - local b = require('telescope.builtin') - -- Fall back to find_files if not in a git repo - local project_files = function() - local opts = {} -- define here if you want to define something - local ok = pcall(b.git_files, opts) - if not ok then - b.find_files(opts) - end - end - - vim.keymap.set( - 'n', - 'ff', - project_files, - { noremap = true, silent = true, desc = 'Fuzzy find git files' } - ) - vim.keymap.set( - 'n', - 'fg', - b.find_files, - { noremap = true, silent = true, desc = 'Fuzzy find files' } - ) - vim.keymap.set( - 'n', - 'fa', - b.live_grep, - { noremap = true, silent = true, desc = 'Fuzzy find grep' } - ) - vim.keymap.set( - 'n', - 'f8', - b.grep_string, - { noremap = true, silent = true, desc = 'Fuzzy find grep current word' } - ) - vim.keymap.set( - 'n', - 'f?', - b.builtin, - { noremap = true, silent = true, desc = 'See all pickers' } - ) - vim.keymap.set( - 'n', - 'f.', - b.resume, - { noremap = true, silent = true, desc = 'Fuzzy find resume' } - ) - vim.keymap.set( - 'n', - 'fs', - b.lsp_document_symbols, - { noremap = true, silent = true, desc = 'Fuzzy find treesitter objects' } - ) - vim.keymap.set( - 'n', - '', - 'Telescope scope buffers', - { noremap = true, silent = true, desc = 'Pick buffers (scope.nvim)' } - ) - vim.keymap.set( - 'n', - 'fp', - 'Telescope yank_history', - { noremap = true, silent = true, desc = 'Pick history (yanky.nvim)' } - ) - end, - }, -} From 012306d04fb618f5887af6f8789c2eef7ced4250 Mon Sep 17 00:00:00 2001 From: iofq Date: Sun, 2 Feb 2025 22:39:23 -0600 Subject: [PATCH 090/160] flake.lock: Update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'nixpkgs-master': 'github:NixOS/nixpkgs/7e26be4395f18f0aaaab3d704a55791f19764edd?narHash=sha256-lYo2OmtQ8Mz8BpmUQT93P8guOLnfGEwXbY55Eb55Thg%3D' (2025-02-02) → 'github:NixOS/nixpkgs/3d89be6655a3ca15643456199b491b524929f61c?narHash=sha256-KbuxOVz6SCBCkjJufqmdhItzhf8OCBKnRP%2BJWE9EFlo%3D' (2025-02-03) --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 4c4391a..d50536f 100644 --- a/flake.lock +++ b/flake.lock @@ -167,11 +167,11 @@ }, "nixpkgs-master": { "locked": { - "lastModified": 1738490265, - "narHash": "sha256-lYo2OmtQ8Mz8BpmUQT93P8guOLnfGEwXbY55Eb55Thg=", + "lastModified": 1738557153, + "narHash": "sha256-KbuxOVz6SCBCkjJufqmdhItzhf8OCBKnRP+JWE9EFlo=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "7e26be4395f18f0aaaab3d704a55791f19764edd", + "rev": "3d89be6655a3ca15643456199b491b524929f61c", "type": "github" }, "original": { From 01366c625aa155716f68989cdea2acf6459313cf Mon Sep 17 00:00:00 2001 From: iofq Date: Mon, 3 Feb 2025 01:36:08 -0600 Subject: [PATCH 091/160] use trouble qf from snacks --- nvim/lua/plugins/ai.lua | 1 - nvim/lua/plugins/completion.lua | 8 +------- nvim/lua/plugins/lsp.lua | 8 +------- nvim/lua/plugins/mini.lua | 1 + nvim/lua/plugins/snacks.lua | 12 ++++++++++-- 5 files changed, 13 insertions(+), 17 deletions(-) diff --git a/nvim/lua/plugins/ai.lua b/nvim/lua/plugins/ai.lua index 3a48c16..f739f01 100644 --- a/nvim/lua/plugins/ai.lua +++ b/nvim/lua/plugins/ai.lua @@ -46,7 +46,6 @@ return { { "yetone/avante.nvim", event = "VeryLazy", - lazy = false, dependencies = { "stevearc/dressing.nvim", "nvim-lua/plenary.nvim", diff --git a/nvim/lua/plugins/completion.lua b/nvim/lua/plugins/completion.lua index 94e8136..10efda6 100644 --- a/nvim/lua/plugins/completion.lua +++ b/nvim/lua/plugins/completion.lua @@ -1,6 +1,7 @@ return { { 'saghen/blink.cmp', + event = "VeryLazy", dependencies = { "yetone/avante.nvim", 'saghen/blink.compat', @@ -35,7 +36,6 @@ return { "ripgrep", "avante_commands", "avante_mentions", - "avante_files" }, providers = { ripgrep = { @@ -49,12 +49,6 @@ return { score_offset = 90, opts = {}, }, - avante_files = { - name = "avante_files", - module = "blink.compat.source", - score_offset = 100, - opts = {}, - }, avante_mentions = { name = "avante_mentions", module = "blink.compat.source", diff --git a/nvim/lua/plugins/lsp.lua b/nvim/lua/plugins/lsp.lua index e42d743..e1b2443 100644 --- a/nvim/lua/plugins/lsp.lua +++ b/nvim/lua/plugins/lsp.lua @@ -51,7 +51,7 @@ return { lspconfig.jedi_language_server.setup { capabilities = capabilities } lspconfig.nil_ls.setup { capabilities = capabilities } lspconfig.phpactor.setup { capabilities = capabilities } - lspconfig.ruby_ls.setup { capabilities = capabilities } + lspconfig.ruby_lsp.setup { capabilities = capabilities } lspconfig.lua_ls.setup { capabilities = capabilities, on_init = function(client) @@ -101,12 +101,6 @@ return { vim.lsp.buf.code_action, { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP code action' } ) - vim.keymap.set( - 'n', - 'dd', - function() Snacks.picker.diagnostics() end, - { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP diagnostics' } - ) vim.keymap.set( 'n', 'df', diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index 76819f4..5d95310 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -47,6 +47,7 @@ return { require('mini.align').setup() require('mini.bracketed').setup() require('mini.icons').setup() + require('mini.jump2d').setup({ mappings = { start_jumping = 'S' } }); require('mini.surround').setup() require('mini.splitjoin').setup { detect = { separator = '[,;\n]' }, } require('mini.trailspace').setup() diff --git a/nvim/lua/plugins/snacks.lua b/nvim/lua/plugins/snacks.lua index 22f28bf..ecfb603 100644 --- a/nvim/lua/plugins/snacks.lua +++ b/nvim/lua/plugins/snacks.lua @@ -1,8 +1,9 @@ return { { "folke/snacks.nvim", - priority = 1000, + dependencies = { "folke/trouble.nvim" }, lazy = false, + priority = 1000, opts = { bigfile = { enabled = true }, notifier = { enabled = true }, @@ -19,10 +20,17 @@ return { return vim.o.columns >= 120 and "telescope" or "vertical" end }, + actions = { + trouble_open = function(...) + return require("trouble.sources.snacks").actions.trouble_open.action(...) + end, + }, win = { input = { keys = { ["wq"] = { "close", mode = "i" }, + [""] = { "trouble_open", mode = { "n", "i" }, + }, } }, list = { @@ -44,7 +52,7 @@ return { { 'ff', function() Snacks.picker.smart() end, - { noremap = true, silent = true, desc = 'Fuzzy find git files' } + { noremap = true, silent = true, desc = 'Fuzzy find files' } }, { 'fa', From 78a7d107e5c6b8122a783d04eb1c9ca81b326dc9 Mon Sep 17 00:00:00 2001 From: iofq Date: Mon, 3 Feb 2025 02:16:10 -0600 Subject: [PATCH 092/160] rm debugger, add jj --- nix/mkNeovim.nix | 2 +- nix/neovim-overlay.nix | 13 +++-- nvim/lua/plugins/debug.lua | 114 ++++++++++++++++++------------------- 3 files changed, 67 insertions(+), 62 deletions(-) diff --git a/nix/mkNeovim.nix b/nix/mkNeovim.nix index 02725a1..95975ff 100644 --- a/nix/mkNeovim.nix +++ b/nix/mkNeovim.nix @@ -28,7 +28,7 @@ with lib; extraPython3Packages ? p: [], # Additional python 3 packages withPython3 ? false, # Build Neovim with Python 3 support? withRuby ? false, # Build Neovim with Ruby support? - withNodeJs ? true, # Build Neovim with NodeJS 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" diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index aaf9213..5b80814 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -32,11 +32,11 @@ with final.pkgs.lib; let none-ls-nvim nightfox-nvim nvim-autopairs - nvim-dap - nvim-dap-go - nvim-dap-ui + # nvim-dap + # nvim-dap-go + # nvim-dap-ui nvim-lspconfig - nvim-nio + # nvim-nio nvim-treesitter-context nvim-treesitter-textobjects nvim-treesitter.withAllGrammars @@ -67,12 +67,16 @@ with final.pkgs.lib; let # debuggers delve + + #other + jujutsu ]; in { nvim-pkg = mkNeovim { plugins = all-plugins; appName = "nvim"; extraPackages = basePackages ++ extraPackages; + withNodeJs = true; }; nvim-min-pkg = mkNeovim { @@ -82,6 +86,7 @@ in { ignoreConfigRegexes = [ ".*lsp.lua" ".*debug.lua" + ".*ai.lua" ]; }; diff --git a/nvim/lua/plugins/debug.lua b/nvim/lua/plugins/debug.lua index 852e1c9..ba69c5a 100644 --- a/nvim/lua/plugins/debug.lua +++ b/nvim/lua/plugins/debug.lua @@ -1,57 +1,57 @@ -return { - { - 'rcarriga/nvim-dap-ui', - event = 'VeryLazy', - dependencies = { - 'nvim-neotest/nvim-nio', - }, - }, - { - 'mfussenegger/nvim-dap', - event = 'VeryLazy', - dependencies = { - 'leoluz/nvim-dap-go', - 'rcarriga/nvim-dap-ui', - }, - config = function() - local d = require('dap') - local w = require('dap.ui.widgets') - local ui = require('dapui') - require('dap-go').setup() - ui.setup() - - local scopes = nil - vim.keymap.set('n', 'za', function() - ui.toggle() - end, { desc = 'toggle dapui' }) - vim.keymap.set('n', 'zz', function() - d.continue() - end, { desc = 'start debugger' }) - vim.keymap.set('n', 'zn', function() - d.step_over() - end, { desc = 'step over' }) - vim.keymap.set('n', 'zi', function() - d.step_into() - end, { desc = 'step into' }) - vim.keymap.set('n', 'zo', function() - d.step_out() - end, { desc = 'step out' }) - vim.keymap.set('n', 'zx', function() - d.toggle_breakpoint() - end, { desc = 'toggle_breakpoint' }) - vim.keymap.set('n', 'zr', function() - d.run_last() - end, { desc = 'run prev' }) - vim.keymap.set({ 'n', 'v' }, 'zh', function() - ui.eval() - end, { desc = 'hover' }) - vim.keymap.set({ 'n', 'v' }, 'zp', function() - require('dap.ui.widgets').preview() - end, { desc = 'preview' }) - vim.keymap.set('n', 'zf', function() - local widgets = require('dap.ui.widgets') - widgets.centered_float(widgets.frames) - end, { desc = 'view frames' }) - end, - }, -} +-- return { +-- { +-- 'rcarriga/nvim-dap-ui', +-- event = 'VeryLazy', +-- dependencies = { +-- 'nvim-neotest/nvim-nio', +-- }, +-- }, +-- { +-- 'mfussenegger/nvim-dap', +-- event = 'VeryLazy', +-- dependencies = { +-- 'leoluz/nvim-dap-go', +-- 'rcarriga/nvim-dap-ui', +-- }, +-- config = function() +-- local d = require('dap') +-- local w = require('dap.ui.widgets') +-- local ui = require('dapui') +-- require('dap-go').setup() +-- ui.setup() +-- +-- local scopes = nil +-- vim.keymap.set('n', 'za', function() +-- ui.toggle() +-- end, { desc = 'toggle dapui' }) +-- vim.keymap.set('n', 'zz', function() +-- d.continue() +-- end, { desc = 'start debugger' }) +-- vim.keymap.set('n', 'zn', function() +-- d.step_over() +-- end, { desc = 'step over' }) +-- vim.keymap.set('n', 'zi', function() +-- d.step_into() +-- end, { desc = 'step into' }) +-- vim.keymap.set('n', 'zo', function() +-- d.step_out() +-- end, { desc = 'step out' }) +-- vim.keymap.set('n', 'zx', function() +-- d.toggle_breakpoint() +-- end, { desc = 'toggle_breakpoint' }) +-- vim.keymap.set('n', 'zr', function() +-- d.run_last() +-- end, { desc = 'run prev' }) +-- vim.keymap.set({ 'n', 'v' }, 'zh', function() +-- ui.eval() +-- end, { desc = 'hover' }) +-- vim.keymap.set({ 'n', 'v' }, 'zp', function() +-- require('dap.ui.widgets').preview() +-- end, { desc = 'preview' }) +-- vim.keymap.set('n', 'zf', function() +-- local widgets = require('dap.ui.widgets') +-- widgets.centered_float(widgets.frames) +-- end, { desc = 'view frames' }) +-- end, +-- }, +-- } From bb2a34d6205f2d31c3f4dc958ac22da90e9e87df Mon Sep 17 00:00:00 2001 From: iofq Date: Mon, 3 Feb 2025 11:51:35 -0600 Subject: [PATCH 093/160] fix bad debug file comment --- nvim/lua/plugins/debug.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/nvim/lua/plugins/debug.lua b/nvim/lua/plugins/debug.lua index ba69c5a..9679263 100644 --- a/nvim/lua/plugins/debug.lua +++ b/nvim/lua/plugins/debug.lua @@ -1,4 +1,4 @@ --- return { +return {} -- { -- 'rcarriga/nvim-dap-ui', -- event = 'VeryLazy', @@ -54,4 +54,3 @@ -- end, { desc = 'view frames' }) -- end, -- }, --- } From e7eb63b09b0255e1203a9475fcd279628bcf9ea2 Mon Sep 17 00:00:00 2001 From: iofq Date: Tue, 4 Feb 2025 02:03:02 -0600 Subject: [PATCH 094/160] snacks tweaks --- nvim/lua/plugins/ai.lua | 10 +++++++--- nvim/lua/plugins/completion.lua | 2 +- nvim/lua/plugins/misc.lua | 4 ++-- nvim/lua/plugins/snacks.lua | 7 +++++++ 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/nvim/lua/plugins/ai.lua b/nvim/lua/plugins/ai.lua index f739f01..d941156 100644 --- a/nvim/lua/plugins/ai.lua +++ b/nvim/lua/plugins/ai.lua @@ -2,7 +2,6 @@ return { { "zbirenbaum/copilot.lua", cmd = "Copilot", - event = "InsertEnter", opts = { panel = { enabled = false }, suggestion = { @@ -45,12 +44,11 @@ return { }, { "yetone/avante.nvim", - event = "VeryLazy", + cmd = "Copilot", dependencies = { "stevearc/dressing.nvim", "nvim-lua/plenary.nvim", "MunifTanjim/nui.nvim", - "folke/snacks.nvim", "zbirenbaum/copilot.lua", { 'MeanderingProgrammer/render-markdown.nvim', @@ -68,6 +66,12 @@ return { }, file_selector = { provider = "native", -- TODO snacks once it's ready + }, + windows = { + width = 50, + ask = { + floating = true + } } } } diff --git a/nvim/lua/plugins/completion.lua b/nvim/lua/plugins/completion.lua index 10efda6..cb70901 100644 --- a/nvim/lua/plugins/completion.lua +++ b/nvim/lua/plugins/completion.lua @@ -3,7 +3,7 @@ return { 'saghen/blink.cmp', event = "VeryLazy", dependencies = { - "yetone/avante.nvim", + { "yetone/avante.nvim", lazy = true }, 'saghen/blink.compat', 'rafamadriz/friendly-snippets', 'giuxtaposition/blink-cmp-copilot', diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index 715bf34..901c63e 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -12,7 +12,7 @@ return { { 'jinh0/eyeliner.nvim', event = 'VeryLazy', - config = function() + init = function() vim.api.nvim_set_hl(0, 'EyelinerPrimary', { underline = true }) vim.api.nvim_set_hl(0, 'EyelinerSecondary', { underline = true }) end, @@ -76,7 +76,7 @@ return { opts = { options = { transparent = true, - terminal_colors = false, + terminal_colors = true, modules = { "mini", "treesitter", diff --git a/nvim/lua/plugins/snacks.lua b/nvim/lua/plugins/snacks.lua index ecfb603..da24d61 100644 --- a/nvim/lua/plugins/snacks.lua +++ b/nvim/lua/plugins/snacks.lua @@ -20,6 +20,13 @@ return { return vim.o.columns >= 120 and "telescope" or "vertical" end }, + picker = { + sources = { + files = { hidden = true }, + grep = { hidden = true }, + explorer = { hidden = true }, + }, + }, actions = { trouble_open = function(...) return require("trouble.sources.snacks").actions.trouble_open.action(...) From 55bade6fb70a75047c35f3809b5aee11a5e85e30 Mon Sep 17 00:00:00 2001 From: iofq Date: Tue, 4 Feb 2025 02:29:38 -0600 Subject: [PATCH 095/160] fix: copilot suggestions warning --- nvim/lua/plugins/ai.lua | 2 +- nvim/lua/plugins/snacks.lua | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/nvim/lua/plugins/ai.lua b/nvim/lua/plugins/ai.lua index d941156..0be26a1 100644 --- a/nvim/lua/plugins/ai.lua +++ b/nvim/lua/plugins/ai.lua @@ -60,7 +60,7 @@ return { }, opts = { provider = "copilot", - auto_suggestions_provider = "copilot", + -- auto_suggestions_provider = "copilot", behavior = { auto_suggestions = false, -- TODO }, diff --git a/nvim/lua/plugins/snacks.lua b/nvim/lua/plugins/snacks.lua index da24d61..b0f8330 100644 --- a/nvim/lua/plugins/snacks.lua +++ b/nvim/lua/plugins/snacks.lua @@ -61,6 +61,11 @@ return { function() Snacks.picker.smart() end, { noremap = true, silent = true, desc = 'Fuzzy find files' } }, + { + 'fg', + function() Snacks.picker.files() end, + { noremap = true, silent = true, desc = 'Fuzzy find files' } + }, { 'fa', function() Snacks.picker.grep() end, From b4404d2c1f5f0032fe60986b12feeea505f0a1c1 Mon Sep 17 00:00:00 2001 From: iofq Date: Thu, 6 Feb 2025 02:48:48 -0600 Subject: [PATCH 096/160] feat: codecompanion.nvim --- flake.lock | 12 +++--- nix/neovim-overlay.nix | 2 +- nvim/lua/plugins/ai.lua | 69 ++++++++++++++++++++++----------- nvim/lua/plugins/completion.lua | 22 ++++------- nvim/lua/plugins/lsp.lua | 3 +- nvim/lua/plugins/misc.lua | 7 +++- 6 files changed, 69 insertions(+), 46 deletions(-) diff --git a/flake.lock b/flake.lock index d50536f..8ab2bdf 100644 --- a/flake.lock +++ b/flake.lock @@ -139,11 +139,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1738410390, - "narHash": "sha256-xvTo0Aw0+veek7hvEVLzErmJyQkEcRk6PSR4zsRQFEc=", + "lastModified": 1738680400, + "narHash": "sha256-ooLh+XW8jfa+91F1nhf9OF7qhuA/y1ChLx6lXDNeY5U=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "3a228057f5b619feb3186e986dbe76278d707b6e", + "rev": "799ba5bffed04ced7067a91798353d360788b30d", "type": "github" }, "original": { @@ -167,11 +167,11 @@ }, "nixpkgs-master": { "locked": { - "lastModified": 1738557153, - "narHash": "sha256-KbuxOVz6SCBCkjJufqmdhItzhf8OCBKnRP+JWE9EFlo=", + "lastModified": 1738831044, + "narHash": "sha256-6y2I2h4hX8d+LXLCzgu7QJ3Wvkx89R0x3WFQ5ovhwco=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "3d89be6655a3ca15643456199b491b524929f61c", + "rev": "e4b6440d7ca1649bb95bd59f39b2279db959e498", "type": "github" }, "original": { diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index 5b80814..8bc35af 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -14,11 +14,11 @@ with final.pkgs.lib; let all-plugins = with pkgs.vimPlugins; [ aerial-nvim - avante-nvim inputs.nixpkgs-master.legacyPackages.${pkgs.system}.vimPlugins.blink-cmp blink-cmp-copilot blink-compat blink-ripgrep-nvim + codecompanion-nvim copilot-lua diffview-nvim eyeliner-nvim diff --git a/nvim/lua/plugins/ai.lua b/nvim/lua/plugins/ai.lua index 0be26a1..d0fe298 100644 --- a/nvim/lua/plugins/ai.lua +++ b/nvim/lua/plugins/ai.lua @@ -2,10 +2,19 @@ return { { "zbirenbaum/copilot.lua", cmd = "Copilot", + keys = { + { + 'M-\\', + 'Copilot panel', + noremap = true, + desc = 'Copilot panel' + } + }, opts = { - panel = { enabled = false }, + panel = { enabled = true, keymap = { accept = "ga" } }, suggestion = { enabled = true, + auto_trigger = true, keymap = { accept = "", next = "", @@ -43,36 +52,50 @@ return { } }, { - "yetone/avante.nvim", + "olimorris/codecompanion.nvim", cmd = "Copilot", dependencies = { - "stevearc/dressing.nvim", "nvim-lua/plenary.nvim", - "MunifTanjim/nui.nvim", + "nvim-treesitter/nvim-treesitter", "zbirenbaum/copilot.lua", - { - 'MeanderingProgrammer/render-markdown.nvim', - opts = { - file_types = { "markdown", "Avante" }, - }, - ft = { "markdown", "Avante" }, - }, }, opts = { - provider = "copilot", - -- auto_suggestions_provider = "copilot", - behavior = { - auto_suggestions = false, -- TODO + adapters = { + copilot = function() + return require("codecompanion.adapters").extend("copilot", { + name = "copilot-claude-3.5-sonnet", + schema = { model = "claude-3.5-sonnet", }, + }) + end }, - file_selector = { - provider = "native", -- TODO snacks once it's ready + strategies = { + chat = { adapter = "copilot-claude-3.5-sonnet", }, + inline = { adapter = "copilot-claude-3.5-sonnet", }, }, - windows = { - width = 50, - ask = { - floating = true - } + }, + init = function() + vim.api.nvim_create_user_command('CC', ':CodeCompanion', {}) + end, + keys = { + { + 'ac', + 'CodeCompanionChat Toggle', + noremap = true, + desc = 'Copilot chat toggle' + }, + { + 'as', + 'CodeCompanionChat Add', + noremap = true, + desc = 'Copilot chat add selection' + }, + { + 'aa', + 'CodeCompanionActions', + noremap = true, + desc = 'Copilot inline' } } - } + + }, } diff --git a/nvim/lua/plugins/completion.lua b/nvim/lua/plugins/completion.lua index cb70901..7e48e87 100644 --- a/nvim/lua/plugins/completion.lua +++ b/nvim/lua/plugins/completion.lua @@ -3,7 +3,6 @@ return { 'saghen/blink.cmp', event = "VeryLazy", dependencies = { - { "yetone/avante.nvim", lazy = true }, 'saghen/blink.compat', 'rafamadriz/friendly-snippets', 'giuxtaposition/blink-cmp-copilot', @@ -34,8 +33,7 @@ return { "snippets", "buffer", "ripgrep", - "avante_commands", - "avante_mentions", + "copilot" }, providers = { ripgrep = { @@ -43,18 +41,12 @@ return { name = "rg", score_offset = -10, }, - avante_commands = { - name = "avante_commands", - module = "blink.compat.source", - score_offset = 90, - opts = {}, + copilot = { + name = "copilot", + module = "blink-cmp-copilot", + score_offset = 100, + async = true, }, - avante_mentions = { - name = "avante_mentions", - module = "blink.compat.source", - score_offset = 1000, - opts = {}, - } } }, keymap = { @@ -77,6 +69,8 @@ return { } }, menu = { + -- auto show in cmdline + auto_show = true, draw = { treesitter = { "lsp" }, columns = { diff --git a/nvim/lua/plugins/lsp.lua b/nvim/lua/plugins/lsp.lua index e1b2443..dc4c0b0 100644 --- a/nvim/lua/plugins/lsp.lua +++ b/nvim/lua/plugins/lsp.lua @@ -7,7 +7,8 @@ return { { 'de', 'Trouble diagnostics toggle focus=true', - { noremap = true, desc = 'Trouble diagnostics' } + noremap = true, + desc = 'Trouble diagnostics' } } }, diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index 901c63e..67968f3 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -164,10 +164,15 @@ return { ring = { storage = "memory", }, + picker = { + select = { + action = require('yanky.picker').actions.set_register("+") + } + } }, keys = { { "y", "(YankyYank)", mode = { "n", "x" } }, - { "fp", "YankyRingHistory", { mode = { "n", "x" }, noremap = true, silent = true, desc = 'Pick history (yanky.nvim)' } } + { "fp", "YankyRingHistory", mode = { "n", "x" }, noremap = true, silent = true, desc = 'Pick history (yanky.nvim)' } }, }, } From 91b6830d9e15769fba2c008dfb36229d6b2586d3 Mon Sep 17 00:00:00 2001 From: iofq Date: Thu, 6 Feb 2025 14:33:02 -0600 Subject: [PATCH 097/160] revert model override --- nvim/lua/plugins/ai.lua | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/nvim/lua/plugins/ai.lua b/nvim/lua/plugins/ai.lua index d0fe298..2706552 100644 --- a/nvim/lua/plugins/ai.lua +++ b/nvim/lua/plugins/ai.lua @@ -60,17 +60,20 @@ return { "zbirenbaum/copilot.lua", }, opts = { - adapters = { - copilot = function() - return require("codecompanion.adapters").extend("copilot", { - name = "copilot-claude-3.5-sonnet", - schema = { model = "claude-3.5-sonnet", }, - }) - end - }, + -- adapters = { + -- copilot = function() + -- return require("codecompanion.adapters").extend("copilot", { + -- schema = { + -- model = { + -- default = "claude-3.5-sonnet" + -- }, + -- }, + -- }) + -- end + -- }, strategies = { - chat = { adapter = "copilot-claude-3.5-sonnet", }, - inline = { adapter = "copilot-claude-3.5-sonnet", }, + chat = { adapter = "copilot", }, + inline = { adapter = "copilot", }, }, }, init = function() From df59c1b3804cdc6a9651256b287d582c17e8108e Mon Sep 17 00:00:00 2001 From: iofq Date: Thu, 13 Mar 2025 02:51:48 -0500 Subject: [PATCH 098/160] use nightly neovim, plugin cleanup --- flake.lock | 235 ++++++++++++++++++++++++++++++-- flake.nix | 2 + nix/neovim-overlay.nix | 11 +- nvim/lua/config/init.lua | 1 + nvim/lua/plugins/ai.lua | 28 ++-- nvim/lua/plugins/completion.lua | 46 ++----- nvim/lua/plugins/misc.lua | 5 - nvim/lua/plugins/snacks.lua | 31 ++++- 8 files changed, 281 insertions(+), 78 deletions(-) diff --git a/flake.lock b/flake.lock index 8ab2bdf..3a98af2 100644 --- a/flake.lock +++ b/flake.lock @@ -16,6 +16,38 @@ "type": "github" } }, + "flake-compat_2": { + "flake": false, + "locked": { + "lastModified": 1733328505, + "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_3": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, "flake-parts": { "inputs": { "nixpkgs-lib": "nixpkgs-lib" @@ -34,6 +66,48 @@ "type": "github" } }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": [ + "neovim-nightly-overlay", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1741352980, + "narHash": "sha256-+u2UunDA4Cl5Fci3m7S643HzKmIDAe+fiXrLqYsR2fs=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "f4330d22f1c5d2ba72d3d22df5597d123fdb60a9", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_3": { + "inputs": { + "nixpkgs-lib": [ + "neovim-nightly-overlay", + "hercules-ci-effects", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1738453229, + "narHash": "sha256-7H9XgNiGLKN1G1CgRh0vUL4AheZSYzPm+zmZ7vxbJdo=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "32ea77a06711b758da0ad9bd6a844c5740a87abd", + "type": "github" + }, + "original": { + "id": "flake-parts", + "type": "indirect" + } + }, "flake-utils": { "inputs": { "systems": "systems" @@ -99,6 +173,29 @@ "type": "github" } }, + "git-hooks_2": { + "inputs": { + "flake-compat": "flake-compat_3", + "gitignore": "gitignore_2", + "nixpkgs": [ + "neovim-nightly-overlay", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1741379162, + "narHash": "sha256-srpAbmJapkaqGRE3ytf3bj4XshspVR5964OX5LfjDWc=", + "owner": "cachix", + "repo": "git-hooks.nix", + "rev": "b5a62751225b2f62ff3147d0a334055ebadcd5cc", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "git-hooks.nix", + "type": "github" + } + }, "gitignore": { "inputs": { "nixpkgs": [ @@ -121,6 +218,50 @@ "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": "flake-parts_3", + "nixpkgs": [ + "neovim-nightly-overlay", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1739595404, + "narHash": "sha256-0CjCfbq0yHWexOrpO06e2WU1r5JAqR6ffy1zgM3NksI=", + "owner": "hercules-ci", + "repo": "hercules-ci-effects", + "rev": "06519cec8fb32d219006da6eacd255504a9996af", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "hercules-ci-effects", + "type": "github" + } + }, "luvit-meta": { "flake": false, "locked": { @@ -137,18 +278,58 @@ "type": "github" } }, + "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": 1741738202, + "narHash": "sha256-S98JgCHJJFBI9XFXPdn/ATjux6JfrjLN7jGHEGvxsYM=", + "owner": "nix-community", + "repo": "neovim-nightly-overlay", + "rev": "6e291160fc740378dc846f9bb402653c4e50a313", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "neovim-nightly-overlay", + "type": "github" + } + }, + "neovim-src": { + "flake": false, + "locked": { + "lastModified": 1741737177, + "narHash": "sha256-MxPM5FawrHrUywZXAHJ4+0+Wj4dITHDMHKf4aIwC9zk=", + "owner": "neovim", + "repo": "neovim", + "rev": "092529ebbf6fe566399aa47c274d708b8dea5334", + "type": "github" + }, + "original": { + "owner": "neovim", + "repo": "neovim", + "type": "github" + } + }, "nixpkgs": { "locked": { - "lastModified": 1738680400, - "narHash": "sha256-ooLh+XW8jfa+91F1nhf9OF7qhuA/y1ChLx6lXDNeY5U=", + "lastModified": 1741678040, + "narHash": "sha256-rmBsz7BBcDwfvDkxnKHmolKceGJrr0nyz5PQYZg0kMk=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "799ba5bffed04ced7067a91798353d360788b30d", + "rev": "3ee8818da146871cd570b164fc4f438f78479a50", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixos-unstable", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } @@ -167,11 +348,11 @@ }, "nixpkgs-master": { "locked": { - "lastModified": 1738831044, - "narHash": "sha256-6y2I2h4hX8d+LXLCzgu7QJ3Wvkx89R0x3WFQ5ovhwco=", + "lastModified": 1741842650, + "narHash": "sha256-gyA3ngXZroBeWdrVsM+bL63hQMUheYCrC+V78TEgBeU=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "e4b6440d7ca1649bb95bd59f39b2279db959e498", + "rev": "b1f2198021490b51fb92b8b09db97b9ba2a7b4ce", "type": "github" }, "original": { @@ -197,11 +378,28 @@ "type": "github" } }, + "nixpkgs_2": { + "locked": { + "lastModified": 1741513245, + "narHash": "sha256-7rTAMNTY1xoBwz0h7ZMtEcd8LELk9R5TzBPoHuhNSCk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e3e32b642a31e6714ec1b712de8c91a3352ce7e1", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "root": { "inputs": { "flake-utils": "flake-utils", "gen-luarc": "gen-luarc", - "nixpkgs": "nixpkgs", + "neovim-nightly-overlay": "neovim-nightly-overlay", + "nixpkgs": "nixpkgs_2", "nixpkgs-master": "nixpkgs-master" } }, @@ -219,6 +417,27 @@ "repo": "default", "type": "github" } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "neovim-nightly-overlay", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1739829690, + "narHash": "sha256-mL1szCeIsjh6Khn3nH2cYtwO5YXG6gBiTw1A30iGeDU=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "3d0579f5cc93436052d94b73925b48973a104204", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } } }, "root": "root", diff --git a/flake.nix b/flake.nix index 1bec7e0..c9a0c03 100644 --- a/flake.nix +++ b/flake.nix @@ -5,6 +5,7 @@ nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; nixpkgs-master.url = "github:NixOS/nixpkgs/master"; flake-utils.url = "github:numtide/flake-utils"; + neovim-nightly-overlay.url = "github:nix-community/neovim-nightly-overlay"; gen-luarc = { url = "github:mrcjkb/nix-gen-luarc-json"; inputs.nixpkgs.follows = "nixpkgs"; @@ -31,6 +32,7 @@ inherit system; overlays = [ neovim-overlay + inputs.neovim-nightly-overlay.overlays.default gen-luarc.overlays.default ]; }; diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index 8bc35af..b3c7409 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -2,8 +2,7 @@ {inputs}: final: prev: with final.pkgs.lib; let pkgs = final; - - pkgs-wrapNeovim = inputs.nixpkgs.legacyPackages.${pkgs.system}; + pkgs-wrapNeovim = prev; mkNvimPlugin = src: pname: pkgs.vimUtils.buildVimPlugin { @@ -14,9 +13,7 @@ with final.pkgs.lib; let all-plugins = with pkgs.vimPlugins; [ aerial-nvim - inputs.nixpkgs-master.legacyPackages.${pkgs.system}.vimPlugins.blink-cmp - blink-cmp-copilot - blink-compat + blink-cmp blink-ripgrep-nvim codecompanion-nvim copilot-lua @@ -27,7 +24,6 @@ with final.pkgs.lib; let lazy-nvim luasnip mini-nvim - neogen neogit none-ls-nvim nightfox-nvim @@ -65,9 +61,6 @@ with final.pkgs.lib; let python312Packages.jedi-language-server ruby-lsp - # debuggers - delve - #other jujutsu ]; diff --git a/nvim/lua/config/init.lua b/nvim/lua/config/init.lua index ddc501b..09e91cb 100644 --- a/nvim/lua/config/init.lua +++ b/nvim/lua/config/init.lua @@ -80,6 +80,7 @@ vim.diagnostic.config { -- random keymaps vim.keymap.set('n', 'gq', vim.cmd.bdelete, { silent = true }) +vim.keymap.set('n', 'gQ', '%bd|e#', { silent = true }) vim.keymap.set('n', 'gt', vim.cmd.bnext, { silent = true }) vim.keymap.set('n', 'gr', vim.cmd.bprev, { silent = true }) vim.keymap.set('n', 'tr', 'gT', { noremap = true, silent = true }) diff --git a/nvim/lua/plugins/ai.lua b/nvim/lua/plugins/ai.lua index 2706552..3d88f34 100644 --- a/nvim/lua/plugins/ai.lua +++ b/nvim/lua/plugins/ai.lua @@ -11,14 +11,22 @@ return { } }, opts = { - panel = { enabled = true, keymap = { accept = "ga" } }, + panel = { + enabled = true, + auto_refresh = true, + keymap = { + jump_prev = "", + jump_next = "", + accept = "", + } + }, suggestion = { enabled = true, auto_trigger = true, + hide_during_completion = true, keymap = { accept = "", next = "", - dismiss = "", }, }, completion = { @@ -60,25 +68,11 @@ return { "zbirenbaum/copilot.lua", }, opts = { - -- adapters = { - -- copilot = function() - -- return require("codecompanion.adapters").extend("copilot", { - -- schema = { - -- model = { - -- default = "claude-3.5-sonnet" - -- }, - -- }, - -- }) - -- end - -- }, strategies = { chat = { adapter = "copilot", }, inline = { adapter = "copilot", }, }, }, - init = function() - vim.api.nvim_create_user_command('CC', ':CodeCompanion', {}) - end, keys = { { 'ac', @@ -90,12 +84,14 @@ return { 'as', 'CodeCompanionChat Add', noremap = true, + mode = { "n", "v" }, desc = 'Copilot chat add selection' }, { 'aa', 'CodeCompanionActions', noremap = true, + mode = { "n", "v" }, desc = 'Copilot inline' } } diff --git a/nvim/lua/plugins/completion.lua b/nvim/lua/plugins/completion.lua index 7e48e87..fda1de5 100644 --- a/nvim/lua/plugins/completion.lua +++ b/nvim/lua/plugins/completion.lua @@ -3,28 +3,9 @@ return { 'saghen/blink.cmp', event = "VeryLazy", dependencies = { - 'saghen/blink.compat', 'rafamadriz/friendly-snippets', - 'giuxtaposition/blink-cmp-copilot', 'mikavilpas/blink-ripgrep.nvim' }, - config = function(_, opts) - require('blink.cmp').setup(opts) - vim.api.nvim_create_autocmd('User', { - pattern = 'BlinkCmpMenuOpen', - callback = function() - require("copilot.suggestion").dismiss() - vim.b.copilot_suggestion_hidden = true - end, - }) - - vim.api.nvim_create_autocmd('User', { - pattern = 'BlinkCmpMenuClose', - callback = function() - vim.b.copilot_suggestion_hidden = false - end, - }) - end, opts = { sources = { default = { @@ -33,24 +14,22 @@ return { "snippets", "buffer", "ripgrep", - "copilot" }, providers = { ripgrep = { module = "blink-ripgrep", name = "rg", score_offset = -10, - }, - copilot = { - name = "copilot", - module = "blink-cmp-copilot", - score_offset = 100, async = true, }, } }, - keymap = { - [""] = { "show", "select_and_accept" } + cmdline = { + completion = { + menu = { + auto_show = true, + }, + }, }, completion = { documentation = { @@ -63,14 +42,10 @@ return { auto_insert = true, } }, - accept = { - auto_brackets = { - enabled = true - } + ghost_text = { + enabled = true, }, menu = { - -- auto show in cmdline - auto_show = true, draw = { treesitter = { "lsp" }, columns = { @@ -80,12 +55,9 @@ return { } }, trigger = { - show_on_keyword = false, + show_on_keyword = true, } }, - appearance = { - use_nvim_cmp_as_default = true, - }, signature = { enabled = true } } }, diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index 67968f3..e8144c5 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -4,11 +4,6 @@ return { event = "InsertEnter", config = true }, - { - 'danymat/neogen', - event = 'VeryLazy', - config = true, - }, { 'jinh0/eyeliner.nvim', event = 'VeryLazy', diff --git a/nvim/lua/plugins/snacks.lua b/nvim/lua/plugins/snacks.lua index b0f8330..f323ea8 100644 --- a/nvim/lua/plugins/snacks.lua +++ b/nvim/lua/plugins/snacks.lua @@ -25,6 +25,10 @@ return { files = { hidden = true }, grep = { hidden = true }, explorer = { hidden = true }, + git_files = { untracked = true }, + smart = { + multi = { "buffers", "recent", "files", "git_files" } + } }, }, actions = { @@ -53,14 +57,20 @@ return { vim.api.nvim_set_hl(0, 'SnacksPickerDir', { fg = '#cccccc' }) end, keys = { - { '', function() Snacks.terminal.toggle() end, mode = { "n", "t" }, noremap = true, desc = 'terminal open' }, - { 'm', function() Snacks.words.jump(1, true) end, noremap = true, desc = 'next reference' }, - { 'M', function() Snacks.words.jump(-1, true) end, noremap = true, desc = 'next reference' }, + { '', function() Snacks.terminal.toggle() end, mode = { "n", "t" }, noremap = true, desc = 'terminal open' }, + { 't', function() Snacks.terminal.toggle('$SHELL') end, mode = { "n", "t" }, noremap = true, desc = 'terminal open' }, + { 'm', function() Snacks.words.jump(1, true) end, noremap = true, desc = 'next reference' }, + { 'M', function() Snacks.words.jump(-1, true) end, noremap = true, desc = 'next reference' }, { 'ff', function() Snacks.picker.smart() end, { noremap = true, silent = true, desc = 'Fuzzy find files' } }, + { + 'fe', + function() Snacks.picker.explorer() end, + { noremap = true, silent = true, desc = 'snacks explorer' } + }, { 'fg', function() Snacks.picker.files() end, @@ -81,6 +91,16 @@ return { function() Snacks.picker.pickers() end, { noremap = true, silent = true, desc = 'See all pickers' } }, + { + 'fd', + function() Snacks.picker.diagnostics() end, + { noremap = true, silent = true, desc = 'Pick diagnostics' } + }, + { + 'fj', + function() Snacks.picker.jumps() end, + { noremap = true, silent = true, desc = 'Pick jumps' } + }, { 'f.', function() Snacks.picker.resume() end, @@ -91,6 +111,11 @@ return { function() Snacks.picker.buffers() end, { noremap = true, silent = true, desc = 'Fuzzy find buffers' } }, + { + 'fn', + function() Snacks.picker.notifications() end, + { noremap = true, silent = true, desc = 'pick notifications' } + }, } } } From dab37cf7a5ab1a20ed2bd5e5c59c08d3e46f34d4 Mon Sep 17 00:00:00 2001 From: iofq Date: Thu, 13 Mar 2025 03:24:09 -0500 Subject: [PATCH 099/160] update deprecated cache action step --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c8e5cb1..907bff6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -16,7 +16,7 @@ jobs: steps: - uses: actions/checkout@v3 - uses: DeterminateSystems/nix-installer-action@main - - uses: DeterminateSystems/magic-nix-cache-action@main + - uses: DeterminateSystems/flakehub-cache-action@main - name: Run `nix bundle` id: build run: | From 5043280c650003793f85b60f7fc15f13ecc1ccea Mon Sep 17 00:00:00 2001 From: iofq Date: Fri, 14 Mar 2025 12:47:25 -0500 Subject: [PATCH 100/160] linters/formatters --- flake.nix | 2 +- nix/neovim-overlay.nix | 4 +++- nvim/lua/config/init.lua | 33 ++++++++++++++++++++++++++++++--- nvim/lua/plugins/lsp.lua | 37 ++++++++++++++++++++++++++----------- nvim/lua/plugins/mini.lua | 9 +++++++-- nvim/lua/plugins/snacks.lua | 18 +++++++++++++----- 6 files changed, 80 insertions(+), 23 deletions(-) diff --git a/flake.nix b/flake.nix index c9a0c03..eaec499 100644 --- a/flake.nix +++ b/flake.nix @@ -31,9 +31,9 @@ pkgs = import nixpkgs { inherit system; overlays = [ - neovim-overlay inputs.neovim-nightly-overlay.overlays.default gen-luarc.overlays.default + neovim-overlay ]; }; shell = pkgs.mkShell { diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index b3c7409..caa4247 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -16,6 +16,7 @@ with final.pkgs.lib; let blink-cmp blink-ripgrep-nvim codecompanion-nvim + conform-nvim copilot-lua diffview-nvim eyeliner-nvim @@ -25,12 +26,12 @@ with final.pkgs.lib; let luasnip mini-nvim neogit - none-ls-nvim nightfox-nvim nvim-autopairs # nvim-dap # nvim-dap-go # nvim-dap-ui + nvim-lint nvim-lspconfig # nvim-nio nvim-treesitter-context @@ -52,6 +53,7 @@ with final.pkgs.lib; let # linters puppet-lint yamllint + jq # LSPs gopls diff --git a/nvim/lua/config/init.lua b/nvim/lua/config/init.lua index 09e91cb..31dd5be 100644 --- a/nvim/lua/config/init.lua +++ b/nvim/lua/config/init.lua @@ -1,5 +1,6 @@ +vim.opt.autowrite = true vim.opt.backspace = 'indent,eol,start' -vim.opt.clipboard = 'unnamedplus' +vim.opt.confirm = true vim.opt.completeopt = { 'menu', 'menuone', 'noselect' } vim.opt.expandtab = true -- insert tabs as spaces vim.opt.inccommand = 'split' -- incremental live completion @@ -80,7 +81,7 @@ vim.diagnostic.config { -- random keymaps vim.keymap.set('n', 'gq', vim.cmd.bdelete, { silent = true }) -vim.keymap.set('n', 'gQ', '%bd|e#', { silent = true }) +vim.keymap.set('n', 'gQ', '%bd|e#', { silent = true }) vim.keymap.set('n', 'gt', vim.cmd.bnext, { silent = true }) vim.keymap.set('n', 'gr', vim.cmd.bprev, { silent = true }) vim.keymap.set('n', 'tr', 'gT', { noremap = true, silent = true }) @@ -88,4 +89,30 @@ vim.keymap.set('n', 'tt', 'gt', { noremap = true, silent = true }) vim.keymap.set('n', 'n', 'nzz', { noremap = true, silent = true }) vim.keymap.set('n', 'N', 'Nzz', { noremap = true, silent = true }) vim.keymap.set({ 'v', 'i' }, 'wq', 'l', { noremap = true, silent = true }) -vim.keymap.set('n', 'x', '"rd', { remap = true, silent = true }) +vim.keymap.set('v', "<", "", ">gv") + +-- clipboard +vim.keymap.set({ 'n', 'v', 'x' }, 'y', '"+y', { noremap = true, silent = true }) +vim.keymap.set('n', 'yy', '"+yy', { noremap = true, silent = true }) +vim.keymap.set({ 'n', 'v', 'x' }, 'p', '"+p', { noremap = true, silent = true }) + +-- 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, +}) diff --git a/nvim/lua/plugins/lsp.lua b/nvim/lua/plugins/lsp.lua index dc4c0b0..5b890bd 100644 --- a/nvim/lua/plugins/lsp.lua +++ b/nvim/lua/plugins/lsp.lua @@ -129,9 +129,6 @@ return { vim.keymap.set('n', 'dh', function() vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled()) end, { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP hints toggle' }) - vim.keymap.set('n', 'df', function() - vim.lsp.buf.format { async = true } - end, { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP format' }) -- Auto-refresh code lenses if not client then return @@ -153,16 +150,34 @@ return { end, }, { - 'nvimtools/none-ls.nvim', + 'stevearc/conform.nvim', + event = 'VeryLazy', + opts = { + notify_no_formatters = false, + formatters_by_ft = { + json = { "jq" }, + puppet = { "puppet-lint" }, + ['*'] = { 'trim_whitespace' } + }, + format_on_save = { + timeout_ms = 500, + lsp_format = "last", + }, + }, + }, + { + 'mfussenegger/nvim-lint', event = 'VeryLazy', config = function() - local null = require('null-ls') - null.setup { - sources = { - null.builtins.diagnostics.puppet_lint, - null.builtins.diagnostics.yamllint, - }, + require("lint").linters_by_ft = { + docker = { "hadolint" }, + yaml = { "yamllint" }, + puppet = { "puppet-lint" }, + sh = { "shellcheck" }, + go = { "golangcilint" }, + ruby = { "rubocop" }, } - end, + vim.api.nvim_command('au BufWritePost * lua require("lint").try_lint()') + end }, } diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index 5d95310..eb365a0 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -2,6 +2,7 @@ return { { 'echasnovski/mini.nvim', lazy = false, + dependencies = { "folke/snacks.nvim" }, config = function() require('mini.basics').setup { mappings = { windows = true, }, } require('mini.tabline').setup({ @@ -50,8 +51,6 @@ return { require('mini.jump2d').setup({ mappings = { start_jumping = 'S' } }); require('mini.surround').setup() require('mini.splitjoin').setup { detect = { separator = '[,;\n]' }, } - require('mini.trailspace').setup() - vim.api.nvim_create_user_command('Trim', require('mini.trailspace').trim, {}) local miniclue = require('mini.clue') miniclue.setup { @@ -136,6 +135,12 @@ return { ) 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/snacks.lua b/nvim/lua/plugins/snacks.lua index f323ea8..a7fd6ee 100644 --- a/nvim/lua/plugins/snacks.lua +++ b/nvim/lua/plugins/snacks.lua @@ -6,6 +6,8 @@ return { priority = 1000, opts = { bigfile = { enabled = true }, + dim = { enabled = true }, + quickfile = { enabled = true }, notifier = { enabled = true }, scope = { enabled = true }, terminal = { enabled = true }, @@ -57,10 +59,11 @@ return { vim.api.nvim_set_hl(0, 'SnacksPickerDir', { fg = '#cccccc' }) end, keys = { - { '', function() Snacks.terminal.toggle() end, mode = { "n", "t" }, noremap = true, desc = 'terminal open' }, - { 't', function() Snacks.terminal.toggle('$SHELL') end, mode = { "n", "t" }, noremap = true, desc = 'terminal open' }, - { 'm', function() Snacks.words.jump(1, true) end, noremap = true, desc = 'next reference' }, - { 'M', function() Snacks.words.jump(-1, true) end, noremap = true, desc = 'next reference' }, + { '', function() Snacks.terminal.toggle() end, mode = { "n", "t" }, noremap = true, desc = 'terminal open' }, + { '\\\\', function() Snacks.terminal.toggle('$SHELL') end, mode = { "n", "t" }, noremap = true, desc = 'terminal open' }, + { 'm', function() Snacks.words.jump(1, true) end, noremap = true, desc = 'next reference' }, + { 'M', function() Snacks.words.jump(-1, true) end, noremap = true, desc = 'next reference' }, + { '\\z', function() Snacks.dim() end, noremap = true, desc = 'dim' }, { 'ff', function() Snacks.picker.smart() end, @@ -68,9 +71,14 @@ return { }, { 'fe', - function() Snacks.picker.explorer() end, + function() Snacks.explorer() end, { noremap = true, silent = true, desc = 'snacks explorer' } }, + { + 'fE', + function() Snacks.explorer.reveal() end, + { noremap = true, silent = true, desc = 'snacks explorer open current file' } + }, { 'fg', function() Snacks.picker.files() end, From 851e345bca464bd538d42abf2abf1f5452fa02cc Mon Sep 17 00:00:00 2001 From: iofq Date: Fri, 14 Mar 2025 18:09:01 -0500 Subject: [PATCH 101/160] use new default LSP mappings as inspiration --- nix/neovim-overlay.nix | 1 - nvim/lua/config/init.lua | 12 +++---- nvim/lua/plugins/lsp.lua | 68 ++++++++++++++++----------------------- nvim/lua/plugins/misc.lua | 24 ++------------ 4 files changed, 33 insertions(+), 72 deletions(-) diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index caa4247..669a6d7 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -12,7 +12,6 @@ with final.pkgs.lib; let mkNeovim = pkgs.callPackage ./mkNeovim.nix { inherit pkgs-wrapNeovim; }; all-plugins = with pkgs.vimPlugins; [ - aerial-nvim blink-cmp blink-ripgrep-nvim codecompanion-nvim diff --git a/nvim/lua/config/init.lua b/nvim/lua/config/init.lua index 31dd5be..5535ce6 100644 --- a/nvim/lua/config/init.lua +++ b/nvim/lua/config/init.lua @@ -80,14 +80,10 @@ vim.diagnostic.config { } -- random keymaps -vim.keymap.set('n', 'gq', vim.cmd.bdelete, { silent = true }) -vim.keymap.set('n', 'gQ', '%bd|e#', { silent = true }) -vim.keymap.set('n', 'gt', vim.cmd.bnext, { silent = true }) -vim.keymap.set('n', 'gr', vim.cmd.bprev, { silent = true }) -vim.keymap.set('n', 'tr', 'gT', { noremap = true, silent = true }) -vim.keymap.set('n', 'tt', 'gt', { noremap = true, silent = true }) -vim.keymap.set('n', 'n', 'nzz', { noremap = true, silent = true }) -vim.keymap.set('n', 'N', 'Nzz', { noremap = true, silent = true }) +vim.keymap.set('n', 'gq', vim.cmd.bdelete, { noremap = true, silent = true }) +vim.keymap.set('n', 'gQ', '%bd|e#', { noremap = true, silent = true }) +vim.keymap.set('n', '', vim.cmd.bnext, { noremap = true, silent = true }) +vim.keymap.set('n', '', vim.cmd.bprev, { noremap = true, silent = true }) vim.keymap.set({ 'v', 'i' }, 'wq', 'l', { noremap = true, silent = true }) vim.keymap.set('v', "<", "", ">gv") diff --git a/nvim/lua/plugins/lsp.lua b/nvim/lua/plugins/lsp.lua index 5b890bd..070549e 100644 --- a/nvim/lua/plugins/lsp.lua +++ b/nvim/lua/plugins/lsp.lua @@ -2,11 +2,18 @@ return { { 'folke/trouble.nvim', event = 'VeryLazy', - config = true, + opts = { + pinned = true, + win = { + size = 0.25, + position = 'right', + type = 'split' + }, + }, keys = { { - 'de', - 'Trouble diagnostics toggle focus=true', + 'gre', + 'Trouble diagnostics toggle', noremap = true, desc = 'Trouble diagnostics' } @@ -17,6 +24,7 @@ return { event = 'VeryLazy', dependencies = { 'folke/snacks.nvim', + 'folke/trouble.nvim', 'saghen/blink.cmp', }, config = function() @@ -83,66 +91,44 @@ return { callback = function(ev) local bufnr = ev.buf local client = vim.lsp.get_client_by_id(ev.data.client_id) - vim.api.nvim_command('au BufWritePre lua vim.lsp.buf.format { async = false }') + if not client then + return + end vim.keymap.set( 'n', 'K', vim.lsp.buf.hover, - { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP hover' } + { buffer = ev.buf, noremap = true, silent = true, desc = 'vim.lsp.buf.hover()' } ) vim.keymap.set( 'n', - 'rn', - vim.lsp.buf.rename, - { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP Rename' } - ) - vim.keymap.set( - { 'n', 'v' }, - 'da', - vim.lsp.buf.code_action, - { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP code action' } + 'grt', + 'Trouble lsp toggle focus=true ', + { buffer = ev.buf, noremap = true, silent = true, desc = 'Trouble LSP ' } ) vim.keymap.set( 'n', - 'df', - function() Snacks.picker.lsp_definitions() end, - { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP definitions' } + 'grs', + 'Trouble lsp_document_symbols toggle win.position=left ', + { buffer = ev.buf, noremap = true, silent = true, desc = 'Trouble LSP symbols' } ) vim.keymap.set( 'n', - 'di', - function() Snacks.picker.lsp_implementations() end, - { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP implementations' } - ) - vim.keymap.set( - 'n', - 'dr', - function() Snacks.picker.lsp_references() end, - { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP references' } - ) - vim.keymap.set( - 'n', - 'dl', + 'grl', vim.lsp.codelens.run, - { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP codelens' } + { buffer = ev.buf, noremap = true, silent = true, desc = 'vim.lsp.codelens.run()' } ) - vim.keymap.set('n', 'dh', function() + vim.keymap.set('n', 'grh', function() vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled()) end, { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP hints toggle' }) -- Auto-refresh code lenses - if not client then - return - end - local group = vim.api.nvim_create_augroup(string.format('lsp-%s-%s', bufnr, client.id), {}) if client.server_capabilities.codeLensProvider then vim.api.nvim_create_autocmd({ 'InsertLeave', 'BufWritePost', 'TextChanged' }, { - group = group, - callback = function() - vim.lsp.codelens.refresh { bufnr = bufnr } - end, + group = vim.api.nvim_create_augroup(string.format('lsp-%s-%s', bufnr, client.id), {}), + callback = function() vim.lsp.codelens.refresh { bufnr = bufnr } end, buffer = bufnr, }) - vim.lsp.codelens.refresh { bufnr = bufnr } + vim.lsp.codelens.refresh() end end, }) diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index e8144c5..182fc85 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -76,7 +76,6 @@ return { "mini", "treesitter", "neogit", - "aerial" } }, }, @@ -100,14 +99,14 @@ return { on_attach = function() local gs = package.loaded.gitsigns vim.keymap.set('n', 'gg', gs.preview_hunk, { desc = 'git preview hunk' }) - vim.keymap.set('n', 'gr', gs.reset_hunk, { desc = 'git reset hunk' }) + vim.keymap.set('n', 'gR', gs.reset_hunk, { desc = 'git reset hunk' }) vim.keymap.set('n', 'gs', gs.stage_hunk, { desc = 'git stage hunk' }) vim.keymap.set('n', 'gd', gs.diffthis, { desc = 'git diff hunk' }) vim.keymap.set('n', 'gb', function() gs.blame_line { full = true } end, { desc = 'git blame_line current' }) vim.keymap.set('n', 'gB', gs.toggle_current_line_blame, { desc = 'git blame_line toggle' }) - vim.keymap.set('v', 'gr', function() + vim.keymap.set('v', 'gR', function() gs.reset_hunk { vim.fn.line('.'), vim.fn.line('v') } end, { desc = 'git reset hunk' }) @@ -134,25 +133,6 @@ return { end, }, }, - { - 'stevearc/aerial.nvim', - cmd = { 'AerialToggle' }, - keys = { - { 'na', 'AerialToggle', desc = 'Toggle aerial' }, - }, - opts = { - backends = { - "lsp", - "treesitter", - "markdown" - }, - filter_kind = false, - layout = { - default_direction = "left", - }, - autojump = true, - }, - }, { 'gbprod/yanky.nvim', opts = { From cd60d7959bfca62c90ed791b23ba2127e429954d Mon Sep 17 00:00:00 2001 From: iofq Date: Fri, 14 Mar 2025 18:38:47 -0500 Subject: [PATCH 102/160] more trouble.nvim tweaks --- nix/neovim-overlay.nix | 1 - nvim/lua/plugins/misc.lua | 11 ----------- nvim/lua/plugins/snacks.lua | 35 ++++++++++++++++++----------------- 3 files changed, 18 insertions(+), 29 deletions(-) diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index 669a6d7..cd6b085 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -40,7 +40,6 @@ with final.pkgs.lib; let scope-nvim snacks-nvim trouble-nvim - undotree yanky-nvim ]; diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index 182fc85..9d2fbd7 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -53,17 +53,6 @@ return { }, }, }, - { - 'mbbill/undotree', - event = 'VeryLazy', - keys = { - { 'nu', 'UndotreeToggle' }, - }, - config = function() - vim.g.undotree_ShortIndicators = 1 - vim.g.undotree_SetFocusWhenToggle = 1 - end, - }, { 'EdenEast/nightfox.nvim', lazy = false, diff --git a/nvim/lua/plugins/snacks.lua b/nvim/lua/plugins/snacks.lua index a7fd6ee..f572c56 100644 --- a/nvim/lua/plugins/snacks.lua +++ b/nvim/lua/plugins/snacks.lua @@ -22,16 +22,14 @@ return { return vim.o.columns >= 120 and "telescope" or "vertical" end }, - picker = { - sources = { - files = { hidden = true }, - grep = { hidden = true }, - explorer = { hidden = true }, - git_files = { untracked = true }, - smart = { - multi = { "buffers", "recent", "files", "git_files" } - } - }, + sources = { + files = { hidden = true }, + grep = { hidden = true }, + explorer = { hidden = true }, + git_files = { untracked = true }, + smart = { + multi = { "buffers", "recent", "files", "git_files" } + } }, actions = { trouble_open = function(...) @@ -42,8 +40,7 @@ return { input = { keys = { ["wq"] = { "close", mode = "i" }, - [""] = { "trouble_open", mode = { "n", "i" }, - }, + [""] = { "trouble_open", mode = { "n", "i" } }, } }, list = { @@ -63,7 +60,6 @@ return { { '\\\\', function() Snacks.terminal.toggle('$SHELL') end, mode = { "n", "t" }, noremap = true, desc = 'terminal open' }, { 'm', function() Snacks.words.jump(1, true) end, noremap = true, desc = 'next reference' }, { 'M', function() Snacks.words.jump(-1, true) end, noremap = true, desc = 'next reference' }, - { '\\z', function() Snacks.dim() end, noremap = true, desc = 'dim' }, { 'ff', function() Snacks.picker.smart() end, @@ -81,7 +77,7 @@ return { }, { 'fg', - function() Snacks.picker.files() end, + function() Snacks.picker.git_files() end, { noremap = true, silent = true, desc = 'Fuzzy find files' } }, { @@ -100,9 +96,14 @@ return { { noremap = true, silent = true, desc = 'See all pickers' } }, { - 'fd', - function() Snacks.picker.diagnostics() end, - { noremap = true, silent = true, desc = 'Pick diagnostics' } + 'f\'', + function() Snacks.picker.marks() end, + { noremap = true, silent = true, desc = 'Pick marks' } + }, + { + 'fu', + function() Snacks.picker.undo() end, + { noremap = true, silent = true, desc = 'Pick undotree' } }, { 'fj', From 9028ed4893fa885e0081b33cd23de49b1fe3f619 Mon Sep 17 00:00:00 2001 From: iofq Date: Fri, 14 Mar 2025 19:14:00 -0500 Subject: [PATCH 103/160] enable render-markdown --- nvim/lua/plugins/misc.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index 9d2fbd7..e1fa9f3 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -12,7 +12,8 @@ return { vim.api.nvim_set_hl(0, 'EyelinerSecondary', { underline = true }) end, }, - { 'tiagovla/scope.nvim', event = 'VeryLazy', config = true }, + { 'tiagovla/scope.nvim', event = 'VeryLazy', config = true }, + { 'MeanderingProgrammer/render-markdown.nvim', event = 'VeryLazy', config = true }, { 'sindrets/diffview.nvim', event = 'VeryLazy', From 7e87ede672edd55e0fccbad2460e6a91cc08d9c3 Mon Sep 17 00:00:00 2001 From: iofq Date: Sat, 15 Mar 2025 00:47:23 -0500 Subject: [PATCH 104/160] build(flake): enable for all systems --- .envrc | 1 + flake.nix | 14 +++++++------- nix/mkNeovim.nix | 3 ++- nix/neovim-overlay.nix | 12 ++++++++++++ nvim/lua/plugins/misc.lua | 33 +++++++++++++++++---------------- 5 files changed, 39 insertions(+), 24 deletions(-) diff --git a/.envrc b/.envrc index a1d3540..6ea6480 100644 --- a/.envrc +++ b/.envrc @@ -1 +1,2 @@ +watch_file nix/* use flake . -Lv diff --git a/flake.nix b/flake.nix index eaec499..ee4dbe2 100644 --- a/flake.nix +++ b/flake.nix @@ -19,15 +19,12 @@ gen-luarc, ... }: let - supportedSystems = [ - "x86_64-linux" - "aarch64-linux" - "x86_64-darwin" - "aarch64-darwin" - ]; + systems = builtins.attrNames nixpkgs.legacyPackages; + + # This is where the Neovim derivation is built. neovim-overlay = import ./nix/neovim-overlay.nix {inherit inputs;}; in - flake-utils.lib.eachSystem supportedSystems (system: let + flake-utils.lib.eachSystem systems (system: let pkgs = import nixpkgs { inherit system; overlays = [ @@ -43,9 +40,12 @@ nil stylua luajitPackages.luacheck + nvim-dev ]; shellHook = '' ln -fs ${pkgs.nvim-luarc-json} .luarc.json + # allow quick iteration of lua configs + ln -Tfns $PWD/nvim ~/.config/nvim-dev ''; }; in { diff --git a/nix/mkNeovim.nix b/nix/mkNeovim.nix index 95975ff..08ffcaf 100644 --- a/nix/mkNeovim.nix +++ b/nix/mkNeovim.nix @@ -34,6 +34,7 @@ with lib; # 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, }: let # This is the structure of a plugin definition. # Each plugin in the `plugins` argument list can also be defined as this attrset @@ -176,7 +177,7 @@ with lib; + extraMakeWrapperLuaCArgs + " " + extraMakeWrapperLuaArgs; - wrapRc = true; + wrapRc = wrapRc; }); isCustomAppName = appName != null && appName != "nvim"; diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index cd6b085..bfe71a7 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -21,6 +21,7 @@ with final.pkgs.lib; let eyeliner-nvim friendly-snippets gitsigns-nvim + hunk-nvim lazy-nvim luasnip mini-nvim @@ -83,6 +84,17 @@ in { ]; }; + # 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 { + plugins = all-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 { plugins = all-plugins; }; diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index e1fa9f3..c1b786a 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -38,22 +38,22 @@ return { { 'nb', vim.cmd.DiffviewOpen, noremap = true, desc = 'diffview open' } }, }, - { - 'NeogitOrg/neogit', - opts = { - disable_builtin_notifications = true, - integrations = { - diffview = true, - }, - }, - keys = { - { - 'ng', - function() require('neogit').open() end, - { noremap = true, silent = true, desc = 'Neogit' }, - }, - }, - }, + -- { + -- 'NeogitOrg/neogit', + -- opts = { + -- disable_builtin_notifications = true, + -- integrations = { + -- diffview = true, + -- }, + -- }, + -- keys = { + -- { + -- 'ng', + -- function() require('neogit').open() end, + -- { noremap = true, silent = true, desc = 'Neogit' }, + -- }, + -- }, + -- }, { 'EdenEast/nightfox.nvim', lazy = false, @@ -123,6 +123,7 @@ return { end, }, }, + { '/julienvincent/hunk.nvim', event = 'VeryLazy', opts = {} }, { 'gbprod/yanky.nvim', opts = { From 4dfe6c4c33be8c3cac301eac401eb3a54c3e3ba5 Mon Sep 17 00:00:00 2001 From: iofq Date: Sat, 15 Mar 2025 01:34:46 -0500 Subject: [PATCH 105/160] refactor(flake): tidy up inputs attrset --- flake.lock | 54 +++---- flake.nix | 17 +- nix/neovim-overlay.nix | 5 +- nvim/lua/config/init.lua | 35 +---- nvim/lua/plugins/ai.lua | 23 +-- nvim/lua/plugins/completion.lua | 94 ++++------- nvim/lua/plugins/lsp.lua | 24 ++- nvim/lua/plugins/misc.lua | 41 ++--- nvim/lua/plugins/snacks.lua | 265 +++++++++++++++++--------------- 9 files changed, 263 insertions(+), 295 deletions(-) diff --git a/flake.lock b/flake.lock index 3a98af2..2ad9b49 100644 --- a/flake.lock +++ b/flake.lock @@ -96,11 +96,11 @@ ] }, "locked": { - "lastModified": 1738453229, - "narHash": "sha256-7H9XgNiGLKN1G1CgRh0vUL4AheZSYzPm+zmZ7vxbJdo=", + "lastModified": 1741352980, + "narHash": "sha256-+u2UunDA4Cl5Fci3m7S643HzKmIDAe+fiXrLqYsR2fs=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "32ea77a06711b758da0ad9bd6a844c5740a87abd", + "rev": "f4330d22f1c5d2ba72d3d22df5597d123fdb60a9", "type": "github" }, "original": { @@ -183,11 +183,11 @@ ] }, "locked": { - "lastModified": 1741379162, - "narHash": "sha256-srpAbmJapkaqGRE3ytf3bj4XshspVR5964OX5LfjDWc=", + "lastModified": 1742649964, + "narHash": "sha256-DwOTp7nvfi8mRfuL1escHDXabVXFGT1VlPD1JHrtrco=", "owner": "cachix", "repo": "git-hooks.nix", - "rev": "b5a62751225b2f62ff3147d0a334055ebadcd5cc", + "rev": "dcf5072734cb576d2b0c59b2ac44f5050b5eac82", "type": "github" }, "original": { @@ -249,11 +249,11 @@ ] }, "locked": { - "lastModified": 1739595404, - "narHash": "sha256-0CjCfbq0yHWexOrpO06e2WU1r5JAqR6ffy1zgM3NksI=", + "lastModified": 1742014779, + "narHash": "sha256-I6fG1zrfdLFcp/imGZElig0BJO3YU0QEXLgvwWoOpJ8=", "owner": "hercules-ci", "repo": "hercules-ci-effects", - "rev": "06519cec8fb32d219006da6eacd255504a9996af", + "rev": "524637ef84c177661690b924bf64a1ce18072a2c", "type": "github" }, "original": { @@ -289,11 +289,11 @@ "treefmt-nix": "treefmt-nix" }, "locked": { - "lastModified": 1741738202, - "narHash": "sha256-S98JgCHJJFBI9XFXPdn/ATjux6JfrjLN7jGHEGvxsYM=", + "lastModified": 1743293377, + "narHash": "sha256-DqvBHtTslU0E+XMW6xM4SY3UD3+nHAAIXHag0zukrpc=", "owner": "nix-community", "repo": "neovim-nightly-overlay", - "rev": "6e291160fc740378dc846f9bb402653c4e50a313", + "rev": "3f10166b5b818227b9d7728f97e67e11cdf27ffd", "type": "github" }, "original": { @@ -305,11 +305,11 @@ "neovim-src": { "flake": false, "locked": { - "lastModified": 1741737177, - "narHash": "sha256-MxPM5FawrHrUywZXAHJ4+0+Wj4dITHDMHKf4aIwC9zk=", + "lastModified": 1743289921, + "narHash": "sha256-0gsBH+wMZJaXb95GKP6OZmtyhlJh0lS/gsn6J8rxt6k=", "owner": "neovim", "repo": "neovim", - "rev": "092529ebbf6fe566399aa47c274d708b8dea5334", + "rev": "99529577cc9f5229cbb3dac8ab4782bd43094102", "type": "github" }, "original": { @@ -320,11 +320,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1741678040, - "narHash": "sha256-rmBsz7BBcDwfvDkxnKHmolKceGJrr0nyz5PQYZg0kMk=", + "lastModified": 1743076231, + "narHash": "sha256-yQugdVfi316qUfqzN8JMaA2vixl+45GxNm4oUfXlbgw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "3ee8818da146871cd570b164fc4f438f78479a50", + "rev": "6c5963357f3c1c840201eda129a99d455074db04", "type": "github" }, "original": { @@ -348,11 +348,11 @@ }, "nixpkgs-master": { "locked": { - "lastModified": 1741842650, - "narHash": "sha256-gyA3ngXZroBeWdrVsM+bL63hQMUheYCrC+V78TEgBeU=", + "lastModified": 1743392618, + "narHash": "sha256-lc4l0nV5WgnS4wuZrX7Na2tRBEpe2IzWmLnhm3+t3Tk=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "b1f2198021490b51fb92b8b09db97b9ba2a7b4ce", + "rev": "cd6f6791e94d08b983fe6d127ec6942176737f6a", "type": "github" }, "original": { @@ -380,11 +380,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1741513245, - "narHash": "sha256-7rTAMNTY1xoBwz0h7ZMtEcd8LELk9R5TzBPoHuhNSCk=", + "lastModified": 1743315132, + "narHash": "sha256-6hl6L/tRnwubHcA4pfUUtk542wn2Om+D4UnDhlDW9BE=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "e3e32b642a31e6714ec1b712de8c91a3352ce7e1", + "rev": "52faf482a3889b7619003c0daec593a1912fddc1", "type": "github" }, "original": { @@ -426,11 +426,11 @@ ] }, "locked": { - "lastModified": 1739829690, - "narHash": "sha256-mL1szCeIsjh6Khn3nH2cYtwO5YXG6gBiTw1A30iGeDU=", + "lastModified": 1743081648, + "narHash": "sha256-WRAylyYptt6OX5eCEBWyTwOEqEtD6zt33rlUkr6u3cE=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "3d0579f5cc93436052d94b73925b48973a104204", + "rev": "29a3d7b768c70addce17af0869f6e2bd8f5be4b7", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index ee4dbe2..4571818 100644 --- a/flake.nix +++ b/flake.nix @@ -10,13 +10,17 @@ url = "github:mrcjkb/nix-gen-luarc-json"; inputs.nixpkgs.follows = "nixpkgs"; }; + # 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, - gen-luarc, ... }: let systems = builtins.attrNames nixpkgs.legacyPackages; @@ -27,10 +31,14 @@ flake-utils.lib.eachSystem systems (system: let pkgs = import nixpkgs { inherit system; + config.allowUnfree = true; overlays = [ - inputs.neovim-nightly-overlay.overlays.default - gen-luarc.overlays.default + # inputs.neovim-nightly-overlay.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. + inputs.gen-luarc.overlays.default ]; }; shell = pkgs.mkShell { @@ -43,6 +51,7 @@ 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 diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index bfe71a7..df3df0f 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -13,17 +13,15 @@ with final.pkgs.lib; let all-plugins = with pkgs.vimPlugins; [ blink-cmp + blink-copilot blink-ripgrep-nvim codecompanion-nvim conform-nvim copilot-lua diffview-nvim eyeliner-nvim - friendly-snippets gitsigns-nvim - hunk-nvim lazy-nvim - luasnip mini-nvim neogit nightfox-nvim @@ -60,7 +58,6 @@ with final.pkgs.lib; let nil phpactor python312Packages.jedi-language-server - ruby-lsp #other jujutsu diff --git a/nvim/lua/config/init.lua b/nvim/lua/config/init.lua index 5535ce6..e3a42c9 100644 --- a/nvim/lua/config/init.lua +++ b/nvim/lua/config/init.lua @@ -17,6 +17,7 @@ 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 = 'single' -- Switch tab length on the fly vim.keymap.set('n', '\\t', function() @@ -43,56 +44,26 @@ vim.api.nvim_create_autocmd('BufWinEnter', { }) -- Configure Neovim diagnostic messages -local function prefix_diagnostic(prefix, diagnostic) - return string.format(prefix .. ' %s', diagnostic.message) -end vim.diagnostic.config { virtual_text = { - prefix = '', - format = function(diagnostic) - local severity = diagnostic.severity - if severity == vim.diagnostic.severity.ERROR then - return prefix_diagnostic('󰅚', diagnostic) - end - if severity == vim.diagnostic.severity.WARN then - return prefix_diagnostic('⚠', diagnostic) - end - if severity == vim.diagnostic.severity.INFO then - return prefix_diagnostic('ⓘ', diagnostic) - end - if severity == vim.diagnostic.severity.HINT then - return prefix_diagnostic('󰌶', diagnostic) - end - return prefix_diagnostic('■', diagnostic) - end, + current_line = true, }, - update_in_insert = false, underline = true, severity_sort = true, float = { focusable = false, style = 'minimal', - border = 'rounded', source = 'if_many', - header = '', - prefix = '', }, } -- random keymaps -vim.keymap.set('n', 'gq', vim.cmd.bdelete, { noremap = true, silent = true }) -vim.keymap.set('n', 'gQ', '%bd|e#', { noremap = true, silent = true }) +vim.keymap.set({ 'v', 'i', }, 'wq', 'l', { noremap = true, silent = true }) vim.keymap.set('n', '', vim.cmd.bnext, { noremap = true, silent = true }) vim.keymap.set('n', '', vim.cmd.bprev, { noremap = true, silent = true }) -vim.keymap.set({ 'v', 'i' }, 'wq', 'l', { noremap = true, silent = true }) vim.keymap.set('v', "<", "", ">gv") --- clipboard -vim.keymap.set({ 'n', 'v', 'x' }, 'y', '"+y', { noremap = true, silent = true }) -vim.keymap.set('n', 'yy', '"+yy', { noremap = true, silent = true }) -vim.keymap.set({ 'n', 'v', 'x' }, 'p', '"+p', { noremap = true, silent = true }) - -- resize splits if window got resized vim.api.nvim_create_autocmd({ "VimResized" }, { group = vim.api.nvim_create_augroup("resize_splits", { clear = true }), diff --git a/nvim/lua/plugins/ai.lua b/nvim/lua/plugins/ai.lua index 3d88f34..670f55e 100644 --- a/nvim/lua/plugins/ai.lua +++ b/nvim/lua/plugins/ai.lua @@ -2,32 +2,19 @@ return { { "zbirenbaum/copilot.lua", cmd = "Copilot", - keys = { - { - 'M-\\', - 'Copilot panel', - noremap = true, - desc = 'Copilot panel' - } - }, opts = { panel = { enabled = true, - auto_refresh = true, + auto_refresh = false, keymap = { jump_prev = "", jump_next = "", accept = "", + toggle = "" } }, suggestion = { - enabled = true, - auto_trigger = true, - hide_during_completion = true, - keymap = { - accept = "", - next = "", - }, + enabled = false, }, completion = { documentation = { @@ -52,10 +39,12 @@ return { python = true, ruby = true, sh = true, + bash = true, + javascript = true, puppet = true, yaml = true, markdown = true, - ["."] = false, + ["*"] = false, } } }, diff --git a/nvim/lua/plugins/completion.lua b/nvim/lua/plugins/completion.lua index fda1de5..b0b5d40 100644 --- a/nvim/lua/plugins/completion.lua +++ b/nvim/lua/plugins/completion.lua @@ -1,28 +1,42 @@ return { { 'saghen/blink.cmp', - event = "VeryLazy", + event = 'VeryLazy', dependencies = { - 'rafamadriz/friendly-snippets', - 'mikavilpas/blink-ripgrep.nvim' + 'mikavilpas/blink-ripgrep.nvim', + 'fang2hou/blink-copilot', }, opts = { sources = { default = { - "lsp", - "path", - "snippets", - "buffer", - "ripgrep", + 'lsp', + 'path', + 'omni', + 'ripgrep', + 'copilot', }, providers = { ripgrep = { - module = "blink-ripgrep", - name = "rg", - score_offset = -10, + module = 'blink-ripgrep', + name = 'rg', + score_offset = -30, async = true, }, - } + copilot = { + module = 'blink-copilot', + name = 'Copilot', + score_offset = 100, + async = true, + opts = { + max_completions = 3, + debounce = 500, + auto_refresh = { + backward = false, + forward = true, + } + }, + }, + }, }, cmdline = { completion = { @@ -34,62 +48,22 @@ return { completion = { documentation = { auto_show = true, - auto_show_delay_ms = 100 - }, - list = { - selection = { - preselect = false, - auto_insert = true, - } - }, - ghost_text = { - enabled = true, + auto_show_delay_ms = 500, }, menu = { draw = { - treesitter = { "lsp" }, + treesitter = { 'lsp' }, columns = { - { "label", "label_description", gap = 1 }, - { "source_name", "kind", gap = 1 } + { 'label', 'label_description', gap = 1 }, + { 'source_name', 'kind', gap = 1 }, }, - } + }, }, trigger = { show_on_keyword = true, - } + }, }, - signature = { enabled = true } - } - }, - { - 'L3MON4D3/luasnip', - event = 'VeryLazy', - dependencies = { 'rafamadriz/friendly-snippets' }, - config = function() - local ls = require('luasnip') - ls.config.set_config { - history = true, - updateevents = 'TextChanged, TextChangedI', - } - require('luasnip.loaders.from_vscode').lazy_load() - - vim.keymap.set({ 'i', 's' }, '', function() - if ls.expand_or_jumpable() then - ls.expand_or_jump() - end - end, { silent = true }) - - vim.keymap.set({ 'i', 's' }, '', function() - if ls.jumpable(-1) then - ls.jump(-1) - end - end, { silent = true }) - - vim.keymap.set({ 'i', 's' }, '', function() - if ls.choice_active() then - ls.change_choice(1) - end - end, { silent = true }) - end, + signature = { enabled = true }, + }, }, } diff --git a/nvim/lua/plugins/lsp.lua b/nvim/lua/plugins/lsp.lua index 070549e..bb164ac 100644 --- a/nvim/lua/plugins/lsp.lua +++ b/nvim/lua/plugins/lsp.lua @@ -29,7 +29,12 @@ return { }, config = function() local lspconfig = require('lspconfig') - local capabilities = require("blink.cmp").get_lsp_capabilities() + local capabilities = vim.tbl_deep_extend( + 'force', + {}, + require("blink.cmp").get_lsp_capabilities(), + vim.lsp.protocol.make_client_capabilities() + ) lspconfig.gopls.setup { capabilities = capabilities, settings = { @@ -94,12 +99,6 @@ return { if not client then return end - vim.keymap.set( - 'n', - 'K', - vim.lsp.buf.hover, - { buffer = ev.buf, noremap = true, silent = true, desc = 'vim.lsp.buf.hover()' } - ) vim.keymap.set( 'n', 'grt', @@ -112,6 +111,12 @@ return { 'Trouble lsp_document_symbols toggle win.position=left ', { buffer = ev.buf, noremap = true, silent = true, desc = 'Trouble LSP symbols' } ) + vim.keymap.set( + 'n', + 'grd', + 'Trouble lsp_definitions toggle win.position=left ', + { buffer = ev.buf, noremap = true, silent = true, desc = 'Trouble LSP definition' } + ) vim.keymap.set( 'n', 'grl', @@ -138,6 +143,9 @@ return { { 'stevearc/conform.nvim', event = 'VeryLazy', + keys = { + { "\\f", function() require("conform").format({}) end, mode = { "n", "x" } }, + }, opts = { notify_no_formatters = false, formatters_by_ft = { @@ -145,7 +153,7 @@ return { puppet = { "puppet-lint" }, ['*'] = { 'trim_whitespace' } }, - format_on_save = { + default_format_opts = { timeout_ms = 500, lsp_format = "last", }, diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index c1b786a..935869d 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -9,7 +9,7 @@ return { event = 'VeryLazy', init = function() vim.api.nvim_set_hl(0, 'EyelinerPrimary', { underline = true }) - vim.api.nvim_set_hl(0, 'EyelinerSecondary', { underline = true }) + vim.api.nvim_set_hl(0, 'EyelinerSecondary', { underline = true, bold = true }) end, }, { 'tiagovla/scope.nvim', event = 'VeryLazy', config = true }, @@ -22,6 +22,12 @@ return { default_args = { DiffviewOpen = { '--imply-local' }, }, + view = { + merge_tool = { + layout = "diff4_mixed", + disable_diagnostics = true, + }, + }, keymaps = { view = { { { "n" }, "q", vim.cmd.DiffviewClose, { desc = "Close Diffview" } }, @@ -38,22 +44,22 @@ return { { 'nb', vim.cmd.DiffviewOpen, noremap = true, desc = 'diffview open' } }, }, - -- { - -- 'NeogitOrg/neogit', - -- opts = { - -- disable_builtin_notifications = true, - -- integrations = { - -- diffview = true, - -- }, - -- }, - -- keys = { - -- { - -- 'ng', - -- function() require('neogit').open() end, - -- { noremap = true, silent = true, desc = 'Neogit' }, - -- }, - -- }, - -- }, + { + 'NeogitOrg/neogit', + opts = { + disable_builtin_notifications = true, + integrations = { + diffview = true, + }, + }, + keys = { + { + 'ng', + function() require('neogit').open() end, + { noremap = true, silent = true, desc = 'Neogit' }, + }, + }, + }, { 'EdenEast/nightfox.nvim', lazy = false, @@ -123,7 +129,6 @@ return { end, }, }, - { '/julienvincent/hunk.nvim', event = 'VeryLazy', opts = {} }, { 'gbprod/yanky.nvim', opts = { diff --git a/nvim/lua/plugins/snacks.lua b/nvim/lua/plugins/snacks.lua index f572c56..56aa37a 100644 --- a/nvim/lua/plugins/snacks.lua +++ b/nvim/lua/plugins/snacks.lua @@ -1,130 +1,145 @@ return { - { - "folke/snacks.nvim", - dependencies = { "folke/trouble.nvim" }, - lazy = false, - priority = 1000, - opts = { - bigfile = { enabled = true }, - dim = { enabled = true }, - quickfile = { enabled = true }, - notifier = { enabled = true }, - scope = { enabled = true }, - terminal = { enabled = true }, - indent = { enabled = true }, - input = { enabled = true }, - words = { enabled = true }, - picker = { - enabled = true, - matcher = { frecency = true }, - layout = { - preset = function() - return vim.o.columns >= 120 and "telescope" or "vertical" - end + { + "folke/snacks.nvim", + dependencies = { "folke/trouble.nvim" }, + lazy = false, + priority = 1000, + opts = { + bigfile = { enabled = true }, + bufdelete = { enabled = true }, + dim = { enabled = true }, + quickfile = { enabled = true }, + notifier = { enabled = true }, + scope = { enabled = true }, + terminal = { enabled = true }, + indent = { enabled = true }, + input = { enabled = true }, + words = { enabled = true }, + picker = { + enabled = true, + matcher = { frecency = true }, + layout = { + preset = function() + return vim.o.columns >= 120 and "telescope" or "vertical" + end + }, + sources = { + files = { hidden = true }, + grep = { hidden = true }, + explorer = { hidden = true }, + git_files = { untracked = true }, + smart = { + multi = { "buffers", "recent", "files", "git_files" } + } + }, + actions = { + trouble_open = function(...) + return require("trouble.sources.snacks").actions.trouble_open.action(...) + end, + }, + win = { + input = { + keys = { + ["wq"] = { "close", mode = "i" }, + [""] = { "trouble_open", mode = { "n", "i" } }, + } + }, + list = { + keys = { + ["wq"] = { "close", mode = "i" }, + } + } + } + }, }, - sources = { - files = { hidden = true }, - grep = { hidden = true }, - explorer = { hidden = true }, - git_files = { untracked = true }, - smart = { - multi = { "buffers", "recent", "files", "git_files" } - } - }, - actions = { - trouble_open = function(...) - return require("trouble.sources.snacks").actions.trouble_open.action(...) - end, - }, - win = { - input = { - keys = { - ["wq"] = { "close", mode = "i" }, - [""] = { "trouble_open", mode = { "n", "i" } }, - } - }, - list = { - keys = { - ["wq"] = { "close", mode = "i" }, - } - } + config = function(_, opts) + require("snacks").setup(opts) + vim.api.nvim_set_hl(0, 'SnacksPickerDir', { fg = '#cccccc' }) + end, + keys = { + { '', function() Snacks.terminal.toggle() end, mode = { "n", "t" }, noremap = true, desc = 'terminal open' }, + { '', function() Snacks.terminal.toggle('$SHELL') end, mode = { "n", "t" }, noremap = true, desc = 'terminal open' }, + { 'm', function() Snacks.words.jump(1, true) end, noremap = true, desc = 'next reference' }, + { 'M', function() Snacks.words.jump(-1, true) end, noremap = true, desc = 'next reference' }, + { + '\\z', + function() + if Snacks.dim.enabled then + Snacks.dim.disable() + else + Snacks.dim.enable() + end + end, + noremap = true, + desc = 'next reference' + }, + { 'gq', function() Snacks.bufdelete() end, noremap = true, silent = true }, + { 'gQ', function() Snacks.bufdelete.other() end, noremap = true, silent = true }, + { + 'ff', + function() Snacks.picker.smart() end, + { noremap = true, silent = true, desc = 'Fuzzy find files' } + }, + { + 'fe', + function() Snacks.explorer() end, + { noremap = true, silent = true, desc = 'snacks explorer' } + }, + { + 'fE', + function() Snacks.explorer.reveal() end, + { noremap = true, silent = true, desc = 'snacks explorer open current file' } + }, + { + 'fg', + function() Snacks.picker.git_files() end, + { noremap = true, silent = true, desc = 'Fuzzy find files' } + }, + { + 'fa', + function() Snacks.picker.grep() end, + { noremap = true, silent = true, desc = 'Fuzzy find grep' } + }, + { + 'f8', + function() Snacks.picker.grep_word() end, + { noremap = true, silent = true, desc = 'Fuzzy find grep word' } + }, + { + 'f?', + function() Snacks.picker.pickers() end, + { noremap = true, silent = true, desc = 'See all pickers' } + }, + { + 'f\'', + function() Snacks.picker.marks() end, + { noremap = true, silent = true, desc = 'Pick marks' } + }, + { + 'fu', + function() Snacks.picker.undo() end, + { noremap = true, silent = true, desc = 'Pick undotree' } + }, + { + 'fj', + function() Snacks.picker.jumps() end, + { noremap = true, silent = true, desc = 'Pick jumps' } + }, + { + 'f.', + function() Snacks.picker.resume() end, + { noremap = true, silent = true, desc = 'Fuzzy find resume' } + }, + { + '', + function() Snacks.picker.buffers() end, + { noremap = true, silent = true, desc = 'Fuzzy find buffers' } + }, + { + 'fn', + function() Snacks.picker.notifications() end, + { noremap = true, silent = true, desc = 'pick notifications' } + }, } - }, - }, - config = function(_, opts) - require("snacks").setup(opts) - vim.api.nvim_set_hl(0, 'SnacksPickerDir', { fg = '#cccccc' }) - end, - keys = { - { '', function() Snacks.terminal.toggle() end, mode = { "n", "t" }, noremap = true, desc = 'terminal open' }, - { '\\\\', function() Snacks.terminal.toggle('$SHELL') end, mode = { "n", "t" }, noremap = true, desc = 'terminal open' }, - { 'm', function() Snacks.words.jump(1, true) end, noremap = true, desc = 'next reference' }, - { 'M', function() Snacks.words.jump(-1, true) end, noremap = true, desc = 'next reference' }, - { - 'ff', - function() Snacks.picker.smart() end, - { noremap = true, silent = true, desc = 'Fuzzy find files' } - }, - { - 'fe', - function() Snacks.explorer() end, - { noremap = true, silent = true, desc = 'snacks explorer' } - }, - { - 'fE', - function() Snacks.explorer.reveal() end, - { noremap = true, silent = true, desc = 'snacks explorer open current file' } - }, - { - 'fg', - function() Snacks.picker.git_files() end, - { noremap = true, silent = true, desc = 'Fuzzy find files' } - }, - { - 'fa', - function() Snacks.picker.grep() end, - { noremap = true, silent = true, desc = 'Fuzzy find grep' } - }, - { - 'f8', - function() Snacks.picker.grep_word() end, - { noremap = true, silent = true, desc = 'Fuzzy find grep word' } - }, - { - 'f?', - function() Snacks.picker.pickers() end, - { noremap = true, silent = true, desc = 'See all pickers' } - }, - { - 'f\'', - function() Snacks.picker.marks() end, - { noremap = true, silent = true, desc = 'Pick marks' } - }, - { - 'fu', - function() Snacks.picker.undo() end, - { noremap = true, silent = true, desc = 'Pick undotree' } - }, - { - 'fj', - function() Snacks.picker.jumps() end, - { noremap = true, silent = true, desc = 'Pick jumps' } - }, - { - 'f.', - function() Snacks.picker.resume() end, - { noremap = true, silent = true, desc = 'Fuzzy find resume' } - }, - { - '', - function() Snacks.picker.buffers() end, - { noremap = true, silent = true, desc = 'Fuzzy find buffers' } - }, - { - 'fn', - function() Snacks.picker.notifications() end, - { noremap = true, silent = true, desc = 'pick notifications' } - }, } - } } From 445762ee3a6ba385ce1f1f5d428a20736033b67a Mon Sep 17 00:00:00 2001 From: iofq Date: Tue, 1 Apr 2025 03:49:49 -0500 Subject: [PATCH 106/160] treewalker hydra --- nix/neovim-overlay.nix | 2 ++ nvim/lua/plugins/mini.lua | 10 +++++++ nvim/lua/plugins/treesitter.lua | 48 +++++++++++++++++---------------- 3 files changed, 37 insertions(+), 23 deletions(-) diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index df3df0f..3e60c7d 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -35,10 +35,12 @@ with final.pkgs.lib; let nvim-treesitter-context nvim-treesitter-textobjects nvim-treesitter.withAllGrammars + refactoring-nvim render-markdown-nvim scope-nvim snacks-nvim trouble-nvim + treewalker-nvim yanky-nvim ]; diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index eb365a0..0ac1a73 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -62,6 +62,8 @@ return { { mode = 'n', keys = '"' }, { mode = 'n', keys = '' }, { mode = 'n', keys = 'z' }, + { mode = 'n', keys = ']' }, + { mode = 'n', keys = '[' }, }, window = { config = { width = 'auto', }, @@ -72,6 +74,14 @@ return { miniclue.gen_clues.registers(), miniclue.gen_clues.windows(), miniclue.gen_clues.z(), + { mode = 'n', keys = 'wj', postkeys = 'w', desc = 'TS Down' }, + { mode = 'n', keys = 'wk', postkeys = 'w', desc = 'TS Up' }, + { mode = 'n', keys = 'wh', postkeys = 'w', desc = 'TS Left' }, + { mode = 'n', keys = 'wl', postkeys = 'w', desc = 'TS Right' }, + { mode = 'n', keys = 'w', postkeys = 'w', desc = 'Swap TS Down' }, + { mode = 'n', keys = 'w', postkeys = 'w', desc = 'Swap TS Up' }, + { mode = 'n', keys = 'w', postkeys = 'w', desc = 'Swap TS Left' }, + { mode = 'n', keys = 'w', postkeys = 'w', desc = 'Swap TS Right' }, }, } diff --git a/nvim/lua/plugins/treesitter.lua b/nvim/lua/plugins/treesitter.lua index 36bc496..16f98c2 100644 --- a/nvim/lua/plugins/treesitter.lua +++ b/nvim/lua/plugins/treesitter.lua @@ -3,45 +3,51 @@ return { 'nvim-treesitter/nvim-treesitter', event = 'VeryLazy', dependencies = { - 'nvim-treesitter/nvim-treesitter-context', + { + 'nvim-treesitter/nvim-treesitter-context', + opts = { + max_lines = 2, + min_window_height = 50, + } + }, 'nvim-treesitter/nvim-treesitter-textobjects', + { + 'aaronik/treewalker.nvim', + keys = { + { "wj", 'Treewalker Down', silent = true, desc = 'Down (Treewalker)' }, + { "wk", 'Treewalker Up', silent = true, desc = 'Up (Treewalker)' }, + { "wh", 'Treewalker Left', silent = true, desc = 'Left (Treewalker)' }, + { "wl", 'Treewalker Right', silent = true, desc = 'Right (Treewalker)' }, + { "w", 'Treewalker SwapDown', silent = true, desc = 'SwapDown (Treewalker)' }, + { "w", 'Treewalker SwapUp', silent = true, desc = 'SwapUp (Treewalker)' }, + { "w", 'Treewalker SwapLeft', silent = true, desc = 'SwapLeft (Treewalker)' }, + { "w", 'Treewalker SwapRight', silent = true, desc = 'SwapRight (Treewalker)' }, + } + } }, config = function() require('nvim-treesitter.configs').setup { ensure_installed = {}, + auto_install = false, highlight = { enable = true, - disable = function(_, buf) - local max_filesize = 100 * 1024 -- 100 KiB - local ok, stats = pcall(vim.loop.fs_stat, vim.api.nvim_buf_get_name(buf)) - if ok and stats and stats.size > max_filesize then - return true - end - end, additional_vim_regex_highlighting = false, }, indent = { enable = true, }, - autopairs = { - enable = true, - }, matchup = { enable = true, }, textobjects = { select = { enable = true, - lookahead = true, keymaps = { ['af'] = '@function.outer', ['if'] = '@function.inner', - ['aa'] = '@statement.outer', ['ia'] = '@parameter.inner', ["ik"] = "@assignment.lhs", - ["ak"] = "@assignment.inner", ["iv"] = "@assignment.rhs", - ["av"] = "@assignment.outer", }, }, move = { @@ -49,21 +55,21 @@ return { goto_next_start = { [']a'] = '@parameter.inner', [']f'] = '@function.outer', - [']]'] = '@block.inner', + [']]'] = '@block.outer', }, goto_previous_start = { ['[a'] = '@parameter.inner', ['[f'] = '@function.outer', - ['[['] = '@block.inner', + ['[['] = '@block.outer', }, }, swap = { enable = true, swap_next = { - ['s]'] = '@parameter.inner', + ['a]'] = '@parameter.inner', }, swap_previous = { - ['s['] = '@parameter.inner', + ['a['] = '@parameter.inner', }, }, }, @@ -77,10 +83,6 @@ return { }, } - require('treesitter-context').setup { - max_lines = 2, - min_window_height = 50, - } end, }, } From 1013b2348363b1f3318417e8afb96bf19c497813 Mon Sep 17 00:00:00 2001 From: iofq Date: Tue, 1 Apr 2025 03:49:49 -0500 Subject: [PATCH 107/160] refactoring-nvim --- nvim/lua/plugins/misc.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index 935869d..e44c6df 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -146,4 +146,5 @@ return { { "fp", "YankyRingHistory", mode = { "n", "x" }, noremap = true, silent = true, desc = 'Pick history (yanky.nvim)' } }, }, + { 'ThePrimeagen/refactoring.nvim', event = 'VeryLazy', config = true } } From 3dcc3a10e811ff5db8fb6eb354dc916cb9ebb9c2 Mon Sep 17 00:00:00 2001 From: iofq Date: Fri, 4 Apr 2025 19:06:25 -0500 Subject: [PATCH 108/160] trouble + conform changes --- nix/neovim-overlay.nix | 2 +- nvim/lua/plugins/lsp.lua | 27 ++++++++++++++++++++++++--- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index 3e60c7d..09e802f 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -59,7 +59,7 @@ with final.pkgs.lib; let lua-language-server nil phpactor - python312Packages.jedi-language-server + basedpyright #other jujutsu diff --git a/nvim/lua/plugins/lsp.lua b/nvim/lua/plugins/lsp.lua index bb164ac..0970bca 100644 --- a/nvim/lua/plugins/lsp.lua +++ b/nvim/lua/plugins/lsp.lua @@ -4,6 +4,8 @@ return { event = 'VeryLazy', opts = { pinned = true, + focus = true, + auto_jump = true, win = { size = 0.25, position = 'right', @@ -16,6 +18,12 @@ return { 'Trouble diagnostics toggle', noremap = true, desc = 'Trouble diagnostics' + }, + { + 'nt', + 'Trouble qflist', + noremap = true, + desc = 'Trouble qflist' } } }, @@ -62,10 +70,9 @@ return { }, }, } - lspconfig.jedi_language_server.setup { capabilities = capabilities } + lspconfig.basedpyright.setup { capabilities = capabilities } lspconfig.nil_ls.setup { capabilities = capabilities } lspconfig.phpactor.setup { capabilities = capabilities } - lspconfig.ruby_lsp.setup { capabilities = capabilities } lspconfig.lua_ls.setup { capabilities = capabilities, on_init = function(client) @@ -117,6 +124,12 @@ return { 'Trouble lsp_definitions toggle win.position=left ', { buffer = ev.buf, noremap = true, silent = true, desc = 'Trouble LSP definition' } ) + vim.keymap.set( + 'n', + 'grr', + 'Trouble lsp_references toggle win.position=left ', + { buffer = ev.buf, noremap = true, silent = true, desc = 'Trouble LSP definition' } + ) vim.keymap.set( 'n', 'grl', @@ -144,7 +157,8 @@ return { 'stevearc/conform.nvim', event = 'VeryLazy', keys = { - { "\\f", function() require("conform").format({}) end, mode = { "n", "x" } }, + { "\\f", function() vim.b.disable_autoformat = not vim.b.disable_autoformat end, mode = { "n", "x" } }, + { "\\F", function() vim.g.disable_autoformat = not vim.g.disable_autoformat end, mode = { "n", "x" } }, }, opts = { notify_no_formatters = false, @@ -153,6 +167,13 @@ return { puppet = { "puppet-lint" }, ['*'] = { '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 = 500, lsp_format = "last" } + end, default_format_opts = { timeout_ms = 500, lsp_format = "last", From 23bd257c9ecde919b9bacf7441bc6bc34f01287f Mon Sep 17 00:00:00 2001 From: iofq Date: Sun, 6 Apr 2025 01:47:06 -0500 Subject: [PATCH 109/160] lint everything --- nvim/init.lua | 4 +- nvim/lua/config/init.lua | 28 ++- nvim/lua/plugins/ai.lua | 55 +++-- nvim/lua/plugins/completion.lua | 2 +- nvim/lua/plugins/lsp.lua | 62 +++--- nvim/lua/plugins/mini.lua | 79 ++----- nvim/lua/plugins/misc.lua | 51 +++-- nvim/lua/plugins/snacks.lua | 352 +++++++++++++++++++------------- nvim/lua/plugins/treesitter.lua | 27 ++- 9 files changed, 351 insertions(+), 309 deletions(-) diff --git a/nvim/init.lua b/nvim/init.lua index 215be02..919b12b 100644 --- a/nvim/init.lua +++ b/nvim/init.lua @@ -21,8 +21,8 @@ if not LAZY_OPTS then rtp = { reset = false, disabled_plugins = { - "netrwPlugin", - "tutor", + 'netrwPlugin', + 'tutor', }, }, }, diff --git a/nvim/lua/config/init.lua b/nvim/lua/config/init.lua index e3a42c9..daaaa59 100644 --- a/nvim/lua/config/init.lua +++ b/nvim/lua/config/init.lua @@ -21,7 +21,7 @@ vim.opt.winborder = 'single' -- Switch tab length on the fly vim.keymap.set('n', '\\t', function() - vim.o.tabstop = vim.o.tabstop == 2 and 4 or 2 + vim.o.tabstop = vim.o.tabstop == 8 and 2 or 2 * vim.o.tabstop end, { silent = true, desc = 'toggle tabstop' }) -- autocmd @@ -45,9 +45,7 @@ vim.api.nvim_create_autocmd('BufWinEnter', { -- Configure Neovim diagnostic messages vim.diagnostic.config { - virtual_text = { - current_line = true, - }, + virtual_text = true, underline = true, severity_sort = true, float = { @@ -58,28 +56,28 @@ vim.diagnostic.config { } -- random keymaps -vim.keymap.set({ 'v', 'i', }, 'wq', 'l', { noremap = true, silent = true }) +vim.keymap.set({ 'v', 'i' }, 'wq', 'l', { noremap = true, silent = true }) vim.keymap.set('n', '', vim.cmd.bnext, { noremap = true, silent = true }) vim.keymap.set('n', '', vim.cmd.bprev, { noremap = true, silent = true }) -vim.keymap.set('v', "<", "", ">gv") +vim.keymap.set('v', '<', '', '>gv') -- resize splits if window got resized -vim.api.nvim_create_autocmd({ "VimResized" }, { - group = vim.api.nvim_create_augroup("resize_splits", { clear = true }), +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) + 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 }), +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") + if vim.o.buftype ~= 'nofile' then + vim.cmd('checktime') end end, }) diff --git a/nvim/lua/plugins/ai.lua b/nvim/lua/plugins/ai.lua index 670f55e..201beb1 100644 --- a/nvim/lua/plugins/ai.lua +++ b/nvim/lua/plugins/ai.lua @@ -1,17 +1,17 @@ return { { - "zbirenbaum/copilot.lua", - cmd = "Copilot", + 'zbirenbaum/copilot.lua', + cmd = 'Copilot', opts = { panel = { enabled = true, auto_refresh = false, keymap = { - jump_prev = "", - jump_next = "", - accept = "", - toggle = "" - } + jump_prev = '', + jump_next = '', + accept = '', + toggle = '', + }, }, suggestion = { enabled = false, @@ -24,12 +24,12 @@ return { selection = { preselect = false, auto_insert = true, - } + }, }, accept = { auto_brackets = { - enabled = true - } + enabled = true, + }, }, }, filetypes = { @@ -44,22 +44,22 @@ return { puppet = true, yaml = true, markdown = true, - ["*"] = false, - } - } + ['*'] = false, + }, + }, }, { - "olimorris/codecompanion.nvim", - cmd = "Copilot", + 'olimorris/codecompanion.nvim', + cmd = 'Copilot', dependencies = { - "nvim-lua/plenary.nvim", - "nvim-treesitter/nvim-treesitter", - "zbirenbaum/copilot.lua", + 'nvim-lua/plenary.nvim', + 'nvim-treesitter/nvim-treesitter', + 'zbirenbaum/copilot.lua', }, opts = { strategies = { - chat = { adapter = "copilot", }, - inline = { adapter = "copilot", }, + chat = { adapter = 'copilot' }, + inline = { adapter = 'copilot' }, }, }, keys = { @@ -67,23 +67,22 @@ return { 'ac', 'CodeCompanionChat Toggle', noremap = true, - desc = 'Copilot chat toggle' + desc = 'Copilot chat toggle', }, { 'as', 'CodeCompanionChat Add', noremap = true, - mode = { "n", "v" }, - desc = 'Copilot chat add selection' + mode = { 'n', 'v' }, + desc = 'Copilot chat add selection', }, { 'aa', 'CodeCompanionActions', noremap = true, - mode = { "n", "v" }, - desc = 'Copilot inline' - } - } - + mode = { 'n', 'v' }, + desc = 'Copilot inline', + }, + }, }, } diff --git a/nvim/lua/plugins/completion.lua b/nvim/lua/plugins/completion.lua index b0b5d40..c855bfc 100644 --- a/nvim/lua/plugins/completion.lua +++ b/nvim/lua/plugins/completion.lua @@ -33,7 +33,7 @@ return { auto_refresh = { backward = false, forward = true, - } + }, }, }, }, diff --git a/nvim/lua/plugins/lsp.lua b/nvim/lua/plugins/lsp.lua index 0970bca..54288fe 100644 --- a/nvim/lua/plugins/lsp.lua +++ b/nvim/lua/plugins/lsp.lua @@ -9,7 +9,7 @@ return { win = { size = 0.25, position = 'right', - type = 'split' + type = 'split', }, }, keys = { @@ -17,15 +17,15 @@ return { 'gre', 'Trouble diagnostics toggle', noremap = true, - desc = 'Trouble diagnostics' + desc = 'Trouble diagnostics', }, { 'nt', 'Trouble qflist', noremap = true, - desc = 'Trouble qflist' - } - } + desc = 'Trouble qflist', + }, + }, }, { 'neovim/nvim-lspconfig', @@ -40,7 +40,7 @@ return { local capabilities = vim.tbl_deep_extend( 'force', {}, - require("blink.cmp").get_lsp_capabilities(), + require('blink.cmp').get_lsp_capabilities(), vim.lsp.protocol.make_client_capabilities() ) lspconfig.gopls.setup { @@ -121,13 +121,13 @@ return { vim.keymap.set( 'n', 'grd', - 'Trouble lsp_definitions toggle win.position=left ', + 'Trouble lsp_definitions toggle ', { buffer = ev.buf, noremap = true, silent = true, desc = 'Trouble LSP definition' } ) vim.keymap.set( 'n', 'grr', - 'Trouble lsp_references toggle win.position=left ', + 'Trouble lsp_references toggle ', { buffer = ev.buf, noremap = true, silent = true, desc = 'Trouble LSP definition' } ) vim.keymap.set( @@ -143,7 +143,9 @@ return { if client.server_capabilities.codeLensProvider then vim.api.nvim_create_autocmd({ 'InsertLeave', 'BufWritePost', 'TextChanged' }, { group = vim.api.nvim_create_augroup(string.format('lsp-%s-%s', bufnr, client.id), {}), - callback = function() vim.lsp.codelens.refresh { bufnr = bufnr } end, + callback = function() + vim.lsp.codelens.refresh { bufnr = bufnr } + end, buffer = bufnr, }) vim.lsp.codelens.refresh() @@ -157,26 +159,38 @@ return { 'stevearc/conform.nvim', event = 'VeryLazy', keys = { - { "\\f", function() vim.b.disable_autoformat = not vim.b.disable_autoformat end, mode = { "n", "x" } }, - { "\\F", function() vim.g.disable_autoformat = not vim.g.disable_autoformat end, mode = { "n", "x" } }, + { + '\\f', + function() + vim.b.disable_autoformat = not vim.b.disable_autoformat + end, + mode = { 'n', 'x' }, + }, + { + '\\F', + function() + vim.g.disable_autoformat = not vim.g.disable_autoformat + end, + mode = { 'n', 'x' }, + }, }, opts = { notify_no_formatters = false, formatters_by_ft = { - json = { "jq" }, - puppet = { "puppet-lint" }, - ['*'] = { 'trim_whitespace' } + json = { 'jq' }, + puppet = { 'puppet-lint' }, + ['*'] = { '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 = 500, lsp_format = "last" } + return { timeout_ms = 500, lsp_format = 'last' } end, default_format_opts = { timeout_ms = 500, - lsp_format = "last", + lsp_format = 'last', }, }, }, @@ -184,15 +198,15 @@ return { 'mfussenegger/nvim-lint', event = 'VeryLazy', config = function() - require("lint").linters_by_ft = { - docker = { "hadolint" }, - yaml = { "yamllint" }, - puppet = { "puppet-lint" }, - sh = { "shellcheck" }, - go = { "golangcilint" }, - ruby = { "rubocop" }, + require('lint').linters_by_ft = { + docker = { 'hadolint' }, + yaml = { 'yamllint' }, + puppet = { 'puppet-lint' }, + sh = { 'shellcheck' }, + go = { 'golangcilint' }, + ruby = { 'rubocop' }, } vim.api.nvim_command('au BufWritePost * lua require("lint").try_lint()') - end + end, }, } diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index 0ac1a73..cc76c4f 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -2,13 +2,13 @@ return { { 'echasnovski/mini.nvim', lazy = false, - dependencies = { "folke/snacks.nvim" }, + dependencies = { 'folke/snacks.nvim' }, config = function() - require('mini.basics').setup { mappings = { windows = true, }, } - require('mini.tabline').setup({ + require('mini.basics').setup { mappings = { windows = true } } + require('mini.tabline').setup { tabpage_section = 'right', show_icons = false, - }) + } require('mini.statusline').setup { content = { active = function() @@ -48,9 +48,10 @@ return { require('mini.align').setup() require('mini.bracketed').setup() require('mini.icons').setup() - require('mini.jump2d').setup({ mappings = { start_jumping = 'S' } }); + require('mini.jump2d').setup { mappings = { start_jumping = 'S' } } + require('mini.operators').setup() require('mini.surround').setup() - require('mini.splitjoin').setup { detect = { separator = '[,;\n]' }, } + require('mini.splitjoin').setup { detect = { separator = '[,;\n]' } } local miniclue = require('mini.clue') miniclue.setup { @@ -66,7 +67,7 @@ return { { mode = 'n', keys = '[' }, }, window = { - config = { width = 'auto', }, + config = { width = 'auto' }, }, clues = { miniclue.gen_clues.g(), @@ -74,14 +75,14 @@ return { miniclue.gen_clues.registers(), miniclue.gen_clues.windows(), miniclue.gen_clues.z(), - { mode = 'n', keys = 'wj', postkeys = 'w', desc = 'TS Down' }, - { mode = 'n', keys = 'wk', postkeys = 'w', desc = 'TS Up' }, - { mode = 'n', keys = 'wh', postkeys = 'w', desc = 'TS Left' }, - { mode = 'n', keys = 'wl', postkeys = 'w', desc = 'TS Right' }, - { mode = 'n', keys = 'w', postkeys = 'w', desc = 'Swap TS Down' }, - { mode = 'n', keys = 'w', postkeys = 'w', desc = 'Swap TS Up' }, - { mode = 'n', keys = 'w', postkeys = 'w', desc = 'Swap TS Left' }, - { mode = 'n', keys = 'w', postkeys = 'w', desc = 'Swap TS Right' }, + { mode = 'n', keys = 'wj', postkeys = 'w', desc = 'TS Down' }, + { mode = 'n', keys = 'wk', postkeys = 'w', desc = 'TS Up' }, + { mode = 'n', keys = 'wh', postkeys = 'w', desc = 'TS Left' }, + { mode = 'n', keys = 'wl', postkeys = 'w', desc = 'TS Right' }, + { mode = 'n', keys = 'w', postkeys = 'w', desc = 'Swap TS Down' }, + { mode = 'n', keys = 'w', postkeys = 'w', desc = 'Swap TS Up' }, + { mode = 'n', keys = 'w', postkeys = 'w', desc = 'Swap TS Left' }, + { mode = 'n', keys = 'w', postkeys = 'w', desc = 'Swap TS Right' }, }, } @@ -103,54 +104,6 @@ return { }, } vim.keymap.set('n', 'nm', map.toggle, { noremap = true, desc = 'minimap open' }) - - local files = require("mini.files") - files.setup { - mappings = { - go_in_plus = "" - }, - windows = { - preview = true, - width_focus = 30, - width_preview = 50, - } - } - vim.keymap.set('n', 'c', files.open, { noremap = true, desc = 'minifiles open' }) - vim.api.nvim_create_autocmd("User", { - pattern = "MiniFilesBufferCreate", - callback = function(args) - vim.keymap.set( - "n", - "c", - function() - files.synchronize() - files.close() - end, - { buffer = args.data.buf_id } - ) - end, - }) - vim.api.nvim_create_autocmd("User", { - pattern = "MiniFilesBufferCreate", - callback = function(args) - vim.keymap.set( - "n", - "`", - function() - local cur_entry_path = MiniFiles.get_fs_entry().path - local cur_directory = vim.fs.dirname(cur_entry_path) - vim.fn.chdir(cur_directory) - 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 index e44c6df..9343772 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -24,24 +24,24 @@ return { }, view = { merge_tool = { - layout = "diff4_mixed", + layout = 'diff4_mixed', disable_diagnostics = true, }, }, keymaps = { view = { - { { "n" }, "q", vim.cmd.DiffviewClose, { desc = "Close Diffview" } }, + { { 'n' }, 'q', vim.cmd.DiffviewClose, { desc = 'Close Diffview' } }, }, file_panel = { - { { "n" }, "q", vim.cmd.DiffviewClose, { desc = "Close Diffview" } }, + { { 'n' }, 'q', vim.cmd.DiffviewClose, { desc = 'Close Diffview' } }, }, file_history_panel = { - { { "n" }, "q", vim.cmd.DiffviewClose, { desc = "Close Diffview" } }, - } - } + { { 'n' }, 'q', vim.cmd.DiffviewClose, { desc = 'Close Diffview' } }, + }, + }, }, keys = { - { 'nb', vim.cmd.DiffviewOpen, noremap = true, desc = 'diffview open' } + { 'nb', vim.cmd.DiffviewOpen, noremap = true, desc = 'diffview open' }, }, }, { @@ -55,7 +55,9 @@ return { keys = { { 'ng', - function() require('neogit').open() end, + function() + require('neogit').open() + end, { noremap = true, silent = true, desc = 'Neogit' }, }, }, @@ -69,10 +71,10 @@ return { transparent = true, terminal_colors = true, modules = { - "mini", - "treesitter", - "neogit", - } + 'mini', + 'treesitter', + 'neogit', + }, }, }, config = function(_, opts) @@ -112,7 +114,7 @@ return { return ']c' end vim.schedule(function() - gs.next_hunk({ target = 'all' }) + gs.next_hunk { target = 'all' } end) return '' end, { expr = true }) @@ -122,7 +124,7 @@ return { return '[c' end vim.schedule(function() - gs.prev_hunk({ target = 'all' }) + gs.prev_hunk { target = 'all' } end) return '' end, { expr = true }) @@ -133,18 +135,25 @@ return { 'gbprod/yanky.nvim', opts = { ring = { - storage = "memory", + storage = 'memory', }, picker = { select = { - action = require('yanky.picker').actions.set_register("+") - } - } + action = require('yanky.picker').actions.set_register('+'), + }, + }, }, keys = { - { "y", "(YankyYank)", mode = { "n", "x" } }, - { "fp", "YankyRingHistory", mode = { "n", "x" }, noremap = true, silent = true, desc = 'Pick history (yanky.nvim)' } + { 'y', '(YankyYank)', mode = { 'n', 'x' } }, + { + 'fp', + 'YankyRingHistory', + mode = { 'n', 'x' }, + noremap = true, + silent = true, + desc = 'Pick history (yanky.nvim)', + }, }, }, - { 'ThePrimeagen/refactoring.nvim', event = 'VeryLazy', config = true } + { 'ThePrimeagen/refactoring.nvim', event = 'VeryLazy', config = true }, } diff --git a/nvim/lua/plugins/snacks.lua b/nvim/lua/plugins/snacks.lua index 56aa37a..9e22dae 100644 --- a/nvim/lua/plugins/snacks.lua +++ b/nvim/lua/plugins/snacks.lua @@ -1,145 +1,215 @@ return { - { - "folke/snacks.nvim", - dependencies = { "folke/trouble.nvim" }, - lazy = false, - priority = 1000, - opts = { - bigfile = { enabled = true }, - bufdelete = { enabled = true }, - dim = { enabled = true }, - quickfile = { enabled = true }, - notifier = { enabled = true }, - scope = { enabled = true }, - terminal = { enabled = true }, - indent = { enabled = true }, - input = { enabled = true }, - words = { enabled = true }, - picker = { - enabled = true, - matcher = { frecency = true }, - layout = { - preset = function() - return vim.o.columns >= 120 and "telescope" or "vertical" - end - }, - sources = { - files = { hidden = true }, - grep = { hidden = true }, - explorer = { hidden = true }, - git_files = { untracked = true }, - smart = { - multi = { "buffers", "recent", "files", "git_files" } - } - }, - actions = { - trouble_open = function(...) - return require("trouble.sources.snacks").actions.trouble_open.action(...) - end, - }, - win = { - input = { - keys = { - ["wq"] = { "close", mode = "i" }, - [""] = { "trouble_open", mode = { "n", "i" } }, - } - }, - list = { - keys = { - ["wq"] = { "close", mode = "i" }, - } - } - } - }, + { + 'folke/snacks.nvim', + dependencies = { 'folke/trouble.nvim' }, + lazy = false, + priority = 1000, + opts = { + bigfile = { enabled = true }, + bufdelete = { enabled = true }, + dim = { enabled = true }, + quickfile = { enabled = true }, + notifier = { enabled = true }, + scope = { enabled = true }, + terminal = { enabled = true }, + indent = { enabled = true }, + input = { enabled = true }, + words = { enabled = true }, + picker = { + enabled = true, + matcher = { frecency = true }, + layout = { + preset = function() + return vim.o.columns >= 120 and 'telescope' or 'vertical' + end, }, - config = function(_, opts) - require("snacks").setup(opts) - vim.api.nvim_set_hl(0, 'SnacksPickerDir', { fg = '#cccccc' }) + sources = { + files = { hidden = true }, + grep = { hidden = true }, + explorer = { hidden = true }, + git_files = { untracked = true }, + smart = { + multi = { 'buffers', 'recent', 'files', 'git_files' }, + }, + }, + actions = { + trouble_open = function(...) + return require('trouble.sources.snacks').actions.trouble_open.action(...) + end, + }, + win = { + input = { + keys = { + ['wq'] = { 'close', mode = 'i' }, + [''] = { 'trouble_open', mode = { 'n', 'i' } }, + }, + }, + list = { + keys = { + ['wq'] = { 'close', mode = 'i' }, + }, + }, + }, + }, + }, + config = function(_, opts) + require('snacks').setup(opts) + vim.api.nvim_set_hl(0, 'SnacksPickerDir', { fg = '#cccccc' }) + end, + keys = { + { + '', + function() + Snacks.terminal.toggle() end, - keys = { - { '', function() Snacks.terminal.toggle() end, mode = { "n", "t" }, noremap = true, desc = 'terminal open' }, - { '', function() Snacks.terminal.toggle('$SHELL') end, mode = { "n", "t" }, noremap = true, desc = 'terminal open' }, - { 'm', function() Snacks.words.jump(1, true) end, noremap = true, desc = 'next reference' }, - { 'M', function() Snacks.words.jump(-1, true) end, noremap = true, desc = 'next reference' }, - { - '\\z', - function() - if Snacks.dim.enabled then - Snacks.dim.disable() - else - Snacks.dim.enable() - end - end, - noremap = true, - desc = 'next reference' - }, - { 'gq', function() Snacks.bufdelete() end, noremap = true, silent = true }, - { 'gQ', function() Snacks.bufdelete.other() end, noremap = true, silent = true }, - { - 'ff', - function() Snacks.picker.smart() end, - { noremap = true, silent = true, desc = 'Fuzzy find files' } - }, - { - 'fe', - function() Snacks.explorer() end, - { noremap = true, silent = true, desc = 'snacks explorer' } - }, - { - 'fE', - function() Snacks.explorer.reveal() end, - { noremap = true, silent = true, desc = 'snacks explorer open current file' } - }, - { - 'fg', - function() Snacks.picker.git_files() end, - { noremap = true, silent = true, desc = 'Fuzzy find files' } - }, - { - 'fa', - function() Snacks.picker.grep() end, - { noremap = true, silent = true, desc = 'Fuzzy find grep' } - }, - { - 'f8', - function() Snacks.picker.grep_word() end, - { noremap = true, silent = true, desc = 'Fuzzy find grep word' } - }, - { - 'f?', - function() Snacks.picker.pickers() end, - { noremap = true, silent = true, desc = 'See all pickers' } - }, - { - 'f\'', - function() Snacks.picker.marks() end, - { noremap = true, silent = true, desc = 'Pick marks' } - }, - { - 'fu', - function() Snacks.picker.undo() end, - { noremap = true, silent = true, desc = 'Pick undotree' } - }, - { - 'fj', - function() Snacks.picker.jumps() end, - { noremap = true, silent = true, desc = 'Pick jumps' } - }, - { - 'f.', - function() Snacks.picker.resume() end, - { noremap = true, silent = true, desc = 'Fuzzy find resume' } - }, - { - '', - function() Snacks.picker.buffers() end, - { noremap = true, silent = true, desc = 'Fuzzy find buffers' } - }, - { - 'fn', - function() Snacks.picker.notifications() end, - { noremap = true, silent = true, desc = 'pick notifications' } - }, - } - } + mode = { 'n', 't' }, + noremap = true, + desc = 'terminal open', + }, + { + '', + function() + Snacks.terminal.toggle('$SHELL') + end, + mode = { 'n', 't' }, + noremap = true, + desc = 'terminal open', + }, + { + ']r', + function() + Snacks.words.jump(1, true) + end, + noremap = true, + desc = 'next reference', + }, + { + '[r', + function() + Snacks.words.jump(-1, true) + end, + noremap = true, + desc = 'next reference', + }, + { + '\\z', + function() + if Snacks.dim.enabled then + Snacks.dim.disable() + else + Snacks.dim.enable() + end + end, + noremap = true, + desc = 'next reference', + }, + { + 'gq', + function() + Snacks.bufdelete() + end, + noremap = true, + silent = true, + }, + { + 'gQ', + function() + Snacks.bufdelete.other() + end, + noremap = true, + silent = true, + }, + { + 'ff', + function() + Snacks.picker.smart() + end, + { noremap = true, silent = true, desc = 'Fuzzy find files' }, + }, + { + 'fe', + function() + Snacks.explorer() + end, + { noremap = true, silent = true, desc = 'snacks explorer' }, + }, + { + 'fE', + function() + Snacks.explorer.reveal() + end, + { noremap = true, silent = true, desc = 'snacks explorer open current file' }, + }, + { + 'fg', + function() + Snacks.picker.git_files() + end, + { noremap = true, silent = true, desc = 'Fuzzy find files' }, + }, + { + 'fa', + function() + Snacks.picker.grep() + end, + { noremap = true, silent = true, desc = 'Fuzzy find grep' }, + }, + { + 'f8', + function() + Snacks.picker.grep_word() + end, + { noremap = true, silent = true, desc = 'Fuzzy find grep word' }, + }, + { + 'f?', + function() + Snacks.picker.pickers() + end, + { noremap = true, silent = true, desc = 'See all pickers' }, + }, + { + "f'", + function() + Snacks.picker.marks() + end, + { noremap = true, silent = true, desc = 'Pick marks' }, + }, + { + 'fu', + function() + Snacks.picker.undo() + end, + { noremap = true, silent = true, desc = 'Pick undotree' }, + }, + { + 'fj', + function() + Snacks.picker.jumps() + end, + { noremap = true, silent = true, desc = 'Pick jumps' }, + }, + { + 'f.', + function() + Snacks.picker.resume() + end, + { noremap = true, silent = true, desc = 'Fuzzy find resume' }, + }, + { + '', + function() + Snacks.picker.buffers() + end, + { noremap = true, silent = true, desc = 'Fuzzy find buffers' }, + }, + { + 'fn', + function() + Snacks.picker.notifications() + end, + { noremap = true, silent = true, desc = 'pick notifications' }, + }, + }, + }, } diff --git a/nvim/lua/plugins/treesitter.lua b/nvim/lua/plugins/treesitter.lua index 16f98c2..37a48cd 100644 --- a/nvim/lua/plugins/treesitter.lua +++ b/nvim/lua/plugins/treesitter.lua @@ -8,22 +8,22 @@ return { opts = { max_lines = 2, min_window_height = 50, - } + }, }, 'nvim-treesitter/nvim-treesitter-textobjects', { 'aaronik/treewalker.nvim', keys = { - { "wj", 'Treewalker Down', silent = true, desc = 'Down (Treewalker)' }, - { "wk", 'Treewalker Up', silent = true, desc = 'Up (Treewalker)' }, - { "wh", 'Treewalker Left', silent = true, desc = 'Left (Treewalker)' }, - { "wl", 'Treewalker Right', silent = true, desc = 'Right (Treewalker)' }, - { "w", 'Treewalker SwapDown', silent = true, desc = 'SwapDown (Treewalker)' }, - { "w", 'Treewalker SwapUp', silent = true, desc = 'SwapUp (Treewalker)' }, - { "w", 'Treewalker SwapLeft', silent = true, desc = 'SwapLeft (Treewalker)' }, - { "w", 'Treewalker SwapRight', silent = true, desc = 'SwapRight (Treewalker)' }, - } - } + { 'wj', 'Treewalker Down', silent = true, desc = 'Down (Treewalker)' }, + { 'wk', 'Treewalker Up', silent = true, desc = 'Up (Treewalker)' }, + { 'wh', 'Treewalker Left', silent = true, desc = 'Left (Treewalker)' }, + { 'wl', 'Treewalker Right', silent = true, desc = 'Right (Treewalker)' }, + { 'w', 'Treewalker SwapDown', silent = true, desc = 'SwapDown (Treewalker)' }, + { 'w', 'Treewalker SwapUp', silent = true, desc = 'SwapUp (Treewalker)' }, + { 'w', 'Treewalker SwapLeft', silent = true, desc = 'SwapLeft (Treewalker)' }, + { 'w', 'Treewalker SwapRight', silent = true, desc = 'SwapRight (Treewalker)' }, + }, + }, }, config = function() require('nvim-treesitter.configs').setup { @@ -46,8 +46,8 @@ return { ['af'] = '@function.outer', ['if'] = '@function.inner', ['ia'] = '@parameter.inner', - ["ik"] = "@assignment.lhs", - ["iv"] = "@assignment.rhs", + ['ik'] = '@assignment.lhs', + ['iv'] = '@assignment.rhs', }, }, move = { @@ -82,7 +82,6 @@ return { }, }, } - end, }, } From 9b0cab97090d4742b7b8481bc91780aac5d205fa Mon Sep 17 00:00:00 2001 From: iofq Date: Sun, 6 Apr 2025 01:47:06 -0500 Subject: [PATCH 110/160] oil.nvim --- flake.lock | 72 +++++++++++++++++++------------------- flake.nix | 4 +-- nix/neovim-overlay.nix | 5 +-- nvim/lua/plugins/ai.lua | 54 ++++++---------------------- nvim/lua/plugins/debug.lua | 56 ----------------------------- nvim/lua/plugins/lsp.lua | 2 ++ nvim/lua/plugins/misc.lua | 29 +++++++++++++-- 7 files changed, 78 insertions(+), 144 deletions(-) delete mode 100644 nvim/lua/plugins/debug.lua diff --git a/flake.lock b/flake.lock index 2ad9b49..fc325ca 100644 --- a/flake.lock +++ b/flake.lock @@ -74,11 +74,11 @@ ] }, "locked": { - "lastModified": 1741352980, - "narHash": "sha256-+u2UunDA4Cl5Fci3m7S643HzKmIDAe+fiXrLqYsR2fs=", + "lastModified": 1743550720, + "narHash": "sha256-hIshGgKZCgWh6AYJpJmRgFdR3WUbkY04o82X05xqQiY=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "f4330d22f1c5d2ba72d3d22df5597d123fdb60a9", + "rev": "c621e8422220273271f52058f618c94e405bb0f5", "type": "github" }, "original": { @@ -289,11 +289,11 @@ "treefmt-nix": "treefmt-nix" }, "locked": { - "lastModified": 1743293377, - "narHash": "sha256-DqvBHtTslU0E+XMW6xM4SY3UD3+nHAAIXHag0zukrpc=", + "lastModified": 1743898191, + "narHash": "sha256-JCcQDgwYV+C4igYA6DchGpKKA6eyZXLvRrxWHmQbmDk=", "owner": "nix-community", "repo": "neovim-nightly-overlay", - "rev": "3f10166b5b818227b9d7728f97e67e11cdf27ffd", + "rev": "276567b29d8c9aca7b6a54e93a9183e44a17f19c", "type": "github" }, "original": { @@ -305,11 +305,11 @@ "neovim-src": { "flake": false, "locked": { - "lastModified": 1743289921, - "narHash": "sha256-0gsBH+wMZJaXb95GKP6OZmtyhlJh0lS/gsn6J8rxt6k=", + "lastModified": 1743893800, + "narHash": "sha256-i/X0b3b/dAqjNIB5RoryeDvMkVfdoPBwK5xn06W6Wdo=", "owner": "neovim", "repo": "neovim", - "rev": "99529577cc9f5229cbb3dac8ab4782bd43094102", + "rev": "28e819018520a2300eaeeec6794ffcd614b25dd2", "type": "github" }, "original": { @@ -320,11 +320,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1743076231, - "narHash": "sha256-yQugdVfi316qUfqzN8JMaA2vixl+45GxNm4oUfXlbgw=", + "lastModified": 1743689281, + "narHash": "sha256-y7Hg5lwWhEOgflEHRfzSH96BOt26LaYfrYWzZ+VoVdg=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "6c5963357f3c1c840201eda129a99d455074db04", + "rev": "2bfc080955153be0be56724be6fa5477b4eefabb", "type": "github" }, "original": { @@ -346,22 +346,6 @@ "url": "https://github.com/NixOS/nixpkgs/archive/eb9ceca17df2ea50a250b6b27f7bf6ab0186f198.tar.gz" } }, - "nixpkgs-master": { - "locked": { - "lastModified": 1743392618, - "narHash": "sha256-lc4l0nV5WgnS4wuZrX7Na2tRBEpe2IzWmLnhm3+t3Tk=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "cd6f6791e94d08b983fe6d127ec6942176737f6a", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "master", - "repo": "nixpkgs", - "type": "github" - } - }, "nixpkgs-stable": { "locked": { "lastModified": 1720386169, @@ -378,13 +362,13 @@ "type": "github" } }, - "nixpkgs_2": { + "nixpkgs-uns": { "locked": { - "lastModified": 1743315132, - "narHash": "sha256-6hl6L/tRnwubHcA4pfUUtk542wn2Om+D4UnDhlDW9BE=", + "lastModified": 1743827369, + "narHash": "sha256-rpqepOZ8Eo1zg+KJeWoq1HAOgoMCDloqv5r2EAa9TSA=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "52faf482a3889b7619003c0daec593a1912fddc1", + "rev": "42a1c966be226125b48c384171c44c651c236c22", "type": "github" }, "original": { @@ -394,13 +378,29 @@ "type": "github" } }, + "nixpkgs_2": { + "locked": { + "lastModified": 1743962461, + "narHash": "sha256-UaulIYZqwVF7CRYsDG6Jt3k3+Qs21yJT2/CLRWT9qzg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "eb77ff4e9c1f071693be92d144f363ef24701039", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "master", + "repo": "nixpkgs", + "type": "github" + } + }, "root": { "inputs": { "flake-utils": "flake-utils", "gen-luarc": "gen-luarc", "neovim-nightly-overlay": "neovim-nightly-overlay", "nixpkgs": "nixpkgs_2", - "nixpkgs-master": "nixpkgs-master" + "nixpkgs-uns": "nixpkgs-uns" } }, "systems": { @@ -426,11 +426,11 @@ ] }, "locked": { - "lastModified": 1743081648, - "narHash": "sha256-WRAylyYptt6OX5eCEBWyTwOEqEtD6zt33rlUkr6u3cE=", + "lastModified": 1743748085, + "narHash": "sha256-uhjnlaVTWo5iD3LXics1rp9gaKgDRQj6660+gbUU3cE=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "29a3d7b768c70addce17af0869f6e2bd8f5be4b7", + "rev": "815e4121d6a5d504c0f96e5be2dd7f871e4fd99d", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 4571818..dbcbd00 100644 --- a/flake.nix +++ b/flake.nix @@ -2,8 +2,8 @@ description = "Neovim derivation"; inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; - nixpkgs-master.url = "github:NixOS/nixpkgs/master"; + nixpkgs-uns.url = "github:NixOS/nixpkgs/nixos-unstable"; + nixpkgs.url = "github:NixOS/nixpkgs/master"; flake-utils.url = "github:numtide/flake-utils"; neovim-nightly-overlay.url = "github:nix-community/neovim-nightly-overlay"; gen-luarc = { diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index 09e802f..f3219ea 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -26,15 +26,12 @@ with final.pkgs.lib; let neogit nightfox-nvim nvim-autopairs - # nvim-dap - # nvim-dap-go - # nvim-dap-ui nvim-lint nvim-lspconfig - # nvim-nio nvim-treesitter-context nvim-treesitter-textobjects nvim-treesitter.withAllGrammars + oil-nvim refactoring-nvim render-markdown-nvim scope-nvim diff --git a/nvim/lua/plugins/ai.lua b/nvim/lua/plugins/ai.lua index 201beb1..effa2ea 100644 --- a/nvim/lua/plugins/ai.lua +++ b/nvim/lua/plugins/ai.lua @@ -4,48 +4,11 @@ return { cmd = 'Copilot', opts = { panel = { - enabled = true, - auto_refresh = false, - keymap = { - jump_prev = '', - jump_next = '', - accept = '', - toggle = '', - }, + enabled = false, }, suggestion = { enabled = false, }, - completion = { - documentation = { - auto_show = true, - }, - list = { - selection = { - preselect = false, - auto_insert = true, - }, - }, - accept = { - auto_brackets = { - enabled = true, - }, - }, - }, - filetypes = { - go = true, - lua = true, - php = true, - python = true, - ruby = true, - sh = true, - bash = true, - javascript = true, - puppet = true, - yaml = true, - markdown = true, - ['*'] = false, - }, }, }, { @@ -61,14 +24,17 @@ return { chat = { adapter = 'copilot' }, inline = { adapter = 'copilot' }, }, + adapters = { + ollama = function() + return require('codecompanion.adapters').extend('ollama', { + schema = { + model = { default = 'qwen2.5-coder:1.5b' }, + }, + }) + end, + }, }, keys = { - { - 'ac', - 'CodeCompanionChat Toggle', - noremap = true, - desc = 'Copilot chat toggle', - }, { 'as', 'CodeCompanionChat Add', diff --git a/nvim/lua/plugins/debug.lua b/nvim/lua/plugins/debug.lua deleted file mode 100644 index 9679263..0000000 --- a/nvim/lua/plugins/debug.lua +++ /dev/null @@ -1,56 +0,0 @@ -return {} --- { --- 'rcarriga/nvim-dap-ui', --- event = 'VeryLazy', --- dependencies = { --- 'nvim-neotest/nvim-nio', --- }, --- }, --- { --- 'mfussenegger/nvim-dap', --- event = 'VeryLazy', --- dependencies = { --- 'leoluz/nvim-dap-go', --- 'rcarriga/nvim-dap-ui', --- }, --- config = function() --- local d = require('dap') --- local w = require('dap.ui.widgets') --- local ui = require('dapui') --- require('dap-go').setup() --- ui.setup() --- --- local scopes = nil --- vim.keymap.set('n', 'za', function() --- ui.toggle() --- end, { desc = 'toggle dapui' }) --- vim.keymap.set('n', 'zz', function() --- d.continue() --- end, { desc = 'start debugger' }) --- vim.keymap.set('n', 'zn', function() --- d.step_over() --- end, { desc = 'step over' }) --- vim.keymap.set('n', 'zi', function() --- d.step_into() --- end, { desc = 'step into' }) --- vim.keymap.set('n', 'zo', function() --- d.step_out() --- end, { desc = 'step out' }) --- vim.keymap.set('n', 'zx', function() --- d.toggle_breakpoint() --- end, { desc = 'toggle_breakpoint' }) --- vim.keymap.set('n', 'zr', function() --- d.run_last() --- end, { desc = 'run prev' }) --- vim.keymap.set({ 'n', 'v' }, 'zh', function() --- ui.eval() --- end, { desc = 'hover' }) --- vim.keymap.set({ 'n', 'v' }, 'zp', function() --- require('dap.ui.widgets').preview() --- end, { desc = 'preview' }) --- vim.keymap.set('n', 'zf', function() --- local widgets = require('dap.ui.widgets') --- widgets.centered_float(widgets.frames) --- end, { desc = 'view frames' }) --- end, --- }, diff --git a/nvim/lua/plugins/lsp.lua b/nvim/lua/plugins/lsp.lua index 54288fe..6848030 100644 --- a/nvim/lua/plugins/lsp.lua +++ b/nvim/lua/plugins/lsp.lua @@ -179,6 +179,8 @@ return { formatters_by_ft = { json = { 'jq' }, puppet = { 'puppet-lint' }, + lua = { 'stylua' }, + python = { 'ruff' }, ['*'] = { 'trim_whitespace' }, }, format_on_save = function(bufnr) diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index 9343772..c5da54a 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -1,8 +1,33 @@ return { { 'windwp/nvim-autopairs', - event = "InsertEnter", - config = true + event = 'InsertEnter', + config = true, + }, + { + 'stevearc/oil.nvim', + opts = { + watch_for_changes = true, + columns = { + 'permissions', + 'size', + }, + view_options = { + show_hidden = true, + }, + keymaps = { + ['wq'] = 'actions.close', + }, + }, + keys = { + { + 'nc', + function() + require('oil').toggle_float() + end, + { noremap = true, silent = true }, + }, + }, }, { 'jinh0/eyeliner.nvim', From 38e0a620f3ed4d0fbd0a5a70191a6134a42b0822 Mon Sep 17 00:00:00 2001 From: cjurgell Date: Mon, 21 Apr 2025 14:19:13 -0500 Subject: [PATCH 111/160] fix conflicting grn mapping --- nvim/lua/plugins/mini.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index cc76c4f..4a0ca07 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -49,7 +49,11 @@ return { require('mini.bracketed').setup() require('mini.icons').setup() require('mini.jump2d').setup { mappings = { start_jumping = 'S' } } - require('mini.operators').setup() + require('mini.operators').setup { + replace = { + prefix = "gR" + } + } require('mini.surround').setup() require('mini.splitjoin').setup { detect = { separator = '[,;\n]' } } From 96a162e9e8e9fa55f6d69296b6ecef0781dc3e4d Mon Sep 17 00:00:00 2001 From: iofq Date: Tue, 22 Apr 2025 01:36:18 -0500 Subject: [PATCH 112/160] minidiff/git --- nix/neovim-overlay.nix | 1 - nvim/lua/plugins/mini.lua | 78 +++++++++++++++++++++++++++++-------- nvim/lua/plugins/misc.lua | 50 ++---------------------- nvim/lua/plugins/snacks.lua | 50 +++++++++++++++++------- 4 files changed, 102 insertions(+), 77 deletions(-) diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index f3219ea..3a1addb 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -20,7 +20,6 @@ with final.pkgs.lib; let copilot-lua diffview-nvim eyeliner-nvim - gitsigns-nvim lazy-nvim mini-nvim neogit diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index 4a0ca07..c676575 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -3,6 +3,44 @@ return { 'echasnovski/mini.nvim', lazy = false, dependencies = { 'folke/snacks.nvim' }, + keys = { + { + 'gp', + function() + MiniDiff.toggle_overlay(0) + end, + noremap = true, + desc = 'git diff overlay', + }, + { + 'gr', + function() + return MiniDiff.operator('reset') .. 'gh' + end, + noremap = true, + desc = 'git diff reset', + }, + { + 'gd', + function() + return MiniGit.show_at_cursor() + end, + noremap = true, + desc = 'git show at cursor', + }, + { + 'gb', + 'vert Git blame -- %', + noremap = true, + desc = 'git blame', + }, + { + 'gg', + ':Git ', + noremap = true, + desc = 'git command', + }, + }, config = function() require('mini.basics').setup { mappings = { windows = true } } require('mini.tabline').setup { @@ -13,17 +51,10 @@ return { content = { active = function() local mode, mode_hl = MiniStatusline.section_mode {} - local git = function() - local g = vim.b.gitsigns_head - return (g == nil) and '' or g - end - local diff = function() - local g = vim.b.gitsigns_status - return (g == nil) and '' or g - end + local filename = MiniStatusline.section_filename { trunc_width = 140 } + local diff = MiniStatusline.section_diff { trunc_width = 75, icon = '' } local diagnostics = MiniStatusline.section_diagnostics { trunc_width = 75 } local lsp = MiniStatusline.section_lsp { trunc_width = 75 } - local filename = MiniStatusline.section_filename { trunc_width = 140 } local search = MiniStatusline.section_searchcount { trunc_width = 75 } return MiniStatusline.combine_groups { @@ -31,7 +62,7 @@ return { '%<', -- Mark general truncate point { hl = 'MiniStatuslineFilename', strings = { filename } }, '%=', -- End left alignment - { hl = 'MiniStatusDevinfo', strings = { git(), diff(), diagnostics, lsp } }, + { hl = 'MiniStatusDevinfo', strings = { diff, diagnostics, lsp } }, { hl = mode_hl, strings = { search } }, } end, @@ -51,12 +82,29 @@ return { require('mini.jump2d').setup { mappings = { start_jumping = 'S' } } require('mini.operators').setup { replace = { - prefix = "gR" - } + prefix = 'gR', + }, } + require('mini.git').setup() + local align_blame = function(au_data) + if au_data.data.git_subcommand ~= 'blame' then + return + end + + -- Align blame output with source + local win_src = au_data.data.win_source + vim.wo.wrap = false + vim.fn.winrestview { topline = vim.fn.line('w0', win_src) } + vim.api.nvim_win_set_cursor(0, { vim.fn.line('.', win_src), 0 }) + + -- Bind both windows so that they scroll together + vim.wo[win_src].scrollbind, vim.wo.scrollbind = true, true + end + vim.api.nvim_create_autocmd('User', { pattern = 'MiniGitCommandSplit', callback = align_blame }) + require('mini.surround').setup() require('mini.splitjoin').setup { detect = { separator = '[,;\n]' } } - + require('mini.diff').setup { options = { wrap_goto = true } } local miniclue = require('mini.clue') miniclue.setup { triggers = { @@ -99,12 +147,10 @@ return { integrations = { map.gen_integration.builtin_search(), map.gen_integration.diagnostic(), - map.gen_integration.gitsigns(), + map.gen_integration.diff(), }, window = { show_integration_count = false, - winblend = 0, - width = 5, }, } vim.keymap.set('n', 'nm', map.toggle, { noremap = true, desc = 'minimap open' }) diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index c5da54a..10143cb 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -107,55 +107,11 @@ return { vim.cmd('colorscheme terafox') vim.api.nvim_set_hl(0, 'StatusLine', { bg = 'none' }) vim.api.nvim_set_hl(0, 'StatusLineNC', { bg = 'none' }) - vim.api.nvim_set_hl(0, 'GitSignsAdd', { fg = 'green', bold = true }) - vim.api.nvim_set_hl(0, 'GitSignsDelete', { fg = 'red', bold = true }) - vim.api.nvim_set_hl(0, 'GitSignsChange', { fg = 'green', bold = true }) - vim.api.nvim_set_hl(0, 'GitSignsCurrentLineBlame', { link = 'Comment' }) + vim.api.nvim_set_hl(0, 'MiniDiffSignAdd', { fg = 'green', bold = true }) + vim.api.nvim_set_hl(0, 'MiniDiffSignDelete', { fg = 'red', bold = true }) + vim.api.nvim_set_hl(0, 'MiniDiffSignChange', { fg = 'green', bold = true }) end, }, - { - 'lewis6991/gitsigns.nvim', - event = 'VeryLazy', - opts = { - signcolumn = false, - numhl = true, - on_attach = function() - local gs = package.loaded.gitsigns - vim.keymap.set('n', 'gg', gs.preview_hunk, { desc = 'git preview hunk' }) - vim.keymap.set('n', 'gR', gs.reset_hunk, { desc = 'git reset hunk' }) - vim.keymap.set('n', 'gs', gs.stage_hunk, { desc = 'git stage hunk' }) - vim.keymap.set('n', 'gd', gs.diffthis, { desc = 'git diff hunk' }) - vim.keymap.set('n', 'gb', function() - gs.blame_line { full = true } - end, { desc = 'git blame_line current' }) - vim.keymap.set('n', 'gB', gs.toggle_current_line_blame, { desc = 'git blame_line toggle' }) - vim.keymap.set('v', 'gR', function() - gs.reset_hunk { vim.fn.line('.'), vim.fn.line('v') } - end, { desc = 'git reset hunk' }) - - -- Navigation - vim.keymap.set('n', ']g', function() - if vim.wo.diff then - return ']c' - end - vim.schedule(function() - gs.next_hunk { target = 'all' } - end) - return '' - end, { expr = true }) - - vim.keymap.set('n', '[g', function() - if vim.wo.diff then - return '[c' - end - vim.schedule(function() - gs.prev_hunk { target = 'all' } - end) - return '' - end, { expr = true }) - end, - }, - }, { 'gbprod/yanky.nvim', opts = { diff --git a/nvim/lua/plugins/snacks.lua b/nvim/lua/plugins/snacks.lua index 9e22dae..2e8d55f 100644 --- a/nvim/lua/plugins/snacks.lua +++ b/nvim/lua/plugins/snacks.lua @@ -124,91 +124,115 @@ return { function() Snacks.picker.smart() end, - { noremap = true, silent = true, desc = 'Fuzzy find files' }, + noremap = true, + desc = 'Fuzzy find files', }, { 'fe', function() Snacks.explorer() end, - { noremap = true, silent = true, desc = 'snacks explorer' }, + noremap = true, + desc = 'snacks explorer', }, { 'fE', function() Snacks.explorer.reveal() end, - { noremap = true, silent = true, desc = 'snacks explorer open current file' }, + noremap = true, + silent = true, + desc = 'snacks explorer open current file', }, { 'fg', function() Snacks.picker.git_files() end, - { noremap = true, silent = true, desc = 'Fuzzy find files' }, + noremap = true, + silent = true, + desc = 'Fuzzy find files', }, { 'fa', function() Snacks.picker.grep() end, - { noremap = true, silent = true, desc = 'Fuzzy find grep' }, + noremap = true, + silent = true, + desc = 'Fuzzy find grep', }, { 'f8', function() Snacks.picker.grep_word() end, - { noremap = true, silent = true, desc = 'Fuzzy find grep word' }, + noremap = true, + silent = true, + desc = 'Fuzzy find grep word', }, { 'f?', function() Snacks.picker.pickers() end, - { noremap = true, silent = true, desc = 'See all pickers' }, + noremap = true, + silent = true, + desc = 'See all pickers', }, { "f'", function() Snacks.picker.marks() end, - { noremap = true, silent = true, desc = 'Pick marks' }, + noremap = true, + silent = true, + desc = 'Pick marks', }, { 'fu', function() Snacks.picker.undo() end, - { noremap = true, silent = true, desc = 'Pick undotree' }, + noremap = true, + silent = true, + desc = 'Pick undotree', }, { 'fj', function() Snacks.picker.jumps() end, - { noremap = true, silent = true, desc = 'Pick jumps' }, + noremap = true, + silent = true, + desc = 'Pick jumps', }, { 'f.', function() Snacks.picker.resume() end, - { noremap = true, silent = true, desc = 'Fuzzy find resume' }, + noremap = true, + silent = true, + desc = 'Fuzzy find resume', }, { '', function() Snacks.picker.buffers() end, - { noremap = true, silent = true, desc = 'Fuzzy find buffers' }, + noremap = true, + silent = true, + desc = 'Fuzzy find buffers', }, { 'fn', function() Snacks.picker.notifications() end, - { noremap = true, silent = true, desc = 'pick notifications' }, + noremap = true, + silent = true, + desc = 'pick notifications', }, }, }, From fb7e0a930afc1c6396e192b6a095dfc21735b321 Mon Sep 17 00:00:00 2001 From: iofq Date: Sat, 3 May 2025 20:50:37 -0500 Subject: [PATCH 113/160] completion tweaks --- flake.lock | 65 +++++++++++++++++++++------------ flake.nix | 4 ++ nix/neovim-overlay.nix | 6 ++- nvim/lua/config/init.lua | 1 - nvim/lua/plugins/ai.lua | 1 + nvim/lua/plugins/completion.lua | 22 +++++++++-- nvim/lua/plugins/mini.lua | 15 ++++++++ nvim/lua/plugins/misc.lua | 16 ++++---- 8 files changed, 93 insertions(+), 37 deletions(-) diff --git a/flake.lock b/flake.lock index fc325ca..1095eef 100644 --- a/flake.lock +++ b/flake.lock @@ -96,11 +96,11 @@ ] }, "locked": { - "lastModified": 1741352980, - "narHash": "sha256-+u2UunDA4Cl5Fci3m7S643HzKmIDAe+fiXrLqYsR2fs=", + "lastModified": 1743550720, + "narHash": "sha256-hIshGgKZCgWh6AYJpJmRgFdR3WUbkY04o82X05xqQiY=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "f4330d22f1c5d2ba72d3d22df5597d123fdb60a9", + "rev": "c621e8422220273271f52058f618c94e405bb0f5", "type": "github" }, "original": { @@ -249,11 +249,11 @@ ] }, "locked": { - "lastModified": 1742014779, - "narHash": "sha256-I6fG1zrfdLFcp/imGZElig0BJO3YU0QEXLgvwWoOpJ8=", + "lastModified": 1744693102, + "narHash": "sha256-1Z4WPGVky4w3lrhrgs89OKsLzPdtkbi1bPLNFWsoLfY=", "owner": "hercules-ci", "repo": "hercules-ci-effects", - "rev": "524637ef84c177661690b924bf64a1ce18072a2c", + "rev": "5b6cec51c9ec095a0d3fd4c8eeb53eb5c59ae33e", "type": "github" }, "original": { @@ -278,6 +278,22 @@ "type": "github" } }, + "mini-nvim": { + "flake": false, + "locked": { + "lastModified": 1746264830, + "narHash": "sha256-A3FIyfy/3VUBMPfWd6PLaqAhOAOA5ava0nc4Z9JCKCI=", + "owner": "echasnovski", + "repo": "mini.nvim", + "rev": "ee23e1abc206efc6d6cce19ec8c0a3da7a897035", + "type": "github" + }, + "original": { + "owner": "echasnovski", + "repo": "mini.nvim", + "type": "github" + } + }, "neovim-nightly-overlay": { "inputs": { "flake-compat": "flake-compat_2", @@ -289,11 +305,11 @@ "treefmt-nix": "treefmt-nix" }, "locked": { - "lastModified": 1743898191, - "narHash": "sha256-JCcQDgwYV+C4igYA6DchGpKKA6eyZXLvRrxWHmQbmDk=", + "lastModified": 1746256223, + "narHash": "sha256-a97mwMJcE0cYGfwB5N5v+Ey+by1poGTc/fsrd47Fom8=", "owner": "nix-community", "repo": "neovim-nightly-overlay", - "rev": "276567b29d8c9aca7b6a54e93a9183e44a17f19c", + "rev": "02ec02529a5d602a9e9d273531d776d160fae182", "type": "github" }, "original": { @@ -305,11 +321,11 @@ "neovim-src": { "flake": false, "locked": { - "lastModified": 1743893800, - "narHash": "sha256-i/X0b3b/dAqjNIB5RoryeDvMkVfdoPBwK5xn06W6Wdo=", + "lastModified": 1746214751, + "narHash": "sha256-FlGgG3A9oJwGP0YTWU2Nw9fwdnqPMapjx3twonu0Vkg=", "owner": "neovim", "repo": "neovim", - "rev": "28e819018520a2300eaeeec6794ffcd614b25dd2", + "rev": "5a2edc483dff93cc94847b6950713d80a51087c0", "type": "github" }, "original": { @@ -320,11 +336,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1743689281, - "narHash": "sha256-y7Hg5lwWhEOgflEHRfzSH96BOt26LaYfrYWzZ+VoVdg=", + "lastModified": 1746152631, + "narHash": "sha256-zBuvmL6+CUsk2J8GINpyy8Hs1Zp4PP6iBWSmZ4SCQ/s=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "2bfc080955153be0be56724be6fa5477b4eefabb", + "rev": "032bc6539bd5f14e9d0c51bd79cfe9a055b094c3", "type": "github" }, "original": { @@ -364,11 +380,11 @@ }, "nixpkgs-uns": { "locked": { - "lastModified": 1743827369, - "narHash": "sha256-rpqepOZ8Eo1zg+KJeWoq1HAOgoMCDloqv5r2EAa9TSA=", + "lastModified": 1746232882, + "narHash": "sha256-MHmBH2rS8KkRRdoU/feC/dKbdlMkcNkB5mwkuipVHeQ=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "42a1c966be226125b48c384171c44c651c236c22", + "rev": "7a2622e2c0dbad5c4493cb268aba12896e28b008", "type": "github" }, "original": { @@ -380,11 +396,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1743962461, - "narHash": "sha256-UaulIYZqwVF7CRYsDG6Jt3k3+Qs21yJT2/CLRWT9qzg=", + "lastModified": 1746314326, + "narHash": "sha256-2xqKEdmbFttKUwIxZgQAOG24rNqVvJ7c3LmA+ZnvWlc=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "eb77ff4e9c1f071693be92d144f363ef24701039", + "rev": "0eb56ece14bc2e4301f756c342356ceceb90b6f9", "type": "github" }, "original": { @@ -398,6 +414,7 @@ "inputs": { "flake-utils": "flake-utils", "gen-luarc": "gen-luarc", + "mini-nvim": "mini-nvim", "neovim-nightly-overlay": "neovim-nightly-overlay", "nixpkgs": "nixpkgs_2", "nixpkgs-uns": "nixpkgs-uns" @@ -426,11 +443,11 @@ ] }, "locked": { - "lastModified": 1743748085, - "narHash": "sha256-uhjnlaVTWo5iD3LXics1rp9gaKgDRQj6660+gbUU3cE=", + "lastModified": 1746216483, + "narHash": "sha256-4h3s1L/kKqt3gMDcVfN8/4v2jqHrgLIe4qok4ApH5x4=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "815e4121d6a5d504c0f96e5be2dd7f871e4fd99d", + "rev": "29ec5026372e0dec56f890e50dbe4f45930320fd", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index dbcbd00..e4c6acf 100644 --- a/flake.nix +++ b/flake.nix @@ -10,6 +10,10 @@ url = "github:mrcjkb/nix-gen-luarc-json"; inputs.nixpkgs.follows = "nixpkgs"; }; + mini-nvim = { + url = "github:echasnovski/mini.nvim"; + flake = false; + }; # Add bleeding-edge plugins here. # They can be updated with `nix flake update` (make sure to commit the generated flake.lock) # wf-nvim = { diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index 3a1addb..087fe8e 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -11,6 +11,8 @@ with final.pkgs.lib; let }; mkNeovim = pkgs.callPackage ./mkNeovim.nix { inherit pkgs-wrapNeovim; }; + mini-nvim-git = mkNvimPlugin inputs.mini-nvim "mini.nvim"; + all-plugins = with pkgs.vimPlugins; [ blink-cmp blink-copilot @@ -20,11 +22,11 @@ with final.pkgs.lib; let copilot-lua diffview-nvim eyeliner-nvim + friendly-snippets lazy-nvim - mini-nvim + mini-nvim-git neogit nightfox-nvim - nvim-autopairs nvim-lint nvim-lspconfig nvim-treesitter-context diff --git a/nvim/lua/config/init.lua b/nvim/lua/config/init.lua index daaaa59..ccfec4d 100644 --- a/nvim/lua/config/init.lua +++ b/nvim/lua/config/init.lua @@ -56,7 +56,6 @@ vim.diagnostic.config { } -- random keymaps -vim.keymap.set({ 'v', 'i' }, 'wq', 'l', { noremap = true, silent = true }) vim.keymap.set('n', '', vim.cmd.bnext, { noremap = true, silent = true }) vim.keymap.set('n', '', vim.cmd.bprev, { noremap = true, silent = true }) vim.keymap.set('v', '<', 'nm', map.toggle, { noremap = true, desc = 'minimap open' }) + + local multi = require('mini.keymap').map_multistep + local combo = require('mini.keymap').map_combo + + combo({ 'i', 'c', 'x', 's' }, 'wq', 'l') + multi({ 'i', 's' }, '', { 'blink_accept', 'vimsnippet_next', 'jump_after_close', 'jump_after_tsnode' }) + multi({ 'i', 's' }, '', { 'vimsnippet_prev', 'jump_before_open', 'jump_before_tsnode' }) end) end, }, diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index 10143cb..a27f40d 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -1,9 +1,4 @@ return { - { - 'windwp/nvim-autopairs', - event = 'InsertEnter', - config = true, - }, { 'stevearc/oil.nvim', opts = { @@ -37,8 +32,14 @@ return { vim.api.nvim_set_hl(0, 'EyelinerSecondary', { underline = true, bold = true }) end, }, - { 'tiagovla/scope.nvim', event = 'VeryLazy', config = true }, - { 'MeanderingProgrammer/render-markdown.nvim', event = 'VeryLazy', config = true }, + { 'tiagovla/scope.nvim', event = 'VeryLazy', config = true }, + { + 'MeanderingProgrammer/render-markdown.nvim', + event = 'VeryLazy', + opts = { + ft = { 'markdown', 'codecompanion ' }, + }, + }, { 'sindrets/diffview.nvim', event = 'VeryLazy', @@ -110,6 +111,7 @@ return { vim.api.nvim_set_hl(0, 'MiniDiffSignAdd', { fg = 'green', bold = true }) vim.api.nvim_set_hl(0, 'MiniDiffSignDelete', { fg = 'red', bold = true }) vim.api.nvim_set_hl(0, 'MiniDiffSignChange', { fg = 'green', bold = true }) + vim.api.nvim_set_hl(0, 'BlinkCmpGhostText', { link = 'String' }) end, }, { From 8feb221d41c8db8cad34e9bfc8a9981f099fe055 Mon Sep 17 00:00:00 2001 From: iofq Date: Tue, 6 May 2025 23:48:51 -0500 Subject: [PATCH 114/160] mini tweaks --- nvim/lua/config/init.lua | 2 + nvim/lua/plugins/mini.lua | 92 +++++++++++++++------------------ nvim/lua/plugins/misc.lua | 11 +++- nvim/lua/plugins/treesitter.lua | 5 +- 4 files changed, 58 insertions(+), 52 deletions(-) diff --git a/nvim/lua/config/init.lua b/nvim/lua/config/init.lua index ccfec4d..04214a9 100644 --- a/nvim/lua/config/init.lua +++ b/nvim/lua/config/init.lua @@ -60,6 +60,8 @@ vim.keymap.set('n', '', vim.cmd.bnext, { noremap = true, silent = true }) vim.keymap.set('n', '', vim.cmd.bprev, { noremap = true, silent = true }) vim.keymap.set('v', '<', '', '>gv') +vim.keymap.set({ 'n', 'v' }, '[[', '{') +vim.keymap.set({ 'n', 'v' }, ']]', '}') -- resize splits if window got resized vim.api.nvim_create_autocmd({ 'VimResized' }, { diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index 3b9e282..6a7557e 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -1,3 +1,42 @@ +-- ripped from lazyvim +local function setup_pairs(opts) + local pairs = require('mini.pairs') + pairs.setup(opts) + local open = pairs.open + pairs.open = function(pair, neigh_pattern) + if vim.fn.getcmdline() ~= '' then + return open(pair, neigh_pattern) + end + local o, c = pair:sub(1, 1), pair:sub(2, 2) + local line = vim.api.nvim_get_current_line() + local cursor = vim.api.nvim_win_get_cursor(0) + local next = line:sub(cursor[2] + 1, cursor[2] + 1) + local before = line:sub(1, cursor[2]) + if opts.markdown and o == '`' and vim.bo.filetype == 'markdown' and before:match('^%s*``') then + return '`\n```' .. vim.api.nvim_replace_termcodes('', true, true, true) + end + if opts.skip_next and next ~= '' and next:match(opts.skip_next) then + return o + end + if opts.skip_ts and #opts.skip_ts > 0 then + local ok, captures = pcall(vim.treesitter.get_captures_at_pos, 0, cursor[1] - 1, math.max(cursor[2] - 1, 0)) + for _, capture in ipairs(ok and captures or {}) do + if vim.tbl_contains(opts.skip_ts, capture.capture) then + return o + end + end + end + if opts.skip_unbalanced and next == c and c ~= o then + local _, count_open = line:gsub(vim.pesc(pair:sub(1, 1)), '') + local _, count_close = line:gsub(vim.pesc(pair:sub(2, 2)), '') + if count_close > count_open then + return o + end + end + return open(pair, neigh_pattern) + end +end + return { { 'echasnovski/mini.nvim', @@ -12,34 +51,6 @@ return { noremap = true, desc = 'git diff overlay', }, - { - 'gr', - function() - return MiniDiff.operator('reset') .. 'gh' - end, - noremap = true, - desc = 'git diff reset', - }, - { - 'gd', - function() - return MiniGit.show_at_cursor() - end, - noremap = true, - desc = 'git show at cursor', - }, - { - 'gb', - 'vert Git blame -- %', - noremap = true, - desc = 'git blame', - }, - { - 'gg', - ':Git ', - noremap = true, - desc = 'git command', - }, }, config = function() require('mini.basics').setup { mappings = { windows = true } } @@ -85,29 +96,13 @@ return { prefix = 'gR', }, } - require('mini.pairs').setup { + setup_pairs { modes = { insert = true, command = true, terminal = false }, skip_next = [=[[%w%%%'%[%"%.%`%$]]=], skip_ts = { 'string' }, skip_unbalanced = true, markdown = true, } - require('mini.git').setup() - local align_blame = function(au_data) - if au_data.data.git_subcommand ~= 'blame' then - return - end - - -- Align blame output with source - local win_src = au_data.data.win_source - vim.wo.wrap = false - vim.fn.winrestview { topline = vim.fn.line('w0', win_src) } - vim.api.nvim_win_set_cursor(0, { vim.fn.line('.', win_src), 0 }) - - -- Bind both windows so that they scroll together - vim.wo[win_src].scrollbind, vim.wo.scrollbind = true, true - end - vim.api.nvim_create_autocmd('User', { pattern = 'MiniGitCommandSplit', callback = align_blame }) require('mini.surround').setup() require('mini.splitjoin').setup { detect = { separator = '[,;\n]' } } @@ -160,15 +155,14 @@ return { show_integration_count = false, }, } - vim.keymap.set('n', 'nm', map.toggle, { noremap = true, desc = 'minimap open' }) local multi = require('mini.keymap').map_multistep local combo = require('mini.keymap').map_combo - combo({ 'i', 'c', 'x', 's' }, 'wq', 'l') - multi({ 'i', 's' }, '', { 'blink_accept', 'vimsnippet_next', 'jump_after_close', 'jump_after_tsnode' }) - multi({ 'i', 's' }, '', { 'vimsnippet_prev', 'jump_before_open', 'jump_before_tsnode' }) + combo({ 'v', 'r', 'i', 's' }, 'wq', 'l') + multi({ 'i', 's' }, '', { 'blink_accept', 'vimsnippet_next' }) + multi({ 'i', 's' }, '', { 'vimsnippet_prev' }) end) end, }, diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index a27f40d..3f1c82d 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -37,7 +37,7 @@ return { 'MeanderingProgrammer/render-markdown.nvim', event = 'VeryLazy', opts = { - ft = { 'markdown', 'codecompanion ' }, + ft = { 'markdown', 'codecompanion' }, }, }, { @@ -68,6 +68,13 @@ return { }, keys = { { 'nb', vim.cmd.DiffviewOpen, noremap = true, desc = 'diffview open' }, + { + 'nh', + vim.cmd.DiffviewFileHistory, + mode = { 'n', 'v' }, + noremap = true, + desc = 'diffview history', + }, }, }, { @@ -100,6 +107,8 @@ return { 'mini', 'treesitter', 'neogit', + 'native_lsp', + 'diagnostic', }, }, }, diff --git a/nvim/lua/plugins/treesitter.lua b/nvim/lua/plugins/treesitter.lua index 37a48cd..acdcada 100644 --- a/nvim/lua/plugins/treesitter.lua +++ b/nvim/lua/plugins/treesitter.lua @@ -48,6 +48,7 @@ return { ['ia'] = '@parameter.inner', ['ik'] = '@assignment.lhs', ['iv'] = '@assignment.rhs', + ['is'] = { query = '@local.scope', query_group = 'locals', desc = 'Select language scope' }, }, }, move = { @@ -55,12 +56,12 @@ return { goto_next_start = { [']a'] = '@parameter.inner', [']f'] = '@function.outer', - [']]'] = '@block.outer', + ['}'] = '@statement.outer', }, goto_previous_start = { ['[a'] = '@parameter.inner', ['[f'] = '@function.outer', - ['[['] = '@block.outer', + ['{'] = '@statement.outer', }, }, swap = { From 2bab00d2e3f05f99900f32b9d9a3481bab77a00e Mon Sep 17 00:00:00 2001 From: iofq Date: Thu, 8 May 2025 02:02:06 -0500 Subject: [PATCH 115/160] use vim.lsp.config API --- nvim/lua/plugins/lsp.lua | 29 ++++++++++++----------------- nvim/lua/plugins/mini.lua | 7 +++---- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/nvim/lua/plugins/lsp.lua b/nvim/lua/plugins/lsp.lua index 6848030..c3ab405 100644 --- a/nvim/lua/plugins/lsp.lua +++ b/nvim/lua/plugins/lsp.lua @@ -31,20 +31,11 @@ return { 'neovim/nvim-lspconfig', event = 'VeryLazy', dependencies = { - 'folke/snacks.nvim', 'folke/trouble.nvim', 'saghen/blink.cmp', }, config = function() - local lspconfig = require('lspconfig') - local capabilities = vim.tbl_deep_extend( - 'force', - {}, - require('blink.cmp').get_lsp_capabilities(), - vim.lsp.protocol.make_client_capabilities() - ) - lspconfig.gopls.setup { - capabilities = capabilities, + vim.lsp.config('gopls', { settings = { gopls = { gofumpt = true, @@ -69,12 +60,8 @@ return { staticcheck = true, }, }, - } - lspconfig.basedpyright.setup { capabilities = capabilities } - lspconfig.nil_ls.setup { capabilities = capabilities } - lspconfig.phpactor.setup { capabilities = capabilities } - lspconfig.lua_ls.setup { - capabilities = capabilities, + }) + vim.lsp.config('lua_ls', { on_init = function(client) local path = client.workspace_folders[1].name if vim.loop.fs_stat(path .. '/.luarc.json') or vim.loop.fs_stat(path .. '/.luarc.jsonc') then @@ -96,6 +83,13 @@ return { settings = { Lua = {}, }, + }) + + vim.lsp.enable { + 'nil_ls', + 'phpactor', + 'gopls', + 'lua_ls', } vim.api.nvim_create_autocmd('LspAttach', { @@ -139,9 +133,10 @@ return { vim.keymap.set('n', 'grh', function() vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled()) end, { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP hints toggle' }) + -- Auto-refresh code lenses if client.server_capabilities.codeLensProvider then - vim.api.nvim_create_autocmd({ 'InsertLeave', 'BufWritePost', 'TextChanged' }, { + vim.api.nvim_create_autocmd({ 'InsertLeave', 'TextChanged' }, { group = vim.api.nvim_create_augroup(string.format('lsp-%s-%s', bufnr, client.id), {}), callback = function() vim.lsp.codelens.refresh { bufnr = bufnr } diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index 6a7557e..dbc7043 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -159,10 +159,9 @@ return { local multi = require('mini.keymap').map_multistep local combo = require('mini.keymap').map_combo - - combo({ 'v', 'r', 'i', 's' }, 'wq', 'l') - multi({ 'i', 's' }, '', { 'blink_accept', 'vimsnippet_next' }) - multi({ 'i', 's' }, '', { 'vimsnippet_prev' }) + combo({ 'v', 'i', 's' }, 'wq', 'l') + multi({ 'i', 's' }, '', { 'vimsnippet_next', 'increase_indent' }) + multi({ 'i', 's' }, '', { 'vimsnippet_prev', 'decrease_indent' }) end) end, }, From f47fc0f76f6b9a520b2b3c059c773a81589f0b0b Mon Sep 17 00:00:00 2001 From: iofq Date: Sat, 17 May 2025 04:29:48 -0500 Subject: [PATCH 116/160] org mode --- flake.lock | 19 +++++++++++++- flake.nix | 6 ++++- nix/neovim-overlay.nix | 17 +++++++++++- nvim/lua/config/init.lua | 3 +-- nvim/lua/plugins/completion.lua | 9 +++++++ nvim/lua/plugins/mini.lua | 21 +++++++++++++++ nvim/lua/plugins/misc.lua | 46 ++++++++++++++++++++++++++++++++- nvim/lua/plugins/treesitter.lua | 5 ++-- 8 files changed, 118 insertions(+), 8 deletions(-) diff --git a/flake.lock b/flake.lock index 1095eef..628b39d 100644 --- a/flake.lock +++ b/flake.lock @@ -410,6 +410,22 @@ "type": "github" } }, + "nvim-orgmode": { + "flake": false, + "locked": { + "lastModified": 1747057841, + "narHash": "sha256-mLT3XnsRyG+ZldB9NrR9tjmaznRAISBsdVTVPSjhj0A=", + "owner": "nvim-orgmode", + "repo": "orgmode", + "rev": "8ff03c75f3d808e3ea1765b7aba0fb4783a5a83f", + "type": "github" + }, + "original": { + "owner": "nvim-orgmode", + "repo": "orgmode", + "type": "github" + } + }, "root": { "inputs": { "flake-utils": "flake-utils", @@ -417,7 +433,8 @@ "mini-nvim": "mini-nvim", "neovim-nightly-overlay": "neovim-nightly-overlay", "nixpkgs": "nixpkgs_2", - "nixpkgs-uns": "nixpkgs-uns" + "nixpkgs-uns": "nixpkgs-uns", + "nvim-orgmode": "nvim-orgmode" } }, "systems": { diff --git a/flake.nix b/flake.nix index e4c6acf..dd710c9 100644 --- a/flake.nix +++ b/flake.nix @@ -14,6 +14,10 @@ url = "github:echasnovski/mini.nvim"; flake = false; }; + nvim-orgmode = { + url = "github:nvim-orgmode/orgmode"; + flake = false; + }; # Add bleeding-edge plugins here. # They can be updated with `nix flake update` (make sure to commit the generated flake.lock) # wf-nvim = { @@ -37,7 +41,7 @@ inherit system; config.allowUnfree = true; overlays = [ - # inputs.neovim-nightly-overlay.overlays.default + inputs.neovim-nightly-overlay.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. diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index 087fe8e..725f569 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -12,6 +12,7 @@ with final.pkgs.lib; let mkNeovim = pkgs.callPackage ./mkNeovim.nix { inherit pkgs-wrapNeovim; }; mini-nvim-git = mkNvimPlugin inputs.mini-nvim "mini.nvim"; + nvim-orgmode = mkNvimPlugin inputs.nvim-orgmode "orgmode"; all-plugins = with pkgs.vimPlugins; [ blink-cmp @@ -29,9 +30,23 @@ with final.pkgs.lib; let nightfox-nvim nvim-lint nvim-lspconfig + nvim-orgmode nvim-treesitter-context nvim-treesitter-textobjects - nvim-treesitter.withAllGrammars + (nvim-treesitter.withPlugins (_: + nvim-treesitter.allGrammars ++ + [(pkgs.tree-sitter.buildGrammar { + language = "org"; + version = "2.0.1"; + src = pkgs.fetchFromGitHub { + owner = "nvim-orgmode"; + repo = "tree-sitter-org"; + rev = "2.0.1"; + hash = "sha256-k1g5+iyJvVWKOuAkFNaaKl42Xmmz9BN+vT0+IQ/4RQI="; + }; + meta.homepage = "https://github.com/nvim-orgmode/tree-sitter-org"; + })] + )) oil-nvim refactoring-nvim render-markdown-nvim diff --git a/nvim/lua/config/init.lua b/nvim/lua/config/init.lua index 04214a9..e615f4e 100644 --- a/nvim/lua/config/init.lua +++ b/nvim/lua/config/init.lua @@ -2,6 +2,7 @@ vim.opt.autowrite = true vim.opt.backspace = 'indent,eol,start' vim.opt.confirm = true vim.opt.completeopt = { 'menu', 'menuone', 'noselect' } +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.list = true @@ -60,8 +61,6 @@ vim.keymap.set('n', '', vim.cmd.bnext, { noremap = true, silent = true }) vim.keymap.set('n', '', vim.cmd.bprev, { noremap = true, silent = true }) vim.keymap.set('v', '<', '', '>gv') -vim.keymap.set({ 'n', 'v' }, '[[', '{') -vim.keymap.set({ 'n', 'v' }, ']]', '}') -- resize splits if window got resized vim.api.nvim_create_autocmd({ 'VimResized' }, { diff --git a/nvim/lua/plugins/completion.lua b/nvim/lua/plugins/completion.lua index aa21196..57a11a8 100644 --- a/nvim/lua/plugins/completion.lua +++ b/nvim/lua/plugins/completion.lua @@ -5,6 +5,7 @@ return { dependencies = { 'mikavilpas/blink-ripgrep.nvim', 'fang2hou/blink-copilot', + 'nvim-orgmode/orgmode', }, opts = { fuzzy = { @@ -23,6 +24,9 @@ return { 'ripgrep', 'copilot', }, + per_filetype = { + org = { 'orgmode' }, + }, providers = { snippets = { score_offset = -20, @@ -47,6 +51,11 @@ return { }, }, }, + orgmode = { + name = 'Orgmode', + module = 'orgmode.org.autocompletion.blink', + fallbacks = { 'buffer' }, + }, }, }, cmdline = { diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index dbc7043..6bf864b 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -51,6 +51,26 @@ return { noremap = true, desc = 'git diff overlay', }, + { + 'gd', + function() + return MiniGit.show_at_cursor() + end, + noremap = true, + desc = 'git show at cursor', + }, + { + 'gb', + 'Git blame -- %', + noremap = true, + desc = 'git blame', + }, + { + 'gg', + ':Git ', + noremap = true, + desc = 'git command', + }, }, config = function() require('mini.basics').setup { mappings = { windows = true } } @@ -96,6 +116,7 @@ return { prefix = 'gR', }, } + require('mini.git').setup() setup_pairs { modes = { insert = true, command = true, terminal = false }, skip_next = [=[[%w%%%'%[%"%.%`%$]]=], diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index 3f1c82d..a8356ce 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -37,7 +37,7 @@ return { 'MeanderingProgrammer/render-markdown.nvim', event = 'VeryLazy', opts = { - ft = { 'markdown', 'codecompanion' }, + file_types = { 'markdown', 'codecompanion' }, }, }, { @@ -109,6 +109,7 @@ return { 'neogit', 'native_lsp', 'diagnostic', + 'modes', }, }, }, @@ -148,4 +149,47 @@ return { }, }, { 'ThePrimeagen/refactoring.nvim', event = 'VeryLazy', config = true }, + { + 'nvim-orgmode/orgmode', + event = 'VeryLazy', + ft = { 'org' }, + dependencies = 'nvim-treesitter', + keys = { + { + 'oR', + 'e ~/orgfiles/refile.org', + desc = 'open org refile', + }, + }, + config = function() + require('orgmode').setup { + org_agenda_files = '~/orgfiles/**/*', + org_default_notes_file = '~/orgfiles/refile.org', + org_todo_keywords = { + 'TODO', + 'IN_PROGRESS', + 'BLOCKED', + '|', + 'DONE', + 'NOT DOING', + }, + org_capture_templates = { + l = { + description = 'Work Log', + template = '* %?', + target = '~/orgfiles/worklog.org', + }, + }, + } + vim.api.nvim_create_autocmd('FileType', { + pattern = 'org', + callback = function() + vim.keymap.set({ 'n', 'i' }, '\\\\', 'lua require("orgmode").action("org_mappings.meta_return")', { + silent = true, + buffer = true, + }) + end, + }) + end, + }, } diff --git a/nvim/lua/plugins/treesitter.lua b/nvim/lua/plugins/treesitter.lua index acdcada..c48c183 100644 --- a/nvim/lua/plugins/treesitter.lua +++ b/nvim/lua/plugins/treesitter.lua @@ -28,6 +28,7 @@ return { config = function() require('nvim-treesitter.configs').setup { ensure_installed = {}, + ignore_install = { 'org' }, auto_install = false, highlight = { enable = true, @@ -56,12 +57,12 @@ return { goto_next_start = { [']a'] = '@parameter.inner', [']f'] = '@function.outer', - ['}'] = '@statement.outer', + [']]'] = '@statement.outer', }, goto_previous_start = { ['[a'] = '@parameter.inner', ['[f'] = '@function.outer', - ['{'] = '@statement.outer', + ['[['] = '@statement.outer', }, }, swap = { From 47a2d487da5310be55acef50b51cd71c2990bf81 Mon Sep 17 00:00:00 2001 From: iofq Date: Tue, 20 May 2025 21:07:57 -0500 Subject: [PATCH 117/160] random rice --- flake.lock | 79 +++++++++++++-------------------- flake.nix | 5 +-- nix/neovim-overlay.nix | 19 +------- nvim/lua/config/init.lua | 2 + nvim/lua/plugins/completion.lua | 9 ---- nvim/lua/plugins/lsp.lua | 1 + nvim/lua/plugins/mini.lua | 14 +++--- nvim/lua/plugins/misc.lua | 44 +----------------- nvim/lua/plugins/treesitter.lua | 2 +- 9 files changed, 46 insertions(+), 129 deletions(-) diff --git a/flake.lock b/flake.lock index 628b39d..4bab839 100644 --- a/flake.lock +++ b/flake.lock @@ -19,11 +19,11 @@ "flake-compat_2": { "flake": false, "locked": { - "lastModified": 1733328505, - "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=", + "lastModified": 1747046372, + "narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=", "owner": "edolstra", "repo": "flake-compat", - "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec", + "rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885", "type": "github" }, "original": { @@ -183,11 +183,11 @@ ] }, "locked": { - "lastModified": 1742649964, - "narHash": "sha256-DwOTp7nvfi8mRfuL1escHDXabVXFGT1VlPD1JHrtrco=", + "lastModified": 1747372754, + "narHash": "sha256-2Y53NGIX2vxfie1rOW0Qb86vjRZ7ngizoo+bnXU9D9k=", "owner": "cachix", "repo": "git-hooks.nix", - "rev": "dcf5072734cb576d2b0c59b2ac44f5050b5eac82", + "rev": "80479b6ec16fefd9c1db3ea13aeb038c60530f46", "type": "github" }, "original": { @@ -249,11 +249,11 @@ ] }, "locked": { - "lastModified": 1744693102, - "narHash": "sha256-1Z4WPGVky4w3lrhrgs89OKsLzPdtkbi1bPLNFWsoLfY=", + "lastModified": 1747284884, + "narHash": "sha256-lTSKhRrassMcJ1ZsuUVunyl/F04vvCKY80HB/4rvvm4=", "owner": "hercules-ci", "repo": "hercules-ci-effects", - "rev": "5b6cec51c9ec095a0d3fd4c8eeb53eb5c59ae33e", + "rev": "7168f6002a6b48a9b6151e1e97e974a0722ecfdc", "type": "github" }, "original": { @@ -281,11 +281,11 @@ "mini-nvim": { "flake": false, "locked": { - "lastModified": 1746264830, - "narHash": "sha256-A3FIyfy/3VUBMPfWd6PLaqAhOAOA5ava0nc4Z9JCKCI=", + "lastModified": 1747734615, + "narHash": "sha256-Nym+lyfEkAdnEmUT6s8ejd+hTIMvC6tMUzJyZLmp6cg=", "owner": "echasnovski", "repo": "mini.nvim", - "rev": "ee23e1abc206efc6d6cce19ec8c0a3da7a897035", + "rev": "94cae4660a8b2d95dbbd56e1fbc6fcfa2716d152", "type": "github" }, "original": { @@ -305,11 +305,11 @@ "treefmt-nix": "treefmt-nix" }, "locked": { - "lastModified": 1746256223, - "narHash": "sha256-a97mwMJcE0cYGfwB5N5v+Ey+by1poGTc/fsrd47Fom8=", + "lastModified": 1747786187, + "narHash": "sha256-9SSsln1nd3SnECH7I466UzLZ2luJS1phTOYG0ehRAxQ=", "owner": "nix-community", "repo": "neovim-nightly-overlay", - "rev": "02ec02529a5d602a9e9d273531d776d160fae182", + "rev": "1709adcc65a1779b6513db3470dad257de7c24ae", "type": "github" }, "original": { @@ -321,11 +321,11 @@ "neovim-src": { "flake": false, "locked": { - "lastModified": 1746214751, - "narHash": "sha256-FlGgG3A9oJwGP0YTWU2Nw9fwdnqPMapjx3twonu0Vkg=", + "lastModified": 1747760768, + "narHash": "sha256-5oDiP8Yn93692CUEH81LJbZxPIprIozLHdkFt5N9Np4=", "owner": "neovim", "repo": "neovim", - "rev": "5a2edc483dff93cc94847b6950713d80a51087c0", + "rev": "cd9d8469b22cedeb5ccad3def6e3cfee2877577f", "type": "github" }, "original": { @@ -336,11 +336,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1746152631, - "narHash": "sha256-zBuvmL6+CUsk2J8GINpyy8Hs1Zp4PP6iBWSmZ4SCQ/s=", + "lastModified": 1747728033, + "narHash": "sha256-NnXFQu7g4LnvPIPfJmBuZF7LFy/fey2g2+LCzjQhTUk=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "032bc6539bd5f14e9d0c51bd79cfe9a055b094c3", + "rev": "2f9173bde1d3fbf1ad26ff6d52f952f9e9da52ea", "type": "github" }, "original": { @@ -380,11 +380,11 @@ }, "nixpkgs-uns": { "locked": { - "lastModified": 1746232882, - "narHash": "sha256-MHmBH2rS8KkRRdoU/feC/dKbdlMkcNkB5mwkuipVHeQ=", + "lastModified": 1747744144, + "narHash": "sha256-W7lqHp0qZiENCDwUZ5EX/lNhxjMdNapFnbErcbnP11Q=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "7a2622e2c0dbad5c4493cb268aba12896e28b008", + "rev": "2795c506fe8fb7b03c36ccb51f75b6df0ab2553f", "type": "github" }, "original": { @@ -396,11 +396,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1746314326, - "narHash": "sha256-2xqKEdmbFttKUwIxZgQAOG24rNqVvJ7c3LmA+ZnvWlc=", + "lastModified": 1747894227, + "narHash": "sha256-iMzxxhwF4ZqRDrMl7/kKPCiO0uWpnGywJ+oMPEvnP/Y=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "0eb56ece14bc2e4301f756c342356ceceb90b6f9", + "rev": "ebcc1d6f281ceef7854bea032b65a5609ee45fad", "type": "github" }, "original": { @@ -410,22 +410,6 @@ "type": "github" } }, - "nvim-orgmode": { - "flake": false, - "locked": { - "lastModified": 1747057841, - "narHash": "sha256-mLT3XnsRyG+ZldB9NrR9tjmaznRAISBsdVTVPSjhj0A=", - "owner": "nvim-orgmode", - "repo": "orgmode", - "rev": "8ff03c75f3d808e3ea1765b7aba0fb4783a5a83f", - "type": "github" - }, - "original": { - "owner": "nvim-orgmode", - "repo": "orgmode", - "type": "github" - } - }, "root": { "inputs": { "flake-utils": "flake-utils", @@ -433,8 +417,7 @@ "mini-nvim": "mini-nvim", "neovim-nightly-overlay": "neovim-nightly-overlay", "nixpkgs": "nixpkgs_2", - "nixpkgs-uns": "nixpkgs-uns", - "nvim-orgmode": "nvim-orgmode" + "nixpkgs-uns": "nixpkgs-uns" } }, "systems": { @@ -460,11 +443,11 @@ ] }, "locked": { - "lastModified": 1746216483, - "narHash": "sha256-4h3s1L/kKqt3gMDcVfN8/4v2jqHrgLIe4qok4ApH5x4=", + "lastModified": 1747469671, + "narHash": "sha256-bo1ptiFoNqm6m1B2iAhJmWCBmqveLVvxom6xKmtuzjg=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "29ec5026372e0dec56f890e50dbe4f45930320fd", + "rev": "ab0378b61b0d85e73a8ab05d5c6029b5bd58c9fb", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index dd710c9..ea7e593 100644 --- a/flake.nix +++ b/flake.nix @@ -14,10 +14,6 @@ url = "github:echasnovski/mini.nvim"; flake = false; }; - nvim-orgmode = { - url = "github:nvim-orgmode/orgmode"; - flake = false; - }; # Add bleeding-edge plugins here. # They can be updated with `nix flake update` (make sure to commit the generated flake.lock) # wf-nvim = { @@ -57,6 +53,7 @@ stylua luajitPackages.luacheck nvim-dev + alejandra ]; shellHook = '' # symlink the .luarc.json generated in the overlay diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index 725f569..70217b8 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -9,10 +9,9 @@ with final.pkgs.lib; let inherit pname src; version = src.lastModifiedDate; }; - mkNeovim = pkgs.callPackage ./mkNeovim.nix { inherit pkgs-wrapNeovim; }; + mkNeovim = pkgs.callPackage ./mkNeovim.nix {inherit pkgs-wrapNeovim;}; mini-nvim-git = mkNvimPlugin inputs.mini-nvim "mini.nvim"; - nvim-orgmode = mkNvimPlugin inputs.nvim-orgmode "orgmode"; all-plugins = with pkgs.vimPlugins; [ blink-cmp @@ -30,23 +29,9 @@ with final.pkgs.lib; let nightfox-nvim nvim-lint nvim-lspconfig - nvim-orgmode nvim-treesitter-context nvim-treesitter-textobjects - (nvim-treesitter.withPlugins (_: - nvim-treesitter.allGrammars ++ - [(pkgs.tree-sitter.buildGrammar { - language = "org"; - version = "2.0.1"; - src = pkgs.fetchFromGitHub { - owner = "nvim-orgmode"; - repo = "tree-sitter-org"; - rev = "2.0.1"; - hash = "sha256-k1g5+iyJvVWKOuAkFNaaKl42Xmmz9BN+vT0+IQ/4RQI="; - }; - meta.homepage = "https://github.com/nvim-orgmode/tree-sitter-org"; - })] - )) + nvim-treesitter.withAllGrammars oil-nvim refactoring-nvim render-markdown-nvim diff --git a/nvim/lua/config/init.lua b/nvim/lua/config/init.lua index e615f4e..e2e11a9 100644 --- a/nvim/lua/config/init.lua +++ b/nvim/lua/config/init.lua @@ -2,6 +2,7 @@ vim.opt.autowrite = true vim.opt.backspace = 'indent,eol,start' vim.opt.confirm = true vim.opt.completeopt = { 'menu', 'menuone', 'noselect' } +vim.opt.cmdheight = 0 vim.opt.diffopt = 'internal,filler,closeoff,inline:char' vim.opt.expandtab = true -- insert tabs as spaces vim.opt.inccommand = 'split' -- incremental live completion @@ -61,6 +62,7 @@ vim.keymap.set('n', '', vim.cmd.bnext, { noremap = true, silent = true }) vim.keymap.set('n', '', vim.cmd.bprev, { noremap = true, silent = true }) vim.keymap.set('v', '<', '', '>gv') +vim.keymap.set('v', 'q:', 'oR', - 'e ~/orgfiles/refile.org', - desc = 'open org refile', - }, - }, - config = function() - require('orgmode').setup { - org_agenda_files = '~/orgfiles/**/*', - org_default_notes_file = '~/orgfiles/refile.org', - org_todo_keywords = { - 'TODO', - 'IN_PROGRESS', - 'BLOCKED', - '|', - 'DONE', - 'NOT DOING', - }, - org_capture_templates = { - l = { - description = 'Work Log', - template = '* %?', - target = '~/orgfiles/worklog.org', - }, - }, - } - vim.api.nvim_create_autocmd('FileType', { - pattern = 'org', - callback = function() - vim.keymap.set({ 'n', 'i' }, '\\\\', 'lua require("orgmode").action("org_mappings.meta_return")', { - silent = true, - buffer = true, - }) - end, - }) - end, - }, } diff --git a/nvim/lua/plugins/treesitter.lua b/nvim/lua/plugins/treesitter.lua index c48c183..867b9c2 100644 --- a/nvim/lua/plugins/treesitter.lua +++ b/nvim/lua/plugins/treesitter.lua @@ -79,7 +79,7 @@ return { enable = true, keymaps = { init_selection = '', - node_incremental = '', + node_incremental = 'v', node_decremental = '', }, }, From ee647f4338a07d5837479050a6b98b170a283dde Mon Sep 17 00:00:00 2001 From: iofq Date: Mon, 2 Jun 2025 01:45:59 -0500 Subject: [PATCH 118/160] add image --- README.md | 2 ++ img.png | Bin 0 -> 97703 bytes 2 files changed, 2 insertions(+) create mode 100644 img.png diff --git a/README.md b/README.md index 2768641..29a9c20 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ ## nvim.nix - personal Neovim config. First-class nix support, but doesn't sacrifice portability +![neovim](./img.png?raw=true) + ## Usage Try it out! ```bash diff --git a/img.png b/img.png new file mode 100644 index 0000000000000000000000000000000000000000..303a64ed75eeab22f7e8b67f13b063ba1c723819 GIT binary patch literal 97703 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 Date: Wed, 11 Jun 2025 02:35:44 -0500 Subject: [PATCH 119/160] cleanup codecompanion, neogit, bump inputs --- flake.lock | 54 ++++++++++++++++----------------- nix/neovim-overlay.nix | 2 -- nvim/lua/config/init.lua | 1 + nvim/lua/plugins/ai.lua | 41 ------------------------- nvim/lua/plugins/mini.lua | 17 +++++------ nvim/lua/plugins/misc.lua | 20 +----------- nvim/lua/plugins/treesitter.lua | 1 - 7 files changed, 37 insertions(+), 99 deletions(-) diff --git a/flake.lock b/flake.lock index 4bab839..371d5d1 100644 --- a/flake.lock +++ b/flake.lock @@ -74,11 +74,11 @@ ] }, "locked": { - "lastModified": 1743550720, - "narHash": "sha256-hIshGgKZCgWh6AYJpJmRgFdR3WUbkY04o82X05xqQiY=", + "lastModified": 1749398372, + "narHash": "sha256-tYBdgS56eXYaWVW3fsnPQ/nFlgWi/Z2Ymhyu21zVM98=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "c621e8422220273271f52058f618c94e405bb0f5", + "rev": "9305fe4e5c2a6fcf5ba6a3ff155720fbe4076569", "type": "github" }, "original": { @@ -249,11 +249,11 @@ ] }, "locked": { - "lastModified": 1747284884, - "narHash": "sha256-lTSKhRrassMcJ1ZsuUVunyl/F04vvCKY80HB/4rvvm4=", + "lastModified": 1748000383, + "narHash": "sha256-EaAJhwfJGBncgIV/0NlJviid2DP93cTMc9h0q6P6xXk=", "owner": "hercules-ci", "repo": "hercules-ci-effects", - "rev": "7168f6002a6b48a9b6151e1e97e974a0722ecfdc", + "rev": "231726642197817d20310b9d39dd4afb9e899489", "type": "github" }, "original": { @@ -281,11 +281,11 @@ "mini-nvim": { "flake": false, "locked": { - "lastModified": 1747734615, - "narHash": "sha256-Nym+lyfEkAdnEmUT6s8ejd+hTIMvC6tMUzJyZLmp6cg=", + "lastModified": 1749301386, + "narHash": "sha256-U6QkqrvmxEERLgrc3roBxMuNc8Djuxk/wOuH/Hwmu1M=", "owner": "echasnovski", "repo": "mini.nvim", - "rev": "94cae4660a8b2d95dbbd56e1fbc6fcfa2716d152", + "rev": "35e1767f4cd7dde51256eabae7349a5283a43cba", "type": "github" }, "original": { @@ -305,11 +305,11 @@ "treefmt-nix": "treefmt-nix" }, "locked": { - "lastModified": 1747786187, - "narHash": "sha256-9SSsln1nd3SnECH7I466UzLZ2luJS1phTOYG0ehRAxQ=", + "lastModified": 1749625230, + "narHash": "sha256-o65mGvIz4+5gqyFG0gLK6BqIVRGqxl0AiY6Xy5De+Qk=", "owner": "nix-community", "repo": "neovim-nightly-overlay", - "rev": "1709adcc65a1779b6513db3470dad257de7c24ae", + "rev": "34f4b17993e9ec8e8a5c8a1cec5847b4520b3d26", "type": "github" }, "original": { @@ -321,11 +321,11 @@ "neovim-src": { "flake": false, "locked": { - "lastModified": 1747760768, - "narHash": "sha256-5oDiP8Yn93692CUEH81LJbZxPIprIozLHdkFt5N9Np4=", + "lastModified": 1749599615, + "narHash": "sha256-7A4cafY420gsxdCA0yZhlOMjBSLzu3156QFEeAmcwrk=", "owner": "neovim", "repo": "neovim", - "rev": "cd9d8469b22cedeb5ccad3def6e3cfee2877577f", + "rev": "79ce71430fe5480e37a150522e2c6c925f5d0e66", "type": "github" }, "original": { @@ -336,11 +336,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1747728033, - "narHash": "sha256-NnXFQu7g4LnvPIPfJmBuZF7LFy/fey2g2+LCzjQhTUk=", + "lastModified": 1749523198, + "narHash": "sha256-How2kQw0psKmCdXgojc95Sf3K5maHB3qfINxTZFCAPM=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "2f9173bde1d3fbf1ad26ff6d52f952f9e9da52ea", + "rev": "cdc68935eba9f86d155585fdf6f17af6824f38ac", "type": "github" }, "original": { @@ -380,11 +380,11 @@ }, "nixpkgs-uns": { "locked": { - "lastModified": 1747744144, - "narHash": "sha256-W7lqHp0qZiENCDwUZ5EX/lNhxjMdNapFnbErcbnP11Q=", + "lastModified": 1749285348, + "narHash": "sha256-frdhQvPbmDYaScPFiCnfdh3B/Vh81Uuoo0w5TkWmmjU=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "2795c506fe8fb7b03c36ccb51f75b6df0ab2553f", + "rev": "3e3afe5174c561dee0df6f2c2b2236990146329f", "type": "github" }, "original": { @@ -396,11 +396,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1747894227, - "narHash": "sha256-iMzxxhwF4ZqRDrMl7/kKPCiO0uWpnGywJ+oMPEvnP/Y=", + "lastModified": 1749625384, + "narHash": "sha256-DjWYlOFrddI5t5w4mimZJo1RGp2qxhcvTYWSZjx9+3I=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "ebcc1d6f281ceef7854bea032b65a5609ee45fad", + "rev": "ab301cc663dc2db37c53933b33d1070cb72934ec", "type": "github" }, "original": { @@ -443,11 +443,11 @@ ] }, "locked": { - "lastModified": 1747469671, - "narHash": "sha256-bo1ptiFoNqm6m1B2iAhJmWCBmqveLVvxom6xKmtuzjg=", + "lastModified": 1749194973, + "narHash": "sha256-eEy8cuS0mZ2j/r/FE0/LYBSBcIs/MKOIVakwHVuqTfk=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "ab0378b61b0d85e73a8ab05d5c6029b5bd58c9fb", + "rev": "a05be418a1af1198ca0f63facb13c985db4cb3c5", "type": "github" }, "original": { diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index 70217b8..3374c5a 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -17,7 +17,6 @@ with final.pkgs.lib; let blink-cmp blink-copilot blink-ripgrep-nvim - codecompanion-nvim conform-nvim copilot-lua diffview-nvim @@ -25,7 +24,6 @@ with final.pkgs.lib; let friendly-snippets lazy-nvim mini-nvim-git - neogit nightfox-nvim nvim-lint nvim-lspconfig diff --git a/nvim/lua/config/init.lua b/nvim/lua/config/init.lua index e2e11a9..9d7e6c5 100644 --- a/nvim/lua/config/init.lua +++ b/nvim/lua/config/init.lua @@ -58,6 +58,7 @@ vim.diagnostic.config { } -- random keymaps +vim.keymap.set({ 'v', 'i' }, 'wq', 'l', { noremap = true, silent = true }) vim.keymap.set('n', '', vim.cmd.bnext, { noremap = true, silent = true }) vim.keymap.set('n', '', vim.cmd.bprev, { noremap = true, silent = true }) vim.keymap.set('v', '<', 'as', - 'CodeCompanionChat Add', - noremap = true, - mode = { 'n', 'v' }, - desc = 'Copilot chat add selection', - }, - { - 'aa', - 'CodeCompanionActions', - noremap = true, - mode = { 'n', 'v' }, - desc = 'Copilot inline', - }, - }, - }, } diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index 78cbdf1..ee54407 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -92,9 +92,9 @@ return { '%<', -- Mark general truncate point { hl = 'MiniStatuslineFilename', strings = { '' } }, '%=', -- End left alignment - { hl = 'MiniStatusDevinfo', strings = { diff, diagnostics, lsp } }, + { hl = 'MiniStatusDevinfo', strings = { diff, diagnostics, lsp } }, { hl = 'MiniStatuslineFilename', strings = { search } }, - { hl = mode_hl, strings = { mode } }, + { hl = mode_hl, strings = { mode } }, } end, inactive = function() @@ -150,10 +150,10 @@ return { miniclue.gen_clues.registers(), miniclue.gen_clues.windows(), miniclue.gen_clues.z(), - { mode = 'n', keys = 'wj', postkeys = 'w', desc = 'TS Down' }, - { mode = 'n', keys = 'wk', postkeys = 'w', desc = 'TS Up' }, - { mode = 'n', keys = 'wh', postkeys = 'w', desc = 'TS Left' }, - { mode = 'n', keys = 'wl', postkeys = 'w', desc = 'TS Right' }, + { mode = 'n', keys = 'wj', postkeys = 'w', desc = 'TS Down' }, + { mode = 'n', keys = 'wk', postkeys = 'w', desc = 'TS Up' }, + { mode = 'n', keys = 'wh', postkeys = 'w', desc = 'TS Left' }, + { mode = 'n', keys = 'wl', postkeys = 'w', desc = 'TS Right' }, { mode = 'n', keys = 'w', postkeys = 'w', desc = 'Swap TS Down' }, { mode = 'n', keys = 'w', postkeys = 'w', desc = 'Swap TS Up' }, { mode = 'n', keys = 'w', postkeys = 'w', desc = 'Swap TS Left' }, @@ -179,9 +179,8 @@ return { vim.keymap.set('n', 'nm', map.toggle, { noremap = true, desc = 'minimap open' }) local multi = require('mini.keymap').map_multistep - local combo = require('mini.keymap').map_combo - combo({ 'v', 'i', 's' }, 'wq', 'l') - multi({ 'i', 's' }, '', { 'vimsnippet_next', 'increase_indent' }) + multi({ 'i' }, '', { 'minipairs_bs' }) + 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 e09d7d1..b2f4e71 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -37,7 +37,7 @@ return { 'MeanderingProgrammer/render-markdown.nvim', event = 'VeryLazy', opts = { - file_types = { 'markdown', 'codecompanion' }, + file_types = { 'markdown' }, }, }, { @@ -77,24 +77,6 @@ return { }, }, }, - { - 'NeogitOrg/neogit', - opts = { - disable_builtin_notifications = true, - integrations = { - diffview = true, - }, - }, - keys = { - { - 'ng', - function() - require('neogit').open() - end, - { noremap = true, silent = true, desc = 'Neogit' }, - }, - }, - }, { 'EdenEast/nightfox.nvim', lazy = false, diff --git a/nvim/lua/plugins/treesitter.lua b/nvim/lua/plugins/treesitter.lua index 867b9c2..5875a1e 100644 --- a/nvim/lua/plugins/treesitter.lua +++ b/nvim/lua/plugins/treesitter.lua @@ -78,7 +78,6 @@ return { incremental_selection = { enable = true, keymaps = { - init_selection = '', node_incremental = 'v', node_decremental = '', }, From 3de4c4e2899d24c0b7bd34acf34dc27fb0677c38 Mon Sep 17 00:00:00 2001 From: iofq Date: Thu, 12 Jun 2025 03:02:38 -0500 Subject: [PATCH 120/160] mini jump rice --- nvim/lua/plugins/mini.lua | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index ee54407..62dff12 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -61,7 +61,7 @@ return { }, { 'gb', - 'Git blame -- %', + 'vertical Git blame -- %', noremap = true, desc = 'git blame', }, @@ -71,6 +71,14 @@ return { noremap = true, desc = 'git command', }, + { + 'S', + function() + MiniJump2d.start { spotter = MiniJump2d.gen_spotter.vimpattern() } + end, + noremap = true, + desc = 'mini jump', + }, }, config = function() require('mini.basics').setup { mappings = { windows = true } } @@ -92,7 +100,7 @@ return { '%<', -- Mark general truncate point { hl = 'MiniStatuslineFilename', strings = { '' } }, '%=', -- End left alignment - { hl = 'MiniStatusDevinfo', strings = { diff, diagnostics, lsp } }, + { hl = 'MiniStatusDevinfo', strings = { diagnostics, lsp } }, { hl = 'MiniStatuslineFilename', strings = { search } }, { hl = mode_hl, strings = { mode } }, } @@ -110,13 +118,24 @@ return { require('mini.align').setup() require('mini.bracketed').setup() require('mini.icons').setup() - require('mini.jump2d').setup { mappings = { start_jumping = 'S' } } - require('mini.operators').setup { - replace = { - prefix = 'gR', - }, + require('mini.jump2d').setup { + view = { n_steps_ahead = 1, dim = true }, } - require('mini.git').setup() + require('mini.git').setup { command = { split = 'vertical' } } + -- Bind both windows so that they scroll together + local align_blame = function(au_data) + if au_data.data.git_subcommand ~= 'blame' then + return + end + local win_src = au_data.data.win_source + vim.wo.wrap = false + vim.fn.winrestview { topline = vim.fn.line('w0', win_src) } + vim.api.nvim_win_set_cursor(0, { vim.fn.line('.', win_src), 0 }) + vim.wo[win_src].scrollbind, vim.wo.scrollbind = true, true + end + + local au_opts = { pattern = 'MiniGitCommandSplit', callback = align_blame } + vim.api.nvim_create_autocmd('User', au_opts) setup_pairs { modes = { insert = true, command = true, terminal = false }, skip_next = [=[[%w%%%'%[%"%.%`%$]]=], From aa1f5847d21d8de3915aab3fd7436751dcf4b728 Mon Sep 17 00:00:00 2001 From: iofq Date: Mon, 16 Jun 2025 23:52:21 -0500 Subject: [PATCH 121/160] add alejandra formatter --- nix/neovim-overlay.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index 3374c5a..72bb006 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -49,6 +49,7 @@ with final.pkgs.lib; let puppet-lint yamllint jq + alejandra # LSPs gopls From 5a884a48c23ca3293c33b7e3b52388ed1995a6d0 Mon Sep 17 00:00:00 2001 From: iofq Date: Mon, 16 Jun 2025 23:54:00 -0500 Subject: [PATCH 122/160] flake.lock: Update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'mini-nvim': 'github:echasnovski/mini.nvim/35e1767f4cd7dde51256eabae7349a5283a43cba?narHash=sha256-U6QkqrvmxEERLgrc3roBxMuNc8Djuxk/wOuH/Hwmu1M%3D' (2025-06-07) → 'github:echasnovski/mini.nvim/3f5d06a6f710966cb93baaadc4897eeb6d6210e5?narHash=sha256-vR8sOlGEST8SlknAtvfsP3j40rZaS5Jed8FwDdCBP94%3D' (2025-06-14) • Updated input 'neovim-nightly-overlay': 'github:nix-community/neovim-nightly-overlay/34f4b17993e9ec8e8a5c8a1cec5847b4520b3d26?narHash=sha256-o65mGvIz4%2B5gqyFG0gLK6BqIVRGqxl0AiY6Xy5De%2BQk%3D' (2025-06-11) → 'github:nix-community/neovim-nightly-overlay/5b231a9c0efd15547569bd753dbec420b90c8c98?narHash=sha256-wGa5HXzU9lK4Q7ODv8/n5oY/QbIl8R2wUyDxcLsV3B4%3D' (2025-06-17) • Updated input 'neovim-nightly-overlay/git-hooks': 'github:cachix/git-hooks.nix/80479b6ec16fefd9c1db3ea13aeb038c60530f46?narHash=sha256-2Y53NGIX2vxfie1rOW0Qb86vjRZ7ngizoo%2BbnXU9D9k%3D' (2025-05-16) → 'github:cachix/git-hooks.nix/623c56286de5a3193aa38891a6991b28f9bab056?narHash=sha256-WUaIlOlPLyPgz9be7fqWJA5iG6rHcGRtLERSCfUDne4%3D' (2025-06-11) • Updated input 'neovim-nightly-overlay/neovim-src': 'github:neovim/neovim/79ce71430fe5480e37a150522e2c6c925f5d0e66?narHash=sha256-7A4cafY420gsxdCA0yZhlOMjBSLzu3156QFEeAmcwrk%3D' (2025-06-10) → 'github:neovim/neovim/3e984cf02bdcebe2d4f31792505b6a3784fd1b1b?narHash=sha256-JTG1BFIIKmFfuT%2BsIhwrphAIjREgV4FfRcyuztr89P0%3D' (2025-06-16) • Updated input 'neovim-nightly-overlay/nixpkgs': 'github:NixOS/nixpkgs/cdc68935eba9f86d155585fdf6f17af6824f38ac?narHash=sha256-How2kQw0psKmCdXgojc95Sf3K5maHB3qfINxTZFCAPM%3D' (2025-06-10) → 'github:NixOS/nixpkgs/41da1e3ea8e23e094e5e3eeb1e6b830468a7399e?narHash=sha256-jp0D4vzBcRKwNZwfY4BcWHemLGUs4JrS3X9w5k/JYDA%3D' (2025-06-14) • Updated input 'nixpkgs': 'github:NixOS/nixpkgs/ab301cc663dc2db37c53933b33d1070cb72934ec?narHash=sha256-DjWYlOFrddI5t5w4mimZJo1RGp2qxhcvTYWSZjx9%2B3I%3D' (2025-06-11) → 'github:NixOS/nixpkgs/9e83b64f727c88a7711a2c463a7b16eedb69a84c?narHash=sha256-v263g4GbxXv87hMXMCpjkIxd/viIF7p3JpJrwgKdNiI%3D' (2025-06-17) • Updated input 'nixpkgs-uns': 'github:NixOS/nixpkgs/3e3afe5174c561dee0df6f2c2b2236990146329f?narHash=sha256-frdhQvPbmDYaScPFiCnfdh3B/Vh81Uuoo0w5TkWmmjU%3D' (2025-06-07) → 'github:NixOS/nixpkgs/ee930f9755f58096ac6e8ca94a1887e0534e2d81?narHash=sha256-Kh9K4taXbVuaLC0IL%2B9HcfvxsSUx8dPB5s5weJcc9pc%3D' (2025-06-13) --- flake.lock | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/flake.lock b/flake.lock index 371d5d1..1170af2 100644 --- a/flake.lock +++ b/flake.lock @@ -183,11 +183,11 @@ ] }, "locked": { - "lastModified": 1747372754, - "narHash": "sha256-2Y53NGIX2vxfie1rOW0Qb86vjRZ7ngizoo+bnXU9D9k=", + "lastModified": 1749636823, + "narHash": "sha256-WUaIlOlPLyPgz9be7fqWJA5iG6rHcGRtLERSCfUDne4=", "owner": "cachix", "repo": "git-hooks.nix", - "rev": "80479b6ec16fefd9c1db3ea13aeb038c60530f46", + "rev": "623c56286de5a3193aa38891a6991b28f9bab056", "type": "github" }, "original": { @@ -281,11 +281,11 @@ "mini-nvim": { "flake": false, "locked": { - "lastModified": 1749301386, - "narHash": "sha256-U6QkqrvmxEERLgrc3roBxMuNc8Djuxk/wOuH/Hwmu1M=", + "lastModified": 1749909966, + "narHash": "sha256-vR8sOlGEST8SlknAtvfsP3j40rZaS5Jed8FwDdCBP94=", "owner": "echasnovski", "repo": "mini.nvim", - "rev": "35e1767f4cd7dde51256eabae7349a5283a43cba", + "rev": "3f5d06a6f710966cb93baaadc4897eeb6d6210e5", "type": "github" }, "original": { @@ -305,11 +305,11 @@ "treefmt-nix": "treefmt-nix" }, "locked": { - "lastModified": 1749625230, - "narHash": "sha256-o65mGvIz4+5gqyFG0gLK6BqIVRGqxl0AiY6Xy5De+Qk=", + "lastModified": 1750119416, + "narHash": "sha256-wGa5HXzU9lK4Q7ODv8/n5oY/QbIl8R2wUyDxcLsV3B4=", "owner": "nix-community", "repo": "neovim-nightly-overlay", - "rev": "34f4b17993e9ec8e8a5c8a1cec5847b4520b3d26", + "rev": "5b231a9c0efd15547569bd753dbec420b90c8c98", "type": "github" }, "original": { @@ -321,11 +321,11 @@ "neovim-src": { "flake": false, "locked": { - "lastModified": 1749599615, - "narHash": "sha256-7A4cafY420gsxdCA0yZhlOMjBSLzu3156QFEeAmcwrk=", + "lastModified": 1750116292, + "narHash": "sha256-JTG1BFIIKmFfuT+sIhwrphAIjREgV4FfRcyuztr89P0=", "owner": "neovim", "repo": "neovim", - "rev": "79ce71430fe5480e37a150522e2c6c925f5d0e66", + "rev": "3e984cf02bdcebe2d4f31792505b6a3784fd1b1b", "type": "github" }, "original": { @@ -336,11 +336,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1749523198, - "narHash": "sha256-How2kQw0psKmCdXgojc95Sf3K5maHB3qfINxTZFCAPM=", + "lastModified": 1749903597, + "narHash": "sha256-jp0D4vzBcRKwNZwfY4BcWHemLGUs4JrS3X9w5k/JYDA=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "cdc68935eba9f86d155585fdf6f17af6824f38ac", + "rev": "41da1e3ea8e23e094e5e3eeb1e6b830468a7399e", "type": "github" }, "original": { @@ -380,11 +380,11 @@ }, "nixpkgs-uns": { "locked": { - "lastModified": 1749285348, - "narHash": "sha256-frdhQvPbmDYaScPFiCnfdh3B/Vh81Uuoo0w5TkWmmjU=", + "lastModified": 1749794982, + "narHash": "sha256-Kh9K4taXbVuaLC0IL+9HcfvxsSUx8dPB5s5weJcc9pc=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "3e3afe5174c561dee0df6f2c2b2236990146329f", + "rev": "ee930f9755f58096ac6e8ca94a1887e0534e2d81", "type": "github" }, "original": { @@ -396,11 +396,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1749625384, - "narHash": "sha256-DjWYlOFrddI5t5w4mimZJo1RGp2qxhcvTYWSZjx9+3I=", + "lastModified": 1750134718, + "narHash": "sha256-v263g4GbxXv87hMXMCpjkIxd/viIF7p3JpJrwgKdNiI=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "ab301cc663dc2db37c53933b33d1070cb72934ec", + "rev": "9e83b64f727c88a7711a2c463a7b16eedb69a84c", "type": "github" }, "original": { From 3132ae3d98ad0694bb2b1d356da1e8bd873e6abf Mon Sep 17 00:00:00 2001 From: iofq Date: Thu, 19 Jun 2025 04:12:38 -0500 Subject: [PATCH 123/160] bqf --- nix/neovim-overlay.nix | 1 + nvim/lua/plugins/lsp.lua | 6 ------ nvim/lua/plugins/misc.lua | 23 ++++++++++++++++++----- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index 72bb006..1e7cde4 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -25,6 +25,7 @@ with final.pkgs.lib; let lazy-nvim mini-nvim-git nightfox-nvim + nvim-bqf nvim-lint nvim-lspconfig nvim-treesitter-context diff --git a/nvim/lua/plugins/lsp.lua b/nvim/lua/plugins/lsp.lua index cc94128..3c66d15 100644 --- a/nvim/lua/plugins/lsp.lua +++ b/nvim/lua/plugins/lsp.lua @@ -19,12 +19,6 @@ return { noremap = true, desc = 'Trouble diagnostics', }, - { - 'nt', - 'Trouble qflist', - noremap = true, - desc = 'Trouble qflist', - }, }, }, { diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index b2f4e71..0c5162a 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -32,13 +32,11 @@ return { vim.api.nvim_set_hl(0, 'EyelinerSecondary', { underline = true, bold = true }) end, }, - { 'tiagovla/scope.nvim', event = 'VeryLazy', config = true }, + { 'tiagovla/scope.nvim', event = 'VeryLazy', config = true }, { 'MeanderingProgrammer/render-markdown.nvim', event = 'VeryLazy', - opts = { - file_types = { 'markdown' }, - }, + config = true, }, { 'sindrets/diffview.nvim', @@ -131,5 +129,20 @@ return { }, }, }, - { 'ThePrimeagen/refactoring.nvim', event = 'VeryLazy', config = true }, + { + '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' }, + }, + }, + }, + { 'kevinhwang91/nvim-bqf', event = 'VeryLazy', config = true }, } From 83f9f90f1f6c69d4595c76240ecd2ce87f8b00c6 Mon Sep 17 00:00:00 2001 From: iofq Date: Sat, 21 Jun 2025 00:32:20 -0500 Subject: [PATCH 124/160] jj mini/snacks rice --- nvim/lazy-lock.json | 26 +++++ nvim/lua/plugins/lib/minidiff_jj.lua | 165 +++++++++++++++++++++++++++ nvim/lua/plugins/lib/snacks_jj.lua | 133 +++++++++++++++++++++ nvim/lua/plugins/mini.lua | 23 ++-- nvim/lua/plugins/snacks.lua | 18 +++ 5 files changed, 358 insertions(+), 7 deletions(-) create mode 100644 nvim/lazy-lock.json create mode 100644 nvim/lua/plugins/lib/minidiff_jj.lua create mode 100644 nvim/lua/plugins/lib/snacks_jj.lua diff --git a/nvim/lazy-lock.json b/nvim/lazy-lock.json new file mode 100644 index 0000000..736c290 --- /dev/null +++ b/nvim/lazy-lock.json @@ -0,0 +1,26 @@ +{ + "blink-copilot": { "branch": "main", "commit": "bdc45bbbed2ec252b3a29f4adecf031e157b5573" }, + "blink-ripgrep.nvim": { "branch": "main", "commit": "0a2c3c1ce8c3c56e7490cae835a981d5dbeb472c" }, + "blink.cmp": { "branch": "main", "commit": "4f38ce99a472932d5776337f08f7a8180f1f571a" }, + "conform.nvim": { "branch": "master", "commit": "372fc521f8421b7830ea6db4d6ea3bae1c77548c" }, + "copilot.lua": { "branch": "master", "commit": "a5c390f8d8e85b501b22dcb2f30e0cbbd69d5ff0" }, + "diffview.nvim": { "branch": "main", "commit": "4516612fe98ff56ae0415a259ff6361a89419b0a" }, + "eyeliner.nvim": { "branch": "main", "commit": "8f197eb30cecdf4c2cc9988a5eecc6bc34c0c7d6" }, + "lazy.nvim": { "branch": "main", "commit": "6c3bda4aca61a13a9c63f1c1d1b16b9d3be90d7a" }, + "mini.nvim": { "branch": "main", "commit": "ee23e1abc206efc6d6cce19ec8c0a3da7a897035" }, + "nightfox.nvim": { "branch": "main", "commit": "ba47d4b4c5ec308718641ba7402c143836f35aa9" }, + "nvim-bqf": { "branch": "main", "commit": "9cbec7cf8ad2a902a0a41241ad16c3489620321b" }, + "nvim-lint": { "branch": "master", "commit": "9dfb77ef6c5092a19502883c02dc5a02ec648729" }, + "nvim-lspconfig": { "branch": "master", "commit": "1b801f68d09e70e59e6dd967b663b6d84ee3e87d" }, + "nvim-treesitter": { "branch": "master", "commit": "94ea4f436d2b59c80f02e293466c374584f03b8c" }, + "nvim-treesitter-context": { "branch": "master", "commit": "6daca3ad780f045550b820f262002f35175a6c04" }, + "nvim-treesitter-textobjects": { "branch": "master", "commit": "ed373482db797bbf71bdff37a15c7555a84dce47" }, + "oil.nvim": { "branch": "master", "commit": "685cdb4ffa74473d75a1b97451f8654ceeab0f4a" }, + "refactoring.nvim": { "branch": "master", "commit": "2be7ea3f10b7e59658f5abf6dffc50b5d61964d6" }, + "render-markdown.nvim": { "branch": "main", "commit": "b2d857c848c2c27440c8e5efc8e49a9b5bcf13c6" }, + "scope.nvim": { "branch": "main", "commit": "3fc963e75f88990a9467ff72b8eea667a69c30a2" }, + "snacks.nvim": { "branch": "main", "commit": "bc0630e43be5699bb94dadc302c0d21615421d93" }, + "treewalker.nvim": { "branch": "main", "commit": "34bf0a6044e0b5e3d93b7012ae7bdf457de91ba1" }, + "trouble.nvim": { "branch": "main", "commit": "85bedb7eb7fa331a2ccbecb9202d8abba64d37b3" }, + "yanky.nvim": { "branch": "main", "commit": "04775cc6e10ef038c397c407bc17f00a2f52b378" } +} diff --git a/nvim/lua/plugins/lib/minidiff_jj.lua b/nvim/lua/plugins/lib/minidiff_jj.lua new file mode 100644 index 0000000..81ac4d9 --- /dev/null +++ b/nvim/lua/plugins/lib/minidiff_jj.lua @@ -0,0 +1,165 @@ +local diff = require('mini.diff') +local JJ = { + cache = {}, + jj_cache = {}, +} + +JJ.get_buf_realpath = function(buf_id) + return vim.loop.fs_realpath(vim.api.nvim_buf_get_name(buf_id)) or '' +end + +JJ.jj_start_watching_tree_state = function(buf_id, path) + local stdout = vim.loop.new_pipe() + local args = { 'workspace', 'root' } + 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 + JJ.cache[buf_id] = nil + return + end + diff.fail_attach(buf_id) + JJ.jj_cache[buf_id] = {} + end) + + local process, stdout_feed = nil, {} + local on_exit = function(exit_code) + process:close() + + -- 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() + end + + -- Set up index watching + local jj_dir_path = table.concat(stdout_feed, ''):gsub('\n+$', '') .. '/.jj/working_copy' + JJ.jj_setup_tree_state_watch(buf_id, jj_dir_path) + + -- Set reference text immediately + JJ.jj_set_ref_text(buf_id) + end + + process = vim.loop.spawn('jj', spawn_opts, on_exit) + JJ.jj_read_stream(stdout, stdout_feed) +end + +JJ.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() + JJ.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, { recursive = false }, watch_tree_state) + + JJ.jj_invalidate_cache(JJ.jj_cache[buf_id]) + JJ.jj_cache[buf_id] = { fs_event = buf_fs_event, timer = timer } +end + +JJ.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) + pcall(diff.set_ref_text, buf_id, text) + end) + + -- NOTE: Do not cache buffer's name to react to its possible rename + local path = JJ.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', '-r', '@-', './' .. basename }, + cwd = cwd, + stdio = { nil, stdout, nil }, + } + + local process, stdout_feed = nil, {} + local on_exit = 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 + + process = vim.loop.spawn('jj', spawn_opts, on_exit) + JJ.jj_read_stream(stdout, stdout_feed) +end) + +JJ.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 + +JJ.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) +end + +local jj = function() + local attach = function(buf_id) + -- Try attaching to a buffer only once + if JJ.jj_cache[buf_id] ~= nil then + return false + end + -- - Possibly resolve symlinks to get data from the original repo + local path = JJ.get_buf_realpath(buf_id) + if path == '' then + return false + end + + JJ.jj_cache[buf_id] = {} + JJ.jj_start_watching_tree_state(buf_id, path) + end + + local detach = function(buf_id) + local cache = JJ.jj_cache[buf_id] + JJ.jj_cache[buf_id] = nil + JJ.jj_invalidate_cache(cache) + end + + local apply_hunks = function(_, _) + -- staging does not apply for jj + end + + return { + name = 'jj', + attach = attach, + detach = detach, + apply_hunks = apply_hunks, + } +end +return jj diff --git a/nvim/lua/plugins/lib/snacks_jj.lua b/nvim/lua/plugins/lib/snacks_jj.lua new file mode 100644 index 0000000..c69f0e1 --- /dev/null +++ b/nvim/lua/plugins/lib/snacks_jj.lua @@ -0,0 +1,133 @@ +local M = {} + +function M.status() + local function get_files() + local status_raw = vim.fn.system('jj diff --no-pager --quiet --summary') + 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 hl = '' + if state == 'A' then + hl = 'SnacksPickerGitStatusAdded' + elseif state == 'M' then + hl = 'SnacksPickerGitStatusModified' + elseif state == 'D' then + hl = 'SnacksPickerGitStatusDeleted' + elseif state == 'R' then + hl = 'SnacksPickerGitStatusRenamed' + file = string.match(text, '{.-=>%s*(.-)}') + end + + 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 + end + + return files + end + + local files = get_files() + + Snacks.picker.pick { + source = 'jj_status', + items = files, + format = 'file', + title = 'jj status', + preview = function(ctx) + if ctx.item.file then + Snacks.picker.preview.diff(ctx) + else + ctx.preview:reset() + ctx.preview:set_title('No preview') + end + end, + } +end + +function M.revs() + local function jj_new() + return function(picker, item) + picker:close() + if item then + if not item.rev then + Snacks.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() + Snacks.notify('Checking out revision: ' .. item.rev, { title = 'Snacks Picker' }) + vim.cmd.checktime() + end, { cwd = item.cwd }) + end + end + end + + local function jj_rev_cmd(rev) + if rev ~= nil then + return vim.fn.system { 'jj', 'show', '--git', '-r', rev } + else + return 'No preview available.' + end + end + + local function jj_log(revset) + if revset == nil then + revset = '-r @' + else + revset = '-r ' .. revset + end + local status_raw = vim.fn.system( + 'jj log ' + .. revset + .. + ' --template \'if(root, format_root_commit(self), label(if(current_working_copy, "working_copy"), concat( format_short_commit_header(self) ++ " ", separate(" ", 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, description = string.match(line, '(.)%s*(%a+)(.*)') + table.insert(lines, { + text = line, + file = line, + sign = sign, + rev = rev, + hl = 'SnacksPickerGitMsg', + description = description, + diff = jj_rev_cmd(rev), + }) + end + + return lines + end + + local lines = jj_log('::@') + + Snacks.picker.pick { + source = 'jj_revs', + items = lines, + format = 'text', + title = 'jj log', + confirm = jj_new(), + preview = function(ctx) + if ctx.item.file then + Snacks.picker.preview.diff(ctx) + else + ctx.preview:reset() + ctx.preview:set_title('No rev found') + end + end, + } +end + +return M diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index 62dff12..7cff3df 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -100,9 +100,9 @@ return { '%<', -- Mark general truncate point { hl = 'MiniStatuslineFilename', strings = { '' } }, '%=', -- End left alignment - { hl = 'MiniStatusDevinfo', strings = { diagnostics, lsp } }, + { hl = 'MiniStatusDevinfo', strings = { diagnostics, lsp } }, { hl = 'MiniStatuslineFilename', strings = { search } }, - { hl = mode_hl, strings = { mode } }, + { hl = mode_hl, strings = { mode } }, } end, inactive = function() @@ -146,7 +146,16 @@ return { require('mini.surround').setup() require('mini.splitjoin').setup { detect = { separator = '[,;\n]' } } - require('mini.diff').setup { options = { wrap_goto = true } } + + local jj = require('nvim.lua.plugins.lib.minidiff_jj') + local diff = require('mini.diff') + diff.setup { + options = { wrap_goto = true }, + source = { + jj(), + diff.gen_source.git(), + }, + } local miniclue = require('mini.clue') miniclue.setup { triggers = { @@ -169,10 +178,10 @@ return { miniclue.gen_clues.registers(), miniclue.gen_clues.windows(), miniclue.gen_clues.z(), - { mode = 'n', keys = 'wj', postkeys = 'w', desc = 'TS Down' }, - { mode = 'n', keys = 'wk', postkeys = 'w', desc = 'TS Up' }, - { mode = 'n', keys = 'wh', postkeys = 'w', desc = 'TS Left' }, - { mode = 'n', keys = 'wl', postkeys = 'w', desc = 'TS Right' }, + { mode = 'n', keys = 'wj', postkeys = 'w', desc = 'TS Down' }, + { mode = 'n', keys = 'wk', postkeys = 'w', desc = 'TS Up' }, + { mode = 'n', keys = 'wh', postkeys = 'w', desc = 'TS Left' }, + { mode = 'n', keys = 'wl', postkeys = 'w', desc = 'TS Right' }, { mode = 'n', keys = 'w', postkeys = 'w', desc = 'Swap TS Down' }, { mode = 'n', keys = 'w', postkeys = 'w', desc = 'Swap TS Up' }, { mode = 'n', keys = 'w', postkeys = 'w', desc = 'Swap TS Left' }, diff --git a/nvim/lua/plugins/snacks.lua b/nvim/lua/plugins/snacks.lua index 2e8d55f..2a92033 100644 --- a/nvim/lua/plugins/snacks.lua +++ b/nvim/lua/plugins/snacks.lua @@ -234,6 +234,24 @@ return { silent = true, desc = 'pick notifications', }, + { + 'fj', + function() + require('nvim.lua.plugins.lib.snacks_jj').status() + end, + noremap = true, + silent = true, + desc = 'pick notifications', + }, + { + 'fr', + function() + require('nvim.lua.plugins.lib.snacks_jj').revs() + end, + noremap = true, + silent = true, + desc = 'pick notifications', + }, }, }, } From 75c09a73ff66c228f2790425d55e9c7ed61481fe Mon Sep 17 00:00:00 2001 From: iofq Date: Sat, 21 Jun 2025 04:13:57 -0500 Subject: [PATCH 125/160] even more jj mini/snacks rice --- .gitignore | 1 + nix/mkNeovim.nix | 335 ++++++++++++++------------- nix/neovim-overlay.nix | 4 +- nvim/ftplugin/php.lua | 1 - nvim/init.lua | 1 + nvim/lazy-lock.json | 26 --- nvim/lua/config/init.lua | 4 +- nvim/lua/plugins/completion.lua | 3 + nvim/lua/plugins/lib/minidiff_jj.lua | 4 +- nvim/lua/plugins/lib/session_jj.lua | 48 ++++ nvim/lua/plugins/lib/snacks_jj.lua | 61 ++--- nvim/lua/plugins/mini.lua | 67 +++--- nvim/lua/plugins/misc.lua | 47 ++-- nvim/lua/plugins/snacks.lua | 67 ++++-- nvim/lua/plugins/treesitter.lua | 13 -- 15 files changed, 345 insertions(+), 337 deletions(-) delete mode 100644 nvim/ftplugin/php.lua delete mode 100644 nvim/lazy-lock.json create mode 100644 nvim/lua/plugins/lib/session_jj.lua diff --git a/.gitignore b/.gitignore index a0a4ae3..5bd4dbb 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ result *.AppImage .direnv .luarc.json +nvim/lazy*json diff --git a/nix/mkNeovim.nix b/nix/mkNeovim.nix index 08ffcaf..a7cc6f0 100644 --- a/nix/mkNeovim.nix +++ b/nix/mkNeovim.nix @@ -7,186 +7,195 @@ 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 ? null, - # 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, - }: 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 = {}; - }; +{ + # NVIM_APPNAME - Defaults to 'nvim' if not set. + # If set to something else, this will also rename the binary. + appName ? null, + # 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, +}: +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]); + 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; + # 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. - neovimConfig = pkgs-wrapNeovim.neovimUtils.makeNeovimConfig { - inherit extraPython3Packages withPython3 withRuby withNodeJs viAlias vimAlias; - plugins = normalizedPlugins; - }; + # 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 = normalizedPlugins; + }; - packDir = pkgs.neovimUtils.packDir({ - myNeovimPackages = pkgs.neovimUtils.normalizedPluginsToVimPackage normalizedPlugins; - }); + packDir = pkgs.neovimUtils.packDir { + myNeovimPackages = pkgs.neovimUtils.normalizedPluginsToVimPackage normalizedPlugins; + }; - # This uses the ignoreConfigRegexes list to filter - # the nvim directory - nvimRtpSrc = let + # 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 + 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/lua - mkdir -p $out/ftplugin - ''; - - installPhase = '' - cp -r lua $out/ - rm -r lua - cp -r ftplugin $out/ - rm -r ftplugin - ''; + lib.all (regex: builtins.match regex relPath == null) ignoreConfigRegexes; }; - # 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}') - LAZY_OPTS = { - performance = { - reset_packpath = false, - rtp = { - reset = false, - disabled_plugins = { - "netrwPlugin", - "tutor", - }, + # 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/lua + mkdir -p $out/ftplugin + ''; + + installPhase = '' + cp -r lua $out/ + rm -r lua + cp -r ftplugin $out/ + rm -r ftplugin + ''; + }; + + # 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 = + '' + LAZY_OPTS = { + performance = { + reset_packpath = true, + rtp = { + disabled_plugins = { + "netrwPlugin", + "tutor", }, }, - dev = { - path = "${packDir}/pack/myNeovimPackages/start", - patterns = {""}, - }, - checker = { - enabled = false, - }, - install = { missing = false, }, - spec = {{ import = "plugins" }}, - } - '' + (builtins.readFile ../nvim/init.lua); + }, + 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); - # 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"'') - ); + # 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; + luaPackages = neovim-unwrapped.lua.pkgs; + resolvedExtraLuaPackages = extraLuaPackages luaPackages; - # Native Lua libraries - extraMakeWrapperLuaCArgs = - optionalString (resolvedExtraLuaPackages != []) - ''--suffix LUA_CPATH ";" "${concatMapStringsSep ";" luaPackages.getLuaCPath resolvedExtraLuaPackages}"''; + # 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}"''; + # 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; - }); + # 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"; - 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} - ''; - }) + isCustomAppName = appName != null && appName != "nvim"; +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} + ''; +}) diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index 1e7cde4..cc0e683 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -22,6 +22,7 @@ with final.pkgs.lib; let diffview-nvim eyeliner-nvim friendly-snippets + fzf-vim lazy-nvim mini-nvim-git nightfox-nvim @@ -34,11 +35,8 @@ with final.pkgs.lib; let oil-nvim refactoring-nvim render-markdown-nvim - scope-nvim snacks-nvim trouble-nvim - treewalker-nvim - yanky-nvim ]; basePackages = with pkgs; [ diff --git a/nvim/ftplugin/php.lua b/nvim/ftplugin/php.lua deleted file mode 100644 index 3f3eef4..0000000 --- a/nvim/ftplugin/php.lua +++ /dev/null @@ -1 +0,0 @@ -vim.opt.tabstop = 4 diff --git a/nvim/init.lua b/nvim/init.lua index 919b12b..a4da977 100644 --- a/nvim/init.lua +++ b/nvim/init.lua @@ -28,5 +28,6 @@ if not LAZY_OPTS then }, } end +vim.cmd('packadd cfilter') require('lazy').setup(LAZY_OPTS) require('config') diff --git a/nvim/lazy-lock.json b/nvim/lazy-lock.json deleted file mode 100644 index 736c290..0000000 --- a/nvim/lazy-lock.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "blink-copilot": { "branch": "main", "commit": "bdc45bbbed2ec252b3a29f4adecf031e157b5573" }, - "blink-ripgrep.nvim": { "branch": "main", "commit": "0a2c3c1ce8c3c56e7490cae835a981d5dbeb472c" }, - "blink.cmp": { "branch": "main", "commit": "4f38ce99a472932d5776337f08f7a8180f1f571a" }, - "conform.nvim": { "branch": "master", "commit": "372fc521f8421b7830ea6db4d6ea3bae1c77548c" }, - "copilot.lua": { "branch": "master", "commit": "a5c390f8d8e85b501b22dcb2f30e0cbbd69d5ff0" }, - "diffview.nvim": { "branch": "main", "commit": "4516612fe98ff56ae0415a259ff6361a89419b0a" }, - "eyeliner.nvim": { "branch": "main", "commit": "8f197eb30cecdf4c2cc9988a5eecc6bc34c0c7d6" }, - "lazy.nvim": { "branch": "main", "commit": "6c3bda4aca61a13a9c63f1c1d1b16b9d3be90d7a" }, - "mini.nvim": { "branch": "main", "commit": "ee23e1abc206efc6d6cce19ec8c0a3da7a897035" }, - "nightfox.nvim": { "branch": "main", "commit": "ba47d4b4c5ec308718641ba7402c143836f35aa9" }, - "nvim-bqf": { "branch": "main", "commit": "9cbec7cf8ad2a902a0a41241ad16c3489620321b" }, - "nvim-lint": { "branch": "master", "commit": "9dfb77ef6c5092a19502883c02dc5a02ec648729" }, - "nvim-lspconfig": { "branch": "master", "commit": "1b801f68d09e70e59e6dd967b663b6d84ee3e87d" }, - "nvim-treesitter": { "branch": "master", "commit": "94ea4f436d2b59c80f02e293466c374584f03b8c" }, - "nvim-treesitter-context": { "branch": "master", "commit": "6daca3ad780f045550b820f262002f35175a6c04" }, - "nvim-treesitter-textobjects": { "branch": "master", "commit": "ed373482db797bbf71bdff37a15c7555a84dce47" }, - "oil.nvim": { "branch": "master", "commit": "685cdb4ffa74473d75a1b97451f8654ceeab0f4a" }, - "refactoring.nvim": { "branch": "master", "commit": "2be7ea3f10b7e59658f5abf6dffc50b5d61964d6" }, - "render-markdown.nvim": { "branch": "main", "commit": "b2d857c848c2c27440c8e5efc8e49a9b5bcf13c6" }, - "scope.nvim": { "branch": "main", "commit": "3fc963e75f88990a9467ff72b8eea667a69c30a2" }, - "snacks.nvim": { "branch": "main", "commit": "bc0630e43be5699bb94dadc302c0d21615421d93" }, - "treewalker.nvim": { "branch": "main", "commit": "34bf0a6044e0b5e3d93b7012ae7bdf457de91ba1" }, - "trouble.nvim": { "branch": "main", "commit": "85bedb7eb7fa331a2ccbecb9202d8abba64d37b3" }, - "yanky.nvim": { "branch": "main", "commit": "04775cc6e10ef038c397c407bc17f00a2f52b378" } -} diff --git a/nvim/lua/config/init.lua b/nvim/lua/config/init.lua index 9d7e6c5..98ae067 100644 --- a/nvim/lua/config/init.lua +++ b/nvim/lua/config/init.lua @@ -2,7 +2,7 @@ vim.opt.autowrite = true vim.opt.backspace = 'indent,eol,start' vim.opt.confirm = true vim.opt.completeopt = { 'menu', 'menuone', 'noselect' } -vim.opt.cmdheight = 0 +vim.opt.cmdheight = 1 vim.opt.diffopt = 'internal,filler,closeoff,inline:char' vim.opt.expandtab = true -- insert tabs as spaces vim.opt.inccommand = 'split' -- incremental live completion @@ -28,7 +28,7 @@ end, { silent = true, desc = 'toggle tabstop' }) -- autocmd ---------------------------------------- -local undopath = '~/.local/share/nvim/undo' +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', {}), diff --git a/nvim/lua/plugins/completion.lua b/nvim/lua/plugins/completion.lua index aa21196..0e15172 100644 --- a/nvim/lua/plugins/completion.lua +++ b/nvim/lua/plugins/completion.lua @@ -7,6 +7,9 @@ return { 'fang2hou/blink-copilot', }, opts = { + enabled = function() + return not vim.tbl_contains({ 'snacks_picker_input', 'oil' }, vim.bo.filetype) + end, fuzzy = { sorts = { 'exact', diff --git a/nvim/lua/plugins/lib/minidiff_jj.lua b/nvim/lua/plugins/lib/minidiff_jj.lua index 81ac4d9..e638676 100644 --- a/nvim/lua/plugins/lib/minidiff_jj.lua +++ b/nvim/lua/plugins/lib/minidiff_jj.lua @@ -10,7 +10,7 @@ end JJ.jj_start_watching_tree_state = function(buf_id, path) local stdout = vim.loop.new_pipe() - local args = { 'workspace', 'root' } + local args = { 'workspace', 'root', '--ignore-working-copy' } local spawn_opts = { args = args, cwd = vim.fn.fnamemodify(path, ':h'), @@ -86,7 +86,7 @@ JJ.jj_set_ref_text = vim.schedule_wrap(function(buf_id) -- Set local stdout = vim.loop.new_pipe() local spawn_opts = { - args = { 'file', 'show', '-r', '@-', './' .. basename }, + args = { 'file', 'show', '--ignore-working-copy', '-r', '@-', './' .. basename }, cwd = cwd, stdio = { nil, stdout, nil }, } diff --git a/nvim/lua/plugins/lib/session_jj.lua b/nvim/lua/plugins/lib/session_jj.lua new file mode 100644 index 0000000..db6a271 --- /dev/null +++ b/nvim/lua/plugins/lib/session_jj.lua @@ -0,0 +1,48 @@ +local M = {} +M.load = function() + local jj_root = vim.system({ 'jj', 'workspace', 'root' }):wait() + local sessions = require('mini.sessions') + + 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*]', '')) + local root = vim.trim(string.gsub(jj_root.stdout, '\n', '')) + local jj_sesh = string.gsub(string.format('jj:%s:%s', root, branch), '[./]', '-') + if jj_sesh ~= '' then + vim.opt.shadafile = vim.fn.stdpath('data') .. '/myshada/' .. jj_sesh .. '.shada' + for name, _ in pairs(sessions.detected) do + if name == jj_sesh then + vim.ui.select({ + 'No', + 'Yes', + }, { prompt = 'Session found at ' .. jj_sesh .. ', load it?' }, function(c) + if c == 'Yes' then + -- load session (buffers, etc) as well as shada (marks) + sessions.read(jj_sesh) + vim.cmd('rshada') + vim.notify('loaded jj session: ' .. jj_sesh) + end + end) + return + end + end + vim.cmd('wshada') + sessions.write(jj_sesh) + end +end + +return M diff --git a/nvim/lua/plugins/lib/snacks_jj.lua b/nvim/lua/plugins/lib/snacks_jj.lua index c69f0e1..87dc12e 100644 --- a/nvim/lua/plugins/lib/snacks_jj.lua +++ b/nvim/lua/plugins/lib/snacks_jj.lua @@ -23,7 +23,7 @@ function M.status() file = string.match(text, '{.-=>%s*(.-)}') end - local diff = vim.fn.system('jj diff ' .. file .. ' --no-pager --stat --git') + local diff = vim.fn.system('jj diff ' .. file .. ' --ignore-working-copy --no-pager --stat --git') table.insert(files, { text = text, file = file, @@ -56,77 +56,64 @@ function M.status() end function M.revs() - local function jj_new() - return function(picker, item) - picker:close() - if item then - if not item.rev then - Snacks.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() - Snacks.notify('Checking out revision: ' .. item.rev, { title = 'Snacks Picker' }) - vim.cmd.checktime() - end, { cwd = item.cwd }) + local function jj_new(picker, item) + picker:close() + if item then + if not item.rev then + Snacks.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() + Snacks.notify('Checking out revision: ' .. item.rev, { title = 'Snacks Picker' }) + vim.cmd.checktime() + end, { cwd = item.cwd }) end end - local function jj_rev_cmd(rev) - if rev ~= nil then - return vim.fn.system { 'jj', 'show', '--git', '-r', rev } + 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 @' + revset = '-r "ancestors(@,25)"' else revset = '-r ' .. revset end local status_raw = vim.fn.system( - 'jj log ' + 'jj log --ignore-working-copy ' .. revset .. - ' --template \'if(root, format_root_commit(self), label(if(current_working_copy, "working_copy"), concat( format_short_commit_header(self) ++ " ", separate(" ", if(empty, label("empty", "(empty)")), if(description, description.first_line(), label(if(empty, "empty"), description_placeholder),),) ++ "\n",),))\'' + ' --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, description = string.match(line, '(.)%s*(%a+)(.*)') + local sign, rev = string.match(line, '(.)%s(%a+)%s.*') table.insert(lines, { text = line, - file = line, sign = sign, rev = rev, - hl = 'SnacksPickerGitMsg', - description = description, - diff = jj_rev_cmd(rev), }) end return lines end - local lines = jj_log('::@') - Snacks.picker.pick { source = 'jj_revs', - items = lines, + layout = 'ivy', format = 'text', title = 'jj log', - confirm = jj_new(), - preview = function(ctx) - if ctx.item.file then - Snacks.picker.preview.diff(ctx) - else - ctx.preview:reset() - ctx.preview:set_title('No rev found') - end - end, + items = jj_log(), + confirm = jj_new, + preview = jj_rev_cmd, } end diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index 7cff3df..d8a758d 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -41,7 +41,6 @@ return { { 'echasnovski/mini.nvim', lazy = false, - dependencies = { 'folke/snacks.nvim' }, keys = { { 'gp', @@ -52,7 +51,7 @@ return { desc = 'git diff overlay', }, { - 'gd', + 'go', function() return MiniGit.show_at_cursor() end, @@ -61,7 +60,7 @@ return { }, { 'gb', - 'vertical Git blame -- %', + 'Git blame -- %', noremap = true, desc = 'git blame', }, @@ -72,12 +71,12 @@ return { desc = 'git command', }, { - 'S', + 'fs', function() - MiniJump2d.start { spotter = MiniJump2d.gen_spotter.vimpattern() } + require('plugins.lib.session_jj').load() end, noremap = true, - desc = 'mini jump', + desc = 'mini session select', }, }, config = function() @@ -91,18 +90,17 @@ return { active = function() local mode, mode_hl = MiniStatusline.section_mode {} local filename = MiniStatusline.section_filename { trunc_width = 140 } - local diff = MiniStatusline.section_diff { trunc_width = 75, icon = '' } local diagnostics = MiniStatusline.section_diagnostics { trunc_width = 75 } local lsp = MiniStatusline.section_lsp { trunc_width = 75 } local search = MiniStatusline.section_searchcount { trunc_width = 75 } return MiniStatusline.combine_groups { '%<', -- Mark general truncate point - { hl = 'MiniStatuslineFilename', strings = { '' } }, + -- { hl = 'MiniStatuslineFilename', strings = { filename } }, '%=', -- End left alignment - { hl = 'MiniStatusDevinfo', strings = { diagnostics, lsp } }, - { hl = 'MiniStatuslineFilename', strings = { search } }, - { hl = mode_hl, strings = { mode } }, + { hl = 'MiniStatuslineDevinfo', strings = { rec, diagnostics, lsp } }, + { hl = 'MiniStatuslineDevinfo', strings = { search } }, + { hl = mode_hl, strings = { mode } }, } end, inactive = function() @@ -118,24 +116,28 @@ return { require('mini.align').setup() require('mini.bracketed').setup() require('mini.icons').setup() - require('mini.jump2d').setup { - view = { n_steps_ahead = 1, dim = true }, + require('mini.git').setup() + require('mini.surround').setup() + require('mini.splitjoin').setup { detect = { separator = '[,;\n]' } } + + local sessions = require('mini.sessions') + sessions.setup { + file = '', + autowrite = true, + verbose = { + write = false, + }, } - require('mini.git').setup { command = { split = 'vertical' } } - -- Bind both windows so that they scroll together - local align_blame = function(au_data) - if au_data.data.git_subcommand ~= 'blame' then - return - end - local win_src = au_data.data.win_source - vim.wo.wrap = false - vim.fn.winrestview { topline = vim.fn.line('w0', win_src) } - vim.api.nvim_win_set_cursor(0, { vim.fn.line('.', win_src), 0 }) - vim.wo[win_src].scrollbind, vim.wo.scrollbind = true, true + if #vim.fn.argv() == 0 then + require('plugins.lib.session_jj').load() end - local au_opts = { pattern = 'MiniGitCommandSplit', callback = align_blame } - vim.api.nvim_create_autocmd('User', au_opts) + local jump = require('mini.jump2d') + jump.setup { + view = { n_steps_ahead = 1, dim = true }, + spotter = jump.gen_spotter.vimpattern(), + } + setup_pairs { modes = { insert = true, command = true, terminal = false }, skip_next = [=[[%w%%%'%[%"%.%`%$]]=], @@ -144,10 +146,7 @@ return { markdown = true, } - require('mini.surround').setup() - require('mini.splitjoin').setup { detect = { separator = '[,;\n]' } } - - local jj = require('nvim.lua.plugins.lib.minidiff_jj') + local jj = require('plugins.lib.minidiff_jj') local diff = require('mini.diff') diff.setup { options = { wrap_goto = true }, @@ -178,14 +177,6 @@ return { miniclue.gen_clues.registers(), miniclue.gen_clues.windows(), miniclue.gen_clues.z(), - { mode = 'n', keys = 'wj', postkeys = 'w', desc = 'TS Down' }, - { mode = 'n', keys = 'wk', postkeys = 'w', desc = 'TS Up' }, - { mode = 'n', keys = 'wh', postkeys = 'w', desc = 'TS Left' }, - { mode = 'n', keys = 'wl', postkeys = 'w', desc = 'TS Right' }, - { mode = 'n', keys = 'w', postkeys = 'w', desc = 'Swap TS Down' }, - { mode = 'n', keys = 'w', postkeys = 'w', desc = 'Swap TS Up' }, - { mode = 'n', keys = 'w', postkeys = 'w', desc = 'Swap TS Left' }, - { mode = 'n', keys = 'w', postkeys = 'w', desc = 'Swap TS Right' }, }, } diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index 0c5162a..0d160ed 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -20,7 +20,7 @@ return { function() require('oil').toggle_float() end, - { noremap = true, silent = true }, + { noremap = true, silent = true, desc = 'oil' }, }, }, }, @@ -32,7 +32,6 @@ return { vim.api.nvim_set_hl(0, 'EyelinerSecondary', { underline = true, bold = true }) end, }, - { 'tiagovla/scope.nvim', event = 'VeryLazy', config = true }, { 'MeanderingProgrammer/render-markdown.nvim', event = 'VeryLazy', @@ -68,7 +67,14 @@ return { { 'nb', vim.cmd.DiffviewOpen, noremap = true, desc = 'diffview open' }, { 'nh', - vim.cmd.DiffviewFileHistory, + 'DiffviewFileHistory %', + mode = { 'n', 'v' }, + noremap = true, + desc = 'diffview history', + }, + { + 'nH', + 'DiffviewFileHistory', mode = { 'n', 'v' }, noremap = true, desc = 'diffview history', @@ -105,30 +111,6 @@ return { vim.api.nvim_set_hl(0, 'BlinkCmpGhostText', { link = 'String' }) end, }, - { - 'gbprod/yanky.nvim', - opts = { - ring = { - storage = 'memory', - }, - picker = { - select = { - action = require('yanky.picker').actions.set_register('+'), - }, - }, - }, - keys = { - { 'y', '(YankyYank)', mode = { 'n', 'x' } }, - { - 'fp', - 'YankyRingHistory', - mode = { 'n', 'x' }, - noremap = true, - silent = true, - desc = 'Pick history (yanky.nvim)', - }, - }, - }, { 'ThePrimeagen/refactoring.nvim', event = 'VeryLazy', @@ -144,5 +126,14 @@ return { }, }, }, - { 'kevinhwang91/nvim-bqf', event = 'VeryLazy', config = true }, + { + 'kevinhwang91/nvim-bqf', + event = 'VeryLazy', + opts = { + auto_resize_height = true, + preview = { + winblend = 0, + }, + }, + }, } diff --git a/nvim/lua/plugins/snacks.lua b/nvim/lua/plugins/snacks.lua index 2a92033..67fae13 100644 --- a/nvim/lua/plugins/snacks.lua +++ b/nvim/lua/plugins/snacks.lua @@ -1,7 +1,9 @@ return { { 'folke/snacks.nvim', - dependencies = { 'folke/trouble.nvim' }, + dependencies = { + 'folke/trouble.nvim', + }, lazy = false, priority = 1000, opts = { @@ -10,7 +12,6 @@ return { dim = { enabled = true }, quickfile = { enabled = true }, notifier = { enabled = true }, - scope = { enabled = true }, terminal = { enabled = true }, indent = { enabled = true }, input = { enabled = true }, @@ -135,15 +136,6 @@ return { noremap = true, desc = 'snacks explorer', }, - { - 'fE', - function() - Snacks.explorer.reveal() - end, - noremap = true, - silent = true, - desc = 'snacks explorer open current file', - }, { 'fg', function() @@ -180,15 +172,6 @@ return { silent = true, desc = 'See all pickers', }, - { - "f'", - function() - Snacks.picker.marks() - end, - noremap = true, - silent = true, - desc = 'Pick marks', - }, { 'fu', function() @@ -235,18 +218,54 @@ return { desc = 'pick notifications', }, { - 'fj', + 'fm', function() - require('nvim.lua.plugins.lib.snacks_jj').status() + vim.cmd.delmarks { args = { '0-9' } } + Snacks.picker.pick { + finder = 'vim_marks', + format = 'file', + ['local'] = false, + global = true, + actions = { + markdel = function(picker) + for _, item in ipairs(picker:selected()) do + vim.cmd.delmarks { args = { item.label } } + end + vim.cmd('wshada') + picker.list:set_selected() + picker.list:set_target() + picker:find() + end, + }, + win = { + input = { + keys = { + [''] = { 'markdel', mode = { 'n', 'i' } }, + }, + }, + list = { + keys = { ['dd'] = 'markdel' }, + }, + }, + } + end, + noremap = true, + silent = true, + desc = 'pick global marks', + }, + { + 'jf', + function() + require('plugins.lib.snacks_jj').status() end, noremap = true, silent = true, desc = 'pick notifications', }, { - 'fr', + 'jj', function() - require('nvim.lua.plugins.lib.snacks_jj').revs() + require('plugins.lib.snacks_jj').revs() end, noremap = true, silent = true, diff --git a/nvim/lua/plugins/treesitter.lua b/nvim/lua/plugins/treesitter.lua index 5875a1e..8e08bae 100644 --- a/nvim/lua/plugins/treesitter.lua +++ b/nvim/lua/plugins/treesitter.lua @@ -11,19 +11,6 @@ return { }, }, 'nvim-treesitter/nvim-treesitter-textobjects', - { - 'aaronik/treewalker.nvim', - keys = { - { 'wj', 'Treewalker Down', silent = true, desc = 'Down (Treewalker)' }, - { 'wk', 'Treewalker Up', silent = true, desc = 'Up (Treewalker)' }, - { 'wh', 'Treewalker Left', silent = true, desc = 'Left (Treewalker)' }, - { 'wl', 'Treewalker Right', silent = true, desc = 'Right (Treewalker)' }, - { 'w', 'Treewalker SwapDown', silent = true, desc = 'SwapDown (Treewalker)' }, - { 'w', 'Treewalker SwapUp', silent = true, desc = 'SwapUp (Treewalker)' }, - { 'w', 'Treewalker SwapLeft', silent = true, desc = 'SwapLeft (Treewalker)' }, - { 'w', 'Treewalker SwapRight', silent = true, desc = 'SwapRight (Treewalker)' }, - }, - }, }, config = function() require('nvim-treesitter.configs').setup { From 4dbe1e026ea8a136e2133180fb59b9d28ef5470f Mon Sep 17 00:00:00 2001 From: iofq Date: Tue, 24 Jun 2025 02:25:16 -0500 Subject: [PATCH 126/160] flake.lock: Update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'mini-nvim': 'github:echasnovski/mini.nvim/3f5d06a6f710966cb93baaadc4897eeb6d6210e5?narHash=sha256-vR8sOlGEST8SlknAtvfsP3j40rZaS5Jed8FwDdCBP94%3D' (2025-06-14) → 'github:echasnovski/mini.nvim/1b32a3f61f1f649cadc748bd4b7a32b4b4785d29?narHash=sha256-cfgANg0vRJg31x%2BBiSfYhwBSyQnYt/aRDx6%2BBaS0YYY%3D' (2025-06-22) • Updated input 'neovim-nightly-overlay': 'github:nix-community/neovim-nightly-overlay/5b231a9c0efd15547569bd753dbec420b90c8c98?narHash=sha256-wGa5HXzU9lK4Q7ODv8/n5oY/QbIl8R2wUyDxcLsV3B4%3D' (2025-06-17) → 'github:nix-community/neovim-nightly-overlay/d9f4e3e5952e267e8399b15759bbec90019f4515?narHash=sha256-IxbIMd6Z2%2BFPb9QCo95lJ4qcqaAYitSxB5Z%2Bh3rM2Qo%3D' (2025-06-24) • Updated input 'neovim-nightly-overlay/git-hooks': 'github:cachix/git-hooks.nix/623c56286de5a3193aa38891a6991b28f9bab056?narHash=sha256-WUaIlOlPLyPgz9be7fqWJA5iG6rHcGRtLERSCfUDne4%3D' (2025-06-11) → 'github:cachix/git-hooks.nix/fae816c55a75675f30d18c9cbdecc13b970d95d4?narHash=sha256-uLtw0iF9mQ94L831NOlQLPX9wm0qzd5yim3rcwACEoM%3D' (2025-06-23) • Updated input 'neovim-nightly-overlay/neovim-src': 'github:neovim/neovim/3e984cf02bdcebe2d4f31792505b6a3784fd1b1b?narHash=sha256-JTG1BFIIKmFfuT%2BsIhwrphAIjREgV4FfRcyuztr89P0%3D' (2025-06-16) → 'github:neovim/neovim/7f3249fa0de06cdcf4be1ed5f260d83cd9021dee?narHash=sha256-li7cZUSJUhvjXC09GYS6u5PxBoVk2PGvqcdmINUGnhU%3D' (2025-06-23) • Updated input 'neovim-nightly-overlay/nixpkgs': 'github:NixOS/nixpkgs/41da1e3ea8e23e094e5e3eeb1e6b830468a7399e?narHash=sha256-jp0D4vzBcRKwNZwfY4BcWHemLGUs4JrS3X9w5k/JYDA%3D' (2025-06-14) → 'github:NixOS/nixpkgs/3078b9a9e75f1790e6d6ef9955fdc6a2d1740cc6?narHash=sha256-xT8cPLTxlktxI9vSdoBlAVK7dXgd8IK59j7ZwzkkhnI%3D' (2025-06-22) • Updated input 'nixpkgs': 'github:NixOS/nixpkgs/9e83b64f727c88a7711a2c463a7b16eedb69a84c?narHash=sha256-v263g4GbxXv87hMXMCpjkIxd/viIF7p3JpJrwgKdNiI%3D' (2025-06-17) → 'github:NixOS/nixpkgs/8ad467f6d5f3533c961e456a43948373f41a98da?narHash=sha256-b5ISt1FZCnYf%2BqhWFu3wc39zl0jlZNEXudzWHD0dsV0%3D' (2025-06-24) • Updated input 'nixpkgs-uns': 'github:NixOS/nixpkgs/ee930f9755f58096ac6e8ca94a1887e0534e2d81?narHash=sha256-Kh9K4taXbVuaLC0IL%2B9HcfvxsSUx8dPB5s5weJcc9pc%3D' (2025-06-13) → 'github:NixOS/nixpkgs/4206c4cb56751df534751b058295ea61357bbbaa?narHash=sha256-VLFNc4egNjovYVxDGyBYTrvVCgDYgENp5bVi9fPTDYc%3D' (2025-06-21) --- flake.lock | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/flake.lock b/flake.lock index 1170af2..11842b8 100644 --- a/flake.lock +++ b/flake.lock @@ -183,11 +183,11 @@ ] }, "locked": { - "lastModified": 1749636823, - "narHash": "sha256-WUaIlOlPLyPgz9be7fqWJA5iG6rHcGRtLERSCfUDne4=", + "lastModified": 1750684550, + "narHash": "sha256-uLtw0iF9mQ94L831NOlQLPX9wm0qzd5yim3rcwACEoM=", "owner": "cachix", "repo": "git-hooks.nix", - "rev": "623c56286de5a3193aa38891a6991b28f9bab056", + "rev": "fae816c55a75675f30d18c9cbdecc13b970d95d4", "type": "github" }, "original": { @@ -281,11 +281,11 @@ "mini-nvim": { "flake": false, "locked": { - "lastModified": 1749909966, - "narHash": "sha256-vR8sOlGEST8SlknAtvfsP3j40rZaS5Jed8FwDdCBP94=", + "lastModified": 1750602124, + "narHash": "sha256-cfgANg0vRJg31x+BiSfYhwBSyQnYt/aRDx6+BaS0YYY=", "owner": "echasnovski", "repo": "mini.nvim", - "rev": "3f5d06a6f710966cb93baaadc4897eeb6d6210e5", + "rev": "1b32a3f61f1f649cadc748bd4b7a32b4b4785d29", "type": "github" }, "original": { @@ -305,11 +305,11 @@ "treefmt-nix": "treefmt-nix" }, "locked": { - "lastModified": 1750119416, - "narHash": "sha256-wGa5HXzU9lK4Q7ODv8/n5oY/QbIl8R2wUyDxcLsV3B4=", + "lastModified": 1750742070, + "narHash": "sha256-IxbIMd6Z2+FPb9QCo95lJ4qcqaAYitSxB5Z+h3rM2Qo=", "owner": "nix-community", "repo": "neovim-nightly-overlay", - "rev": "5b231a9c0efd15547569bd753dbec420b90c8c98", + "rev": "d9f4e3e5952e267e8399b15759bbec90019f4515", "type": "github" }, "original": { @@ -321,11 +321,11 @@ "neovim-src": { "flake": false, "locked": { - "lastModified": 1750116292, - "narHash": "sha256-JTG1BFIIKmFfuT+sIhwrphAIjREgV4FfRcyuztr89P0=", + "lastModified": 1750722680, + "narHash": "sha256-li7cZUSJUhvjXC09GYS6u5PxBoVk2PGvqcdmINUGnhU=", "owner": "neovim", "repo": "neovim", - "rev": "3e984cf02bdcebe2d4f31792505b6a3784fd1b1b", + "rev": "7f3249fa0de06cdcf4be1ed5f260d83cd9021dee", "type": "github" }, "original": { @@ -336,11 +336,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1749903597, - "narHash": "sha256-jp0D4vzBcRKwNZwfY4BcWHemLGUs4JrS3X9w5k/JYDA=", + "lastModified": 1750605355, + "narHash": "sha256-xT8cPLTxlktxI9vSdoBlAVK7dXgd8IK59j7ZwzkkhnI=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "41da1e3ea8e23e094e5e3eeb1e6b830468a7399e", + "rev": "3078b9a9e75f1790e6d6ef9955fdc6a2d1740cc6", "type": "github" }, "original": { @@ -380,11 +380,11 @@ }, "nixpkgs-uns": { "locked": { - "lastModified": 1749794982, - "narHash": "sha256-Kh9K4taXbVuaLC0IL+9HcfvxsSUx8dPB5s5weJcc9pc=", + "lastModified": 1750506804, + "narHash": "sha256-VLFNc4egNjovYVxDGyBYTrvVCgDYgENp5bVi9fPTDYc=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "ee930f9755f58096ac6e8ca94a1887e0534e2d81", + "rev": "4206c4cb56751df534751b058295ea61357bbbaa", "type": "github" }, "original": { @@ -396,11 +396,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1750134718, - "narHash": "sha256-v263g4GbxXv87hMXMCpjkIxd/viIF7p3JpJrwgKdNiI=", + "lastModified": 1750749555, + "narHash": "sha256-b5ISt1FZCnYf+qhWFu3wc39zl0jlZNEXudzWHD0dsV0=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "9e83b64f727c88a7711a2c463a7b16eedb69a84c", + "rev": "8ad467f6d5f3533c961e456a43948373f41a98da", "type": "github" }, "original": { From 1a0651a8961eb5dd4a1cc95898f3463606f5bd1d Mon Sep 17 00:00:00 2001 From: cjurgell Date: Tue, 3 Jun 2025 11:59:56 -0500 Subject: [PATCH 127/160] allow dd in qf --- nvim/lua/config/init.lua | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/nvim/lua/config/init.lua b/nvim/lua/config/init.lua index 98ae067..10ebd2a 100644 --- a/nvim/lua/config/init.lua +++ b/nvim/lua/config/init.lua @@ -57,6 +57,23 @@ vim.diagnostic.config { }, } +-- 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 }) + end, { buffer = true }) + end, +}) + -- random keymaps vim.keymap.set({ 'v', 'i' }, 'wq', 'l', { noremap = true, silent = true }) vim.keymap.set('n', '', vim.cmd.bnext, { noremap = true, silent = true }) From 3231eec14e7346f820c7f48b599dfa8060894689 Mon Sep 17 00:00:00 2001 From: cjurgell Date: Tue, 24 Jun 2025 11:31:25 -0500 Subject: [PATCH 128/160] cleanup bundle size --- .github/workflows/main.yml | 2 +- nix/neovim-overlay.nix | 18 ++++++------------ 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 907bff6..36b3551 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", "nvim-min"] + package_name: ["nvim-min"] steps: - uses: actions/checkout@v3 - uses: DeterminateSystems/nix-installer-action@main diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index cc0e683..bffdfa2 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -22,7 +22,6 @@ with final.pkgs.lib; let diffview-nvim eyeliner-nvim friendly-snippets - fzf-vim lazy-nvim mini-nvim-git nightfox-nvim @@ -43,22 +42,20 @@ with final.pkgs.lib; let ripgrep fd ]; + # Extra packages that should be included on nixos but don't need to be bundled extraPackages = with pkgs; [ # linters - puppet-lint + alejandra yamllint jq - alejandra + hadolint + shellcheck # LSPs gopls lua-language-server nil - phpactor basedpyright - - #other - jujutsu ]; in { nvim-pkg = mkNeovim { @@ -72,11 +69,8 @@ in { plugins = all-plugins; appName = "nvim"; extraPackages = basePackages; - ignoreConfigRegexes = [ - ".*lsp.lua" - ".*debug.lua" - ".*ai.lua" - ]; + withSqlite = false; + withPython3 = false; }; # This is meant to be used within a devshell. From c46a2297137ad7461dac15441dfb991868ddbe99 Mon Sep 17 00:00:00 2001 From: iofq Date: Tue, 24 Jun 2025 02:38:40 -0500 Subject: [PATCH 129/160] cleanup, mini rice --- flake.lock | 34 ++++++++-------- flake.nix | 7 +++- nix/neovim-overlay.nix | 13 +++++-- nvim/ftplugin/php.lua | 1 + nvim/lua/config/init.lua | 6 ++- nvim/lua/plugins/lib/minipairs.lua | 38 ++++++++++++++++++ nvim/lua/plugins/lsp.lua | 14 ++++++- nvim/lua/plugins/mini.lua | 62 ++++++++++-------------------- nvim/lua/plugins/misc.lua | 21 +++++++--- nvim/lua/plugins/snacks.lua | 1 + nvim/lua/plugins/treesitter.lua | 17 +------- 11 files changed, 127 insertions(+), 87 deletions(-) create mode 100644 nvim/ftplugin/php.lua create mode 100644 nvim/lua/plugins/lib/minipairs.lua diff --git a/flake.lock b/flake.lock index 11842b8..e0a33d9 100644 --- a/flake.lock +++ b/flake.lock @@ -378,22 +378,6 @@ "type": "github" } }, - "nixpkgs-uns": { - "locked": { - "lastModified": 1750506804, - "narHash": "sha256-VLFNc4egNjovYVxDGyBYTrvVCgDYgENp5bVi9fPTDYc=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "4206c4cb56751df534751b058295ea61357bbbaa", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, "nixpkgs_2": { "locked": { "lastModified": 1750749555, @@ -410,6 +394,22 @@ "type": "github" } }, + "oil-nvim": { + "flake": false, + "locked": { + "lastModified": 1749076816, + "narHash": "sha256-fbRbRT9VJdppOs4hML1J113qLHdj7YRuSDQgZkt34cM=", + "owner": "stevearc", + "repo": "oil.nvim", + "rev": "08c2bce8b00fd780fb7999dbffdf7cd174e896fb", + "type": "github" + }, + "original": { + "owner": "stevearc", + "repo": "oil.nvim", + "type": "github" + } + }, "root": { "inputs": { "flake-utils": "flake-utils", @@ -417,7 +417,7 @@ "mini-nvim": "mini-nvim", "neovim-nightly-overlay": "neovim-nightly-overlay", "nixpkgs": "nixpkgs_2", - "nixpkgs-uns": "nixpkgs-uns" + "oil-nvim": "oil-nvim" } }, "systems": { diff --git a/flake.nix b/flake.nix index ea7e593..5c2dd29 100644 --- a/flake.nix +++ b/flake.nix @@ -2,7 +2,6 @@ description = "Neovim derivation"; inputs = { - nixpkgs-uns.url = "github:NixOS/nixpkgs/nixos-unstable"; nixpkgs.url = "github:NixOS/nixpkgs/master"; flake-utils.url = "github:numtide/flake-utils"; neovim-nightly-overlay.url = "github:nix-community/neovim-nightly-overlay"; @@ -14,6 +13,10 @@ url = "github:echasnovski/mini.nvim"; flake = false; }; + oil-nvim = { + url = "github:stevearc/oil.nvim"; + flake = false; + }; # Add bleeding-edge plugins here. # They can be updated with `nix flake update` (make sure to commit the generated flake.lock) # wf-nvim = { @@ -52,7 +55,6 @@ nil stylua luajitPackages.luacheck - nvim-dev alejandra ]; shellHook = '' @@ -67,6 +69,7 @@ default = nvim; nvim = pkgs.nvim-pkg; nvim-min = pkgs.nvim-min-pkg; + nvim-dev = pkgs.nvim-dev; }; devShells = { default = shell; diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index bffdfa2..87fdbce 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -12,6 +12,7 @@ with final.pkgs.lib; let mkNeovim = pkgs.callPackage ./mkNeovim.nix {inherit pkgs-wrapNeovim;}; mini-nvim-git = mkNvimPlugin inputs.mini-nvim "mini.nvim"; + oil-nvim-git = mkNvimPlugin inputs.oil-nvim "oil.nvim"; all-plugins = with pkgs.vimPlugins; [ blink-cmp @@ -25,13 +26,13 @@ with final.pkgs.lib; let lazy-nvim mini-nvim-git nightfox-nvim - nvim-bqf nvim-lint nvim-lspconfig nvim-treesitter-context nvim-treesitter-textobjects nvim-treesitter.withAllGrammars - oil-nvim + oil-nvim-git + quicker-nvim refactoring-nvim render-markdown-nvim snacks-nvim @@ -40,7 +41,6 @@ with final.pkgs.lib; let basePackages = with pkgs; [ ripgrep - fd ]; # Extra packages that should be included on nixos but don't need to be bundled extraPackages = with pkgs; [ @@ -49,6 +49,7 @@ with final.pkgs.lib; let yamllint jq hadolint + alejandra shellcheck # LSPs @@ -56,6 +57,10 @@ with final.pkgs.lib; let lua-language-server nil basedpyright + + #other + jujutsu + fd ]; in { nvim-pkg = mkNeovim { @@ -69,8 +74,8 @@ in { plugins = all-plugins; appName = "nvim"; extraPackages = basePackages; + withNodeJs = false; withSqlite = false; - withPython3 = false; }; # This is meant to be used within a devshell. diff --git a/nvim/ftplugin/php.lua b/nvim/ftplugin/php.lua new file mode 100644 index 0000000..3f3eef4 --- /dev/null +++ b/nvim/ftplugin/php.lua @@ -0,0 +1 @@ +vim.opt.tabstop = 4 diff --git a/nvim/lua/config/init.lua b/nvim/lua/config/init.lua index 10ebd2a..fd54f6b 100644 --- a/nvim/lua/config/init.lua +++ b/nvim/lua/config/init.lua @@ -5,6 +5,9 @@ vim.opt.completeopt = { 'menu', 'menuone', 'noselect' } vim.opt.cmdheight = 1 vim.opt.diffopt = 'internal,filler,closeoff,inline:char' vim.opt.expandtab = true -- insert tabs as spaces +vim.o.foldenable = true +vim.o.foldmethod = 'expr' -- use tree-sitter for folding method +vim.o.foldexpr = 'v:lua.vim.treesitter.foldexpr()' vim.opt.inccommand = 'split' -- incremental live completion vim.opt.list = true vim.opt.nrformats:append('alpha') -- let Ctrl-a do letters as well @@ -80,7 +83,8 @@ vim.keymap.set('n', '', vim.cmd.bnext, { noremap = true, silent = true }) vim.keymap.set('n', '', vim.cmd.bprev, { noremap = true, silent = true }) vim.keymap.set('v', '<', '', '>gv') -vim.keymap.set('v', 'q:', '') +vim.keymap.set({ 'n', 'v' }, '', '') -- usually have C-a mapped to tmux -- resize splits if window got resized vim.api.nvim_create_autocmd({ 'VimResized' }, { diff --git a/nvim/lua/plugins/lib/minipairs.lua b/nvim/lua/plugins/lib/minipairs.lua new file mode 100644 index 0000000..f3b22f3 --- /dev/null +++ b/nvim/lua/plugins/lib/minipairs.lua @@ -0,0 +1,38 @@ +-- ripped from lazyvim +return function(opts) + local pairs = require('mini.pairs') + pairs.setup(opts) + local open = pairs.open + pairs.open = function(pair, neigh_pattern) + if vim.fn.getcmdline() ~= '' then + return open(pair, neigh_pattern) + end + local o, c = pair:sub(1, 1), pair:sub(2, 2) + local line = vim.api.nvim_get_current_line() + local cursor = vim.api.nvim_win_get_cursor(0) + local next = line:sub(cursor[2] + 1, cursor[2] + 1) + local before = line:sub(1, cursor[2]) + if opts.markdown and o == '`' and vim.bo.filetype == 'markdown' and before:match('^%s*``') then + return '`\n```' .. vim.api.nvim_replace_termcodes('', true, true, true) + end + if opts.skip_next and next ~= '' and next:match(opts.skip_next) then + return o + end + if opts.skip_ts and #opts.skip_ts > 0 then + local ok, captures = pcall(vim.treesitter.get_captures_at_pos, 0, cursor[1] - 1, math.max(cursor[2] - 1, 0)) + for _, capture in ipairs(ok and captures or {}) do + if vim.tbl_contains(opts.skip_ts, capture.capture) then + return o + end + end + end + if opts.skip_unbalanced and next == c and c ~= o then + local _, count_open = line:gsub(vim.pesc(pair:sub(1, 1)), '') + local _, count_close = line:gsub(vim.pesc(pair:sub(2, 2)), '') + if count_close > count_open then + return o + end + end + return open(pair, neigh_pattern) + end +end diff --git a/nvim/lua/plugins/lsp.lua b/nvim/lua/plugins/lsp.lua index 3c66d15..bcab147 100644 --- a/nvim/lua/plugins/lsp.lua +++ b/nvim/lua/plugins/lsp.lua @@ -39,6 +39,10 @@ return { }, analyses = { unusedvariable = true, + unusedparams = true, + useany = true, + unusedwrite = true, + nilness = true, shadow = true, }, hints = { @@ -52,6 +56,8 @@ return { }, usePlaceholders = true, staticcheck = true, + completeUnimported = true, + semanticTokens = true, }, }, }) @@ -154,6 +160,7 @@ return { vim.b.disable_autoformat = not vim.b.disable_autoformat end, mode = { 'n', 'x' }, + desc = 'toggle buffer formatting', }, { '\\F', @@ -161,6 +168,7 @@ return { vim.g.disable_autoformat = not vim.g.disable_autoformat end, mode = { 'n', 'x' }, + desc = 'toggle global formatting', }, }, opts = { @@ -171,6 +179,7 @@ return { lua = { 'stylua' }, python = { 'ruff' }, nix = { 'alejandra' }, + fish = { 'fish_indent' }, ['*'] = { 'trim_whitespace' }, }, format_on_save = function(bufnr) @@ -181,8 +190,8 @@ return { return { timeout_ms = 500, lsp_format = 'last' } end, default_format_opts = { - timeout_ms = 500, - lsp_format = 'last', + timeout_ms = 1500, + lsp_format = 'fallback', }, }, }, @@ -197,6 +206,7 @@ return { sh = { 'shellcheck' }, go = { 'golangcilint' }, ruby = { 'rubocop' }, + fish = { 'fish' }, } vim.api.nvim_command('au BufWritePost * lua require("lint").try_lint()') end, diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index d8a758d..56acd25 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -1,45 +1,7 @@ --- ripped from lazyvim -local function setup_pairs(opts) - local pairs = require('mini.pairs') - pairs.setup(opts) - local open = pairs.open - pairs.open = function(pair, neigh_pattern) - if vim.fn.getcmdline() ~= '' then - return open(pair, neigh_pattern) - end - local o, c = pair:sub(1, 1), pair:sub(2, 2) - local line = vim.api.nvim_get_current_line() - local cursor = vim.api.nvim_win_get_cursor(0) - local next = line:sub(cursor[2] + 1, cursor[2] + 1) - local before = line:sub(1, cursor[2]) - if opts.markdown and o == '`' and vim.bo.filetype == 'markdown' and before:match('^%s*``') then - return '`\n```' .. vim.api.nvim_replace_termcodes('', true, true, true) - end - if opts.skip_next and next ~= '' and next:match(opts.skip_next) then - return o - end - if opts.skip_ts and #opts.skip_ts > 0 then - local ok, captures = pcall(vim.treesitter.get_captures_at_pos, 0, cursor[1] - 1, math.max(cursor[2] - 1, 0)) - for _, capture in ipairs(ok and captures or {}) do - if vim.tbl_contains(opts.skip_ts, capture.capture) then - return o - end - end - end - if opts.skip_unbalanced and next == c and c ~= o then - local _, count_open = line:gsub(vim.pesc(pair:sub(1, 1)), '') - local _, count_close = line:gsub(vim.pesc(pair:sub(2, 2)), '') - if count_close > count_open then - return o - end - end - return open(pair, neigh_pattern) - end -end - return { { 'echasnovski/mini.nvim', + dependencies = 'nvim-treesitter/nvim-treesitter-textobjects', lazy = false, keys = { { @@ -112,7 +74,24 @@ return { }, } vim.schedule(function() - require('mini.ai').setup() + 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(), + 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() require('mini.icons').setup() @@ -138,7 +117,7 @@ return { spotter = jump.gen_spotter.vimpattern(), } - setup_pairs { + require('plugins.lib.minipairs') { modes = { insert = true, command = true, terminal = false }, skip_next = [=[[%w%%%'%[%"%.%`%$]]=], skip_ts = { 'string' }, @@ -167,6 +146,7 @@ return { { mode = 'n', keys = 'z' }, { mode = 'n', keys = ']' }, { mode = 'n', keys = '[' }, + { mode = 'n', keys = '\\' }, }, window = { config = { width = 'auto' }, diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index 0d160ed..0e52e74 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -127,12 +127,23 @@ return { }, }, { - 'kevinhwang91/nvim-bqf', + 'stevearc/quicker.nvim', event = 'VeryLazy', - opts = { - auto_resize_height = true, - preview = { - winblend = 0, + config = true, + keys = { + { + 'qf', + function() + require('quicker').toggle() + end, + desc = 'Toggle qflist', + }, + { + 'qr', + function() + require('quicker').refresh() + end, + desc = 'Refresh qflist', }, }, }, diff --git a/nvim/lua/plugins/snacks.lua b/nvim/lua/plugins/snacks.lua index 67fae13..58e542a 100644 --- a/nvim/lua/plugins/snacks.lua +++ b/nvim/lua/plugins/snacks.lua @@ -16,6 +16,7 @@ return { indent = { enabled = true }, input = { enabled = true }, words = { enabled = true }, + scope = { enabled = true }, picker = { enabled = true, matcher = { frecency = true }, diff --git a/nvim/lua/plugins/treesitter.lua b/nvim/lua/plugins/treesitter.lua index 8e08bae..ad22ccd 100644 --- a/nvim/lua/plugins/treesitter.lua +++ b/nvim/lua/plugins/treesitter.lua @@ -15,11 +15,9 @@ return { config = function() require('nvim-treesitter.configs').setup { ensure_installed = {}, - ignore_install = { 'org' }, auto_install = false, highlight = { enable = true, - additional_vim_regex_highlighting = false, }, indent = { enable = true, @@ -28,28 +26,17 @@ return { enable = true, }, textobjects = { - select = { - enable = true, - keymaps = { - ['af'] = '@function.outer', - ['if'] = '@function.inner', - ['ia'] = '@parameter.inner', - ['ik'] = '@assignment.lhs', - ['iv'] = '@assignment.rhs', - ['is'] = { query = '@local.scope', query_group = 'locals', desc = 'Select language scope' }, - }, - }, move = { enable = true, goto_next_start = { [']a'] = '@parameter.inner', [']f'] = '@function.outer', - [']]'] = '@statement.outer', + [']t'] = '@statement.outer', }, goto_previous_start = { ['[a'] = '@parameter.inner', ['[f'] = '@function.outer', - ['[['] = '@statement.outer', + ['[t'] = '@statement.outer', }, }, swap = { From 285df2df531fc95238c51e3c9ea670a6d92df775 Mon Sep 17 00:00:00 2001 From: cjurgell Date: Mon, 30 Jun 2025 13:20:51 -0500 Subject: [PATCH 130/160] fix snacks duplicate path bug --- nvim/lua/plugins/snacks.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nvim/lua/plugins/snacks.lua b/nvim/lua/plugins/snacks.lua index 58e542a..acf66ea 100644 --- a/nvim/lua/plugins/snacks.lua +++ b/nvim/lua/plugins/snacks.lua @@ -31,7 +31,7 @@ return { explorer = { hidden = true }, git_files = { untracked = true }, smart = { - multi = { 'buffers', 'recent', 'files', 'git_files' }, + multi = { 'buffers', 'recent', 'files' }, }, }, actions = { From d360f0e7016f1e016c4b9bd6d7228e7147af9f0a Mon Sep 17 00:00:00 2001 From: iofq Date: Sat, 5 Jul 2025 20:36:06 -0500 Subject: [PATCH 131/160] no more oil --- flake.lock | 19 +----- flake.nix | 110 ++++++++++++++++---------------- nix/neovim-overlay.nix | 16 +++-- nvim/lua/config/init.lua | 13 ++-- nvim/lua/plugins/completion.lua | 2 +- nvim/lua/plugins/mini.lua | 39 ++++++----- nvim/lua/plugins/misc.lua | 25 -------- 7 files changed, 97 insertions(+), 127 deletions(-) diff --git a/flake.lock b/flake.lock index e0a33d9..7cf582e 100644 --- a/flake.lock +++ b/flake.lock @@ -394,30 +394,13 @@ "type": "github" } }, - "oil-nvim": { - "flake": false, - "locked": { - "lastModified": 1749076816, - "narHash": "sha256-fbRbRT9VJdppOs4hML1J113qLHdj7YRuSDQgZkt34cM=", - "owner": "stevearc", - "repo": "oil.nvim", - "rev": "08c2bce8b00fd780fb7999dbffdf7cd174e896fb", - "type": "github" - }, - "original": { - "owner": "stevearc", - "repo": "oil.nvim", - "type": "github" - } - }, "root": { "inputs": { "flake-utils": "flake-utils", "gen-luarc": "gen-luarc", "mini-nvim": "mini-nvim", "neovim-nightly-overlay": "neovim-nightly-overlay", - "nixpkgs": "nixpkgs_2", - "oil-nvim": "oil-nvim" + "nixpkgs": "nixpkgs_2" } }, "systems": { diff --git a/flake.nix b/flake.nix index 5c2dd29..78131bc 100644 --- a/flake.nix +++ b/flake.nix @@ -13,10 +13,6 @@ url = "github:echasnovski/mini.nvim"; flake = false; }; - oil-nvim = { - url = "github:stevearc/oil.nvim"; - flake = false; - }; # Add bleeding-edge plugins here. # They can be updated with `nix flake update` (make sure to commit the generated flake.lock) # wf-nvim = { @@ -24,57 +20,63 @@ # flake = false; # }; }; - outputs = inputs @ { - self, - nixpkgs, - flake-utils, - ... - }: let - systems = builtins.attrNames nixpkgs.legacyPackages; + outputs = + inputs@{ + self, + nixpkgs, + flake-utils, + ... + }: + let + systems = builtins.attrNames nixpkgs.legacyPackages; - # This is where the Neovim derivation is built. - neovim-overlay = import ./nix/neovim-overlay.nix {inherit inputs;}; - in - flake-utils.lib.eachSystem systems (system: let - pkgs = import nixpkgs { - inherit system; - config.allowUnfree = true; - overlays = [ - inputs.neovim-nightly-overlay.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. - inputs.gen-luarc.overlays.default - ]; - }; - shell = pkgs.mkShell { - name = "nvim-devShell"; - buildInputs = with pkgs; [ - lua-language-server - nil - stylua - luajitPackages.luacheck - alejandra - ]; - 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 { - packages = rec { - default = nvim; - nvim = pkgs.nvim-pkg; - nvim-min = pkgs.nvim-min-pkg; - nvim-dev = pkgs.nvim-dev; - }; - devShells = { - default = shell; - }; - }) + # This is where the Neovim derivation is built. + neovim-overlay = import ./nix/neovim-overlay.nix { inherit inputs; }; + in + flake-utils.lib.eachSystem systems ( + system: + let + pkgs = import nixpkgs { + inherit system; + config.allowUnfree = true; + overlays = [ + inputs.neovim-nightly-overlay.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. + inputs.gen-luarc.overlays.default + ]; + }; + shell = pkgs.mkShell { + name = "nvim-devShell"; + buildInputs = with pkgs; [ + lua-language-server + nil + stylua + luajitPackages.luacheck + alejandra + ]; + 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 + { + packages = rec { + default = nvim; + nvim = pkgs.nvim-pkg; + nvim-min = pkgs.nvim-min-pkg; + nvim-dev = pkgs.nvim-dev; + }; + devShells = { + default = shell; + }; + } + ) // { overlays.default = neovim-overlay; }; diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index 87fdbce..1e2a8b2 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -1,18 +1,20 @@ # This overlay, when applied to nixpkgs, adds the final neovim derivation to nixpkgs. -{inputs}: final: prev: -with final.pkgs.lib; let +{ inputs }: +final: prev: +with final.pkgs.lib; +let pkgs = final; pkgs-wrapNeovim = prev; - mkNvimPlugin = src: pname: + mkNvimPlugin = + src: pname: pkgs.vimUtils.buildVimPlugin { inherit pname src; version = src.lastModifiedDate; }; - mkNeovim = pkgs.callPackage ./mkNeovim.nix {inherit pkgs-wrapNeovim;}; + mkNeovim = pkgs.callPackage ./mkNeovim.nix { inherit pkgs-wrapNeovim; }; mini-nvim-git = mkNvimPlugin inputs.mini-nvim "mini.nvim"; - oil-nvim-git = mkNvimPlugin inputs.oil-nvim "oil.nvim"; all-plugins = with pkgs.vimPlugins; [ blink-cmp @@ -31,7 +33,6 @@ with final.pkgs.lib; let nvim-treesitter-context nvim-treesitter-textobjects nvim-treesitter.withAllGrammars - oil-nvim-git quicker-nvim refactoring-nvim render-markdown-nvim @@ -62,7 +63,8 @@ with final.pkgs.lib; let jujutsu fd ]; -in { +in +{ nvim-pkg = mkNeovim { plugins = all-plugins; appName = "nvim"; diff --git a/nvim/lua/config/init.lua b/nvim/lua/config/init.lua index fd54f6b..af169ee 100644 --- a/nvim/lua/config/init.lua +++ b/nvim/lua/config/init.lua @@ -4,10 +4,11 @@ vim.opt.confirm = true vim.opt.completeopt = { 'menu', 'menuone', 'noselect' } vim.opt.cmdheight = 1 vim.opt.diffopt = 'internal,filler,closeoff,inline:char' -vim.opt.expandtab = true -- insert tabs as spaces +vim.opt.expandtab = true -- insert tabs as spaces vim.o.foldenable = true -vim.o.foldmethod = 'expr' -- use tree-sitter for folding method +vim.o.foldmethod = 'expr' -- use tree-sitter for folding method vim.o.foldexpr = 'v:lua.vim.treesitter.foldexpr()' +vim.o.foldlevelstart = 99 vim.opt.inccommand = 'split' -- incremental live completion vim.opt.list = true vim.opt.nrformats:append('alpha') -- let Ctrl-a do letters as well @@ -62,12 +63,14 @@ vim.diagnostic.config { -- Allow basic deletion in qflist vim.api.nvim_create_autocmd({ 'FileType' }, { - pattern = "qf", + pattern = 'qf', callback = function() - vim.keymap.set({ "n", "i" }, 'dd', function() + vim.keymap.set({ 'n', 'i' }, 'dd', function() local ln = vim.fn.line('.') local qf = vim.fn.getqflist() - if #qf == 0 then return end + if #qf == 0 then + return + end table.remove(qf, ln) vim.fn.setqflist(qf, 'r') vim.cmd('copen') diff --git a/nvim/lua/plugins/completion.lua b/nvim/lua/plugins/completion.lua index 0e15172..62368fb 100644 --- a/nvim/lua/plugins/completion.lua +++ b/nvim/lua/plugins/completion.lua @@ -8,7 +8,7 @@ return { }, opts = { enabled = function() - return not vim.tbl_contains({ 'snacks_picker_input', 'oil' }, vim.bo.filetype) + return not vim.tbl_contains({ 'snacks_picker_input' }, vim.bo.filetype) end, fuzzy = { sorts = { diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index 56acd25..e6a6895 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -51,7 +51,7 @@ return { content = { active = function() local mode, mode_hl = MiniStatusline.section_mode {} - local filename = MiniStatusline.section_filename { trunc_width = 140 } + -- local filename = MiniStatusline.section_filename { trunc_width = 140 } local diagnostics = MiniStatusline.section_diagnostics { trunc_width = 75 } local lsp = MiniStatusline.section_lsp { trunc_width = 75 } local search = MiniStatusline.section_searchcount { trunc_width = 75 } @@ -60,7 +60,7 @@ return { '%<', -- Mark general truncate point -- { hl = 'MiniStatuslineFilename', strings = { filename } }, '%=', -- End left alignment - { hl = 'MiniStatuslineDevinfo', strings = { rec, diagnostics, lsp } }, + { hl = 'MiniStatuslineDevinfo', strings = { diagnostics, lsp } }, { hl = 'MiniStatuslineDevinfo', strings = { search } }, { hl = mode_hl, strings = { mode } }, } @@ -93,7 +93,7 @@ return { }, } require('mini.align').setup() - require('mini.bracketed').setup() + require('mini.bracketed').setup { file = { suffix = 'm' } } require('mini.icons').setup() require('mini.git').setup() require('mini.surround').setup() @@ -159,23 +159,28 @@ return { miniclue.gen_clues.z(), }, } - - local map = require('mini.map') - map.setup { - symbols = { - scroll_line = '┃', - scroll_view = '', + local files = require('mini.files') + files.setup { + mappings = { + go_in_plus = '', }, - integrations = { - map.gen_integration.builtin_search(), - map.gen_integration.diagnostic(), - map.gen_integration.diff(), - }, - window = { - show_integration_count = false, + windows = { + preview = true, + width_focus = 30, + width_preview = 50, }, } - vim.keymap.set('n', 'nm', map.toggle, { noremap = true, desc = 'minimap open' }) + vim.keymap.set('n', 'nc', files.open, { noremap = true, desc = 'minifiles open' }) + vim.api.nvim_create_autocmd('User', { + pattern = 'MiniFilesBufferCreate', + callback = function(args) + vim.keymap.set('n', '`', function() + local cur_entry_path = MiniFiles.get_fs_entry().path + local cur_directory = vim.fs.dirname(cur_entry_path) + vim.fn.chdir(cur_directory) + end, { buffer = args.data.buf_id }) + end, + }) local multi = require('mini.keymap').map_multistep multi({ 'i' }, '', { 'minipairs_bs' }) diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index 0e52e74..9849c9e 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -1,29 +1,4 @@ return { - { - 'stevearc/oil.nvim', - opts = { - watch_for_changes = true, - columns = { - 'permissions', - 'size', - }, - view_options = { - show_hidden = true, - }, - keymaps = { - ['wq'] = 'actions.close', - }, - }, - keys = { - { - 'nc', - function() - require('oil').toggle_float() - end, - { noremap = true, silent = true, desc = 'oil' }, - }, - }, - }, { 'jinh0/eyeliner.nvim', event = 'VeryLazy', From 5f5ac1793595cb935e828c0a8e8bf2f9a5ab776c Mon Sep 17 00:00:00 2001 From: iofq Date: Sat, 5 Jul 2025 21:18:10 -0500 Subject: [PATCH 132/160] no more copilot --- flake.lock | 17 --------- flake.nix | 32 +++++++---------- nix/neovim-overlay.nix | 20 ++++------- nvim/lsp/gopls.lua | 32 +++++++++++++++++ nvim/lsp/lua_ls.lua | 23 ++++++++++++ nvim/lua/config/init.lua | 1 - nvim/lua/plugins/ai.lua | 14 -------- nvim/lua/plugins/completion.lua | 16 --------- nvim/lua/plugins/lsp.lua | 62 +++------------------------------ nvim/lua/plugins/snacks.lua | 2 -- 10 files changed, 78 insertions(+), 141 deletions(-) create mode 100644 nvim/lsp/gopls.lua create mode 100644 nvim/lsp/lua_ls.lua delete mode 100644 nvim/lua/plugins/ai.lua diff --git a/flake.lock b/flake.lock index 7cf582e..efa8973 100644 --- a/flake.lock +++ b/flake.lock @@ -278,22 +278,6 @@ "type": "github" } }, - "mini-nvim": { - "flake": false, - "locked": { - "lastModified": 1750602124, - "narHash": "sha256-cfgANg0vRJg31x+BiSfYhwBSyQnYt/aRDx6+BaS0YYY=", - "owner": "echasnovski", - "repo": "mini.nvim", - "rev": "1b32a3f61f1f649cadc748bd4b7a32b4b4785d29", - "type": "github" - }, - "original": { - "owner": "echasnovski", - "repo": "mini.nvim", - "type": "github" - } - }, "neovim-nightly-overlay": { "inputs": { "flake-compat": "flake-compat_2", @@ -398,7 +382,6 @@ "inputs": { "flake-utils": "flake-utils", "gen-luarc": "gen-luarc", - "mini-nvim": "mini-nvim", "neovim-nightly-overlay": "neovim-nightly-overlay", "nixpkgs": "nixpkgs_2" } diff --git a/flake.nix b/flake.nix index 78131bc..984342b 100644 --- a/flake.nix +++ b/flake.nix @@ -9,10 +9,6 @@ url = "github:mrcjkb/nix-gen-luarc-json"; inputs.nixpkgs.follows = "nixpkgs"; }; - mini-nvim = { - url = "github:echasnovski/mini.nvim"; - flake = false; - }; # Add bleeding-edge plugins here. # They can be updated with `nix flake update` (make sure to commit the generated flake.lock) # wf-nvim = { @@ -20,22 +16,19 @@ # flake = false; # }; }; - outputs = - inputs@{ - self, - nixpkgs, - flake-utils, - ... - }: - let - systems = builtins.attrNames nixpkgs.legacyPackages; + outputs = inputs @ { + self, + nixpkgs, + flake-utils, + ... + }: let + systems = builtins.attrNames nixpkgs.legacyPackages; - # This is where the Neovim derivation is built. - neovim-overlay = import ./nix/neovim-overlay.nix { inherit inputs; }; - in + # This is where the Neovim derivation is built. + neovim-overlay = import ./nix/neovim-overlay.nix {inherit inputs;}; + in flake-utils.lib.eachSystem systems ( - system: - let + system: let pkgs = import nixpkgs { inherit system; config.allowUnfree = true; @@ -64,8 +57,7 @@ ln -Tfns $PWD/nvim ~/.config/nvim-dev ''; }; - in - { + in { packages = rec { default = nvim; nvim = pkgs.nvim-pkg; diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index 1e2a8b2..d3e6df7 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -1,32 +1,25 @@ # This overlay, when applied to nixpkgs, adds the final neovim derivation to nixpkgs. -{ inputs }: -final: prev: -with final.pkgs.lib; -let +{inputs}: final: prev: +with final.pkgs.lib; let pkgs = final; pkgs-wrapNeovim = prev; - mkNvimPlugin = - src: pname: + mkNvimPlugin = src: pname: pkgs.vimUtils.buildVimPlugin { inherit pname src; version = src.lastModifiedDate; }; - mkNeovim = pkgs.callPackage ./mkNeovim.nix { inherit pkgs-wrapNeovim; }; - - mini-nvim-git = mkNvimPlugin inputs.mini-nvim "mini.nvim"; + mkNeovim = pkgs.callPackage ./mkNeovim.nix {inherit pkgs-wrapNeovim;}; all-plugins = with pkgs.vimPlugins; [ blink-cmp - blink-copilot blink-ripgrep-nvim conform-nvim - copilot-lua diffview-nvim eyeliner-nvim friendly-snippets lazy-nvim - mini-nvim-git + mini-nvim nightfox-nvim nvim-lint nvim-lspconfig @@ -63,8 +56,7 @@ let jujutsu fd ]; -in -{ +in { nvim-pkg = mkNeovim { plugins = all-plugins; appName = "nvim"; diff --git a/nvim/lsp/gopls.lua b/nvim/lsp/gopls.lua new file mode 100644 index 0000000..46d47d8 --- /dev/null +++ b/nvim/lsp/gopls.lua @@ -0,0 +1,32 @@ +return { + settings = { + gopls = { + gofumpt = true, + codelenses = { + gc_details = true, + test = true, + }, + analyses = { + unusedvariable = true, + unusedparams = true, + useany = true, + unusedwrite = true, + nilness = true, + shadow = true, + }, + hints = { + assignVariableTypes = true, + compositeLiteralFields = true, + compositeLiteralTypes = true, + constantValues = true, + functionTypeParameters = true, + rangeVariableTypes = true, + parameterNames = true, + }, + usePlaceholders = true, + staticcheck = true, + completeUnimported = true, + semanticTokens = true, + }, + }, +} diff --git a/nvim/lsp/lua_ls.lua b/nvim/lsp/lua_ls.lua new file mode 100644 index 0000000..a2244c8 --- /dev/null +++ b/nvim/lsp/lua_ls.lua @@ -0,0 +1,23 @@ +return { + on_init = function(client) + local path = client.workspace_folders[1].name + if vim.loop.fs_stat(path .. '/.luarc.json') or vim.loop.fs_stat(path .. '/.luarc.jsonc') then + return + end + + client.config.settings.Lua = vim.tbl_deep_extend('force', client.config.settings.Lua, { + runtime = { + version = 'LuaJIT', + }, + workspace = { + checkThirdParty = false, + library = { + vim.env.VIMRUNTIME, + }, + }, + }) + end, + settings = { + Lua = {}, + }, +} diff --git a/nvim/lua/config/init.lua b/nvim/lua/config/init.lua index af169ee..1f048e1 100644 --- a/nvim/lua/config/init.lua +++ b/nvim/lua/config/init.lua @@ -87,7 +87,6 @@ vim.keymap.set('n', '', vim.cmd.bprev, { noremap = true, silent = true }) vim.keymap.set('v', '<', '', '>gv') vim.keymap.set({ 'v', 'n' }, 'q:', '') -vim.keymap.set({ 'n', 'v' }, '', '') -- usually have C-a mapped to tmux -- resize splits if window got resized vim.api.nvim_create_autocmd({ 'VimResized' }, { diff --git a/nvim/lua/plugins/ai.lua b/nvim/lua/plugins/ai.lua deleted file mode 100644 index 8529175..0000000 --- a/nvim/lua/plugins/ai.lua +++ /dev/null @@ -1,14 +0,0 @@ -return { - { - 'zbirenbaum/copilot.lua', - cmd = 'Copilot', - opts = { - panel = { - enabled = false, - }, - suggestion = { - enabled = false, - }, - }, - }, -} diff --git a/nvim/lua/plugins/completion.lua b/nvim/lua/plugins/completion.lua index 62368fb..b91c370 100644 --- a/nvim/lua/plugins/completion.lua +++ b/nvim/lua/plugins/completion.lua @@ -4,7 +4,6 @@ return { event = 'VeryLazy', dependencies = { 'mikavilpas/blink-ripgrep.nvim', - 'fang2hou/blink-copilot', }, opts = { enabled = function() @@ -24,7 +23,6 @@ return { 'snippets', 'omni', 'ripgrep', - 'copilot', }, providers = { snippets = { @@ -36,20 +34,6 @@ return { score_offset = -30, async = true, }, - copilot = { - module = 'blink-copilot', - name = 'Copilot', - score_offset = 10, - async = true, - opts = { - max_completions = 2, - debounce = 500, - auto_refresh = { - backward = false, - forward = true, - }, - }, - }, }, }, cmdline = { diff --git a/nvim/lua/plugins/lsp.lua b/nvim/lua/plugins/lsp.lua index bcab147..09c5a0a 100644 --- a/nvim/lua/plugins/lsp.lua +++ b/nvim/lua/plugins/lsp.lua @@ -5,7 +5,8 @@ return { opts = { pinned = true, focus = true, - auto_jump = true, + follow = false, + auto_close = false, win = { size = 0.25, position = 'right', @@ -29,62 +30,6 @@ return { 'saghen/blink.cmp', }, config = function() - vim.lsp.config('gopls', { - settings = { - gopls = { - gofumpt = true, - codelenses = { - gc_details = true, - test = true, - }, - analyses = { - unusedvariable = true, - unusedparams = true, - useany = true, - unusedwrite = true, - nilness = true, - shadow = true, - }, - hints = { - assignVariableTypes = true, - compositeLiteralFields = true, - compositeLiteralTypes = true, - constantValues = true, - functionTypeParameters = true, - rangeVariableTypes = true, - parameterNames = true, - }, - usePlaceholders = true, - staticcheck = true, - completeUnimported = true, - semanticTokens = true, - }, - }, - }) - vim.lsp.config('lua_ls', { - on_init = function(client) - local path = client.workspace_folders[1].name - if vim.loop.fs_stat(path .. '/.luarc.json') or vim.loop.fs_stat(path .. '/.luarc.jsonc') then - return - end - - client.config.settings.Lua = vim.tbl_deep_extend('force', client.config.settings.Lua, { - runtime = { - version = 'LuaJIT', - }, - workspace = { - checkThirdParty = false, - library = { - vim.env.VIMRUNTIME, - }, - }, - }) - end, - settings = { - Lua = {}, - }, - }) - vim.lsp.enable { 'nil_ls', 'phpactor', @@ -207,6 +152,9 @@ return { go = { 'golangcilint' }, ruby = { 'rubocop' }, fish = { 'fish' }, + bash = { 'bash' }, + nix = { 'nix' }, + php = { 'php' }, } vim.api.nvim_command('au BufWritePost * lua require("lint").try_lint()') end, diff --git a/nvim/lua/plugins/snacks.lua b/nvim/lua/plugins/snacks.lua index acf66ea..a6206a0 100644 --- a/nvim/lua/plugins/snacks.lua +++ b/nvim/lua/plugins/snacks.lua @@ -9,14 +9,12 @@ return { opts = { bigfile = { enabled = true }, bufdelete = { enabled = true }, - dim = { enabled = true }, quickfile = { enabled = true }, notifier = { enabled = true }, terminal = { enabled = true }, indent = { enabled = true }, input = { enabled = true }, words = { enabled = true }, - scope = { enabled = true }, picker = { enabled = true, matcher = { frecency = true }, From 66d50e274ebb857624ded6e3a0aa840947d95252 Mon Sep 17 00:00:00 2001 From: iofq Date: Sun, 6 Jul 2025 09:55:16 -0500 Subject: [PATCH 133/160] flake.lock: Update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'flake-utils': 'github:numtide/flake-utils/11707dc2f618dd54ca8739b309ec4fc024de578b?narHash=sha256-l0KFg5HjrsfsO/JpG%2Br7fRrqm12kzFHyUHqHCVpMMbI%3D' (2024-11-13) → 'github:numtide/flake-utils/11707dc2f618dd54ca8739b309ec4fc024de578b' (2024-11-13) • Updated input 'gen-luarc': 'github:mrcjkb/nix-gen-luarc-json/b36b69c4ded9f31b079523bc452e23458734cf00?narHash=sha256-Q4tgm8ZHAQUdvsNft86MqIbHQAm7OF7RT/wwYWXqSdY%3D' (2024-08-19) → 'github:mrcjkb/nix-gen-luarc-json/b36b69c4ded9f31b079523bc452e23458734cf00' (2024-08-19) • Updated input 'neovim-nightly-overlay': 'github:nix-community/neovim-nightly-overlay/d9f4e3e5952e267e8399b15759bbec90019f4515?narHash=sha256-IxbIMd6Z2%2BFPb9QCo95lJ4qcqaAYitSxB5Z%2Bh3rM2Qo%3D' (2025-06-24) → 'github:nix-community/neovim-nightly-overlay/a4252dd30a64aef3fa59ad1f9ded862381df117a' (2025-07-06) • Updated input 'neovim-nightly-overlay/flake-parts': 'github:hercules-ci/flake-parts/9305fe4e5c2a6fcf5ba6a3ff155720fbe4076569?narHash=sha256-tYBdgS56eXYaWVW3fsnPQ/nFlgWi/Z2Ymhyu21zVM98%3D' (2025-06-08) → 'github:hercules-ci/flake-parts/77826244401ea9de6e3bac47c2db46005e1f30b5?narHash=sha256-Tyw1RjYEsp5scoigs1384gIg6e0GoBVjms4aXFfRssQ%3D' (2025-07-01) • Updated input 'neovim-nightly-overlay/git-hooks': 'github:cachix/git-hooks.nix/fae816c55a75675f30d18c9cbdecc13b970d95d4?narHash=sha256-uLtw0iF9mQ94L831NOlQLPX9wm0qzd5yim3rcwACEoM%3D' (2025-06-23) → 'github:cachix/git-hooks.nix/16ec914f6fb6f599ce988427d9d94efddf25fe6d?narHash=sha256-wibppH3g/E2lxU43ZQHC5yA/7kIKLGxVEnsnVK1BtRg%3D' (2025-06-24) • Updated input 'neovim-nightly-overlay/neovim-src': 'github:neovim/neovim/7f3249fa0de06cdcf4be1ed5f260d83cd9021dee?narHash=sha256-li7cZUSJUhvjXC09GYS6u5PxBoVk2PGvqcdmINUGnhU%3D' (2025-06-23) → 'github:neovim/neovim/8fe4e120a2de558fddbb91ba5438d78f3dbd926a?narHash=sha256-z2PkkcUBuO5IWQrra034YBl8ioerkHXHai9GCeoaRuM%3D' (2025-07-05) • Updated input 'neovim-nightly-overlay/nixpkgs': 'github:NixOS/nixpkgs/3078b9a9e75f1790e6d6ef9955fdc6a2d1740cc6?narHash=sha256-xT8cPLTxlktxI9vSdoBlAVK7dXgd8IK59j7ZwzkkhnI%3D' (2025-06-22) → 'github:NixOS/nixpkgs/c860cf0b3a0829f0f6cf344ca8de83a2bbfab428?narHash=sha256-4E7wWftF1ExK5ZEDzj41%2B9mVgxtuRV3wWCId7QAYMAU%3D' (2025-07-04) • Updated input 'neovim-nightly-overlay/treefmt-nix': 'github:numtide/treefmt-nix/a05be418a1af1198ca0f63facb13c985db4cb3c5?narHash=sha256-eEy8cuS0mZ2j/r/FE0/LYBSBcIs/MKOIVakwHVuqTfk%3D' (2025-06-06) → 'github:numtide/treefmt-nix/ac8e6f32e11e9c7f153823abc3ab007f2a65d3e1?narHash=sha256-0IEdQB1nS%2BuViQw4k3VGUXntjkDp7aAlqcxdewb/hAc%3D' (2025-06-26) • Updated input 'nixpkgs': 'github:NixOS/nixpkgs/8ad467f6d5f3533c961e456a43948373f41a98da?narHash=sha256-b5ISt1FZCnYf%2BqhWFu3wc39zl0jlZNEXudzWHD0dsV0%3D' (2025-06-24) → 'github:NixOS/nixpkgs/27d6791b2e2a167105e8545fc92ee0edabe4a9e5' (2025-07-06) --- flake.lock | 42 +++++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/flake.lock b/flake.lock index efa8973..fc621e7 100644 --- a/flake.lock +++ b/flake.lock @@ -74,11 +74,11 @@ ] }, "locked": { - "lastModified": 1749398372, - "narHash": "sha256-tYBdgS56eXYaWVW3fsnPQ/nFlgWi/Z2Ymhyu21zVM98=", + "lastModified": 1751413152, + "narHash": "sha256-Tyw1RjYEsp5scoigs1384gIg6e0GoBVjms4aXFfRssQ=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "9305fe4e5c2a6fcf5ba6a3ff155720fbe4076569", + "rev": "77826244401ea9de6e3bac47c2db46005e1f30b5", "type": "github" }, "original": { @@ -114,7 +114,6 @@ }, "locked": { "lastModified": 1731533236, - "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", "owner": "numtide", "repo": "flake-utils", "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", @@ -137,7 +136,6 @@ }, "locked": { "lastModified": 1724097937, - "narHash": "sha256-Q4tgm8ZHAQUdvsNft86MqIbHQAm7OF7RT/wwYWXqSdY=", "owner": "mrcjkb", "repo": "nix-gen-luarc-json", "rev": "b36b69c4ded9f31b079523bc452e23458734cf00", @@ -183,11 +181,11 @@ ] }, "locked": { - "lastModified": 1750684550, - "narHash": "sha256-uLtw0iF9mQ94L831NOlQLPX9wm0qzd5yim3rcwACEoM=", + "lastModified": 1750779888, + "narHash": "sha256-wibppH3g/E2lxU43ZQHC5yA/7kIKLGxVEnsnVK1BtRg=", "owner": "cachix", "repo": "git-hooks.nix", - "rev": "fae816c55a75675f30d18c9cbdecc13b970d95d4", + "rev": "16ec914f6fb6f599ce988427d9d94efddf25fe6d", "type": "github" }, "original": { @@ -289,11 +287,10 @@ "treefmt-nix": "treefmt-nix" }, "locked": { - "lastModified": 1750742070, - "narHash": "sha256-IxbIMd6Z2+FPb9QCo95lJ4qcqaAYitSxB5Z+h3rM2Qo=", + "lastModified": 1751797218, "owner": "nix-community", "repo": "neovim-nightly-overlay", - "rev": "d9f4e3e5952e267e8399b15759bbec90019f4515", + "rev": "a4252dd30a64aef3fa59ad1f9ded862381df117a", "type": "github" }, "original": { @@ -305,11 +302,11 @@ "neovim-src": { "flake": false, "locked": { - "lastModified": 1750722680, - "narHash": "sha256-li7cZUSJUhvjXC09GYS6u5PxBoVk2PGvqcdmINUGnhU=", + "lastModified": 1751757526, + "narHash": "sha256-z2PkkcUBuO5IWQrra034YBl8ioerkHXHai9GCeoaRuM=", "owner": "neovim", "repo": "neovim", - "rev": "7f3249fa0de06cdcf4be1ed5f260d83cd9021dee", + "rev": "8fe4e120a2de558fddbb91ba5438d78f3dbd926a", "type": "github" }, "original": { @@ -320,11 +317,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1750605355, - "narHash": "sha256-xT8cPLTxlktxI9vSdoBlAVK7dXgd8IK59j7ZwzkkhnI=", + "lastModified": 1751625545, + "narHash": "sha256-4E7wWftF1ExK5ZEDzj41+9mVgxtuRV3wWCId7QAYMAU=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "3078b9a9e75f1790e6d6ef9955fdc6a2d1740cc6", + "rev": "c860cf0b3a0829f0f6cf344ca8de83a2bbfab428", "type": "github" }, "original": { @@ -364,11 +361,10 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1750749555, - "narHash": "sha256-b5ISt1FZCnYf+qhWFu3wc39zl0jlZNEXudzWHD0dsV0=", + "lastModified": 1751812998, "owner": "NixOS", "repo": "nixpkgs", - "rev": "8ad467f6d5f3533c961e456a43948373f41a98da", + "rev": "27d6791b2e2a167105e8545fc92ee0edabe4a9e5", "type": "github" }, "original": { @@ -409,11 +405,11 @@ ] }, "locked": { - "lastModified": 1749194973, - "narHash": "sha256-eEy8cuS0mZ2j/r/FE0/LYBSBcIs/MKOIVakwHVuqTfk=", + "lastModified": 1750931469, + "narHash": "sha256-0IEdQB1nS+uViQw4k3VGUXntjkDp7aAlqcxdewb/hAc=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "a05be418a1af1198ca0f63facb13c985db4cb3c5", + "rev": "ac8e6f32e11e9c7f153823abc3ab007f2a65d3e1", "type": "github" }, "original": { From d998429cb8364d50f62fadb0c686a8c0bc651b96 Mon Sep 17 00:00:00 2001 From: iofq Date: Sun, 6 Jul 2025 21:11:29 -0500 Subject: [PATCH 134/160] snacks rice + new colorscheme --- nix/mkNeovim.nix | 340 ++++++------- nix/neovim-overlay.nix | 20 +- nvim/colors/iofq.lua | 704 +++++++++++++++++++++++++++ nvim/lsp/gopls.lua | 1 + nvim/lsp/lua_ls.lua | 8 +- nvim/lua/config/init.lua | 7 +- nvim/lua/plugins/lib/minidiff_jj.lua | 52 +- nvim/lua/plugins/lib/session_jj.lua | 60 ++- nvim/lua/plugins/lib/snacks.lua | 26 + nvim/lua/plugins/lib/snacks_jj.lua | 1 + nvim/lua/plugins/lsp.lua | 54 +- nvim/lua/plugins/mini.lua | 34 +- nvim/lua/plugins/misc.lua | 34 +- nvim/lua/plugins/snacks.lua | 146 ++---- nvim/lua/plugins/treesitter.lua | 8 +- 15 files changed, 1068 insertions(+), 427 deletions(-) create mode 100644 nvim/colors/iofq.lua create mode 100644 nvim/lua/plugins/lib/snacks.lua diff --git a/nix/mkNeovim.nix b/nix/mkNeovim.nix index a7cc6f0..956f2c3 100644 --- a/nix/mkNeovim.nix +++ b/nix/mkNeovim.nix @@ -7,195 +7,195 @@ 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 ? null, - # 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, -}: -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 = { }; - }; + { + # NVIM_APPNAME - Defaults to 'nvim' if not set. + # If set to something else, this will also rename the binary. + appName ? null, + # 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, + }: 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 ]); + 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; + # 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. - neovimConfig = pkgs-wrapNeovim.neovimUtils.makeNeovimConfig { - inherit - extraPython3Packages - withPython3 - withRuby - withNodeJs - viAlias - vimAlias - ; - plugins = normalizedPlugins; - }; + # 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 = normalizedPlugins; + }; - packDir = pkgs.neovimUtils.packDir { - myNeovimPackages = pkgs.neovimUtils.normalizedPluginsToVimPackage normalizedPlugins; - }; + packDir = pkgs.neovimUtils.packDir { + myNeovimPackages = pkgs.neovimUtils.normalizedPluginsToVimPackage normalizedPlugins; + }; - # This uses the ignoreConfigRegexes list to filter - # the nvim directory - nvimRtpSrc = - let + # 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 + 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; + 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/ + ''; + + installPhase = '' + cp -r . $out/ + ''; }; - # 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/lua - mkdir -p $out/ftplugin - ''; - - installPhase = '' - cp -r lua $out/ - rm -r lua - cp -r ftplugin $out/ - rm -r ftplugin - ''; - }; - - # 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 = - '' - LAZY_OPTS = { - performance = { - reset_packpath = true, - rtp = { - disabled_plugins = { - "netrwPlugin", - "tutor", + # 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 = + '' + 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); + 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); - # 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"'') - ); + # 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; + luaPackages = neovim-unwrapped.lua.pkgs; + resolvedExtraLuaPackages = extraLuaPackages luaPackages; - # Native Lua libraries - extraMakeWrapperLuaCArgs = - optionalString (resolvedExtraLuaPackages != [ ]) + # Native Lua libraries + extraMakeWrapperLuaCArgs = + optionalString (resolvedExtraLuaPackages != []) ''--suffix LUA_CPATH ";" "${ - concatMapStringsSep ";" luaPackages.getLuaCPath resolvedExtraLuaPackages - }"''; + concatMapStringsSep ";" luaPackages.getLuaCPath resolvedExtraLuaPackages + }"''; - # Lua libraries - extraMakeWrapperLuaArgs = - optionalString (resolvedExtraLuaPackages != [ ]) + # Lua libraries + extraMakeWrapperLuaArgs = + optionalString (resolvedExtraLuaPackages != []) ''--suffix LUA_PATH ";" "${ - concatMapStringsSep ";" luaPackages.getLuaPath resolvedExtraLuaPackages - }"''; + 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; - } - ); + # 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"; -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} - ''; -}) + isCustomAppName = appName != null && appName != "nvim"; + 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} + ''; + }) diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index d3e6df7..f95bed6 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -1,15 +1,18 @@ # This overlay, when applied to nixpkgs, adds the final neovim derivation to nixpkgs. -{inputs}: final: prev: -with final.pkgs.lib; let +{ inputs }: +final: prev: +with final.pkgs.lib; +let pkgs = final; pkgs-wrapNeovim = prev; - mkNvimPlugin = src: pname: + mkNvimPlugin = + src: pname: pkgs.vimUtils.buildVimPlugin { inherit pname src; version = src.lastModifiedDate; }; - mkNeovim = pkgs.callPackage ./mkNeovim.nix {inherit pkgs-wrapNeovim;}; + mkNeovim = pkgs.callPackage ./mkNeovim.nix { inherit pkgs-wrapNeovim; }; all-plugins = with pkgs.vimPlugins; [ blink-cmp @@ -20,11 +23,11 @@ with final.pkgs.lib; let friendly-snippets lazy-nvim mini-nvim - nightfox-nvim nvim-lint nvim-lspconfig nvim-treesitter-context nvim-treesitter-textobjects + nvim-treesitter-textsubjects nvim-treesitter.withAllGrammars quicker-nvim refactoring-nvim @@ -35,6 +38,7 @@ with final.pkgs.lib; let basePackages = with pkgs; [ ripgrep + fd ]; # Extra packages that should be included on nixos but don't need to be bundled extraPackages = with pkgs; [ @@ -54,14 +58,14 @@ with final.pkgs.lib; let #other jujutsu - fd ]; -in { +in +{ nvim-pkg = mkNeovim { plugins = all-plugins; appName = "nvim"; extraPackages = basePackages ++ extraPackages; - withNodeJs = true; + withNodeJs = false; }; nvim-min-pkg = mkNeovim { diff --git a/nvim/colors/iofq.lua b/nvim/colors/iofq.lua new file mode 100644 index 0000000..5d32f8f --- /dev/null +++ b/nvim/colors/iofq.lua @@ -0,0 +1,704 @@ +-- Made with 'mini.colors' module of https://github.com/echasnovski/mini.nvim + +if vim.g.colors_name ~= nil then + vim.cmd('highlight clear') +end +vim.g.colors_name = 'iofq' + +-- Highlight groups +local hi = vim.api.nvim_set_hl + +hi(0, '@attribute', { link = 'Constant' }) +hi(0, '@character.special', { link = 'SpecialChar' }) +hi(0, '@comment.error', { bg = '#e85c51', fg = '#152528' }) +hi(0, '@comment.note', { bg = '#5a93aa', fg = '#152528' }) +hi(0, '@comment.todo', { bg = '#7aa4a1', fg = '#152528' }) +hi(0, '@comment.warning', { bg = '#fda47f', fg = '#152528' }) +hi(0, '@conditional', { link = 'Conditional' }) +hi(0, '@constant.builtin', { fg = '#ff9664' }) +hi(0, '@constant.macro', { link = 'Macro' }) +hi(0, '@constructor', { fg = '#a1cdd8' }) +hi(0, '@constructor.lua', { fg = '#cbd9d8' }) +hi(0, '@diff.delta', { link = 'diffChanged' }) +hi(0, '@diff.minus', { link = 'diffRemoved' }) +hi(0, '@diff.plus', { link = 'diffAdded' }) +hi(0, '@exception', { link = 'Exception' }) +hi(0, '@field', { fg = '#5a93aa' }) +hi(0, '@field.rust', { fg = '#cbd9d8' }) +hi(0, '@float', { link = 'Float' }) +hi(0, '@function.builtin', { fg = '#e85c51' }) +hi(0, '@function.macro', { fg = '#e85c51' }) +hi(0, '@include', { link = 'Include' }) +hi(0, '@keyword.conditional', { link = 'Conditional' }) +hi(0, '@keyword.conditional.ternary', { link = 'Conditional' }) +hi(0, '@keyword.exception', { link = 'Exception' }) +hi(0, '@keyword.function', { fg = '#ad5c7c' }) +hi(0, '@keyword.import', { link = 'Include' }) +hi(0, '@keyword.operator', { fg = '#cbd9d8' }) +hi(0, '@keyword.repeat', { link = 'Repeat' }) +hi(0, '@keyword.return', { fg = '#e85c51' }) +hi(0, '@keyword.storage', { link = 'StorageClass' }) +hi(0, '@label.json', { fg = '#73a3b7' }) +hi(0, '@lsp.type.boolean', { link = '@boolean' }) +hi(0, '@lsp.type.builtinType', { link = '@type.builtin' }) +hi(0, '@lsp.type.comment', { link = '@comment' }) +hi(0, '@lsp.type.enum', { link = '@type' }) +hi(0, '@lsp.type.enumMember', { link = '@constant' }) +hi(0, '@lsp.type.escapeSequence', { link = '@string.escape' }) +hi(0, '@lsp.type.formatSpecifier', { link = '@punctuation.special' }) +hi(0, '@lsp.type.interface', { fg = '#eb746b' }) +hi(0, '@lsp.type.keyword', { link = '@keyword' }) +hi(0, '@lsp.type.namespace', { link = '@module' }) +hi(0, '@lsp.type.number', { link = '@number' }) +hi(0, '@lsp.type.operator', { link = '@operator' }) +hi(0, '@lsp.type.parameter', { link = '@parameter' }) +hi(0, '@lsp.type.property', { link = '@property' }) +hi(0, '@lsp.type.selfKeyword', { link = '@variable.builtin' }) +hi(0, '@lsp.type.typeAlias', { link = '@type.definition' }) +hi(0, '@lsp.type.unresolvedReference', { link = '@error' }) +hi(0, '@lsp.type.variable', {}) +hi(0, '@lsp.typemod.class.defaultLibrary', { link = '@type.builtin' }) +hi(0, '@lsp.typemod.enum.defaultLibrary', { link = '@type.builtin' }) +hi(0, '@lsp.typemod.enumMember.defaultLibrary', { link = '@constant.builtin' }) +hi(0, '@lsp.typemod.function.defaultLibrary', { link = '@function.builtin' }) +hi(0, '@lsp.typemod.keyword.async', { link = '@keyword.coroutine' }) +hi(0, '@lsp.typemod.macro.defaultLibrary', { link = '@function.builtin' }) +hi(0, '@lsp.typemod.method.defaultLibrary', { link = '@function.builtin' }) +hi(0, '@lsp.typemod.operator.injected', { link = '@operator' }) +hi(0, '@lsp.typemod.string.injected', { link = '@string' }) +hi(0, '@lsp.typemod.type.defaultLibrary', { link = '@type.builtin' }) +hi(0, '@lsp.typemod.variable.defaultLibrary', { link = '@variable.builtin' }) +hi(0, '@lsp.typemod.variable.injected', { link = '@variable' }) +hi(0, '@markup', { fg = '#e6eaea' }) +hi(0, '@markup.heading', { link = 'Title' }) +hi(0, '@markup.heading.1.delimiter.vimdoc', { nocombine = true, sp = '#e6eaea', underdouble = true }) +hi(0, '@markup.heading.2.delimiter.vimdoc', { nocombine = true, sp = '#e6eaea', underline = true }) +hi(0, '@markup.italic', { link = 'Italic' }) +hi(0, '@markup.link', { bold = true, fg = '#ad5c7c' }) +hi(0, '@markup.link.label', { link = 'Special' }) +hi(0, '@markup.link.url', { fg = '#ff9664', italic = true, underline = true }) +hi(0, '@markup.list', { fg = '#afd4de' }) +hi(0, '@markup.list.checked', { fg = '#7aa4a1' }) +hi(0, '@markup.list.unchecked', { fg = '#fda47f' }) +hi(0, '@markup.math', { fg = '#73a3b7' }) +hi(0, '@markup.quote', { fg = '#cbd9d8' }) +hi(0, '@markup.raw', { fg = '#a1cdd8', italic = true }) +hi(0, '@markup.raw.block', { fg = '#cb7985' }) +hi(0, '@markup.strikethrough', { fg = '#e6eaea', strikethrough = true }) +hi(0, '@markup.strong', { bold = true, fg = '#c54e45' }) +hi(0, '@markup.underline', { link = 'Underline' }) +hi(0, '@module', { fg = '#afd4de' }) +hi(0, '@namespace', { fg = '#afd4de' }) +hi(0, '@number.float', { link = 'Float' }) +hi(0, '@parameter', { fg = '#afd4de' }) +hi(0, '@property', { fg = '#5a93aa' }) +hi(0, '@punctuation.bracket', { fg = '#cbd9d8' }) +hi(0, '@punctuation.delimiter', { fg = '#cbd9d8' }) +hi(0, '@punctuation.special', { fg = '#afd4de' }) +hi(0, '@repeat', { link = 'Repeat' }) +hi(0, '@storageclass', { link = 'StorageClass' }) +hi(0, '@string.escape', { bold = true, fg = '#fdb292' }) +hi(0, '@string.regex', { fg = '#fdb292' }) +hi(0, '@string.regexp', { fg = '#fdb292' }) +hi(0, '@string.special', { link = 'Special' }) +hi(0, '@string.special.url', { fg = '#ff9664', italic = true, underline = true }) +hi(0, '@tag', { fg = '#ad5c7c' }) +hi(0, '@tag.attribute', { fg = '#73a3b7', italic = true }) +hi(0, '@tag.delimiter', { fg = '#afd4de' }) +hi(0, '@text', { fg = '#e6eaea' }) +hi(0, '@text.danger', { bg = '#e85c51', fg = '#152528' }) +hi(0, '@text.diff.add', { link = 'diffAdded' }) +hi(0, '@text.diff.delete', { link = 'diffRemoved' }) +hi(0, '@text.emphasis', { link = 'Italic' }) +hi(0, '@text.literal', { fg = '#a1cdd8', italic = true }) +hi(0, '@text.math', { fg = '#73a3b7' }) +hi(0, '@text.note', { bg = '#5a93aa', fg = '#152528' }) +hi(0, '@text.reference', { bold = true, fg = '#ad5c7c' }) +hi(0, '@text.strike', { fg = '#e6eaea', strikethrough = true }) +hi(0, '@text.strong', { bold = true, fg = '#c54e45' }) +hi(0, '@text.title', { link = 'Title' }) +hi(0, '@text.todo', { bg = '#7aa4a1', fg = '#152528' }) +hi(0, '@text.todo.checked', { fg = '#7aa4a1' }) +hi(0, '@text.todo.unchecked', { fg = '#fda47f' }) +hi(0, '@text.underline', { link = 'Underline' }) +hi(0, '@text.warning', { bg = '#fda47f', fg = '#152528' }) +hi(0, '@type.builtin', { fg = '#afd4de' }) +hi(0, '@variable', { fg = '#ebebeb' }) +hi(0, '@variable.builtin', { fg = '#e85c51' }) +hi(0, '@variable.member', { fg = '#5a93aa' }) +hi(0, '@variable.parameter', { fg = '#afd4de' }) +hi(0, 'AerialGuide', { fg = '#2d4f56' }) +hi(0, 'AerialLine', { link = 'Search' }) +hi(0, 'AlphaButtons', { fg = '#a1cdd8' }) +hi(0, 'AlphaFooter', { fg = '#5a93aa' }) +hi(0, 'AlphaHeader', { fg = '#73a3b7' }) +hi(0, 'AlphaHeaderLabel', { fg = '#ff8349' }) +hi(0, 'AlphaShortcut', { fg = '#ff8349' }) +hi(0, 'BlinkCmpCursorLineDocumentationHack', { bg = '#254147' }) +hi(0, 'BlinkCmpCursorLineMenuHack', { bg = '#425e5e' }) +hi(0, 'BlinkCmpDoc', { bg = '#0f1c1e', fg = '#e6eaea' }) +hi(0, 'BlinkCmpDocBorder', { bg = '#0f1c1e', fg = '#293e40' }) +hi(0, 'BlinkCmpGhostText', { link = 'String' }) +hi(0, 'BlinkCmpKindClass', { link = 'Type' }) +hi(0, 'BlinkCmpKindConstant', { link = '@constant' }) +hi(0, 'BlinkCmpKindConstructor', { link = 'Function' }) +hi(0, 'BlinkCmpKindDefault', { fg = '#cbd9d8' }) +hi(0, 'BlinkCmpKindEnum', { link = 'Constant' }) +hi(0, 'BlinkCmpKindEnumMember', { link = '@field' }) +hi(0, 'BlinkCmpKindEvent', { link = 'Constant' }) +hi(0, 'BlinkCmpKindField', { link = '@field' }) +hi(0, 'BlinkCmpKindFunction', { link = 'Function' }) +hi(0, 'BlinkCmpKindInterface', { link = 'Constant' }) +hi(0, 'BlinkCmpKindKeyword', { link = 'Identifier' }) +hi(0, 'BlinkCmpKindMethod', { link = 'Function' }) +hi(0, 'BlinkCmpKindModule', { link = '@namespace' }) +hi(0, 'BlinkCmpKindOperator', { link = 'Operator' }) +hi(0, 'BlinkCmpKindProperty', { link = '@property' }) +hi(0, 'BlinkCmpKindReference', { link = 'Keyword' }) +hi(0, 'BlinkCmpKindSnippet', { fg = '#cbd9d8' }) +hi(0, 'BlinkCmpKindStruct', { link = 'Type' }) +hi(0, 'BlinkCmpKindTypeParameter', { link = '@field' }) +hi(0, 'BlinkCmpKindUnit', { link = 'Constant' }) +hi(0, 'BlinkCmpKindValue', { link = 'Keyword' }) +hi(0, 'BlinkCmpKindVariable', { link = '@variable' }) +hi(0, 'BlinkCmpLabel', { fg = '#e6eaea' }) +hi(0, 'BlinkCmpLabelDeprecated', { fg = '#587b7b', strikethrough = true }) +hi(0, 'BlinkCmpLabelDetail', { link = 'Comment' }) +hi(0, 'BlinkCmpLabelMatch', { fg = '#73a3b7' }) +hi(0, 'Bold', { bold = true }) +hi(0, 'Boolean', { link = 'Number' }) +hi(0, 'BufferCurrent', { bg = '#587b7b', fg = '#e6eaea' }) +hi(0, 'BufferCurrentIndex', { bg = '#587b7b', fg = '#5a93aa' }) +hi(0, 'BufferCurrentMod', { bg = '#587b7b', fg = '#fda47f' }) +hi(0, 'BufferCurrentSign', { bg = '#587b7b', fg = '#5a93aa' }) +hi(0, 'BufferCurrentTarget', { bg = '#587b7b', fg = '#e85c51' }) +hi(0, 'BufferInactive', { bg = '#0f1c1e', fg = '#6d7f8b' }) +hi(0, 'BufferInactiveIndex', { bg = '#0f1c1e', fg = '#6d7f8b' }) +hi(0, 'BufferInactiveMod', { bg = '#0f1c1e', fg = '#383835' }) +hi(0, 'BufferInactiveSign', { bg = '#0f1c1e', fg = '#254147' }) +hi(0, 'BufferInactiveTarget', { bg = '#0f1c1e', fg = '#e85c51' }) +hi(0, 'BufferTabpage', { bg = '#0f1c1e', fg = '#254147' }) +hi(0, 'BufferTabpages', { bg = '#0f1c1e' }) +hi(0, 'BufferVisible', { bg = '#0f1c1e', fg = '#e6eaea' }) +hi(0, 'BufferVisibleIndex', { bg = '#0f1c1e', fg = '#5a93aa' }) +hi(0, 'BufferVisibleMod', { bg = '#0f1c1e', fg = '#fda47f' }) +hi(0, 'BufferVisibleSign', { bg = '#0f1c1e', fg = '#5a93aa' }) +hi(0, 'BufferVisibleTarget', { bg = '#0f1c1e', fg = '#e85c51' }) +hi(0, 'Character', { link = 'String' }) +hi(0, 'CmpDocumentation', { bg = '#0f1c1e', fg = '#e6eaea' }) +hi(0, 'CmpDocumentationBorder', { bg = '#0f1c1e', fg = '#293e40' }) +hi(0, 'CmpItemAbbr', { fg = '#e6eaea' }) +hi(0, 'CmpItemAbbrDeprecated', { fg = '#587b7b', strikethrough = true }) +hi(0, 'CmpItemAbbrMatch', { fg = '#73a3b7' }) +hi(0, 'CmpItemAbbrMatchFuzzy', { fg = '#73a3b7' }) +hi(0, 'CmpItemKindClass', { link = 'Type' }) +hi(0, 'CmpItemKindConstant', { link = '@constant' }) +hi(0, 'CmpItemKindConstructor', { link = 'Function' }) +hi(0, 'CmpItemKindDefault', { fg = '#cbd9d8' }) +hi(0, 'CmpItemKindEnum', { link = 'Constant' }) +hi(0, 'CmpItemKindEnumMember', { link = '@field' }) +hi(0, 'CmpItemKindEvent', { link = 'Constant' }) +hi(0, 'CmpItemKindField', { link = '@field' }) +hi(0, 'CmpItemKindFunction', { link = 'Function' }) +hi(0, 'CmpItemKindInterface', { link = 'Constant' }) +hi(0, 'CmpItemKindKeyword', { link = 'Identifier' }) +hi(0, 'CmpItemKindMethod', { link = 'Function' }) +hi(0, 'CmpItemKindModule', { link = '@namespace' }) +hi(0, 'CmpItemKindOperator', { link = 'Operator' }) +hi(0, 'CmpItemKindProperty', { link = '@property' }) +hi(0, 'CmpItemKindReference', { link = 'Keyword' }) +hi(0, 'CmpItemKindSnippet', { fg = '#cbd9d8' }) +hi(0, 'CmpItemKindStruct', { link = 'Type' }) +hi(0, 'CmpItemKindTypeParameter', { link = '@field' }) +hi(0, 'CmpItemKindUnit', { link = 'Constant' }) +hi(0, 'CmpItemKindValue', { link = 'Keyword' }) +hi(0, 'CmpItemKindVariable', { link = '@variable' }) +hi(0, 'CmpItemMenu', { link = 'Comment' }) +hi(0, 'CocInlayHint', { bg = '#1d3337', fg = '#6d7f8b' }) +hi(0, 'ColorColumn', { bg = '#1d3337' }) +hi(0, 'Comment', { fg = '#6d7f8b' }) +hi(0, 'Conceal', { fg = '#2d4f56' }) +hi(0, 'Conditional', { fg = '#b97490' }) +hi(0, 'Constant', { fg = '#ff9664' }) +hi(0, 'CurSearch', { link = 'IncSearch' }) +hi(0, 'Cursor', { bg = '#e6eaea', fg = '#152528' }) +hi(0, 'CursorColumn', { link = 'CursorLine' }) +hi(0, 'CursorLine', { bg = '#254147' }) +hi(0, 'CursorLineNr', { bold = true, fg = '#fda47f' }) +hi(0, 'DapUIBreakpointsCurrentLine', { bold = true, fg = '#7aa4a1' }) +hi(0, 'DapUIBreakpointsDisabledLine', { fg = '#6d7f8b' }) +hi(0, 'DapUIBreakpointsInfo', { fg = '#5a93aa' }) +hi(0, 'DapUIBreakpointsLine', { link = 'DapUILineNumber' }) +hi(0, 'DapUIBreakpointsPath', { fg = '#afd4de' }) +hi(0, 'DapUIDecoration', { fg = '#587b7b' }) +hi(0, 'DapUIFloatBorder', { link = 'FloatBorder' }) +hi(0, 'DapUIFrameName', { link = 'Normal' }) +hi(0, 'DapUILineNumber', { link = 'Number' }) +hi(0, 'DapUIModifiedValue', { bold = true, fg = '#ebebeb' }) +hi(0, 'DapUIScope', { fg = '#afd4de' }) +hi(0, 'DapUISource', { link = 'Keyword' }) +hi(0, 'DapUIStoppedThread', { fg = '#afd4de' }) +hi(0, 'DapUIThread', { link = 'String' }) +hi(0, 'DapUIType', { link = 'Type' }) +hi(0, 'DapUIValue', { fg = '#ebebeb' }) +hi(0, 'DapUIVariable', { fg = '#ebebeb' }) +hi(0, 'DapUIWatchesEmpty', { fg = '#e85c51' }) +hi(0, 'DapUIWatchesError', { fg = '#e85c51' }) +hi(0, 'DapUIWatchesValue', { fg = '#fda47f' }) +hi(0, 'DashboardCenter', { link = 'String' }) +hi(0, 'DashboardFooter', { fg = '#ff9664', italic = true }) +hi(0, 'DashboardHeader', { link = 'Title' }) +hi(0, 'DashboardShortCut', { link = 'Identifier' }) +hi(0, 'Delimiter', { link = 'Special' }) +hi(0, 'DiagnosticError', { fg = '#e85c51' }) +hi(0, 'DiagnosticHint', { fg = '#7aa4a1' }) +hi(0, 'DiagnosticInfo', { fg = '#5a93aa' }) +hi(0, 'DiagnosticOk', { fg = '#7aa4a1' }) +hi(0, 'DiagnosticUnderlineError', { sp = '#e85c51', undercurl = true }) +hi(0, 'DiagnosticUnderlineHint', { sp = '#7aa4a1', undercurl = true }) +hi(0, 'DiagnosticUnderlineInfo', { sp = '#5a93aa', undercurl = true }) +hi(0, 'DiagnosticUnderlineOk', { sp = '#7aa4a1', undercurl = true }) +hi(0, 'DiagnosticUnderlineWarn', { sp = '#fda47f', undercurl = true }) +hi(0, 'DiagnosticVirtualTextError', { bg = '#352d2e', fg = '#e85c51' }) +hi(0, 'DiagnosticVirtualTextHint', { bg = '#24383a', fg = '#7aa4a1' }) +hi(0, 'DiagnosticVirtualTextInfo', { bg = '#1f353c', fg = '#5a93aa' }) +hi(0, 'DiagnosticVirtualTextOk', { bg = '#24383a', fg = '#7aa4a1' }) +hi(0, 'DiagnosticVirtualTextWarn', { bg = '#383835', fg = '#fda47f' }) +hi(0, 'DiagnosticWarn', { fg = '#fda47f' }) +hi(0, 'DiffAdd', { bg = '#293e40' }) +hi(0, 'DiffChange', { bg = '#31474b' }) +hi(0, 'DiffDelete', { bg = '#4a3332' }) +hi(0, 'DiffText', { bg = '#466066' }) +hi(0, 'DiffviewDiffAddAsDelete', { bg = '#4a3332' }) +hi(0, 'DiffviewDim1', { fg = '#6d7f8b' }) +hi(0, 'DiffviewFilePanelCounter', { bold = true, fg = '#a1cdd8' }) +hi(0, 'DiffviewFilePanelFileName', { fg = '#e6eaea' }) +hi(0, 'DiffviewFilePanelTitle', { bold = true, fg = '#b97490' }) +hi(0, 'DiffviewPrimary', { fg = '#73a3b7' }) +hi(0, 'DiffviewSecondary', { fg = '#7aa4a1' }) +hi(0, 'Directory', { fg = '#73a3b7' }) +hi(0, 'EndOfBuffer', { fg = '#152528' }) +hi(0, 'Error', { fg = '#e85c51' }) +hi(0, 'ErrorMsg', { fg = '#e85c51' }) +hi(0, 'Exception', { link = 'Keyword' }) +hi(0, 'EyelinerDimmed', { fg = '#6d7f8b' }) +hi(0, 'EyelinerPrimary', { underline = true }) +hi(0, 'EyelinerSecondary', { bold = true, underline = true }) +hi(0, 'FernBranchText', { fg = '#5a93aa' }) +hi(0, 'FidgetTask', { link = 'LineNr' }) +hi(0, 'FidgetTitle', { link = 'Title' }) +hi(0, 'FloatBorder', { fg = '#587b7b' }) +hi(0, 'FocusedSymbol', { link = 'Search' }) +hi(0, 'FoldColumn', { fg = '#587b7b' }) +hi(0, 'Folded', { bg = '#1d3337', fg = '#587b7b' }) +hi(0, 'Function', { fg = '#73a3b7' }) +hi(0, 'GitGutterAdd', { fg = '#7aa4a1' }) +hi(0, 'GitGutterChange', { fg = '#fda47f' }) +hi(0, 'GitGutterDelete', { fg = '#e85c51' }) +hi(0, 'GitSignsAdd', { fg = '#7aa4a1' }) +hi(0, 'GitSignsChange', { fg = '#fda47f' }) +hi(0, 'GitSignsDelete', { fg = '#e85c51' }) +hi(0, 'GlyphPalette0', { fg = '#2f3239' }) +hi(0, 'GlyphPalette1', { fg = '#e85c51' }) +hi(0, 'GlyphPalette10', { fg = '#8eb2af' }) +hi(0, 'GlyphPalette11', { fg = '#fdb292' }) +hi(0, 'GlyphPalette12', { fg = '#73a3b7' }) +hi(0, 'GlyphPalette13', { fg = '#b97490' }) +hi(0, 'GlyphPalette14', { fg = '#afd4de' }) +hi(0, 'GlyphPalette15', { fg = '#eeeeee' }) +hi(0, 'GlyphPalette2', { fg = '#7aa4a1' }) +hi(0, 'GlyphPalette3', { fg = '#fda47f' }) +hi(0, 'GlyphPalette4', { fg = '#5a93aa' }) +hi(0, 'GlyphPalette5', { fg = '#ad5c7c' }) +hi(0, 'GlyphPalette6', { fg = '#a1cdd8' }) +hi(0, 'GlyphPalette7', { fg = '#eeeeee' }) +hi(0, 'GlyphPalette8', { fg = '#4e5157' }) +hi(0, 'GlyphPalette9', { fg = '#eb746b' }) +hi(0, 'HopNextKey', { bold = true, fg = '#a1cdd8' }) +hi(0, 'HopNextKey1', { bold = true, fg = '#5a93aa' }) +hi(0, 'HopNextKey2', { fg = '#4d7d90' }) +hi(0, 'HopUnmatched', { fg = '#6d7f8b' }) +hi(0, 'Identifier', { fg = '#a1cdd8' }) +hi(0, 'IncSearch', { bg = '#7aa4a1', fg = '#152528' }) +hi(0, 'IndentBlanklineChar', { fg = '#254147' }) +hi(0, 'IndentBlanklineContextChar', { fg = '#ebebeb' }) +hi(0, 'IndentBlanklineContextStart', { sp = '#ebebeb', underline = true }) +hi(0, 'IndentBlanklineIndent1', { fg = '#cb7985' }) +hi(0, 'IndentBlanklineIndent2', { fg = '#5a93aa' }) +hi(0, 'IndentBlanklineIndent3', { fg = '#ff8349' }) +hi(0, 'IndentBlanklineIndent4', { fg = '#a1cdd8' }) +hi(0, 'IndentBlanklineIndent5', { fg = '#e85c51' }) +hi(0, 'IndentBlanklineIndent6', { fg = '#fda47f' }) +hi(0, 'Italic', { italic = true }) +hi(0, 'Keyword', { fg = '#ad5c7c' }) +hi(0, 'Label', { link = 'Conditional' }) +hi(0, 'LazyButtonActive', { link = 'TabLineSel' }) +hi(0, 'LazyDimmed', { link = 'LineNr' }) +hi(0, 'LazyProp', { link = 'LineNr' }) +hi(0, 'LeapBackdrop', { fg = '#6d7f8b' }) +hi(0, 'LeapLabelPrimary', { bg = '#d38d97', fg = '#152528' }) +hi(0, 'LeapLabelSecondary', { bg = '#afd4de', fg = '#152528' }) +hi(0, 'LeapMatch', { bg = '#d38d97', fg = '#152528' }) +hi(0, 'LightspeedGreyWash', { fg = '#6d7f8b' }) +hi(0, 'LineNr', { fg = '#587b7b' }) +hi(0, 'LspCodeLens', { fg = '#6d7f8b' }) +hi(0, 'LspCodeLensSeparator', { fg = '#587b7b' }) +hi(0, 'LspFloatWinBorder', { fg = '#587b7b' }) +hi(0, 'LspFloatWinNormal', { bg = '#0f1c1e' }) +hi(0, 'LspInlayHint', { bg = '#1d3337', fg = '#6d7f8b' }) +hi(0, 'LspReferenceRead', { bg = '#293e40' }) +hi(0, 'LspReferenceText', { bg = '#293e40' }) +hi(0, 'LspReferenceWrite', { bg = '#293e40' }) +hi(0, 'LspSagaBorderTitle', { link = 'Title' }) +hi(0, 'LspSagaCodeActionBorder', { fg = '#587b7b' }) +hi(0, 'LspSagaCodeActionContent', { link = 'String' }) +hi(0, 'LspSagaCodeActionTitle', { link = 'Title' }) +hi(0, 'LspSagaDefPreviewBorder', { fg = '#587b7b' }) +hi(0, 'LspSagaFinderSelection', { fg = '#293e40' }) +hi(0, 'LspSagaHoverBorder', { fg = '#587b7b' }) +hi(0, 'LspSagaRenameBorder', { fg = '#587b7b' }) +hi(0, 'LspSagaSignatureHelpBorder', { fg = '#e85c51' }) +hi(0, 'LspSignatureActiveParameter', { fg = '#425e5e' }) +hi(0, 'LspTroubleCount', { bg = '#587b7b', fg = '#ad5c7c' }) +hi(0, 'LspTroubleNormal', { bg = '#0f1c1e', fg = '#587b7b' }) +hi(0, 'LspTroubleText', { fg = '#cbd9d8' }) +hi(0, 'MatchParen', { bold = true, fg = '#fda47f' }) +hi(0, 'MiniAnimateCursor', { nocombine = true, reverse = true }) +hi(0, 'MiniAnimateNormalFloat', { link = 'NormalFloat' }) +hi(0, 'MiniClueBorder', { link = 'FloatBorder' }) +hi(0, 'MiniClueDescGroup', { link = 'DiagnosticFloatingWarn' }) +hi(0, 'MiniClueDescSingle', { link = 'NormalFloat' }) +hi(0, 'MiniClueNextKey', { link = 'DiagnosticFloatingHint' }) +hi(0, 'MiniClueNextKeyWithPostkeys', { link = 'DiagnosticFloatingError' }) +hi(0, 'MiniClueSeparator', { link = 'DiagnosticFloatingInfo' }) +hi(0, 'MiniClueTitle', { link = 'FloatTitle' }) +hi(0, 'MiniCompletionActiveParameter', { underline = true }) +hi(0, 'MiniCursorword', { link = 'LspReferenceText' }) +hi(0, 'MiniCursorwordCurrent', { link = 'LspReferenceText' }) +hi(0, 'MiniDepsChangeAdded', { link = 'diffAdded' }) +hi(0, 'MiniDepsChangeRemoved', { link = 'diffRemoved' }) +hi(0, 'MiniDepsHint', { link = 'DiagnosticHint' }) +hi(0, 'MiniDepsInfo', { link = 'DiagnosticInfo' }) +hi(0, 'MiniDepsMsgBreaking', { link = 'DiagnosticWarn' }) +hi(0, 'MiniDepsPlaceholder', { link = 'Comment' }) +hi(0, 'MiniDepsTitle', { link = 'Title' }) +hi(0, 'MiniDepsTitleError', { bg = '#e85c51', fg = '#0f1c1e' }) +hi(0, 'MiniDepsTitleSame', { link = 'DiffText' }) +hi(0, 'MiniDepsTitleUpdate', { bg = '#7aa4a1', fg = '#0f1c1e' }) +hi(0, 'MiniDiffOverAdd', { link = 'DiffAdd' }) +hi(0, 'MiniDiffOverChange', { link = 'DiffText' }) +hi(0, 'MiniDiffOverContext', { link = 'DiffChange' }) +hi(0, 'MiniDiffOverDelete', { link = 'DiffDelete' }) +hi(0, 'MiniDiffSignAdd', { fg = 'green', bold = true }) +hi(0, 'MiniDiffSignChange', { fg = 'green', bold = true }) +hi(0, 'MiniDiffSignDelete', { fg = 'red', bold = true }) +hi(0, 'MiniFilesBorder', { link = 'FloatBorder' }) +hi(0, 'MiniFilesBorderModified', { link = 'DiagnosticFloatingWarn' }) +hi(0, 'MiniFilesCursorLine', { link = 'CursorLine' }) +hi(0, 'MiniFilesDirectory', { link = 'Directory' }) +hi(0, 'MiniFilesFile', { fg = '#e6eaea' }) +hi(0, 'MiniFilesNormal', { link = 'NormalFloat' }) +hi(0, 'MiniFilesTitle', { link = 'FloatTitle' }) +hi(0, 'MiniFilesTitleFocused', { bold = true, fg = '#e6eaea' }) +hi(0, 'MiniHipatternsFixme', { bg = '#e85c51', bold = true, fg = '#0f1c1e' }) +hi(0, 'MiniHipatternsHack', { bg = '#fda47f', bold = true, fg = '#0f1c1e' }) +hi(0, 'MiniHipatternsNote', { bg = '#5a93aa', bold = true, fg = '#0f1c1e' }) +hi(0, 'MiniHipatternsTodo', { bg = '#7aa4a1', bold = true, fg = '#0f1c1e' }) +hi(0, 'MiniIconsAzure', { fg = '#73a3b7' }) +hi(0, 'MiniIconsBlue', { fg = '#5a93aa' }) +hi(0, 'MiniIconsCyan', { fg = '#a1cdd8' }) +hi(0, 'MiniIconsGreen', { fg = '#7aa4a1' }) +hi(0, 'MiniIconsGrey', { fg = '#eaeeee' }) +hi(0, 'MiniIconsOrange', { fg = '#ff8349' }) +hi(0, 'MiniIconsPurple', { fg = '#ad5c7c' }) +hi(0, 'MiniIconsRed', { fg = '#e85c51' }) +hi(0, 'MiniIconsYellow', { fg = '#fda47f' }) +hi(0, 'MiniIndentscopePrefix', { nocombine = true }) +hi(0, 'MiniIndentscopeSymbol', { link = 'Delimiter' }) +hi(0, 'MiniJump', { bg = '#ad5c7c', fg = '#0f1c1e' }) +hi(0, 'MiniJump2dDim', { link = 'Comment' }) +hi(0, 'MiniJump2dSpot', { bold = true, fg = '#a1cdd8' }) +hi(0, 'MiniJump2dSpotAhead', { bg = '#0f1c1e', fg = '#4d7d90', nocombine = true }) +hi(0, 'MiniJump2dSpotUnique', { bold = true, fg = '#fda47f' }) +hi(0, 'MiniMapNormal', { link = 'NormalFloat' }) +hi(0, 'MiniMapSymbolCount', { link = 'Special' }) +hi(0, 'MiniMapSymbolLine', { link = 'Title' }) +hi(0, 'MiniMapSymbolView', { link = 'Delimiter' }) +hi(0, 'MiniNotifyBorder', { link = 'FloatBorder' }) +hi(0, 'MiniNotifyNormal', { link = 'NormalFloat' }) +hi(0, 'MiniNotifyTitle', { link = 'FloatTitle' }) +hi(0, 'MiniOperatorsExchangeFrom', { link = 'IncSearch' }) +hi(0, 'MiniPickBorder', { link = 'FloatBorder' }) +hi(0, 'MiniPickBorderBusy', { link = 'DiagnosticFloatingWarn' }) +hi(0, 'MiniPickBorderText', { link = 'FloatTitle' }) +hi(0, 'MiniPickHeader', { link = 'DiagnosticFloatingHint' }) +hi(0, 'MiniPickIconDirectory', { link = 'Directory' }) +hi(0, 'MiniPickIconFile', { link = 'MiniPickNormal' }) +hi(0, 'MiniPickMatchCurrent', { link = 'CursorLine' }) +hi(0, 'MiniPickMatchMarked', { link = 'Visual' }) +hi(0, 'MiniPickMatchRanges', { link = 'DiagnosticFloatingHint' }) +hi(0, 'MiniPickNormal', { link = 'NormalFloat' }) +hi(0, 'MiniPickPreviewLine', { link = 'CursorLine' }) +hi(0, 'MiniPickPreviewRegion', { link = 'IncSearch' }) +hi(0, 'MiniPickPrompt', { link = 'DiagnosticFloatingInfo' }) +hi(0, 'MiniStarterCurrent', { nocombine = true }) +hi(0, 'MiniStarterFooter', { fg = '#ff9664', italic = true }) +hi(0, 'MiniStarterHeader', { link = 'Title' }) +hi(0, 'MiniStarterInactive', { link = 'Comment' }) +hi(0, 'MiniStarterItem', { link = 'Normal' }) +hi(0, 'MiniStarterItemBullet', { fg = '#587b7b' }) +hi(0, 'MiniStarterItemPrefix', { fg = '#cb7985' }) +hi(0, 'MiniStarterQuery', { fg = '#7aa4a1' }) +hi(0, 'MiniStarterSection', { fg = '#e85c51' }) +hi(0, 'MiniStatuslineDevinfo', { bg = '#1d3337', fg = '#cbd9d8' }) +hi(0, 'MiniStatuslineFileinfo', { bg = '#1d3337', fg = '#cbd9d8' }) +hi(0, 'MiniStatuslineFilename', { link = 'StatusLine' }) +hi(0, 'MiniStatuslineInactive', { link = 'StatusLineNC' }) +hi(0, 'MiniStatuslineModeCommand', { bg = '#fda47f', bold = true, fg = '#0f1c1e' }) +hi(0, 'MiniStatuslineModeInsert', { bg = '#7aa4a1', bold = true, fg = '#0f1c1e' }) +hi(0, 'MiniStatuslineModeNormal', { bg = '#a1cdd8', bold = true, fg = '#0f1c1e' }) +hi(0, 'MiniStatuslineModeOther', { bg = '#5a93aa', bold = true, fg = '#0f1c1e' }) +hi(0, 'MiniStatuslineModeReplace', { bg = '#e85c51', bold = true, fg = '#0f1c1e' }) +hi(0, 'MiniStatuslineModeVisual', { bg = '#ad5c7c', bold = true, fg = '#0f1c1e' }) +hi(0, 'MiniSurround', { link = 'IncSearch' }) +hi(0, 'MiniTablineCurrent', { bg = '#2d4f56', bold = true, fg = '#cbd9d8' }) +hi(0, 'MiniTablineFill', { link = 'TabLineFill' }) +hi(0, 'MiniTablineHidden', { bg = '#1d3337', fg = '#587b7b' }) +hi(0, 'MiniTablineModifiedCurrent', { bg = '#cbd9d8', bold = true, fg = '#2d4f56' }) +hi(0, 'MiniTablineModifiedHidden', { bg = '#587b7b', fg = '#1d3337' }) +hi(0, 'MiniTablineModifiedVisible', { bg = '#cbd9d8', fg = '#1d3337' }) +hi(0, 'MiniTablineTabpagesection', { bg = '#152528', bold = true, fg = '#e6eaea' }) +hi(0, 'MiniTablineVisible', { bg = '#1d3337', fg = '#cbd9d8' }) +hi(0, 'MiniTestEmphasis', { bold = true }) +hi(0, 'MiniTestFail', { bold = true, fg = '#e85c51' }) +hi(0, 'MiniTestPass', { bold = true, fg = '#7aa4a1' }) +hi(0, 'MiniTrailspace', { bg = '#e85c51' }) +hi(0, 'ModeMsg', { bold = true, fg = '#fda47f' }) +hi(0, 'ModesCopy', { bg = '#fda47f' }) +hi(0, 'ModesDelete', { bg = '#e85c51' }) +hi(0, 'ModesInsert', { bg = '#a1cdd8' }) +hi(0, 'ModesVisual', { bg = '#ad5c7c' }) +hi(0, 'MoreMsg', { bold = true, fg = '#5a93aa' }) +hi(0, 'NagicIconsOperator', { link = 'Operator' }) +hi(0, 'NavicIconsBoolean', { link = 'Boolean' }) +hi(0, 'NavicIconsClass', { link = 'Type' }) +hi(0, 'NavicIconsConstant', { link = 'Constant' }) +hi(0, 'NavicIconsConstructor', { link = 'Function' }) +hi(0, 'NavicIconsEnum', { link = 'Constant' }) +hi(0, 'NavicIconsEnumMember', { link = '@field' }) +hi(0, 'NavicIconsEvent', { link = 'Constant' }) +hi(0, 'NavicIconsField', { link = '@field' }) +hi(0, 'NavicIconsFile', { link = 'Directory' }) +hi(0, 'NavicIconsFunction', { link = 'Function' }) +hi(0, 'NavicIconsInterface', { link = 'Constant' }) +hi(0, 'NavicIconsKey', { link = 'Identifier' }) +hi(0, 'NavicIconsMethod', { link = 'Function' }) +hi(0, 'NavicIconsModule', { link = '@namespace' }) +hi(0, 'NavicIconsNamespace', { link = '@namespace' }) +hi(0, 'NavicIconsNull', { link = 'Type' }) +hi(0, 'NavicIconsNumber', { link = 'Number' }) +hi(0, 'NavicIconsObject', { link = '@namespace' }) +hi(0, 'NavicIconsPackage', { link = '@namespace' }) +hi(0, 'NavicIconsProperty', { link = '@property' }) +hi(0, 'NavicIconsString', { link = 'String' }) +hi(0, 'NavicIconsStruct', { link = 'Type' }) +hi(0, 'NavicIconsTypeParameter', { link = '@field' }) +hi(0, 'NavicIconsVariable', { link = '@variable' }) +hi(0, 'NavicSeparator', { fg = '#2d4f56' }) +hi(0, 'NavicText', { fg = '#e6eaea' }) +hi(0, 'NeoTreeDimText', { link = 'Conceal' }) +hi(0, 'NeoTreeDirectoryIcon', { fg = '#5a93aa' }) +hi(0, 'NeoTreeDirectoryName', { fg = '#5a93aa' }) +hi(0, 'NeoTreeDotfile', { fg = '#4d7d90' }) +hi(0, 'NeoTreeFileName', { fg = '#cbd9d8' }) +hi(0, 'NeoTreeFileNameOpened', { fg = '#e6eaea' }) +hi(0, 'NeoTreeGitAdded', { fg = '#7aa4a1' }) +hi(0, 'NeoTreeGitConflict', { fg = '#ff8349', italic = true }) +hi(0, 'NeoTreeGitDeleted', { fg = '#e85c51' }) +hi(0, 'NeoTreeGitIgnored', { fg = '#6d7f8b' }) +hi(0, 'NeoTreeGitModified', { fg = '#fda47f' }) +hi(0, 'NeoTreeGitUntracked', { fg = '#934e69' }) +hi(0, 'NeoTreeIndentMarker', { fg = '#2d4f56' }) +hi(0, 'NeoTreeNormal', { fg = '#e6eaea' }) +hi(0, 'NeoTreeNormalNC', { link = 'NeoTreeNormal' }) +hi(0, 'NeoTreeRootName', { bold = true, fg = '#ff8349' }) +hi(0, 'NeoTreeSymbolicLinkTarget', { fg = '#ad6771' }) +hi(0, 'NeogitBranch', { fg = '#fda47f' }) +hi(0, 'NeogitDiffAdd', { fg = '#7aa4a1' }) +hi(0, 'NeogitDiffAddHighlight', { bg = '#293e40' }) +hi(0, 'NeogitDiffContextHighlight', { bg = '#1d3337' }) +hi(0, 'NeogitDiffDelete', { fg = '#e85c51' }) +hi(0, 'NeogitDiffDeleteHighlight', { bg = '#4a3332' }) +hi(0, 'NeogitHunkHeader', { bg = '#254147', fg = '#5a93aa' }) +hi(0, 'NeogitHunkHeaderHighlight', { bg = '#293e40', fg = '#5a93aa' }) +hi(0, 'NeogitNotificationError', { fg = '#e85c51' }) +hi(0, 'NeogitNotificationInfo', { fg = '#5a93aa' }) +hi(0, 'NeogitNotificationWarning', { fg = '#fda47f' }) +hi(0, 'NeogitRemote', { fg = '#7aa4a1' }) +hi(0, 'NeotestAdapterName', { bold = true, fg = '#cb7985' }) +hi(0, 'NeotestDir', { fg = '#a1cdd8' }) +hi(0, 'NeotestExpandMarker', { link = 'Conceal' }) +hi(0, 'NeotestFailed', { fg = '#e85c51' }) +hi(0, 'NeotestFile', { fg = '#5a93aa' }) +hi(0, 'NeotestFocused', { underline = true }) +hi(0, 'NeotestIndent', { link = 'Conceal' }) +hi(0, 'NeotestMarked', { bold = true, fg = '#e6eaea' }) +hi(0, 'NeotestNamespace', { fg = '#89aeb8' }) +hi(0, 'NeotestPassed', { fg = '#7aa4a1' }) +hi(0, 'NeotestRunning', { fg = '#ff8349' }) +hi(0, 'NeotestSkipped', { fg = '#fda47f' }) +hi(0, 'NeotestTest', { link = 'Normal' }) +hi(0, 'NonText', { fg = '#2d4f56' }) +hi(0, 'Normal', { fg = '#e6eaea' }) +hi(0, 'NormalFloat', { bg = '#0f1c1e', fg = '#e6eaea' }) +hi(0, 'NormalNC', { fg = '#e6eaea' }) +hi(0, 'NotifyBackground', { link = 'NormalFloat' }) +hi(0, 'NotifyDEBUGBorder', { fg = '#486565' }) +hi(0, 'NotifyDEBUGIcon', { link = 'NotifyDEBUGTitle' }) +hi(0, 'NotifyDEBUGTitle', { fg = '#7aa4a1' }) +hi(0, 'NotifyERRORBorder', { fg = '#7e413d' }) +hi(0, 'NotifyERRORIcon', { link = 'NotifyERRORTitle' }) +hi(0, 'NotifyERRORTitle', { fg = '#e85c51' }) +hi(0, 'NotifyINFOBorder', { fg = '#385c69' }) +hi(0, 'NotifyINFOIcon', { link = 'NotifyINFOTitle' }) +hi(0, 'NotifyINFOTitle', { fg = '#5a93aa' }) +hi(0, 'NotifyTRACEBorder', { fg = '#2d4f56' }) +hi(0, 'NotifyTRACEIcon', { link = 'NotifyTRACETitle' }) +hi(0, 'NotifyTRACETitle', { fg = '#6d7f8b' }) +hi(0, 'NotifyWARNBorder', { fg = '#896554' }) +hi(0, 'NotifyWARNIcon', { link = 'NotifyWARNTitle' }) +hi(0, 'NotifyWARNTitle', { fg = '#fda47f' }) +hi(0, 'Number', { fg = '#ff8349' }) +hi(0, 'NvimTreeEmptyFolderName', { fg = '#587b7b' }) +hi(0, 'NvimTreeFolderIcon', { fg = '#5a93aa' }) +hi(0, 'NvimTreeFolderName', { fg = '#5a93aa' }) +hi(0, 'NvimTreeGitDeleted', { fg = '#e85c51' }) +hi(0, 'NvimTreeGitDirty', { fg = '#fda47f' }) +hi(0, 'NvimTreeGitMerge', { fg = '#ff8349' }) +hi(0, 'NvimTreeGitNew', { fg = '#7aa4a1' }) +hi(0, 'NvimTreeGitRenamed', { link = 'NvimTreeGitDeleted' }) +hi(0, 'NvimTreeGitStaged', { link = 'NvimTreeGitStaged' }) +hi(0, 'NvimTreeImageFile', { fg = '#c8c8c8' }) +hi(0, 'NvimTreeIndentMarker', { fg = '#2d4f56' }) +hi(0, 'NvimTreeNormal', { fg = '#e6eaea' }) +hi(0, 'NvimTreeOpenedFile', { fg = '#d38d97' }) +hi(0, 'NvimTreeOpenedFolderName', { fg = '#73a3b7' }) +hi(0, 'NvimTreeRootFolder', { bold = true, fg = '#ff8349' }) +hi(0, 'NvimTreeSpecialFile', { fg = '#a1cdd8' }) +hi(0, 'NvimTreeSymlink', { fg = '#ad6771' }) +hi(0, 'NvimTreeVertSplit', { link = 'VertSplit' }) +hi(0, 'Operator', { fg = '#cbd9d8' }) +hi(0, 'Pmenu', { bg = '#293e40', fg = '#e6eaea' }) +hi(0, 'PmenuSel', { bg = '#425e5e' }) +hi(0, 'PmenuThumb', { bg = '#425e5e' }) +hi(0, 'PounceAccept', { bg = '#ff9664', fg = '#152528' }) +hi(0, 'PounceAcceptBest', { bg = '#afd4de', fg = '#152528' }) +hi(0, 'PounceGap', { bg = '#293e40', fg = '#e6eaea' }) +hi(0, 'PounceMatch', { bg = '#425e5e', fg = '#e6eaea' }) +hi(0, 'PreProc', { fg = '#d38d97' }) +hi(0, 'Question', { link = 'MoreMsg' }) +hi(0, 'QuickFixLine', { link = 'CursorLine' }) +hi(0, 'RainbowDelimiterBlue', { fg = '#5a93aa' }) +hi(0, 'RainbowDelimiterCyan', { fg = '#a1cdd8' }) +hi(0, 'RainbowDelimiterGreen', { fg = '#7aa4a1' }) +hi(0, 'RainbowDelimiterOrange', { fg = '#ff8349' }) +hi(0, 'RainbowDelimiterPurple', { fg = '#ad5c7c' }) +hi(0, 'RainbowDelimiterRed', { fg = '#e85c51' }) +hi(0, 'RainbowDelimiterYellow', { fg = '#fda47f' }) +hi(0, 'Repeat', { link = 'Conditional' }) +hi(0, 'Search', { bg = '#425e5e', fg = '#e6eaea' }) +hi(0, 'SignColumn', { fg = '#587b7b' }) +hi(0, 'SignColumnSB', { link = 'SignColumn' }) +hi(0, 'SignifySignAdd', { fg = '#7aa4a1' }) +hi(0, 'SignifySignChange', { fg = '#fda47f' }) +hi(0, 'SignifySignDelete', { fg = '#e85c51' }) +hi(0, 'SnacksBackdrop', { bg = '#000000' }) +hi(0, 'SnacksImageMath', { fg = '#73a3b7' }) +hi(0, 'SnacksPickerDir', { fg = '#cccccc' }) +hi(0, 'Sneak', { bg = '#ad5c7c', fg = '#0f1c1e' }) +hi(0, 'SneakScope', { bg = '#293e40' }) +hi(0, 'Special', { fg = '#73a3b7' }) +hi(0, 'SpecialKey', { link = 'NonText' }) +hi(0, 'SpellBad', { sp = '#e85c51', undercurl = true }) +hi(0, 'SpellCap', { sp = '#fda47f', undercurl = true }) +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, 'String', { fg = '#7aa4a1' }) +hi(0, 'Substitute', { bg = '#e85c51', fg = '#152528' }) +hi(0, 'SymbolOutlineConnector', { link = 'Conceal' }) +hi(0, 'TSRainbowBlue', { fg = '#5a93aa' }) +hi(0, 'TSRainbowCyan', { fg = '#a1cdd8' }) +hi(0, 'TSRainbowGreen', { fg = '#7aa4a1' }) +hi(0, 'TSRainbowOrange', { fg = '#ff8349' }) +hi(0, 'TSRainbowRed', { fg = '#e85c51' }) +hi(0, 'TSRainbowViolet', { fg = '#ad5c7c' }) +hi(0, 'TSRainbowYellow', { fg = '#fda47f' }) +hi(0, 'TabLine', { bg = '#1d3337', fg = '#cbd9d8' }) +hi(0, 'TablineFill', { bg = 'none' }) +hi(0, 'TabLineSel', { bg = '#587b7b', fg = '#152528' }) +hi(0, 'TelescopeBorder', { fg = '#2d4f56' }) +hi(0, 'TelescopeMatching', { link = 'Search' }) +hi(0, 'TelescopeSelection', { link = 'CursorLine' }) +hi(0, 'TelescopeSelectionCaret', { fg = '#7aa4a1' }) +hi(0, 'Title', { bold = true, fg = '#73a3b7' }) +hi(0, 'Todo', { bg = '#5a93aa', fg = '#152528' }) +hi(0, 'Type', { fg = '#fda47f' }) +hi(0, 'Visual', { bg = '#293e40' }) +hi(0, 'WarningMsg', { fg = '#fda47f' }) +hi(0, 'WhichKey', { link = 'Identifier' }) +hi(0, 'WhichKeyDesc', { link = 'Keyword' }) +hi(0, 'WhichKeyFloat', { link = 'NormalFloat' }) +hi(0, 'WhichKeyGroup', { link = 'Function' }) +hi(0, 'WhichKeySeparator', { link = 'Comment' }) +hi(0, 'WhichKeySeperator', { link = 'Comment' }) +hi(0, 'WhichKeyValue', { link = 'Comment' }) +hi(0, 'Whitespace', { fg = '#254147' }) +hi(0, 'WildMenu', { link = 'Pmenu' }) +hi(0, 'WinBar', { bold = true, fg = '#587b7b' }) +hi(0, 'WinBarNC', { bold = true, fg = '#587b7b' }) +hi(0, 'WinSeparator', { fg = '#0f1c1e' }) +hi(0, 'diffAdded', { fg = '#7aa4a1' }) +hi(0, 'diffChanged', { fg = '#fda47f' }) +hi(0, 'diffFile', { fg = '#5a93aa' }) +hi(0, 'diffIndexLine', { fg = '#d38d97' }) +hi(0, 'diffLine', { fg = '#ff9664' }) +hi(0, 'diffNewFile', { fg = '#7aa4a1' }) +hi(0, 'diffOldFile', { fg = '#fda47f' }) +hi(0, 'diffRemoved', { fg = '#e85c51' }) +hi(0, 'illuminatedWordRead', { link = 'LspReferenceText' }) +hi(0, 'illuminatedWordText', { link = 'LspReferenceText' }) +hi(0, 'illuminatedWordWrite', { link = 'LspReferenceText' }) +hi(0, 'lCursor', { link = 'Cursor' }) +hi(0, 'qfFileName', { link = 'Directory' }) +hi(0, 'qfLineNr', { link = 'LineNr' }) +hi(0, 'rainbowcol1', { fg = '#e85c51' }) +hi(0, 'rainbowcol2', { fg = '#fda47f' }) +hi(0, 'rainbowcol3', { fg = '#7aa4a1' }) +hi(0, 'rainbowcol4', { fg = '#5a93aa' }) +hi(0, 'rainbowcol5', { fg = '#a1cdd8' }) +hi(0, 'rainbowcol6', { fg = '#ad5c7c' }) +hi(0, 'rainbowcol7', { fg = '#cb7985' }) +hi(0, 'typescriptParens', { fg = '#cbd9d8' }) + +-- Terminal colors +local g = vim.g + +g.terminal_color_0 = '#2f3239' +g.terminal_color_1 = '#e85c51' +g.terminal_color_2 = '#7aa4a1' +g.terminal_color_3 = '#fda47f' +g.terminal_color_4 = '#5a93aa' +g.terminal_color_5 = '#ad5c7c' +g.terminal_color_6 = '#a1cdd8' +g.terminal_color_7 = '#ebebeb' +g.terminal_color_8 = '#4e5157' +g.terminal_color_9 = '#eb746b' +g.terminal_color_10 = '#8eb2af' +g.terminal_color_11 = '#fdb292' +g.terminal_color_12 = '#73a3b7' +g.terminal_color_13 = '#b97490' +g.terminal_color_14 = '#afd4de' +g.terminal_color_15 = '#eeeeee' diff --git a/nvim/lsp/gopls.lua b/nvim/lsp/gopls.lua index 46d47d8..38f2b64 100644 --- a/nvim/lsp/gopls.lua +++ b/nvim/lsp/gopls.lua @@ -1,3 +1,4 @@ +---@type vim.lsp.Config return { settings = { gopls = { diff --git a/nvim/lsp/lua_ls.lua b/nvim/lsp/lua_ls.lua index a2244c8..f71f2bd 100644 --- a/nvim/lsp/lua_ls.lua +++ b/nvim/lsp/lua_ls.lua @@ -18,6 +18,12 @@ return { }) end, settings = { - Lua = {}, + Lua = { + hint = { + enable = true, + arrayIndex = 'Enable', + setType = true, + }, + }, }, } diff --git a/nvim/lua/config/init.lua b/nvim/lua/config/init.lua index 1f048e1..a2a90d3 100644 --- a/nvim/lua/config/init.lua +++ b/nvim/lua/config/init.lua @@ -24,6 +24,7 @@ vim.opt.tabstop = 2 -- 2 space tabs are based vim.opt.updatetime = 250 -- decrease update time vim.opt.virtualedit = 'onemore' vim.opt.winborder = 'single' +vim.cmd('colorscheme iofq') -- Switch tab length on the fly vim.keymap.set('n', '\\t', function() @@ -44,7 +45,7 @@ vim.api.nvim_create_autocmd('BufWinEnter', { 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 = true + vim.bo.buflisted = false end end, }) @@ -87,6 +88,10 @@ vim.keymap.set('n', '', vim.cmd.bprev, { noremap = true, silent = true }) vim.keymap.set('v', '<', '', '>gv') vim.keymap.set({ 'v', 'n' }, 'q:', '') +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' }) -- resize splits if window got resized vim.api.nvim_create_autocmd({ 'VimResized' }, { diff --git a/nvim/lua/plugins/lib/minidiff_jj.lua b/nvim/lua/plugins/lib/minidiff_jj.lua index e638676..c71654f 100644 --- a/nvim/lua/plugins/lib/minidiff_jj.lua +++ b/nvim/lua/plugins/lib/minidiff_jj.lua @@ -1,14 +1,14 @@ local diff = require('mini.diff') -local JJ = { +local M = { cache = {}, jj_cache = {}, } -JJ.get_buf_realpath = function(buf_id) +M.get_buf_realpath = function(buf_id) return vim.loop.fs_realpath(vim.api.nvim_buf_get_name(buf_id)) or '' end -JJ.jj_start_watching_tree_state = function(buf_id, path) +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 = { @@ -19,11 +19,11 @@ JJ.jj_start_watching_tree_state = function(buf_id, path) local on_not_in_jj = vim.schedule_wrap(function() if not vim.api.nvim_buf_is_valid(buf_id) then - JJ.cache[buf_id] = nil + M.cache[buf_id] = nil return end diff.fail_attach(buf_id) - JJ.jj_cache[buf_id] = {} + M.jj_cache[buf_id] = {} end) local process, stdout_feed = nil, {} @@ -37,20 +37,20 @@ JJ.jj_start_watching_tree_state = function(buf_id, path) -- Set up index watching local jj_dir_path = table.concat(stdout_feed, ''):gsub('\n+$', '') .. '/.jj/working_copy' - JJ.jj_setup_tree_state_watch(buf_id, jj_dir_path) + M.jj_setup_tree_state_watch(buf_id, jj_dir_path) -- Set reference text immediately - JJ.jj_set_ref_text(buf_id) + M.jj_set_ref_text(buf_id) end process = vim.loop.spawn('jj', spawn_opts, on_exit) - JJ.jj_read_stream(stdout, stdout_feed) + M.jj_read_stream(stdout, stdout_feed) end -JJ.jj_setup_tree_state_watch = function(buf_id, jj_dir_path) +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() - JJ.jj_set_ref_text(buf_id) + M.jj_set_ref_text(buf_id) end local watch_tree_state = function(_, filename, _) @@ -63,11 +63,11 @@ JJ.jj_setup_tree_state_watch = function(buf_id, jj_dir_path) end buf_fs_event:start(jj_dir_path, { recursive = false }, watch_tree_state) - JJ.jj_invalidate_cache(JJ.jj_cache[buf_id]) - JJ.jj_cache[buf_id] = { fs_event = buf_fs_event, timer = timer } + M.jj_invalidate_cache(M.jj_cache[buf_id]) + M.jj_cache[buf_id] = { fs_event = buf_fs_event, timer = timer } end -JJ.jj_set_ref_text = vim.schedule_wrap(function(buf_id) +M.jj_set_ref_text = vim.schedule_wrap(function(buf_id) if not vim.api.nvim_buf_is_valid(buf_id) then return end @@ -77,7 +77,7 @@ JJ.jj_set_ref_text = vim.schedule_wrap(function(buf_id) end) -- NOTE: Do not cache buffer's name to react to its possible rename - local path = JJ.get_buf_realpath(buf_id) + local path = M.get_buf_realpath(buf_id) if path == '' then return buf_set_ref_text {} end @@ -105,10 +105,10 @@ JJ.jj_set_ref_text = vim.schedule_wrap(function(buf_id) end process = vim.loop.spawn('jj', spawn_opts, on_exit) - JJ.jj_read_stream(stdout, stdout_feed) + M.jj_read_stream(stdout, stdout_feed) end) -JJ.jj_read_stream = function(stream, feed) +M.jj_read_stream = function(stream, feed) local callback = function(err, data) if data ~= nil then return table.insert(feed, data) @@ -121,7 +121,7 @@ JJ.jj_read_stream = function(stream, feed) stream:read_start(callback) end -JJ.jj_invalidate_cache = function(cache) +M.jj_invalidate_cache = function(cache) if cache == nil then return end @@ -129,26 +129,26 @@ JJ.jj_invalidate_cache = function(cache) pcall(vim.loop.timer_stop, cache.timer) end -local jj = function() +M.gen_source = function() local attach = function(buf_id) -- Try attaching to a buffer only once - if JJ.jj_cache[buf_id] ~= nil then + if M.jj_cache[buf_id] ~= nil then return false end -- - Possibly resolve symlinks to get data from the original repo - local path = JJ.get_buf_realpath(buf_id) + local path = M.get_buf_realpath(buf_id) if path == '' then return false end - JJ.jj_cache[buf_id] = {} - JJ.jj_start_watching_tree_state(buf_id, path) + M.jj_cache[buf_id] = {} + M.jj_start_watching_tree_state(buf_id, path) end local detach = function(buf_id) - local cache = JJ.jj_cache[buf_id] - JJ.jj_cache[buf_id] = nil - JJ.jj_invalidate_cache(cache) + local cache = M.jj_cache[buf_id] + M.jj_cache[buf_id] = nil + M.jj_invalidate_cache(cache) end local apply_hunks = function(_, _) @@ -162,4 +162,4 @@ local jj = function() apply_hunks = apply_hunks, } end -return jj +return M diff --git a/nvim/lua/plugins/lib/session_jj.lua b/nvim/lua/plugins/lib/session_jj.lua index db6a271..31429dc 100644 --- a/nvim/lua/plugins/lib/session_jj.lua +++ b/nvim/lua/plugins/lib/session_jj.lua @@ -1,7 +1,8 @@ local M = {} -M.load = function() +sessions = require('mini.sessions') + +M.get_id = function() local jj_root = vim.system({ 'jj', 'workspace', 'root' }):wait() - local sessions = require('mini.sessions') if jj_root.code ~= 0 then return @@ -19,29 +20,42 @@ M.load = function() '--no-graph', }) :wait() - local branch = vim.trim(string.gsub(result.stdout, '[\n*]', '')) + 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 jj_sesh = string.gsub(string.format('jj:%s:%s', root, branch), '[./]', '-') - if jj_sesh ~= '' then - vim.opt.shadafile = vim.fn.stdpath('data') .. '/myshada/' .. jj_sesh .. '.shada' - for name, _ in pairs(sessions.detected) do - if name == jj_sesh then - vim.ui.select({ - 'No', - 'Yes', - }, { prompt = 'Session found at ' .. jj_sesh .. ', load it?' }, function(c) - if c == 'Yes' then - -- load session (buffers, etc) as well as shada (marks) - sessions.read(jj_sesh) - vim.cmd('rshada') - vim.notify('loaded jj session: ' .. jj_sesh) - end - end) - return - end + local id = string.gsub(string.format('jj:%s:%s', root, branch), '[./]', '-') -- slugify + return id +end + +M.check_exists = function(id) + for name, _ in pairs(sessions.detected) do + if name == id then + return true end - vim.cmd('wshada') - sessions.write(jj_sesh) + end + return false +end + +M.load = function() + local id = M.get_id() + 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', + 'No', + }, { prompt = 'Session found at ' .. id .. ', load it?' }, function(c) + if c == 'Yes' then + -- load session (buffers, etc) as well as shada (marks) + sessions.read(id) + vim.cmd('rshada') + vim.notify('loaded jj session: ' .. id) + end + end) + else + vim.cmd('wshada') -- create session if it did not exist + sessions.write(id) end end diff --git a/nvim/lua/plugins/lib/snacks.lua b/nvim/lua/plugins/lib/snacks.lua new file mode 100644 index 0000000..8945232 --- /dev/null +++ b/nvim/lua/plugins/lib/snacks.lua @@ -0,0 +1,26 @@ +M = {} +M.marks = function() + return { + finder = 'vim_marks', + format = 'file', + ['local'] = false, + global = true, + actions = { + markdel = function(picker) + for _, item in ipairs(picker:selected()) do + vim.cmd.delmarks { args = { item.label } } + end + vim.cmd('wshada') + picker.list:set_selected() + picker.list:set_target() + picker:find() + end, + }, + win = { + list = { + keys = { ['dd'] = 'markdel' }, + }, + }, + } +end +return M diff --git a/nvim/lua/plugins/lib/snacks_jj.lua b/nvim/lua/plugins/lib/snacks_jj.lua index 87dc12e..33a71e0 100644 --- a/nvim/lua/plugins/lib/snacks_jj.lua +++ b/nvim/lua/plugins/lib/snacks_jj.lua @@ -67,6 +67,7 @@ function M.revs() Snacks.picker.util.cmd(cmd, function() Snacks.notify('Checking out revision: ' .. item.rev, { title = 'Snacks Picker' }) vim.cmd.checktime() + require('plugins.lib.session_jj').load() end, { cwd = item.cwd }) end end diff --git a/nvim/lua/plugins/lsp.lua b/nvim/lua/plugins/lsp.lua index 09c5a0a..2d3f6ea 100644 --- a/nvim/lua/plugins/lsp.lua +++ b/nvim/lua/plugins/lsp.lua @@ -8,7 +8,7 @@ return { follow = false, auto_close = false, win = { - size = 0.25, + size = 0.33, position = 'right', type = 'split', }, @@ -17,7 +17,6 @@ return { { 'gre', 'Trouble diagnostics toggle', - noremap = true, desc = 'Trouble diagnostics', }, }, @@ -25,10 +24,6 @@ return { { 'neovim/nvim-lspconfig', event = 'VeryLazy', - dependencies = { - 'folke/trouble.nvim', - 'saghen/blink.cmp', - }, config = function() vim.lsp.enable { 'nil_ls', @@ -40,53 +35,36 @@ return { vim.api.nvim_create_autocmd('LspAttach', { group = vim.api.nvim_create_augroup('UserLspConfig', {}), callback = function(ev) - local bufnr = ev.buf local client = vim.lsp.get_client_by_id(ev.data.client_id) if not client then return end + vim.keymap.set('n', 'grg', 'Trouble lsp toggle', { buffer = ev.buf, desc = 'Trouble LSP' }) vim.keymap.set( 'n', - 'grt', - 'Trouble lsp toggle focus=true ', - { buffer = ev.buf, noremap = true, silent = true, desc = 'Trouble LSP ' } - ) - vim.keymap.set( - 'n', - 'grs', - 'Trouble lsp_document_symbols toggle win.position=left ', - { buffer = ev.buf, noremap = true, silent = true, desc = 'Trouble LSP symbols' } - ) - vim.keymap.set( - 'n', - 'grd', - 'Trouble lsp_definitions toggle ', - { buffer = ev.buf, noremap = true, silent = true, desc = 'Trouble LSP definition' } - ) - vim.keymap.set( - 'n', - 'grr', - 'Trouble lsp_references toggle ', - { buffer = ev.buf, noremap = true, silent = true, desc = 'Trouble LSP definition' } - ) - vim.keymap.set( - 'n', - 'grl', - vim.lsp.codelens.run, - { buffer = ev.buf, noremap = true, silent = true, desc = 'vim.lsp.codelens.run()' } + 'gO', + 'Trouble lsp_document_symbols win.position=left', + { buffer = ev.buf, desc = 'Trouble LSP symbols' } ) + vim.keymap.set('n', 'grd', function() + Snacks.picker.lsp_definitions { focus = 'list' } + end, { buffer = ev.buf, desc = 'LSP definition' }) + vim.keymap.set('n', 'grr', function() + Snacks.picker.lsp_references { focus = 'list' } + end, { buffer = ev.buf, desc = 'LSP definition' }) vim.keymap.set('n', 'grh', function() vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled()) - end, { buffer = ev.buf, noremap = true, silent = true, desc = 'LSP hints toggle' }) + 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()' }) -- Auto-refresh code lenses if client.server_capabilities.codeLensProvider then vim.api.nvim_create_autocmd({ 'InsertLeave', 'TextChanged' }, { - group = vim.api.nvim_create_augroup(string.format('lsp-%s-%s', bufnr, client.id), {}), + group = vim.api.nvim_create_augroup(string.format('lsp-%s-%s', ev.buf, client.id), {}), callback = function() - vim.lsp.codelens.refresh { bufnr = bufnr } + vim.lsp.codelens.refresh { bufnr = ev.buf } end, - buffer = bufnr, + buffer = ev.buf, }) vim.lsp.codelens.refresh() end diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index e6a6895..a495465 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -1,7 +1,6 @@ return { { 'echasnovski/mini.nvim', - dependencies = 'nvim-treesitter/nvim-treesitter-textobjects', lazy = false, keys = { { @@ -23,13 +22,11 @@ return { { 'gb', 'Git blame -- %', - noremap = true, desc = 'git blame', }, { 'gg', ':Git ', - noremap = true, desc = 'git command', }, { @@ -40,6 +37,13 @@ return { noremap = true, desc = 'mini session select', }, + { + '\\z', + function() + require('mini.misc').zoom() + end, + desc = 'mini zoom', + }, }, config = function() require('mini.basics').setup { mappings = { windows = true } } @@ -99,16 +103,17 @@ return { require('mini.surround').setup() require('mini.splitjoin').setup { detect = { separator = '[,;\n]' } } - local sessions = require('mini.sessions') - sessions.setup { + require('mini.sessions').setup { file = '', autowrite = true, verbose = { write = false, }, } - if #vim.fn.argv() == 0 then - require('plugins.lib.session_jj').load() + local jj_sesh = require('plugins.lib.session_jj') + local jj_id = jj_sesh.get_id() + if jj_sesh.check_exists(jj_id) then + Snacks.notify('Existing session for ' .. jj_id) end local jump = require('mini.jump2d') @@ -130,7 +135,7 @@ return { diff.setup { options = { wrap_goto = true }, source = { - jj(), + jj.gen_source(), diff.gen_source.git(), }, } @@ -170,10 +175,14 @@ return { width_preview = 50, }, } - vim.keymap.set('n', 'nc', files.open, { noremap = true, desc = 'minifiles open' }) + vim.keymap.set('n', 'nc', files.open, { desc = 'minifiles open' }) 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_directory = vim.fs.dirname(cur_entry_path) @@ -181,7 +190,12 @@ return { 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, + }) local multi = require('mini.keymap').map_multistep multi({ 'i' }, '', { 'minipairs_bs' }) multi({ 'i', 's' }, '', { 'blink_accept', 'vimsnippet_next', 'increase_indent' }) diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index 9849c9e..484e7b9 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -39,53 +39,21 @@ return { }, }, keys = { - { 'nb', vim.cmd.DiffviewOpen, noremap = true, desc = 'diffview open' }, + { 'nb', vim.cmd.DiffviewOpen, desc = 'diffview open' }, { 'nh', 'DiffviewFileHistory %', mode = { 'n', 'v' }, - noremap = true, desc = 'diffview history', }, { 'nH', 'DiffviewFileHistory', mode = { 'n', 'v' }, - noremap = true, desc = 'diffview history', }, }, }, - { - 'EdenEast/nightfox.nvim', - lazy = false, - priority = 1000, - opts = { - options = { - transparent = true, - terminal_colors = true, - modules = { - 'mini', - 'treesitter', - 'neogit', - 'native_lsp', - 'diagnostic', - 'modes', - }, - }, - }, - config = function(_, opts) - require('nightfox').setup(opts) - vim.cmd('colorscheme terafox') - vim.api.nvim_set_hl(0, 'StatusLine', { bg = 'none' }) - vim.api.nvim_set_hl(0, 'StatusLineNC', { bg = 'none' }) - vim.api.nvim_set_hl(0, 'TablineFill', { bg = 'none' }) - vim.api.nvim_set_hl(0, 'MiniDiffSignAdd', { fg = 'green', bold = true }) - vim.api.nvim_set_hl(0, 'MiniDiffSignDelete', { fg = 'red', bold = true }) - vim.api.nvim_set_hl(0, 'MiniDiffSignChange', { fg = 'green', bold = true }) - vim.api.nvim_set_hl(0, 'BlinkCmpGhostText', { link = 'String' }) - end, - }, { 'ThePrimeagen/refactoring.nvim', event = 'VeryLazy', diff --git a/nvim/lua/plugins/snacks.lua b/nvim/lua/plugins/snacks.lua index a6206a0..718a647 100644 --- a/nvim/lua/plugins/snacks.lua +++ b/nvim/lua/plugins/snacks.lua @@ -1,47 +1,53 @@ return { { 'folke/snacks.nvim', - dependencies = { - 'folke/trouble.nvim', - }, lazy = false, priority = 1000, opts = { bigfile = { enabled = true }, - bufdelete = { enabled = true }, quickfile = { enabled = true }, - notifier = { enabled = true }, + notifier = { + enabled = true, + timeout = 5000, + }, + styles = { + notification = { + wo = { wrap = true }, + }, + }, terminal = { enabled = true }, indent = { enabled = true }, input = { enabled = true }, words = { enabled = true }, picker = { enabled = true, - matcher = { frecency = true }, - layout = { - preset = function() - return vim.o.columns >= 120 and 'telescope' or 'vertical' - end, + matcher = { + frecency = true, + history_bonus = true, }, + layout = 'ivy_split', sources = { files = { hidden = true }, grep = { hidden = true }, explorer = { hidden = true }, git_files = { untracked = true }, - smart = { - multi = { 'buffers', 'recent', 'files' }, + lsp_symbols = { + filter = { default = true }, + layout = 'left', + }, + smart = { + multi = { + require('plugins.lib.snacks').marks(), + { source = 'buffers', current = false }, + 'recent', + { source = 'files', hidden = true }, + }, }, - }, - actions = { - trouble_open = function(...) - return require('trouble.sources.snacks').actions.trouble_open.action(...) - end, }, win = { input = { keys = { ['wq'] = { 'close', mode = 'i' }, - [''] = { 'trouble_open', mode = { 'n', 'i' } }, }, }, list = { @@ -52,10 +58,6 @@ return { }, }, }, - config = function(_, opts) - require('snacks').setup(opts) - vim.api.nvim_set_hl(0, 'SnacksPickerDir', { fg = '#cccccc' }) - end, keys = { { '', @@ -63,7 +65,6 @@ return { Snacks.terminal.toggle() end, mode = { 'n', 't' }, - noremap = true, desc = 'terminal open', }, { @@ -72,7 +73,6 @@ return { Snacks.terminal.toggle('$SHELL') end, mode = { 'n', 't' }, - noremap = true, desc = 'terminal open', }, { @@ -80,7 +80,6 @@ return { function() Snacks.words.jump(1, true) end, - noremap = true, desc = 'next reference', }, { @@ -88,51 +87,21 @@ return { function() Snacks.words.jump(-1, true) end, - noremap = true, desc = 'next reference', }, { - '\\z', - function() - if Snacks.dim.enabled then - Snacks.dim.disable() - else - Snacks.dim.enable() - end - end, - noremap = true, - desc = 'next reference', - }, - { - 'gq', - function() - Snacks.bufdelete() - end, - noremap = true, - silent = true, - }, - { - 'gQ', - function() - Snacks.bufdelete.other() - end, - noremap = true, - silent = true, - }, - { - 'ff', + '', function() + vim.cmd.delmarks { args = { '0-9' } } Snacks.picker.smart() end, - noremap = true, - desc = 'Fuzzy find files', + desc = 'Fuzzy find smart', }, { 'fe', function() Snacks.explorer() end, - noremap = true, desc = 'snacks explorer', }, { @@ -140,8 +109,13 @@ return { function() Snacks.picker.git_files() end, - noremap = true, - silent = true, + desc = 'Fuzzy find git files', + }, + { + 'ff', + function() + Snacks.picker.files() + end, desc = 'Fuzzy find files', }, { @@ -149,8 +123,6 @@ return { function() Snacks.picker.grep() end, - noremap = true, - silent = true, desc = 'Fuzzy find grep', }, { @@ -158,8 +130,6 @@ return { function() Snacks.picker.grep_word() end, - noremap = true, - silent = true, desc = 'Fuzzy find grep word', }, { @@ -167,8 +137,6 @@ return { function() Snacks.picker.pickers() end, - noremap = true, - silent = true, desc = 'See all pickers', }, { @@ -176,8 +144,6 @@ return { function() Snacks.picker.undo() end, - noremap = true, - silent = true, desc = 'Pick undotree', }, { @@ -185,8 +151,6 @@ return { function() Snacks.picker.jumps() end, - noremap = true, - silent = true, desc = 'Pick jumps', }, { @@ -194,17 +158,13 @@ return { function() Snacks.picker.resume() end, - noremap = true, - silent = true, desc = 'Fuzzy find resume', }, { - '', + 'fb', function() Snacks.picker.buffers() end, - noremap = true, - silent = true, desc = 'Fuzzy find buffers', }, { @@ -212,44 +172,14 @@ return { function() Snacks.picker.notifications() end, - noremap = true, - silent = true, desc = 'pick notifications', }, { 'fm', function() vim.cmd.delmarks { args = { '0-9' } } - Snacks.picker.pick { - finder = 'vim_marks', - format = 'file', - ['local'] = false, - global = true, - actions = { - markdel = function(picker) - for _, item in ipairs(picker:selected()) do - vim.cmd.delmarks { args = { item.label } } - end - vim.cmd('wshada') - picker.list:set_selected() - picker.list:set_target() - picker:find() - end, - }, - win = { - input = { - keys = { - [''] = { 'markdel', mode = { 'n', 'i' } }, - }, - }, - list = { - keys = { ['dd'] = 'markdel' }, - }, - }, - } + Snacks.picker.pick(require('plugins.lib.snacks').marks()) end, - noremap = true, - silent = true, desc = 'pick global marks', }, { @@ -257,8 +187,6 @@ return { function() require('plugins.lib.snacks_jj').status() end, - noremap = true, - silent = true, desc = 'pick notifications', }, { @@ -266,8 +194,6 @@ return { function() require('plugins.lib.snacks_jj').revs() end, - noremap = true, - silent = true, desc = 'pick notifications', }, }, diff --git a/nvim/lua/plugins/treesitter.lua b/nvim/lua/plugins/treesitter.lua index ad22ccd..ddb5da9 100644 --- a/nvim/lua/plugins/treesitter.lua +++ b/nvim/lua/plugins/treesitter.lua @@ -11,6 +11,7 @@ return { }, }, 'nvim-treesitter/nvim-treesitter-textobjects', + 'RRethy/nvim-treesitter-textsubjects', }, config = function() require('nvim-treesitter.configs').setup { @@ -49,13 +50,6 @@ return { }, }, }, - incremental_selection = { - enable = true, - keymaps = { - node_incremental = 'v', - node_decremental = '', - }, - }, } end, }, From 0c18f504e86e603f256d5d5648408677fb1825d4 Mon Sep 17 00:00:00 2001 From: iofq Date: Tue, 8 Jul 2025 20:31:34 -0500 Subject: [PATCH 135/160] completion and snacks tweaks --- nvim/lua/plugins/completion.lua | 10 +++++++--- nvim/lua/plugins/lib/session_jj.lua | 2 +- nvim/lua/plugins/mini.lua | 3 ++- nvim/lua/plugins/snacks.lua | 5 +++-- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/nvim/lua/plugins/completion.lua b/nvim/lua/plugins/completion.lua index b91c370..c860619 100644 --- a/nvim/lua/plugins/completion.lua +++ b/nvim/lua/plugins/completion.lua @@ -21,17 +21,21 @@ return { 'lsp', 'path', 'snippets', - 'omni', 'ripgrep', + 'buffer', }, providers = { + lsp = { + fallbacks = {}, -- include buffer even when LSP is active + score_offset = 10, + }, snippets = { - score_offset = -20, + score_offset = -10, }, ripgrep = { module = 'blink-ripgrep', name = 'rg', - score_offset = -30, + score_offset = -10, async = true, }, }, diff --git a/nvim/lua/plugins/lib/session_jj.lua b/nvim/lua/plugins/lib/session_jj.lua index 31429dc..ee9bf6a 100644 --- a/nvim/lua/plugins/lib/session_jj.lua +++ b/nvim/lua/plugins/lib/session_jj.lua @@ -1,5 +1,5 @@ local M = {} -sessions = require('mini.sessions') +local sessions = require('mini.sessions') M.get_id = function() local jj_root = vim.system({ 'jj', 'workspace', 'root' }):wait() diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index a495465..24c6e5d 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -123,7 +123,7 @@ return { } require('plugins.lib.minipairs') { - modes = { insert = true, command = true, terminal = false }, + modes = { insert = true, command = false, terminal = false }, skip_next = [=[[%w%%%'%[%"%.%`%$]]=], skip_ts = { 'string' }, skip_unbalanced = true, @@ -196,6 +196,7 @@ return { Snacks.rename.on_rename_file(event.data.from, event.data.to) end, }) + local multi = require('mini.keymap').map_multistep multi({ 'i' }, '', { 'minipairs_bs' }) multi({ 'i', 's' }, '', { 'blink_accept', 'vimsnippet_next', 'increase_indent' }) diff --git a/nvim/lua/plugins/snacks.lua b/nvim/lua/plugins/snacks.lua index 718a647..730a4f6 100644 --- a/nvim/lua/plugins/snacks.lua +++ b/nvim/lua/plugins/snacks.lua @@ -38,9 +38,10 @@ return { smart = { multi = { require('plugins.lib.snacks').marks(), - { source = 'buffers', current = false }, + { source = 'buffers', current = false }, 'recent', - { source = 'files', hidden = true }, + { source = 'files', hidden = true }, + { source = 'git_files', untracked = true }, }, }, }, From 97d6553252d1a30e77bae34e9b6dbce3db87a238 Mon Sep 17 00:00:00 2001 From: cjurgell Date: Thu, 17 Jul 2025 16:21:01 -0500 Subject: [PATCH 136/160] mini.files open in buffer cwd --- nvim/lua/plugins/mini.lua | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index 24c6e5d..27066f0 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -175,7 +175,15 @@ return { width_preview = 50, }, } - vim.keymap.set('n', 'nc', files.open, { desc = 'minifiles open' }) + 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) From ac39b0585d46ecf763105fad19f696e4e058d871 Mon Sep 17 00:00:00 2001 From: iofq Date: Fri, 18 Jul 2025 09:36:11 -0500 Subject: [PATCH 137/160] snacks + tabline changes --- flake.nix | 1 + nvim/colors/iofq.lua | 9 ++-- nvim/lua/config/init.lua | 2 + nvim/lua/plugins/completion.lua | 7 +++ nvim/lua/plugins/lib/minidiff_jj.lua | 27 +++++------ nvim/lua/plugins/lib/session_jj.lua | 2 +- nvim/lua/plugins/lib/snacks.lua | 44 +++++++++++++++--- nvim/lua/plugins/lsp.lua | 67 +++++++++++++++------------- nvim/lua/plugins/mini.lua | 24 ++++++---- nvim/lua/plugins/snacks.lua | 5 +-- nvim/lua/plugins/treesitter.lua | 2 - 11 files changed, 120 insertions(+), 70 deletions(-) diff --git a/flake.nix b/flake.nix index 984342b..b752ee4 100644 --- a/flake.nix +++ b/flake.nix @@ -49,6 +49,7 @@ stylua luajitPackages.luacheck alejandra + nvim-dev ]; shellHook = '' # symlink the .luarc.json generated in the overlay diff --git a/nvim/colors/iofq.lua b/nvim/colors/iofq.lua index 5d32f8f..cc9f2ab 100644 --- a/nvim/colors/iofq.lua +++ b/nvim/colors/iofq.lua @@ -385,10 +385,11 @@ hi(0, 'MiniDepsTitle', { link = 'Title' }) hi(0, 'MiniDepsTitleError', { bg = '#e85c51', fg = '#0f1c1e' }) hi(0, 'MiniDepsTitleSame', { link = 'DiffText' }) hi(0, 'MiniDepsTitleUpdate', { bg = '#7aa4a1', fg = '#0f1c1e' }) -hi(0, 'MiniDiffOverAdd', { link = 'DiffAdd' }) -hi(0, 'MiniDiffOverChange', { link = 'DiffText' }) -hi(0, 'MiniDiffOverContext', { link = 'DiffChange' }) -hi(0, 'MiniDiffOverDelete', { link = 'DiffDelete' }) +hi(0, 'MiniDiffOverAdd', { bg = '#31474b' }) +hi(0, 'MiniDiffOverChange', { bg = '#466066' }) +hi(0, 'MiniDiffOverChangeBuf', { bg = '#466066' }) +hi(0, 'MiniDiffOverContext', { bg = '#31474b' }) +hi(0, 'MiniDiffOverDelete', { fg = 'red' }) hi(0, 'MiniDiffSignAdd', { fg = 'green', bold = true }) hi(0, 'MiniDiffSignChange', { fg = 'green', bold = true }) hi(0, 'MiniDiffSignDelete', { fg = 'red', bold = true }) diff --git a/nvim/lua/config/init.lua b/nvim/lua/config/init.lua index a2a90d3..b5b4365 100644 --- a/nvim/lua/config/init.lua +++ b/nvim/lua/config/init.lua @@ -87,6 +87,8 @@ vim.keymap.set('n', '', vim.cmd.bnext, { noremap = true, silent = true }) vim.keymap.set('n', '', vim.cmd.bprev, { noremap = true, silent = true }) vim.keymap.set('v', '<', '', '>gv') +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({ 'v', 'n' }, 'q:', '') vim.keymap.set('n', 'gq', vim.cmd.bdelete, { noremap = true, silent = true, desc = 'close buffer' }) vim.keymap.set('n', 'gQ', function() diff --git a/nvim/lua/plugins/completion.lua b/nvim/lua/plugins/completion.lua index c860619..ad53094 100644 --- a/nvim/lua/plugins/completion.lua +++ b/nvim/lua/plugins/completion.lua @@ -32,6 +32,13 @@ return { snippets = { score_offset = -10, }, + path = { + opts = { + get_cwd = function(_) + return vim.fn.getcwd() + end, + }, + }, ripgrep = { module = 'blink-ripgrep', name = 'rg', diff --git a/nvim/lua/plugins/lib/minidiff_jj.lua b/nvim/lua/plugins/lib/minidiff_jj.lua index c71654f..d5b93d8 100644 --- a/nvim/lua/plugins/lib/minidiff_jj.lua +++ b/nvim/lua/plugins/lib/minidiff_jj.lua @@ -1,7 +1,6 @@ local diff = require('mini.diff') local M = { cache = {}, - jj_cache = {}, } M.get_buf_realpath = function(buf_id) @@ -20,10 +19,10 @@ M.jj_start_watching_tree_state = function(buf_id, path) 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 - return + return false end diff.fail_attach(buf_id) - M.jj_cache[buf_id] = {} + M.cache[buf_id] = {} end) local process, stdout_feed = nil, {} @@ -61,12 +60,11 @@ M.jj_setup_tree_state_watch = function(buf_id, jj_dir_path) timer:stop() timer:start(50, 0, buf_jj_set_ref_text) end - buf_fs_event:start(jj_dir_path, { recursive = false }, watch_tree_state) + buf_fs_event:start(jj_dir_path, { stat = true }, watch_tree_state) - M.jj_invalidate_cache(M.jj_cache[buf_id]) - M.jj_cache[buf_id] = { fs_event = buf_fs_event, timer = timer } + 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 @@ -86,13 +84,13 @@ M.jj_set_ref_text = vim.schedule_wrap(function(buf_id) -- Set local stdout = vim.loop.new_pipe() local spawn_opts = { - args = { 'file', 'show', '--ignore-working-copy', '-r', '@-', './' .. basename }, + args = { 'file', 'show', '--no-pager', '--ignore-working-copy', '-r', '@-', './' .. basename }, cwd = cwd, stdio = { nil, stdout, nil }, } local process, stdout_feed = nil, {} - local on_exit = function(exit_code) + process = vim.loop.spawn('jj', spawn_opts, function(exit_code) process:close() if exit_code ~= 0 or stdout_feed[1] == nil then @@ -102,9 +100,8 @@ M.jj_set_ref_text = vim.schedule_wrap(function(buf_id) -- 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 + end) - process = vim.loop.spawn('jj', spawn_opts, on_exit) M.jj_read_stream(stdout, stdout_feed) end) @@ -132,7 +129,7 @@ end M.gen_source = function() local attach = function(buf_id) -- Try attaching to a buffer only once - if M.jj_cache[buf_id] ~= nil then + if M.cache[buf_id] ~= nil then return false end -- - Possibly resolve symlinks to get data from the original repo @@ -141,13 +138,13 @@ M.gen_source = function() return false end - M.jj_cache[buf_id] = {} + M.cache[buf_id] = {} M.jj_start_watching_tree_state(buf_id, path) end local detach = function(buf_id) - local cache = M.jj_cache[buf_id] - M.jj_cache[buf_id] = nil + local cache = M.cache[buf_id] + M.cache[buf_id] = nil M.jj_invalidate_cache(cache) end diff --git a/nvim/lua/plugins/lib/session_jj.lua b/nvim/lua/plugins/lib/session_jj.lua index ee9bf6a..9fe5cf0 100644 --- a/nvim/lua/plugins/lib/session_jj.lua +++ b/nvim/lua/plugins/lib/session_jj.lua @@ -50,7 +50,7 @@ M.load = function() -- load session (buffers, etc) as well as shada (marks) sessions.read(id) vim.cmd('rshada') - vim.notify('loaded jj session: ' .. id) + Snacks.notify('loaded jj session: ' .. id) end end) else diff --git a/nvim/lua/plugins/lib/snacks.lua b/nvim/lua/plugins/lib/snacks.lua index 8945232..d7fc22a 100644 --- a/nvim/lua/plugins/lib/snacks.lua +++ b/nvim/lua/plugins/lib/snacks.lua @@ -1,10 +1,10 @@ M = {} M.marks = function() - return { - finder = 'vim_marks', - format = 'file', + Snacks.picker.marks { ['local'] = false, - global = true, + on_show = function() + vim.cmd.delmarks { args = { '0-9' } } + end, actions = { markdel = function(picker) for _, item in ipairs(picker:selected()) do @@ -17,10 +17,42 @@ M.marks = function() end, }, win = { - list = { - keys = { ['dd'] = 'markdel' }, + input = { + keys = { [''] = 'markdel' }, }, }, } end +M.diagnostics = function(filter) + Snacks.picker.diagnostics { + filter = filter, + focus = 'list', + format = function(item, picker) + P = require('snacks.picker.format') + local ret = {} ---@type snacks.picker.Highlight[] + vim.list_extend(ret, P.filename(item, picker)) + + local diag = item.item ---@type vim.Diagnostic + if item.severity then + vim.list_extend(ret, P.severity(item, picker)) + end + + local message = diag.message + ret[#ret + 1] = { message } + Snacks.picker.highlight.markdown(ret) + ret[#ret + 1] = { ' ' } + + if diag.source then + ret[#ret + 1] = { diag.source, 'SnacksPickerDiagnosticSource' } + ret[#ret + 1] = { ' ' } + end + + if diag.code then + ret[#ret + 1] = { ('(%s)'):format(diag.code), 'SnacksPickerDiagnosticCode' } + ret[#ret + 1] = { ' ' } + end + return ret + end, + } +end return M diff --git a/nvim/lua/plugins/lsp.lua b/nvim/lua/plugins/lsp.lua index 2d3f6ea..88e4cb6 100644 --- a/nvim/lua/plugins/lsp.lua +++ b/nvim/lua/plugins/lsp.lua @@ -1,29 +1,22 @@ return { - { - 'folke/trouble.nvim', - event = 'VeryLazy', - opts = { - pinned = true, - focus = true, - follow = false, - auto_close = false, - win = { - size = 0.33, - position = 'right', - type = 'split', - }, - }, - keys = { - { - 'gre', - 'Trouble diagnostics toggle', - desc = 'Trouble diagnostics', - }, - }, - }, { 'neovim/nvim-lspconfig', event = 'VeryLazy', + dependencies = { + 'folke/trouble.nvim', + event = 'VeryLazy', + opts = { + pinned = true, + focus = true, + follow = false, + auto_close = false, + win = { + size = 0.33, + position = 'right', + type = 'split', + }, + }, + }, config = function() vim.lsp.enable { 'nil_ls', @@ -40,23 +33,35 @@ return { return end vim.keymap.set('n', 'grg', 'Trouble lsp toggle', { buffer = ev.buf, desc = 'Trouble LSP' }) - vim.keymap.set( - 'n', - 'gO', - 'Trouble lsp_document_symbols win.position=left', - { buffer = ev.buf, desc = 'Trouble LSP symbols' } - ) - vim.keymap.set('n', 'grd', function() + + vim.keymap.set('n', 'gO', function() + Snacks.picker.lsp_symbols { focus = 'list' } + end, { buffer = ev.buf, desc = 'LSP symbols' }) + vim.keymap.set('n', '', function() Snacks.picker.lsp_definitions { focus = 'list' } end, { buffer = ev.buf, desc = 'LSP definition' }) + vim.keymap.set('n', 'grt', function() + Snacks.picker.lsp_type_definitions { focus = 'list' } + end, { buffer = ev.buf, desc = 'LSP type definition' }) vim.keymap.set('n', 'grr', function() Snacks.picker.lsp_references { focus = 'list' } - end, { buffer = ev.buf, desc = 'LSP definition' }) + end, { buffer = ev.buf, desc = 'LSP refrences' }) + vim.keymap.set('n', 'gri', function() + Snacks.picker.lsp_implementations { focus = 'list' } + end, { buffer = ev.buf, desc = 'LSP implementations' }) + 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() + require('plugins.lib.snacks').diagnostics { buf = true } + end, { buffer = ev.buf, desc = 'LSP buffer diagnostics' }) + vim.keymap.set('n', 'grE', function() + require('plugins.lib.snacks').diagnostics { cwd = false } + end, { buffer = ev.buf, desc = 'LSP diagnostics' }) + -- Auto-refresh code lenses if client.server_capabilities.codeLensProvider then vim.api.nvim_create_autocmd({ 'InsertLeave', 'TextChanged' }, { @@ -81,6 +86,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)) end, mode = { 'n', 'x' }, desc = 'toggle buffer formatting', @@ -89,6 +95,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)) end, mode = { 'n', 'x' }, desc = 'toggle global formatting', diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index 27066f0..5b8f301 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -50,6 +50,17 @@ return { require('mini.tabline').setup { tabpage_section = 'right', show_icons = false, + format = function(buf_id, label) -- show global marks in tab + local default = MiniTabline.default_format(buf_id, label) + for _, mark in ipairs(vim.fn.getmarklist()) do + if mark.pos[1] == buf_id then + if mark.mark:match("^'[A-Z]$") then + return ' [' .. mark.mark:sub(2) .. ']' .. default + end + end + end + return default + end, } require('mini.statusline').setup { content = { @@ -175,15 +186,10 @@ return { 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.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) diff --git a/nvim/lua/plugins/snacks.lua b/nvim/lua/plugins/snacks.lua index 730a4f6..9c62be3 100644 --- a/nvim/lua/plugins/snacks.lua +++ b/nvim/lua/plugins/snacks.lua @@ -37,7 +37,7 @@ return { }, smart = { multi = { - require('plugins.lib.snacks').marks(), + 'marks', { source = 'buffers', current = false }, 'recent', { source = 'files', hidden = true }, @@ -178,8 +178,7 @@ return { { 'fm', function() - vim.cmd.delmarks { args = { '0-9' } } - Snacks.picker.pick(require('plugins.lib.snacks').marks()) + require('plugins.lib.snacks').marks() end, desc = 'pick global marks', }, diff --git a/nvim/lua/plugins/treesitter.lua b/nvim/lua/plugins/treesitter.lua index ddb5da9..51efd4d 100644 --- a/nvim/lua/plugins/treesitter.lua +++ b/nvim/lua/plugins/treesitter.lua @@ -32,12 +32,10 @@ return { goto_next_start = { [']a'] = '@parameter.inner', [']f'] = '@function.outer', - [']t'] = '@statement.outer', }, goto_previous_start = { ['[a'] = '@parameter.inner', ['[f'] = '@function.outer', - ['[t'] = '@statement.outer', }, }, swap = { From ec4206b55a5ce8f78dc19d31ed7f9be9a4d9f9a2 Mon Sep 17 00:00:00 2001 From: iofq Date: Mon, 21 Jul 2025 23:41:37 -0500 Subject: [PATCH 138/160] flake.lock: Update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'neovim-nightly-overlay': 'github:nix-community/neovim-nightly-overlay/a4252dd30a64aef3fa59ad1f9ded862381df117a' (2025-07-06) → 'github:nix-community/neovim-nightly-overlay/e63079523e06e0b7d8d766d40573409d2c5ecc9d' (2025-07-21) • Updated input 'neovim-nightly-overlay/hercules-ci-effects': 'github:hercules-ci/hercules-ci-effects/231726642197817d20310b9d39dd4afb9e899489?narHash=sha256-EaAJhwfJGBncgIV/0NlJviid2DP93cTMc9h0q6P6xXk%3D' (2025-05-23) → 'github:hercules-ci/hercules-ci-effects/5f2e09654b2e70ba643e41609d9f9b6640f22113?narHash=sha256-CNBgr4OZSuklGtNOa9CnTNo9%2BXceqn/EDAC1Tc43fH8%3D' (2025-07-15) • Updated input 'neovim-nightly-overlay/hercules-ci-effects/flake-parts': 'github:hercules-ci/flake-parts/c621e8422220273271f52058f618c94e405bb0f5?narHash=sha256-hIshGgKZCgWh6AYJpJmRgFdR3WUbkY04o82X05xqQiY%3D' (2025-04-01) → 'github:hercules-ci/flake-parts/77826244401ea9de6e3bac47c2db46005e1f30b5?narHash=sha256-Tyw1RjYEsp5scoigs1384gIg6e0GoBVjms4aXFfRssQ%3D' (2025-07-01) • Updated input 'neovim-nightly-overlay/neovim-src': 'github:neovim/neovim/8fe4e120a2de558fddbb91ba5438d78f3dbd926a?narHash=sha256-z2PkkcUBuO5IWQrra034YBl8ioerkHXHai9GCeoaRuM%3D' (2025-07-05) → 'github:neovim/neovim/8ee82da3cfd228d50816aeb5f5db22175f5a4ede?narHash=sha256-VHCJ/E%2B3iI5pH20rW%2Baqq830erPrAzTfOT8Wndax2pI%3D' (2025-07-20) • Updated input 'neovim-nightly-overlay/nixpkgs': 'github:NixOS/nixpkgs/c860cf0b3a0829f0f6cf344ca8de83a2bbfab428?narHash=sha256-4E7wWftF1ExK5ZEDzj41%2B9mVgxtuRV3wWCId7QAYMAU%3D' (2025-07-04) → 'github:NixOS/nixpkgs/6b4955211758ba47fac850c040a27f23b9b4008f?narHash=sha256-dPALCtmik9Wr14MGqVXm%2BOQcv7vhPBXcWNIOThGnB/Q%3D' (2025-07-19) • Updated input 'neovim-nightly-overlay/treefmt-nix': 'github:numtide/treefmt-nix/ac8e6f32e11e9c7f153823abc3ab007f2a65d3e1?narHash=sha256-0IEdQB1nS%2BuViQw4k3VGUXntjkDp7aAlqcxdewb/hAc%3D' (2025-06-26) → 'github:numtide/treefmt-nix/421b56313c65a0815a52b424777f55acf0b56ddf?narHash=sha256-tzbhc4XttkyEhswByk5R38l%2BztN9UDbnj0cTcP6Hp9A%3D' (2025-07-20) • Updated input 'nixpkgs': 'github:NixOS/nixpkgs/27d6791b2e2a167105e8545fc92ee0edabe4a9e5' (2025-07-06) → 'github:NixOS/nixpkgs/78fcdb5d8e08a2d449739aa4796417f2e6cf5724' (2025-07-22) --- flake.lock | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/flake.lock b/flake.lock index fc621e7..9d0c7b0 100644 --- a/flake.lock +++ b/flake.lock @@ -96,11 +96,11 @@ ] }, "locked": { - "lastModified": 1743550720, - "narHash": "sha256-hIshGgKZCgWh6AYJpJmRgFdR3WUbkY04o82X05xqQiY=", + "lastModified": 1751413152, + "narHash": "sha256-Tyw1RjYEsp5scoigs1384gIg6e0GoBVjms4aXFfRssQ=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "c621e8422220273271f52058f618c94e405bb0f5", + "rev": "77826244401ea9de6e3bac47c2db46005e1f30b5", "type": "github" }, "original": { @@ -247,11 +247,11 @@ ] }, "locked": { - "lastModified": 1748000383, - "narHash": "sha256-EaAJhwfJGBncgIV/0NlJviid2DP93cTMc9h0q6P6xXk=", + "lastModified": 1752595130, + "narHash": "sha256-CNBgr4OZSuklGtNOa9CnTNo9+Xceqn/EDAC1Tc43fH8=", "owner": "hercules-ci", "repo": "hercules-ci-effects", - "rev": "231726642197817d20310b9d39dd4afb9e899489", + "rev": "5f2e09654b2e70ba643e41609d9f9b6640f22113", "type": "github" }, "original": { @@ -287,10 +287,10 @@ "treefmt-nix": "treefmt-nix" }, "locked": { - "lastModified": 1751797218, + "lastModified": 1753116172, "owner": "nix-community", "repo": "neovim-nightly-overlay", - "rev": "a4252dd30a64aef3fa59ad1f9ded862381df117a", + "rev": "e63079523e06e0b7d8d766d40573409d2c5ecc9d", "type": "github" }, "original": { @@ -302,11 +302,11 @@ "neovim-src": { "flake": false, "locked": { - "lastModified": 1751757526, - "narHash": "sha256-z2PkkcUBuO5IWQrra034YBl8ioerkHXHai9GCeoaRuM=", + "lastModified": 1753055671, + "narHash": "sha256-VHCJ/E+3iI5pH20rW+aqq830erPrAzTfOT8Wndax2pI=", "owner": "neovim", "repo": "neovim", - "rev": "8fe4e120a2de558fddbb91ba5438d78f3dbd926a", + "rev": "8ee82da3cfd228d50816aeb5f5db22175f5a4ede", "type": "github" }, "original": { @@ -317,11 +317,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1751625545, - "narHash": "sha256-4E7wWftF1ExK5ZEDzj41+9mVgxtuRV3wWCId7QAYMAU=", + "lastModified": 1752900028, + "narHash": "sha256-dPALCtmik9Wr14MGqVXm+OQcv7vhPBXcWNIOThGnB/Q=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "c860cf0b3a0829f0f6cf344ca8de83a2bbfab428", + "rev": "6b4955211758ba47fac850c040a27f23b9b4008f", "type": "github" }, "original": { @@ -361,10 +361,10 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1751812998, + "lastModified": 1753159279, "owner": "NixOS", "repo": "nixpkgs", - "rev": "27d6791b2e2a167105e8545fc92ee0edabe4a9e5", + "rev": "78fcdb5d8e08a2d449739aa4796417f2e6cf5724", "type": "github" }, "original": { @@ -405,11 +405,11 @@ ] }, "locked": { - "lastModified": 1750931469, - "narHash": "sha256-0IEdQB1nS+uViQw4k3VGUXntjkDp7aAlqcxdewb/hAc=", + "lastModified": 1753006367, + "narHash": "sha256-tzbhc4XttkyEhswByk5R38l+ztN9UDbnj0cTcP6Hp9A=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "ac8e6f32e11e9c7f153823abc3ab007f2a65d3e1", + "rev": "421b56313c65a0815a52b424777f55acf0b56ddf", "type": "github" }, "original": { From d7ae87e67182f5fdd00cc08b61efa3436abf9a7b Mon Sep 17 00:00:00 2001 From: iofq Date: Mon, 21 Jul 2025 23:53:08 -0500 Subject: [PATCH 139/160] nixfmt, callHierarchy --- nix/neovim-overlay.nix | 2 +- nvim/lua/plugins/lsp.lua | 20 +++++++-- nvim/lua/plugins/treesitter.lua | 75 ++++++++++++++++----------------- 3 files changed, 55 insertions(+), 42 deletions(-) diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index f95bed6..1b83895 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -47,7 +47,7 @@ let yamllint jq hadolint - alejandra + nixfmt shellcheck # LSPs diff --git a/nvim/lua/plugins/lsp.lua b/nvim/lua/plugins/lsp.lua index 88e4cb6..c6c1c56 100644 --- a/nvim/lua/plugins/lsp.lua +++ b/nvim/lua/plugins/lsp.lua @@ -62,6 +62,13 @@ return { require('plugins.lib.snacks').diagnostics { cwd = false } 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.server_capabilities.codeLensProvider then vim.api.nvim_create_autocmd({ 'InsertLeave', 'TextChanged' }, { @@ -108,7 +115,7 @@ return { puppet = { 'puppet-lint' }, lua = { 'stylua' }, python = { 'ruff' }, - nix = { 'alejandra' }, + nix = { 'nixfmt' }, fish = { 'fish_indent' }, ['*'] = { 'trim_whitespace' }, }, @@ -117,7 +124,7 @@ return { if vim.g.disable_autoformat or vim.b[bufnr].disable_autoformat then return end - return { timeout_ms = 500, lsp_format = 'last' } + return { timeout_ms = 1500, lsp_format = 'fallback' } end, default_format_opts = { timeout_ms = 1500, @@ -141,7 +148,14 @@ return { nix = { 'nix' }, php = { 'php' }, } - vim.api.nvim_command('au BufWritePost * lua require("lint").try_lint()') + 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() + end + end, + }) end, }, } diff --git a/nvim/lua/plugins/treesitter.lua b/nvim/lua/plugins/treesitter.lua index 51efd4d..cb8bbb1 100644 --- a/nvim/lua/plugins/treesitter.lua +++ b/nvim/lua/plugins/treesitter.lua @@ -1,54 +1,53 @@ return { { - 'nvim-treesitter/nvim-treesitter', - event = 'VeryLazy', + "nvim-treesitter/nvim-treesitter", + event = "VeryLazy", dependencies = { { - 'nvim-treesitter/nvim-treesitter-context', + "nvim-treesitter/nvim-treesitter-context", opts = { max_lines = 2, min_window_height = 50, }, }, - 'nvim-treesitter/nvim-treesitter-textobjects', - 'RRethy/nvim-treesitter-textsubjects', + "nvim-treesitter/nvim-treesitter-textobjects", + "RRethy/nvim-treesitter-textsubjects", }, - config = function() - require('nvim-treesitter.configs').setup { - ensure_installed = {}, - auto_install = false, - highlight = { + main = "nvim-treesitter.configs", + opts = { + ensure_installed = {}, + auto_install = false, + highlight = { + enable = true, + }, + indent = { + enable = true, + }, + matchup = { + enable = true, + }, + textobjects = { + move = { enable = true, - }, - indent = { - enable = true, - }, - matchup = { - enable = true, - }, - textobjects = { - move = { - enable = true, - goto_next_start = { - [']a'] = '@parameter.inner', - [']f'] = '@function.outer', - }, - goto_previous_start = { - ['[a'] = '@parameter.inner', - ['[f'] = '@function.outer', - }, + goto_next_start = { + ["]a"] = "@parameter.inner", + ["]f"] = "@function.outer", }, - swap = { - enable = true, - swap_next = { - ['a]'] = '@parameter.inner', - }, - swap_previous = { - ['a['] = '@parameter.inner', - }, + goto_previous_start = { + ["[a"] = "@parameter.inner", + ["[f"] = "@function.outer", }, }, - } - end, + swap = { + enable = true, + swap_next = { + ["a]"] = "@parameter.inner", + }, + swap_previous = { + ["a["] = "@parameter.inner", + }, + }, + }, + }, }, } From 9457c7436e0632d2c4d838fa3cc3ab171aaf259d Mon Sep 17 00:00:00 2001 From: iofq Date: Wed, 23 Jul 2025 23:04:03 -0500 Subject: [PATCH 140/160] custom dart tabline --- ...estingstuffalotofstuffreallywellohyeah.txt | 0 nvim/colors/iofq.lua | 16 +- nvim/lua/config/init.lua | 31 +- nvim/lua/plugins/completion.lua | 8 +- nvim/lua/plugins/lib/dart.lua | 361 ++++++++++++++++++ nvim/lua/plugins/lib/session_jj.lua | 2 +- nvim/lua/plugins/lib/snacks.lua | 5 +- nvim/lua/plugins/lib/snacks_jj.lua | 4 +- nvim/lua/plugins/lsp.lua | 4 +- nvim/lua/plugins/mini.lua | 21 +- nvim/lua/plugins/misc.lua | 6 +- nvim/lua/plugins/snacks.lua | 17 +- 12 files changed, 424 insertions(+), 51 deletions(-) create mode 100644 123reallinglongfilenamefortestingstuffalotofstuffreallywellohyeah.txt create mode 100644 nvim/lua/plugins/lib/dart.lua diff --git a/123reallinglongfilenamefortestingstuffalotofstuffreallywellohyeah.txt b/123reallinglongfilenamefortestingstuffalotofstuffreallywellohyeah.txt new file mode 100644 index 0000000..e69de29 diff --git a/nvim/colors/iofq.lua b/nvim/colors/iofq.lua index cc9f2ab..2f1ce70 100644 --- a/nvim/colors/iofq.lua +++ b/nvim/colors/iofq.lua @@ -426,8 +426,8 @@ hi(0, 'MiniMapSymbolCount', { link = 'Special' }) hi(0, 'MiniMapSymbolLine', { link = 'Title' }) hi(0, 'MiniMapSymbolView', { link = 'Delimiter' }) hi(0, 'MiniNotifyBorder', { link = 'FloatBorder' }) -hi(0, 'MiniNotifyNormal', { link = 'NormalFloat' }) -hi(0, 'MiniNotifyTitle', { link = 'FloatTitle' }) +hi(0, 'MiniNotifyNormal', { link = 'Normal' }) +hi(0, 'MiniNotifyTitle', { link = 'Title' }) hi(0, 'MiniOperatorsExchangeFrom', { link = 'IncSearch' }) hi(0, 'MiniPickBorder', { link = 'FloatBorder' }) hi(0, 'MiniPickBorderBusy', { link = 'DiagnosticFloatingWarn' }) @@ -463,13 +463,13 @@ hi(0, 'MiniStatuslineModeReplace', { bg = '#e85c51', bold = true, fg = '#0f1c1e' hi(0, 'MiniStatuslineModeVisual', { bg = '#ad5c7c', bold = true, fg = '#0f1c1e' }) hi(0, 'MiniSurround', { link = 'IncSearch' }) hi(0, 'MiniTablineCurrent', { bg = '#2d4f56', bold = true, fg = '#cbd9d8' }) -hi(0, 'MiniTablineFill', { link = 'TabLineFill' }) -hi(0, 'MiniTablineHidden', { bg = '#1d3337', fg = '#587b7b' }) -hi(0, 'MiniTablineModifiedCurrent', { bg = '#cbd9d8', bold = true, fg = '#2d4f56' }) -hi(0, 'MiniTablineModifiedHidden', { bg = '#587b7b', fg = '#1d3337' }) -hi(0, 'MiniTablineModifiedVisible', { bg = '#cbd9d8', fg = '#1d3337' }) -hi(0, 'MiniTablineTabpagesection', { bg = '#152528', bold = true, fg = '#e6eaea' }) +hi(0, 'MiniTablineModifiedCurrent', { bg = '#688888', bold = true, fg = '#1d3337' }) hi(0, 'MiniTablineVisible', { bg = '#1d3337', fg = '#cbd9d8' }) +hi(0, 'MiniTablineModifiedVisible', { bg = '#587b7b', fg = '#1d3337' }) +hi(0, 'MiniTablineTabpagesection', { bg = '#152528', bold = true, fg = '#e6eaea' }) +hi(0, 'MiniTablineFill', { link = 'TabLineFill' }) +-- hi(0, 'MiniTablineHidden', { bg = '#1d3337', fg = '#587b7b' }) +-- hi(0, 'MiniTablineModifiedHidden', { bg = '#587b7b', fg = '#1d3337' }) hi(0, 'MiniTestEmphasis', { bold = true }) hi(0, 'MiniTestFail', { bold = true, fg = '#e85c51' }) hi(0, 'MiniTestPass', { bold = true, fg = '#7aa4a1' }) diff --git a/nvim/lua/config/init.lua b/nvim/lua/config/init.lua index b5b4365..a331e13 100644 --- a/nvim/lua/config/init.lua +++ b/nvim/lua/config/init.lua @@ -1,27 +1,28 @@ vim.opt.autowrite = true + vim.opt.backspace = 'indent,eol,start' vim.opt.confirm = true vim.opt.completeopt = { 'menu', 'menuone', 'noselect' } vim.opt.cmdheight = 1 vim.opt.diffopt = 'internal,filler,closeoff,inline:char' -vim.opt.expandtab = true -- insert tabs as spaces +vim.opt.expandtab = true -- insert tabs as spaces vim.o.foldenable = true vim.o.foldmethod = 'expr' -- use tree-sitter for folding method vim.o.foldexpr = 'v:lua.vim.treesitter.foldexpr()' vim.o.foldlevelstart = 99 -vim.opt.inccommand = 'split' -- incremental live completion +vim.opt.inccommand = 'split' -- incremental live completion vim.opt.list = true vim.opt.nrformats:append('alpha') -- let Ctrl-a do letters as well -vim.opt.path:append('**') -- enable fuzzy :find ing +vim.opt.path:append('**') -- enable fuzzy :find ing vim.opt.relativenumber = true -vim.opt.shadafile = 'NONE' -- disable shada -vim.opt.shiftwidth = 0 -- >> shifts by tabstop -vim.opt.showmatch = true -- highlight matching brackets +vim.opt.shadafile = 'NONE' -- disable shada +vim.opt.shiftwidth = 0 -- >> shifts by tabstop +vim.opt.showmatch = true -- highlight matching brackets vim.opt.signcolumn = 'no' -vim.opt.softtabstop = -1 -- backspace removes tabstop +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.tabstop = 2 -- 2 space tabs are based +vim.opt.updatetime = 250 -- decrease update time vim.opt.virtualedit = 'onemore' vim.opt.winborder = 'single' vim.cmd('colorscheme iofq') @@ -83,18 +84,24 @@ vim.api.nvim_create_autocmd({ 'FileType' }, { -- random keymaps vim.keymap.set({ 'v', 'i' }, 'wq', 'l', { noremap = true, silent = true }) -vim.keymap.set('n', '', vim.cmd.bnext, { noremap = true, silent = true }) -vim.keymap.set('n', '', vim.cmd.bprev, { noremap = true, silent = true }) +vim.keymap.set({ 'v', 'n' }, 'q:', '') 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({ 'v', 'n' }, 'q:', '') 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' }) +-- custom tabline +local dart = require('plugins.lib.dart') +dart.setup() + -- resize splits if window got resized vim.api.nvim_create_autocmd({ 'VimResized' }, { group = vim.api.nvim_create_augroup('resize_splits', { clear = true }), diff --git a/nvim/lua/plugins/completion.lua b/nvim/lua/plugins/completion.lua index ad53094..f084dba 100644 --- a/nvim/lua/plugins/completion.lua +++ b/nvim/lua/plugins/completion.lua @@ -63,8 +63,8 @@ return { draw = { treesitter = { 'lsp' }, columns = { - { 'label', 'label_description', gap = 1 }, - { 'source_name', 'kind', gap = 1 }, + { 'label', 'label_description', gap = 1 }, + { 'source_name', 'kind', gap = 1 }, }, }, }, @@ -79,5 +79,9 @@ return { }, }, }, + config = function(_, opts) + require('blink.cmp').setup(opts) + vim.treesitter.language.register('markdown', 'blink-cmp-documentation') + end, }, } diff --git a/nvim/lua/plugins/lib/dart.lua b/nvim/lua/plugins/lib/dart.lua new file mode 100644 index 0000000..af00bf6 --- /dev/null +++ b/nvim/lua/plugins/lib/dart.lua @@ -0,0 +1,361 @@ +local Dart = {} +local M = {} + +-- table of {bufnr = int, mark = string} +M.state = {} + +Dart.setup = function(config) + config = M.setup_config(config) + M.apply_config(config) + M.create_autocommands() + M.create_default_hl() + + _G.Dart = Dart +end + +M.config = { + -- list of characters to use to mark 'pinned' buffers + -- the characters will be chosen for new pins in order + marklist = { 'a', 's', 'd', 'f', 'q', 'w', 'e', 'r' }, + -- list of characters to use to mark recent buffers + -- we track the last #buflist opened buffers to display on the left side of the tabline + buflist = { 'z', 'x', 'c' }, + + mappings = { + mark = 'mm', + jump = 'm', + pick = 'mp', + next = '', + prev = '', + }, +} + +M.setup_config = function(config) + M.config = vim.tbl_deep_extend('force', M.config, config or {}) + return M.config +end + +M.apply_config = function(config) + -- built list of all marks (buf + pin) to sort tabline by + M.order = {} + for i, key in ipairs(vim.list_extend(vim.deepcopy(config.buflist), config.marklist)) do + M.order[key] = i + end + + vim.opt.showtabline = 2 + vim.opt.tabline = '%!v:lua.Dart.gen_tabline()' + + -- setup keymaps + local function map(mode, lhs, rhs, opts) + if lhs == '' then + return + end + opts = vim.tbl_deep_extend('force', { silent = true }, opts or {}) + vim.keymap.set(mode, lhs, rhs, opts) + end + + map('n', config.mappings.mark, Dart.mark, { desc = 'Dart: mark current buffer' }) + map('n', config.mappings.jump, function() + Dart.jump(vim.fn.getcharstr()) + end, { desc = 'Dart: jump to buffer' }) + map('n', config.mappings.pick, Dart.pick, { desc = 'Dart: pick buffer' }) + map('n', config.mappings.next, Dart.next, { desc = 'Dart: next buffer' }) + map('n', config.mappings.prev, Dart.prev, { desc = 'Dart: prev buffer' }) +end + +M.create_autocommands = function() + local group = vim.api.nvim_create_augroup('Dart', {}) + + -- cleanup deleted buffers + vim.api.nvim_create_autocmd('BufDelete', { + group = group, + callback = function(args) + M.del_by_bufnr(args.buf) + end, + }) + + -- track last n opened buffers + vim.api.nvim_create_autocmd({ 'BufWinEnter', 'BufAdd' }, { + group = group, + callback = function(args) + M.shift_buflist(args.buf) + end, + }) + + -- Clickable tabs + vim.api.nvim_exec2( + [[function! SwitchBuffer(buf_id, clicks, button, mod) + execute 'buffer' a:buf_id + endfunction]], + {} + ) +end + +-- Use Mini Tabline for default highlights, since it's well supported by many colorschemes +-- override the foreground for labels to be more visible +M.create_default_hl = function() + local set_default_hl = function(name, opts) + opts.default = true + vim.api.nvim_set_hl(0, name, opts) + end + + local override_label = function(hl, link) + local prev = vim.api.nvim_get_hl(0, { name = link }) + vim.api.nvim_set_hl(0, hl, { bg = prev.bg, fg = 'orange', bold = true }) + end + + -- Current selection + set_default_hl('DartCurrent', { link = 'MiniTablineCurrent' }) + override_label('DartCurrentLabel', 'MiniTablineCurrent') + + -- Current selection if modified + set_default_hl('DartCurrentModified', { link = 'MiniTablineModifiedCurrent' }) + override_label('DartCurrentLabelModified', 'MiniTablineModifiedCurrent') + + -- Visible but not selected + set_default_hl('DartVisible', { link = 'MiniTablineVisible' }) + override_label('DartVisibleLabel', 'MiniTablineVisible') + + -- Visible and modified but not selected + set_default_hl('DartVisibleModified', { link = 'MiniTablineModifiedVisible' }) + override_label('DartVisibleLabelModified', 'MiniTablineModifiedVisible') + + -- Fill + set_default_hl('DartFill', { link = 'MiniTablineFill' }) +end + +M.get_state_by_field = function(field, value) + for _, m in ipairs(M.state) do + if m[field] == value then + return m + end + end +end + +M.state_from_bufnr = function(bufnr) + return M.get_state_by_field('bufnr', bufnr) +end + +M.state_from_mark = function(mark) + return M.get_state_by_field('mark', mark) +end + +M.del_by_bufnr = function(bufnr) + for i, m in ipairs(M.state) do + if m.bufnr == bufnr then + table.remove(M.state, i) + return + end + end +end + +M.should_show = function(bufnr) + return vim.api.nvim_buf_is_valid(bufnr) -- buffer exists and is loaded + and vim.api.nvim_buf_is_loaded(bufnr) + and vim.bo[bufnr].buflisted -- don't show hidden buffers + and vim.bo[bufnr].buftype == '' -- don't show pickers, prompts, etc. + and vim.api.nvim_buf_get_name(bufnr) ~= '' -- don't show unnamed files +end + +M.next_unused_mark = function() + for _, m in ipairs(M.config.marklist) do + if not M.state_from_mark(m) then + return m + end + end + return 'Z' +end + +M.shift_buflist = function(bufnr) + if M.state_from_bufnr(bufnr) or not M.should_show(bufnr) then + return + end + + local buflist = M.config.buflist + + -- if there's a free buflist mark, set it + for _, mark in ipairs(buflist) do + if not M.state_from_mark(mark) then + M.mark(bufnr, mark) + return + end + end + + -- if not, shift buflist right and set new buffer to element 1 + for i = #buflist, 2, -1 do + local mark = M.state_from_mark(buflist[i]) + local next = M.state_from_mark(buflist[i - 1]) + mark.bufnr = next.bufnr + end + M.state_from_mark(buflist[1]).bufnr = bufnr +end + +-- param direction -1 for prev, 1 for next +M.cycle_tabline = function(direction) + local cur = vim.api.nvim_get_current_buf() + for i, m in ipairs(M.state) do + if cur == m.bufnr then + local next = ((i + direction - 1) % #M.state) + 1 -- wrap around list + if M.state[next] then + vim.api.nvim_set_current_buf(M.state[next].bufnr) + return + end + end + end +end + +M.gen_tabpage = function() + local n_tabpages = vim.fn.tabpagenr('$') + if n_tabpages == 1 then + return '' + end + return string.format('%%= Tab %d/%d ', vim.fn.tabpagenr(), n_tabpages) +end + +M.gen_tabline_item = function(item) + local bufnr = item.bufnr + local filename = vim.fn.fnamemodify(vim.api.nvim_buf_get_name(bufnr), ':t') + local is_current = bufnr == vim.api.nvim_get_current_buf() + local modified = vim.bo[bufnr].modified and 'Modified' or '' + + local hl_label = is_current and 'DartCurrentLabel' or 'DartVisibleLabel' + local label = item.mark ~= '' and item.mark .. ' ' or '' + local hl = is_current and 'DartCurrent' or 'DartVisible' + local content = filename ~= '' and filename or '*' + + return { + bufnr = bufnr, + hl_label = hl_label .. modified, + label = label, + hl = hl .. modified, + content = content, + } +end + +M.format_tabline_item = function(item) + local click = string.format('%%%s@SwitchBuffer@', item.bufnr) + return string.format('%%#%s#%s %s%%#%s#%s %%X', item.hl_label, click, item.label, item.hl, item.content) +end + +M.mark = function(bufnr, mark) + if not bufnr then + bufnr = vim.api.nvim_get_current_buf() + end + if not M.should_show(bufnr) then + return + end + if not mark then + mark = M.next_unused_mark() + end + + local exists = M.state_from_bufnr(bufnr) + if not exists then + table.insert(M.state, { bufnr = bufnr, mark = mark }) + elseif vim.tbl_contains(M.config.buflist, exists.mark) then + exists.mark = mark -- allow for re-marking buffers in the buflist + else + return -- skip sort if no change + end + table.sort(M.state, function(a, b) + return (M.order[a.mark] or 998) < (M.order[b.mark] or 999) + end) + vim.cmd.redrawtabline() +end + +Dart.state = M.state +Dart.mark = M.mark + +Dart.jump = function(mark) + local m = M.state_from_mark(mark) + if m and m.bufnr then + vim.api.nvim_set_current_buf(m.bufnr) + end +end + +Dart.pick = function() + local prompt = { 'Jump to buffer:' } + for _, mark in ipairs(M.state) do + local name = vim.fn.fnamemodify(vim.api.nvim_buf_get_name(mark.bufnr), ':t') + table.insert(prompt, string.format(' %s → %s', mark.mark, name)) + end + + local selected = vim.fn.input(table.concat(prompt, '\n') .. '\n> ') + Dart.jump(selected) +end + +Dart.next = function() + M.cycle_tabline(1) +end + +Dart.prev = function() + M.cycle_tabline(-1) +end + +Dart.gen_tabline = function() + local items = {} + local center = 1 + local cur = vim.api.nvim_get_current_buf() + local columns = vim.o.columns + + for i, m in ipairs(M.state) do + if M.should_show(m.bufnr) then + table.insert(items, M.gen_tabline_item(m)) + if m.bufnr == cur then + center = i + end + else + M.del_by_bufnr(m.bufnr) + end + end + + local function width(tabline) + return vim.api.nvim_strwidth(table.concat( + vim.tbl_map(function(m) + return string.format(' %s %s ', m.label, m.content) + end, tabline), + '' + )) + 3 -- save room for trunc + end + + local result = { items[center] } + local left = center - 1 + local right = center + 1 + local trunc_left = false + local trunc_right = false + + while left >= 1 or right <= #items do + local added = false + + if left >= 1 then + table.insert(result, 1, items[left]) + if width(result) >= columns then + table.remove(result, 1) + trunc_left = true + else + left = left - 1 + added = true + end + end + if right <= #items then + table.insert(result, items[right]) + if width(result) >= columns then + table.remove(result) + trunc_right = true + else + right = right + 1 + added = true + end + end + if not added then + break + end + end + + return (trunc_left and '%#DartVisibleLabel# < ' or '') + .. table.concat(vim.tbl_map(M.format_tabline_item, result), '') + .. (trunc_right and '%#DartVisibleLabel# > ' or '') + .. '%X%#DartFill#' + .. M.gen_tabpage() +end + +return Dart diff --git a/nvim/lua/plugins/lib/session_jj.lua b/nvim/lua/plugins/lib/session_jj.lua index 9fe5cf0..ee9bf6a 100644 --- a/nvim/lua/plugins/lib/session_jj.lua +++ b/nvim/lua/plugins/lib/session_jj.lua @@ -50,7 +50,7 @@ M.load = function() -- load session (buffers, etc) as well as shada (marks) sessions.read(id) vim.cmd('rshada') - Snacks.notify('loaded jj session: ' .. id) + vim.notify('loaded jj session: ' .. id) end end) else diff --git a/nvim/lua/plugins/lib/snacks.lua b/nvim/lua/plugins/lib/snacks.lua index d7fc22a..4791c61 100644 --- a/nvim/lua/plugins/lib/snacks.lua +++ b/nvim/lua/plugins/lib/snacks.lua @@ -4,10 +4,11 @@ M.marks = function() ['local'] = false, on_show = function() vim.cmd.delmarks { args = { '0-9' } } + vim.cmd.delmarks { args = { '"' } } end, actions = { markdel = function(picker) - for _, item in ipairs(picker:selected()) do + for _, item in ipairs(picker:selected { fallback = true }) do vim.cmd.delmarks { args = { item.label } } end vim.cmd('wshada') @@ -18,7 +19,7 @@ M.marks = function() }, win = { input = { - keys = { [''] = 'markdel' }, + keys = { [''] = { 'markdel', mode = { 'n', 'i' } } }, }, }, } diff --git a/nvim/lua/plugins/lib/snacks_jj.lua b/nvim/lua/plugins/lib/snacks_jj.lua index 33a71e0..da442eb 100644 --- a/nvim/lua/plugins/lib/snacks_jj.lua +++ b/nvim/lua/plugins/lib/snacks_jj.lua @@ -60,12 +60,12 @@ function M.revs() picker:close() if item then if not item.rev then - Snacks.notify.warn('No branch or commit found', { title = 'Snacks Picker' }) + 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() - Snacks.notify('Checking out revision: ' .. item.rev, { title = 'Snacks Picker' }) + vim.notify('Checking out revision: ' .. item.rev, { title = 'Snacks Picker' }) vim.cmd.checktime() require('plugins.lib.session_jj').load() end, { cwd = item.cwd }) diff --git a/nvim/lua/plugins/lsp.lua b/nvim/lua/plugins/lsp.lua index c6c1c56..f077c71 100644 --- a/nvim/lua/plugins/lsp.lua +++ b/nvim/lua/plugins/lsp.lua @@ -93,7 +93,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', @@ -102,7 +102,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', diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index 5b8f301..44503e6 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -47,21 +47,6 @@ return { }, config = function() require('mini.basics').setup { mappings = { windows = true } } - require('mini.tabline').setup { - tabpage_section = 'right', - show_icons = false, - format = function(buf_id, label) -- show global marks in tab - local default = MiniTabline.default_format(buf_id, label) - for _, mark in ipairs(vim.fn.getmarklist()) do - if mark.pos[1] == buf_id then - if mark.mark:match("^'[A-Z]$") then - return ' [' .. mark.mark:sub(2) .. ']' .. default - end - end - end - return default - end, - } require('mini.statusline').setup { content = { active = function() @@ -73,11 +58,11 @@ return { return MiniStatusline.combine_groups { '%<', -- Mark general truncate point - -- { hl = 'MiniStatuslineFilename', strings = { filename } }, '%=', -- End left alignment + -- { hl = 'MiniStatuslineDevinfo', strings = { filename } }, { hl = 'MiniStatuslineDevinfo', strings = { diagnostics, lsp } }, { hl = 'MiniStatuslineDevinfo', strings = { search } }, - { hl = mode_hl, strings = { mode } }, + { hl = mode_hl, strings = { mode } }, } end, inactive = function() @@ -124,7 +109,7 @@ return { local jj_sesh = require('plugins.lib.session_jj') local jj_id = jj_sesh.get_id() if jj_sesh.check_exists(jj_id) then - Snacks.notify('Existing session for ' .. jj_id) + vim.notify('Existing session for ' .. jj_id) end local jump = require('mini.jump2d') diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index 484e7b9..080ec7d 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -10,7 +10,11 @@ return { { 'MeanderingProgrammer/render-markdown.nvim', event = 'VeryLazy', - config = true, + opts = { + completions = { + blink = { enabled = true }, + }, + }, }, { 'sindrets/diffview.nvim', diff --git a/nvim/lua/plugins/snacks.lua b/nvim/lua/plugins/snacks.lua index 9c62be3..5ce8578 100644 --- a/nvim/lua/plugins/snacks.lua +++ b/nvim/lua/plugins/snacks.lua @@ -8,7 +8,7 @@ return { quickfile = { enabled = true }, notifier = { enabled = true, - timeout = 5000, + timeout = 4000, }, styles = { notification = { @@ -21,6 +21,9 @@ return { words = { enabled = true }, picker = { enabled = true, + jump = { + reuse_win = true, + }, matcher = { frecency = true, history_bonus = true, @@ -38,9 +41,9 @@ return { smart = { multi = { 'marks', - { source = 'buffers', current = false }, + { source = 'buffers', current = false }, 'recent', - { source = 'files', hidden = true }, + { source = 'files', hidden = true }, { source = 'git_files', untracked = true }, }, }, @@ -94,6 +97,7 @@ return { '', function() vim.cmd.delmarks { args = { '0-9' } } + vim.cmd.delmarks { args = { '"' } } Snacks.picker.smart() end, desc = 'Fuzzy find smart', @@ -175,6 +179,13 @@ return { end, desc = 'pick notifications', }, + { + 'gO', + function() + Snacks.picker.treesitter() + end, + desc = 'pick treesitter nodes', + }, { 'fm', function() From 4b7636090f8186484f4aa2420f3b54c4d96c6c4c Mon Sep 17 00:00:00 2001 From: iofq Date: Sun, 3 Aug 2025 14:39:54 -0500 Subject: [PATCH 141/160] dart persist + picker --- ...estingstuffalotofstuffreallywellohyeah.txt | 0 flake.lock | 16 + flake.nix | 33 +- nix/neovim-overlay.nix | 5 +- nvim/lua/config/autocmd.lua | 57 +++ nvim/lua/config/init.lua | 88 ----- nvim/lua/config/keymaps.lua | 18 + nvim/lua/plugins/lib/dart.lua | 361 ------------------ nvim/lua/plugins/lib/session_jj.lua | 26 +- nvim/lua/plugins/lib/snacks.lua | 25 -- nvim/lua/plugins/mini.lua | 19 +- nvim/lua/plugins/misc.lua | 5 + nvim/lua/plugins/snacks.lua | 15 +- 13 files changed, 149 insertions(+), 519 deletions(-) delete mode 100644 123reallinglongfilenamefortestingstuffalotofstuffreallywellohyeah.txt create mode 100644 nvim/lua/config/autocmd.lua create mode 100644 nvim/lua/config/keymaps.lua delete mode 100644 nvim/lua/plugins/lib/dart.lua diff --git a/123reallinglongfilenamefortestingstuffalotofstuffreallywellohyeah.txt b/123reallinglongfilenamefortestingstuffalotofstuffreallywellohyeah.txt deleted file mode 100644 index e69de29..0000000 diff --git a/flake.lock b/flake.lock index 9d0c7b0..c6d2f3f 100644 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,20 @@ { "nodes": { + "dart": { + "flake": false, + "locked": { + "lastModified": 1754291267, + "owner": "iofq", + "repo": "dart.nvim", + "rev": "617587d40fd2f2727c18758c4e6decac78459529", + "type": "github" + }, + "original": { + "owner": "iofq", + "repo": "dart.nvim", + "type": "github" + } + }, "flake-compat": { "flake": false, "locked": { @@ -376,6 +391,7 @@ }, "root": { "inputs": { + "dart": "dart", "flake-utils": "flake-utils", "gen-luarc": "gen-luarc", "neovim-nightly-overlay": "neovim-nightly-overlay", diff --git a/flake.nix b/flake.nix index b752ee4..488efc6 100644 --- a/flake.nix +++ b/flake.nix @@ -9,6 +9,10 @@ url = "github:mrcjkb/nix-gen-luarc-json"; inputs.nixpkgs.follows = "nixpkgs"; }; + dart = { + url = "github:iofq/dart.nvim"; + flake = false; + }; # Add bleeding-edge plugins here. # They can be updated with `nix flake update` (make sure to commit the generated flake.lock) # wf-nvim = { @@ -16,19 +20,22 @@ # flake = false; # }; }; - outputs = inputs @ { - self, - nixpkgs, - flake-utils, - ... - }: let - systems = builtins.attrNames nixpkgs.legacyPackages; + outputs = + inputs@{ + self, + nixpkgs, + flake-utils, + ... + }: + let + systems = builtins.attrNames nixpkgs.legacyPackages; - # This is where the Neovim derivation is built. - neovim-overlay = import ./nix/neovim-overlay.nix {inherit inputs;}; - in + # This is where the Neovim derivation is built. + neovim-overlay = import ./nix/neovim-overlay.nix { inherit inputs; }; + in flake-utils.lib.eachSystem systems ( - system: let + system: + let pkgs = import nixpkgs { inherit system; config.allowUnfree = true; @@ -48,7 +55,6 @@ nil stylua luajitPackages.luacheck - alejandra nvim-dev ]; shellHook = '' @@ -58,7 +64,8 @@ ln -Tfns $PWD/nvim ~/.config/nvim-dev ''; }; - in { + in + { packages = rec { default = nvim; nvim = pkgs.nvim-pkg; diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index 1b83895..6dcb1b4 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -14,10 +14,13 @@ let }; mkNeovim = pkgs.callPackage ./mkNeovim.nix { inherit pkgs-wrapNeovim; }; + dart-nvim-git = mkNvimPlugin inputs.dart "dart.nvim"; + all-plugins = with pkgs.vimPlugins; [ blink-cmp blink-ripgrep-nvim conform-nvim + dart-nvim-git diffview-nvim eyeliner-nvim friendly-snippets @@ -43,12 +46,12 @@ let # Extra packages that should be included on nixos but don't need to be bundled extraPackages = with pkgs; [ # linters - alejandra yamllint jq hadolint nixfmt shellcheck + golangci-lint # LSPs gopls diff --git a/nvim/lua/config/autocmd.lua b/nvim/lua/config/autocmd.lua new file mode 100644 index 0000000..597b87d --- /dev/null +++ b/nvim/lua/config/autocmd.lua @@ -0,0 +1,57 @@ +-- 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 = '*', + 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, +}) + +-- 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 }) + 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 }), + 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, +}) diff --git a/nvim/lua/config/init.lua b/nvim/lua/config/init.lua index a331e13..0fabd68 100644 --- a/nvim/lua/config/init.lua +++ b/nvim/lua/config/init.lua @@ -1,14 +1,9 @@ vim.opt.autowrite = true - vim.opt.backspace = 'indent,eol,start' vim.opt.confirm = true vim.opt.completeopt = { 'menu', 'menuone', 'noselect' } -vim.opt.cmdheight = 1 vim.opt.diffopt = 'internal,filler,closeoff,inline:char' vim.opt.expandtab = true -- insert tabs as spaces -vim.o.foldenable = true -vim.o.foldmethod = 'expr' -- use tree-sitter for folding method -vim.o.foldexpr = 'v:lua.vim.treesitter.foldexpr()' vim.o.foldlevelstart = 99 vim.opt.inccommand = 'split' -- incremental live completion vim.opt.list = true @@ -27,30 +22,6 @@ vim.opt.virtualedit = 'onemore' vim.opt.winborder = 'single' vim.cmd('colorscheme iofq') --- 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 -end, { silent = true, desc = 'toggle tabstop' }) - --- autocmd ----------------------------------------- -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 = '*', - 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, -}) - -- Configure Neovim diagnostic messages vim.diagnostic.config { virtual_text = true, @@ -62,62 +33,3 @@ vim.diagnostic.config { source = 'if_many', }, } - --- 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 }) - end, { buffer = true }) - end, -}) - --- random keymaps -vim.keymap.set({ 'v', 'i' }, 'wq', 'l', { noremap = true, silent = true }) -vim.keymap.set({ 'v', 'n' }, 'q:', '') -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' }) - --- custom tabline -local dart = require('plugins.lib.dart') -dart.setup() - --- 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, -}) diff --git a/nvim/lua/config/keymaps.lua b/nvim/lua/config/keymaps.lua new file mode 100644 index 0000000..109879d --- /dev/null +++ b/nvim/lua/config/keymaps.lua @@ -0,0 +1,18 @@ +-- 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 +end, { silent = true, desc = 'toggle tabstop' }) +vim.keymap.set({ 'v', 'i' }, 'wq', 'l', { noremap = true, silent = true }) +vim.keymap.set({ 'v', 'n' }, 'q:', '') +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/lib/dart.lua b/nvim/lua/plugins/lib/dart.lua deleted file mode 100644 index af00bf6..0000000 --- a/nvim/lua/plugins/lib/dart.lua +++ /dev/null @@ -1,361 +0,0 @@ -local Dart = {} -local M = {} - --- table of {bufnr = int, mark = string} -M.state = {} - -Dart.setup = function(config) - config = M.setup_config(config) - M.apply_config(config) - M.create_autocommands() - M.create_default_hl() - - _G.Dart = Dart -end - -M.config = { - -- list of characters to use to mark 'pinned' buffers - -- the characters will be chosen for new pins in order - marklist = { 'a', 's', 'd', 'f', 'q', 'w', 'e', 'r' }, - -- list of characters to use to mark recent buffers - -- we track the last #buflist opened buffers to display on the left side of the tabline - buflist = { 'z', 'x', 'c' }, - - mappings = { - mark = 'mm', - jump = 'm', - pick = 'mp', - next = '', - prev = '', - }, -} - -M.setup_config = function(config) - M.config = vim.tbl_deep_extend('force', M.config, config or {}) - return M.config -end - -M.apply_config = function(config) - -- built list of all marks (buf + pin) to sort tabline by - M.order = {} - for i, key in ipairs(vim.list_extend(vim.deepcopy(config.buflist), config.marklist)) do - M.order[key] = i - end - - vim.opt.showtabline = 2 - vim.opt.tabline = '%!v:lua.Dart.gen_tabline()' - - -- setup keymaps - local function map(mode, lhs, rhs, opts) - if lhs == '' then - return - end - opts = vim.tbl_deep_extend('force', { silent = true }, opts or {}) - vim.keymap.set(mode, lhs, rhs, opts) - end - - map('n', config.mappings.mark, Dart.mark, { desc = 'Dart: mark current buffer' }) - map('n', config.mappings.jump, function() - Dart.jump(vim.fn.getcharstr()) - end, { desc = 'Dart: jump to buffer' }) - map('n', config.mappings.pick, Dart.pick, { desc = 'Dart: pick buffer' }) - map('n', config.mappings.next, Dart.next, { desc = 'Dart: next buffer' }) - map('n', config.mappings.prev, Dart.prev, { desc = 'Dart: prev buffer' }) -end - -M.create_autocommands = function() - local group = vim.api.nvim_create_augroup('Dart', {}) - - -- cleanup deleted buffers - vim.api.nvim_create_autocmd('BufDelete', { - group = group, - callback = function(args) - M.del_by_bufnr(args.buf) - end, - }) - - -- track last n opened buffers - vim.api.nvim_create_autocmd({ 'BufWinEnter', 'BufAdd' }, { - group = group, - callback = function(args) - M.shift_buflist(args.buf) - end, - }) - - -- Clickable tabs - vim.api.nvim_exec2( - [[function! SwitchBuffer(buf_id, clicks, button, mod) - execute 'buffer' a:buf_id - endfunction]], - {} - ) -end - --- Use Mini Tabline for default highlights, since it's well supported by many colorschemes --- override the foreground for labels to be more visible -M.create_default_hl = function() - local set_default_hl = function(name, opts) - opts.default = true - vim.api.nvim_set_hl(0, name, opts) - end - - local override_label = function(hl, link) - local prev = vim.api.nvim_get_hl(0, { name = link }) - vim.api.nvim_set_hl(0, hl, { bg = prev.bg, fg = 'orange', bold = true }) - end - - -- Current selection - set_default_hl('DartCurrent', { link = 'MiniTablineCurrent' }) - override_label('DartCurrentLabel', 'MiniTablineCurrent') - - -- Current selection if modified - set_default_hl('DartCurrentModified', { link = 'MiniTablineModifiedCurrent' }) - override_label('DartCurrentLabelModified', 'MiniTablineModifiedCurrent') - - -- Visible but not selected - set_default_hl('DartVisible', { link = 'MiniTablineVisible' }) - override_label('DartVisibleLabel', 'MiniTablineVisible') - - -- Visible and modified but not selected - set_default_hl('DartVisibleModified', { link = 'MiniTablineModifiedVisible' }) - override_label('DartVisibleLabelModified', 'MiniTablineModifiedVisible') - - -- Fill - set_default_hl('DartFill', { link = 'MiniTablineFill' }) -end - -M.get_state_by_field = function(field, value) - for _, m in ipairs(M.state) do - if m[field] == value then - return m - end - end -end - -M.state_from_bufnr = function(bufnr) - return M.get_state_by_field('bufnr', bufnr) -end - -M.state_from_mark = function(mark) - return M.get_state_by_field('mark', mark) -end - -M.del_by_bufnr = function(bufnr) - for i, m in ipairs(M.state) do - if m.bufnr == bufnr then - table.remove(M.state, i) - return - end - end -end - -M.should_show = function(bufnr) - return vim.api.nvim_buf_is_valid(bufnr) -- buffer exists and is loaded - and vim.api.nvim_buf_is_loaded(bufnr) - and vim.bo[bufnr].buflisted -- don't show hidden buffers - and vim.bo[bufnr].buftype == '' -- don't show pickers, prompts, etc. - and vim.api.nvim_buf_get_name(bufnr) ~= '' -- don't show unnamed files -end - -M.next_unused_mark = function() - for _, m in ipairs(M.config.marklist) do - if not M.state_from_mark(m) then - return m - end - end - return 'Z' -end - -M.shift_buflist = function(bufnr) - if M.state_from_bufnr(bufnr) or not M.should_show(bufnr) then - return - end - - local buflist = M.config.buflist - - -- if there's a free buflist mark, set it - for _, mark in ipairs(buflist) do - if not M.state_from_mark(mark) then - M.mark(bufnr, mark) - return - end - end - - -- if not, shift buflist right and set new buffer to element 1 - for i = #buflist, 2, -1 do - local mark = M.state_from_mark(buflist[i]) - local next = M.state_from_mark(buflist[i - 1]) - mark.bufnr = next.bufnr - end - M.state_from_mark(buflist[1]).bufnr = bufnr -end - --- param direction -1 for prev, 1 for next -M.cycle_tabline = function(direction) - local cur = vim.api.nvim_get_current_buf() - for i, m in ipairs(M.state) do - if cur == m.bufnr then - local next = ((i + direction - 1) % #M.state) + 1 -- wrap around list - if M.state[next] then - vim.api.nvim_set_current_buf(M.state[next].bufnr) - return - end - end - end -end - -M.gen_tabpage = function() - local n_tabpages = vim.fn.tabpagenr('$') - if n_tabpages == 1 then - return '' - end - return string.format('%%= Tab %d/%d ', vim.fn.tabpagenr(), n_tabpages) -end - -M.gen_tabline_item = function(item) - local bufnr = item.bufnr - local filename = vim.fn.fnamemodify(vim.api.nvim_buf_get_name(bufnr), ':t') - local is_current = bufnr == vim.api.nvim_get_current_buf() - local modified = vim.bo[bufnr].modified and 'Modified' or '' - - local hl_label = is_current and 'DartCurrentLabel' or 'DartVisibleLabel' - local label = item.mark ~= '' and item.mark .. ' ' or '' - local hl = is_current and 'DartCurrent' or 'DartVisible' - local content = filename ~= '' and filename or '*' - - return { - bufnr = bufnr, - hl_label = hl_label .. modified, - label = label, - hl = hl .. modified, - content = content, - } -end - -M.format_tabline_item = function(item) - local click = string.format('%%%s@SwitchBuffer@', item.bufnr) - return string.format('%%#%s#%s %s%%#%s#%s %%X', item.hl_label, click, item.label, item.hl, item.content) -end - -M.mark = function(bufnr, mark) - if not bufnr then - bufnr = vim.api.nvim_get_current_buf() - end - if not M.should_show(bufnr) then - return - end - if not mark then - mark = M.next_unused_mark() - end - - local exists = M.state_from_bufnr(bufnr) - if not exists then - table.insert(M.state, { bufnr = bufnr, mark = mark }) - elseif vim.tbl_contains(M.config.buflist, exists.mark) then - exists.mark = mark -- allow for re-marking buffers in the buflist - else - return -- skip sort if no change - end - table.sort(M.state, function(a, b) - return (M.order[a.mark] or 998) < (M.order[b.mark] or 999) - end) - vim.cmd.redrawtabline() -end - -Dart.state = M.state -Dart.mark = M.mark - -Dart.jump = function(mark) - local m = M.state_from_mark(mark) - if m and m.bufnr then - vim.api.nvim_set_current_buf(m.bufnr) - end -end - -Dart.pick = function() - local prompt = { 'Jump to buffer:' } - for _, mark in ipairs(M.state) do - local name = vim.fn.fnamemodify(vim.api.nvim_buf_get_name(mark.bufnr), ':t') - table.insert(prompt, string.format(' %s → %s', mark.mark, name)) - end - - local selected = vim.fn.input(table.concat(prompt, '\n') .. '\n> ') - Dart.jump(selected) -end - -Dart.next = function() - M.cycle_tabline(1) -end - -Dart.prev = function() - M.cycle_tabline(-1) -end - -Dart.gen_tabline = function() - local items = {} - local center = 1 - local cur = vim.api.nvim_get_current_buf() - local columns = vim.o.columns - - for i, m in ipairs(M.state) do - if M.should_show(m.bufnr) then - table.insert(items, M.gen_tabline_item(m)) - if m.bufnr == cur then - center = i - end - else - M.del_by_bufnr(m.bufnr) - end - end - - local function width(tabline) - return vim.api.nvim_strwidth(table.concat( - vim.tbl_map(function(m) - return string.format(' %s %s ', m.label, m.content) - end, tabline), - '' - )) + 3 -- save room for trunc - end - - local result = { items[center] } - local left = center - 1 - local right = center + 1 - local trunc_left = false - local trunc_right = false - - while left >= 1 or right <= #items do - local added = false - - if left >= 1 then - table.insert(result, 1, items[left]) - if width(result) >= columns then - table.remove(result, 1) - trunc_left = true - else - left = left - 1 - added = true - end - end - if right <= #items then - table.insert(result, items[right]) - if width(result) >= columns then - table.remove(result) - trunc_right = true - else - right = right + 1 - added = true - end - end - if not added then - break - end - end - - return (trunc_left and '%#DartVisibleLabel# < ' or '') - .. table.concat(vim.tbl_map(M.format_tabline_item, result), '') - .. (trunc_right and '%#DartVisibleLabel# > ' or '') - .. '%X%#DartFill#' - .. M.gen_tabpage() -end - -return Dart diff --git a/nvim/lua/plugins/lib/session_jj.lua b/nvim/lua/plugins/lib/session_jj.lua index ee9bf6a..cf7d400 100644 --- a/nvim/lua/plugins/lib/session_jj.lua +++ b/nvim/lua/plugins/lib/session_jj.lua @@ -9,18 +9,18 @@ M.get_id = function() 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 + .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 @@ -49,12 +49,10 @@ M.load = function() if c == 'Yes' then -- load session (buffers, etc) as well as shada (marks) sessions.read(id) - vim.cmd('rshada') vim.notify('loaded jj session: ' .. id) end end) else - vim.cmd('wshada') -- create session if it did not exist sessions.write(id) end end diff --git a/nvim/lua/plugins/lib/snacks.lua b/nvim/lua/plugins/lib/snacks.lua index 4791c61..1bdd791 100644 --- a/nvim/lua/plugins/lib/snacks.lua +++ b/nvim/lua/plugins/lib/snacks.lua @@ -1,29 +1,4 @@ M = {} -M.marks = function() - Snacks.picker.marks { - ['local'] = false, - on_show = function() - vim.cmd.delmarks { args = { '0-9' } } - vim.cmd.delmarks { args = { '"' } } - end, - actions = { - markdel = function(picker) - for _, item in ipairs(picker:selected { fallback = true }) do - vim.cmd.delmarks { args = { item.label } } - end - vim.cmd('wshada') - picker.list:set_selected() - picker.list:set_target() - picker:find() - end, - }, - win = { - input = { - keys = { [''] = { 'markdel', mode = { 'n', 'i' } } }, - }, - }, - } -end M.diagnostics = function(filter) Snacks.picker.diagnostics { filter = filter, diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index 44503e6..756b1ae 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -102,6 +102,18 @@ return { 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, + }, + }, verbose = { write = false, }, @@ -126,12 +138,11 @@ return { markdown = true, } - local jj = require('plugins.lib.minidiff_jj') local diff = require('mini.diff') diff.setup { options = { wrap_goto = true }, source = { - jj.gen_source(), + require('plugins.lib.minidiff_jj').gen_source(), diff.gen_source.git(), }, } @@ -185,7 +196,9 @@ return { vim.keymap.set('n', '`', function() local cur_entry_path = MiniFiles.get_fs_entry().path local cur_directory = vim.fs.dirname(cur_entry_path) - vim.fn.chdir(cur_directory) + if cur_directory ~= '' then + vim.fn.chdir(cur_directory) + end end, { buffer = args.data.buf_id }) end, }) diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index 080ec7d..8313182 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -1,4 +1,9 @@ return { + { + 'iofq/dart.nvim', + event = 'VeryLazy', + config = true, + }, { 'jinh0/eyeliner.nvim', event = 'VeryLazy', diff --git a/nvim/lua/plugins/snacks.lua b/nvim/lua/plugins/snacks.lua index 5ce8578..346fc95 100644 --- a/nvim/lua/plugins/snacks.lua +++ b/nvim/lua/plugins/snacks.lua @@ -27,6 +27,7 @@ return { matcher = { frecency = true, history_bonus = true, + cwd_bonus = true, }, layout = 'ivy_split', sources = { @@ -109,13 +110,6 @@ return { end, desc = 'snacks explorer', }, - { - 'fg', - function() - Snacks.picker.git_files() - end, - desc = 'Fuzzy find git files', - }, { 'ff', function() @@ -186,13 +180,6 @@ return { end, desc = 'pick treesitter nodes', }, - { - 'fm', - function() - require('plugins.lib.snacks').marks() - end, - desc = 'pick global marks', - }, { 'jf', function() From d01db43a232ed3f1a3572de4a724a0e86530a339 Mon Sep 17 00:00:00 2001 From: iofq Date: Thu, 7 Aug 2025 02:16:42 -0500 Subject: [PATCH 142/160] autopairs + cleanup --- flake.lock | 36 ++++++++++++++++- flake.nix | 8 ++++ nix/neovim-overlay.nix | 13 +++++-- nvim/colors/iofq.lua | 2 +- nvim/lua/config/autocmd.lua | 57 ++++++++++++++++++++++++++- nvim/lua/config/init.lua | 11 +++--- nvim/lua/config/keymaps.lua | 1 - nvim/lua/plugins/completion.lua | 2 +- nvim/lua/plugins/lib/minipairs.lua | 38 ------------------ nvim/lua/plugins/lib/session_jj.lua | 19 +++++++-- nvim/lua/plugins/lsp.lua | 19 +-------- nvim/lua/plugins/mini.lua | 60 +---------------------------- nvim/lua/plugins/misc.lua | 32 +++++++++++++-- nvim/lua/plugins/snacks.lua | 29 +++++++------- nvim/lua/plugins/treesitter.lua | 53 ------------------------- 15 files changed, 176 insertions(+), 204 deletions(-) delete mode 100644 nvim/lua/plugins/lib/minipairs.lua delete mode 100644 nvim/lua/plugins/treesitter.lua diff --git a/flake.lock b/flake.lock index c6d2f3f..3f6e7f2 100644 --- a/flake.lock +++ b/flake.lock @@ -389,13 +389,47 @@ "type": "github" } }, + "nvim-treesitter": { + "flake": false, + "locked": { + "lastModified": 1754498994, + "owner": "nvim-treesitter", + "repo": "nvim-treesitter", + "rev": "4eb35c03443742a4c3b2db13d36da9cddb6268c3", + "type": "github" + }, + "original": { + "owner": "nvim-treesitter", + "ref": "main", + "repo": "nvim-treesitter", + "type": "github" + } + }, + "nvim-treesitter-textobjects": { + "flake": false, + "locked": { + "lastModified": 1751128959, + "owner": "nvim-treesitter", + "repo": "nvim-treesitter-textobjects", + "rev": "b54cec389e98c5b0babbe618773acec927437cab", + "type": "github" + }, + "original": { + "owner": "nvim-treesitter", + "ref": "main", + "repo": "nvim-treesitter-textobjects", + "type": "github" + } + }, "root": { "inputs": { "dart": "dart", "flake-utils": "flake-utils", "gen-luarc": "gen-luarc", "neovim-nightly-overlay": "neovim-nightly-overlay", - "nixpkgs": "nixpkgs_2" + "nixpkgs": "nixpkgs_2", + "nvim-treesitter": "nvim-treesitter", + "nvim-treesitter-textobjects": "nvim-treesitter-textobjects" } }, "systems": { diff --git a/flake.nix b/flake.nix index 488efc6..260a049 100644 --- a/flake.nix +++ b/flake.nix @@ -13,6 +13,14 @@ url = "github:iofq/dart.nvim"; flake = false; }; + nvim-treesitter = { + url = "github:nvim-treesitter/nvim-treesitter/main"; + flake = false; + }; + nvim-treesitter-textobjects = { + url = "github:nvim-treesitter/nvim-treesitter-textobjects/main"; + flake = false; + }; # Add bleeding-edge plugins here. # They can be updated with `nix flake update` (make sure to commit the generated flake.lock) # wf-nvim = { diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index 6dcb1b4..00e3dd1 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -15,6 +15,10 @@ let mkNeovim = pkgs.callPackage ./mkNeovim.nix { inherit pkgs-wrapNeovim; }; dart-nvim-git = mkNvimPlugin inputs.dart "dart.nvim"; + nvim-treesitter-textobjects-git = mkNvimPlugin inputs.nvim-treesitter-textobjects "nvim-treesitter-textobjects"; + nvim-treesitter-git = pkgs.vimPlugins.nvim-treesitter.overrideAttrs (old: { + src = inputs.nvim-treesitter; + }); all-plugins = with pkgs.vimPlugins; [ blink-cmp @@ -26,17 +30,17 @@ let friendly-snippets lazy-nvim mini-nvim + nvim-autopairs nvim-lint nvim-lspconfig + nvim-treesitter-git.withAllGrammars nvim-treesitter-context - nvim-treesitter-textobjects + nvim-treesitter-textobjects-git nvim-treesitter-textsubjects - nvim-treesitter.withAllGrammars quicker-nvim refactoring-nvim render-markdown-nvim snacks-nvim - trouble-nvim ]; basePackages = with pkgs; [ @@ -69,6 +73,7 @@ in appName = "nvim"; extraPackages = basePackages ++ extraPackages; withNodeJs = false; + withSqlite = true; }; nvim-min-pkg = mkNeovim { @@ -76,7 +81,7 @@ in appName = "nvim"; extraPackages = basePackages; withNodeJs = false; - withSqlite = false; + withSqlite = true; }; # This is meant to be used within a devshell. diff --git a/nvim/colors/iofq.lua b/nvim/colors/iofq.lua index 2f1ce70..0f9db6f 100644 --- a/nvim/colors/iofq.lua +++ b/nvim/colors/iofq.lua @@ -419,7 +419,7 @@ hi(0, 'MiniIndentscopeSymbol', { link = 'Delimiter' }) hi(0, 'MiniJump', { bg = '#ad5c7c', fg = '#0f1c1e' }) hi(0, 'MiniJump2dDim', { link = 'Comment' }) hi(0, 'MiniJump2dSpot', { bold = true, fg = '#a1cdd8' }) -hi(0, 'MiniJump2dSpotAhead', { bg = '#0f1c1e', fg = '#4d7d90', nocombine = true }) +hi(0, 'MiniJump2dSpotAhead', { bold = true, fg = '#a1cdd8' }) hi(0, 'MiniJump2dSpotUnique', { bold = true, fg = '#fda47f' }) hi(0, 'MiniMapNormal', { link = 'NormalFloat' }) hi(0, 'MiniMapSymbolCount', { link = 'Special' }) diff --git a/nvim/lua/config/autocmd.lua b/nvim/lua/config/autocmd.lua index 597b87d..038f3a4 100644 --- a/nvim/lua/config/autocmd.lua +++ b/nvim/lua/config/autocmd.lua @@ -1,7 +1,6 @@ -- create undopath -local undopath = vim.fn.stdpath('data') .. 'undo' vim.api.nvim_create_autocmd('VimEnter', { - command = 'silent !mkdir -p ' .. undopath, + command = 'silent !mkdir -p ' .. vim.fn.stdpath('data') .. 'undo', group = vim.api.nvim_create_augroup('Init', {}), }) @@ -55,3 +54,57 @@ vim.api.nvim_create_autocmd({ 'FocusGained', 'TermClose', 'TermLeave' }, { end end, }) + +-- Init treesitter +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() + + map('[c', function() + require('treesitter-context').go_to_context(vim.v.count1) + end, { desc = 'jump to TS context' }) + map(']f', function() + require('nvim-treesitter-textobjects.move').goto_next_start('@function.outer', 'textobjects') + end, { desc = 'next function def' }) + map('[f', function() + require('nvim-treesitter-textobjects.move').goto_previous_start('@function.outer', 'textobjects') + end, { desc = 'prev function def' }) + map(']a', function() + require('nvim-treesitter-textobjects.move').goto_next_start('@parameter.inner', 'textobjects') + end, { desc = 'next param def' }) + map('[a', function() + require('nvim-treesitter-textobjects.move').goto_previous_start('@parameter.inner', 'textobjects') + end, { desc = 'prev param def' }) + map('a]', function() + require('nvim-treesitter-textobjects.swap').swap_next('@parameter.inner') + end, { desc = 'swap next arg' }) + map('a[', function() + require('nvim-treesitter-textobjects.swap').swap_previous('@parameter.inner') + end, { desc = 'swap prev arg' }) + end, +}) diff --git a/nvim/lua/config/init.lua b/nvim/lua/config/init.lua index 0fabd68..2e6a1fd 100644 --- a/nvim/lua/config/init.lua +++ b/nvim/lua/config/init.lua @@ -1,25 +1,24 @@ vim.opt.autowrite = true vim.opt.backspace = 'indent,eol,start' vim.opt.confirm = true -vim.opt.completeopt = { 'menu', 'menuone', 'noselect' } vim.opt.diffopt = 'internal,filler,closeoff,inline:char' vim.opt.expandtab = true -- insert tabs as spaces -vim.o.foldlevelstart = 99 vim.opt.inccommand = 'split' -- incremental live completion -vim.opt.list = true +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 +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 = 'single' +vim.opt.winborder = 'rounded' vim.cmd('colorscheme iofq') -- Configure Neovim diagnostic messages @@ -33,3 +32,5 @@ vim.diagnostic.config { source = 'if_many', }, } +require('config.keymaps') +require('config.autocmd') diff --git a/nvim/lua/config/keymaps.lua b/nvim/lua/config/keymaps.lua index 109879d..51a9f6e 100644 --- a/nvim/lua/config/keymaps.lua +++ b/nvim/lua/config/keymaps.lua @@ -3,7 +3,6 @@ vim.keymap.set('n', '\\t', function() vim.o.tabstop = vim.o.tabstop == 8 and 2 or 2 * vim.o.tabstop end, { silent = true, desc = 'toggle tabstop' }) vim.keymap.set({ 'v', 'i' }, 'wq', 'l', { noremap = true, silent = true }) -vim.keymap.set({ 'v', 'n' }, 'q:', '') vim.keymap.set('v', '<', '', '>gv') vim.keymap.set('n', 'n', 'nzz', { noremap = true }) diff --git a/nvim/lua/plugins/completion.lua b/nvim/lua/plugins/completion.lua index f084dba..20480dc 100644 --- a/nvim/lua/plugins/completion.lua +++ b/nvim/lua/plugins/completion.lua @@ -35,7 +35,7 @@ return { path = { opts = { get_cwd = function(_) - return vim.fn.getcwd() + return vim.fn.getcwd() -- use nvim pwd instead of current file pwd end, }, }, diff --git a/nvim/lua/plugins/lib/minipairs.lua b/nvim/lua/plugins/lib/minipairs.lua deleted file mode 100644 index f3b22f3..0000000 --- a/nvim/lua/plugins/lib/minipairs.lua +++ /dev/null @@ -1,38 +0,0 @@ --- ripped from lazyvim -return function(opts) - local pairs = require('mini.pairs') - pairs.setup(opts) - local open = pairs.open - pairs.open = function(pair, neigh_pattern) - if vim.fn.getcmdline() ~= '' then - return open(pair, neigh_pattern) - end - local o, c = pair:sub(1, 1), pair:sub(2, 2) - local line = vim.api.nvim_get_current_line() - local cursor = vim.api.nvim_win_get_cursor(0) - local next = line:sub(cursor[2] + 1, cursor[2] + 1) - local before = line:sub(1, cursor[2]) - if opts.markdown and o == '`' and vim.bo.filetype == 'markdown' and before:match('^%s*``') then - return '`\n```' .. vim.api.nvim_replace_termcodes('', true, true, true) - end - if opts.skip_next and next ~= '' and next:match(opts.skip_next) then - return o - end - if opts.skip_ts and #opts.skip_ts > 0 then - local ok, captures = pcall(vim.treesitter.get_captures_at_pos, 0, cursor[1] - 1, math.max(cursor[2] - 1, 0)) - for _, capture in ipairs(ok and captures or {}) do - if vim.tbl_contains(opts.skip_ts, capture.capture) then - return o - end - end - end - if opts.skip_unbalanced and next == c and c ~= o then - local _, count_open = line:gsub(vim.pesc(pair:sub(1, 1)), '') - local _, count_close = line:gsub(vim.pesc(pair:sub(2, 2)), '') - if count_close > count_open then - return o - end - end - return open(pair, neigh_pattern) - end -end diff --git a/nvim/lua/plugins/lib/session_jj.lua b/nvim/lua/plugins/lib/session_jj.lua index cf7d400..5e81803 100644 --- a/nvim/lua/plugins/lib/session_jj.lua +++ b/nvim/lua/plugins/lib/session_jj.lua @@ -1,5 +1,15 @@ local M = {} -local sessions = require('mini.sessions') + +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() + require('plugins.lib.session_jj').load() + end, { noremap = true, desc = 'mini session select' }) +end M.get_id = function() local jj_root = vim.system({ 'jj', 'workspace', 'root' }):wait() @@ -27,7 +37,7 @@ M.get_id = function() end M.check_exists = function(id) - for name, _ in pairs(sessions.detected) do + for name, _ in pairs(MiniSessions.detected) do if name == id then return true end @@ -48,13 +58,14 @@ 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) - sessions.read(id) + MiniSessions.read(id) vim.notify('loaded jj session: ' .. id) end end) else - sessions.write(id) + MiniSessions.write(id) end end +_G.M = M return M diff --git a/nvim/lua/plugins/lsp.lua b/nvim/lua/plugins/lsp.lua index f077c71..49efddb 100644 --- a/nvim/lua/plugins/lsp.lua +++ b/nvim/lua/plugins/lsp.lua @@ -2,21 +2,6 @@ return { { 'neovim/nvim-lspconfig', event = 'VeryLazy', - dependencies = { - 'folke/trouble.nvim', - event = 'VeryLazy', - opts = { - pinned = true, - focus = true, - follow = false, - auto_close = false, - win = { - size = 0.33, - position = 'right', - type = 'split', - }, - }, - }, config = function() vim.lsp.enable { 'nil_ls', @@ -93,7 +78,7 @@ return { '\\f', function() vim.b.disable_autoformat = not vim.b.disable_autoformat - vim.notify(string.format('Buffer formatting disabled: %s', vim.b.disable_autoformat)) + Snacks.notify(string.format('Buffer formatting disabled: %s', vim.b.disable_autoformat)) end, mode = { 'n', 'x' }, desc = 'toggle buffer formatting', @@ -102,7 +87,7 @@ return { '\\F', function() vim.g.disable_autoformat = not vim.g.disable_autoformat - vim.notify(string.format('Global formatting disabled: %s', vim.g.disable_autoformat)) + Snacks.notify(string.format('Global formatting disabled: %s', vim.g.disable_autoformat)) end, mode = { 'n', 'x' }, desc = 'toggle global formatting', diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index 756b1ae..136521a 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -29,50 +29,9 @@ return { ':Git ', desc = 'git command', }, - { - 'fs', - function() - require('plugins.lib.session_jj').load() - end, - noremap = true, - desc = 'mini session select', - }, - { - '\\z', - function() - require('mini.misc').zoom() - end, - desc = 'mini zoom', - }, }, config = function() require('mini.basics').setup { mappings = { windows = true } } - require('mini.statusline').setup { - content = { - active = function() - local mode, mode_hl = MiniStatusline.section_mode {} - -- local filename = MiniStatusline.section_filename { trunc_width = 140 } - local diagnostics = MiniStatusline.section_diagnostics { trunc_width = 75 } - local lsp = MiniStatusline.section_lsp { trunc_width = 75 } - local search = MiniStatusline.section_searchcount { trunc_width = 75 } - - return MiniStatusline.combine_groups { - '%<', -- Mark general truncate point - '%=', -- End left alignment - -- { hl = 'MiniStatuslineDevinfo', strings = { filename } }, - { hl = 'MiniStatuslineDevinfo', strings = { diagnostics, lsp } }, - { hl = 'MiniStatuslineDevinfo', strings = { search } }, - { hl = mode_hl, strings = { mode } }, - } - end, - inactive = function() - local filename = MiniStatusline.section_filename { trunc_width = 140 } - return MiniStatusline.combine_groups { - { hl = 'MiniStatuslineFilename', strings = { filename } }, - } - end, - }, - } vim.schedule(function() local ai = require('mini.ai') local extra_ai = require('mini.extra').gen_ai_spec @@ -81,6 +40,7 @@ return { custom_textobjects = { i = extra_ai.indent(), g = extra_ai.buffer(), + 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' }, @@ -114,15 +74,8 @@ return { end, }, }, - verbose = { - write = false, - }, } - local jj_sesh = require('plugins.lib.session_jj') - local jj_id = jj_sesh.get_id() - if jj_sesh.check_exists(jj_id) then - vim.notify('Existing session for ' .. jj_id) - end + require('plugins.lib.session_jj').setup() local jump = require('mini.jump2d') jump.setup { @@ -130,14 +83,6 @@ return { spotter = jump.gen_spotter.vimpattern(), } - require('plugins.lib.minipairs') { - modes = { insert = true, command = false, terminal = false }, - skip_next = [=[[%w%%%'%[%"%.%`%$]]=], - skip_ts = { 'string' }, - skip_unbalanced = true, - markdown = true, - } - local diff = require('mini.diff') diff.setup { options = { wrap_goto = true }, @@ -210,7 +155,6 @@ return { }) local multi = require('mini.keymap').map_multistep - multi({ 'i' }, '', { 'minipairs_bs' }) multi({ 'i', 's' }, '', { 'blink_accept', 'vimsnippet_next', 'increase_indent' }) multi({ 'i', 's' }, '', { 'vimsnippet_prev', 'decrease_indent' }) end) diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index 8313182..d8b1a5f 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -4,13 +4,37 @@ return { event = 'VeryLazy', config = true, }, + { + 'windwp/nvim-autopairs', + event = 'VeryLazy', + config = true, + }, + { + 'nvim-treesitter/nvim-treesitter', + event = 'VeryLazy', + branch = 'main', + main = 'nvim-treesitter.configs', + config = true, + dependencies = { + { + 'nvim-treesitter/nvim-treesitter-textobjects', + branch = 'main', + config = true, + }, + 'RRethy/nvim-treesitter-textsubjects', + { + 'nvim-treesitter/nvim-treesitter-context', + opts = { + max_lines = 5, + min_window_height = 50, + }, + }, + }, + }, { 'jinh0/eyeliner.nvim', event = 'VeryLazy', - init = function() - vim.api.nvim_set_hl(0, 'EyelinerPrimary', { underline = true }) - vim.api.nvim_set_hl(0, 'EyelinerSecondary', { underline = true, bold = true }) - end, + config = true, }, { 'MeanderingProgrammer/render-markdown.nvim', diff --git a/nvim/lua/plugins/snacks.lua b/nvim/lua/plugins/snacks.lua index 346fc95..248937b 100644 --- a/nvim/lua/plugins/snacks.lua +++ b/nvim/lua/plugins/snacks.lua @@ -5,7 +5,6 @@ return { priority = 1000, opts = { bigfile = { enabled = true }, - quickfile = { enabled = true }, notifier = { enabled = true, timeout = 4000, @@ -14,16 +13,16 @@ return { notification = { wo = { wrap = true }, }, + terminal = { + border = 'rounded', + }, }, terminal = { enabled = true }, indent = { enabled = true }, input = { enabled = true }, - words = { enabled = true }, picker = { enabled = true, - jump = { - reuse_win = true, - }, + jump = { reuse_win = true }, matcher = { frecency = true, history_bonus = true, @@ -31,19 +30,23 @@ return { }, layout = 'ivy_split', sources = { - files = { hidden = true }, grep = { hidden = true }, explorer = { hidden = true }, - git_files = { untracked = true }, lsp_symbols = { filter = { default = true }, layout = 'left', }, smart = { + sort = { + fields = { + 'score:desc', + 'idx', + '#text', + }, + }, multi = { 'marks', { source = 'buffers', current = false }, - 'recent', { source = 'files', hidden = true }, { source = 'git_files', untracked = true }, }, @@ -51,14 +54,10 @@ return { }, win = { input = { - keys = { - ['wq'] = { 'close', mode = 'i' }, - }, + keys = { ['wq'] = { 'close', mode = 'i' } }, }, list = { - keys = { - ['wq'] = { 'close', mode = 'i' }, - }, + keys = { ['wq'] = { 'close', mode = 'i' } }, }, }, }, @@ -75,7 +74,7 @@ return { { '', function() - Snacks.terminal.toggle('$SHELL') + Snacks.terminal.toggle('command -v fish >/dev/null && exec fish || exec bash') end, mode = { 'n', 't' }, desc = 'terminal open', diff --git a/nvim/lua/plugins/treesitter.lua b/nvim/lua/plugins/treesitter.lua deleted file mode 100644 index cb8bbb1..0000000 --- a/nvim/lua/plugins/treesitter.lua +++ /dev/null @@ -1,53 +0,0 @@ -return { - { - "nvim-treesitter/nvim-treesitter", - event = "VeryLazy", - dependencies = { - { - "nvim-treesitter/nvim-treesitter-context", - opts = { - max_lines = 2, - min_window_height = 50, - }, - }, - "nvim-treesitter/nvim-treesitter-textobjects", - "RRethy/nvim-treesitter-textsubjects", - }, - main = "nvim-treesitter.configs", - opts = { - ensure_installed = {}, - auto_install = false, - highlight = { - enable = true, - }, - indent = { - enable = true, - }, - matchup = { - enable = true, - }, - textobjects = { - move = { - enable = true, - goto_next_start = { - ["]a"] = "@parameter.inner", - ["]f"] = "@function.outer", - }, - goto_previous_start = { - ["[a"] = "@parameter.inner", - ["[f"] = "@function.outer", - }, - }, - swap = { - enable = true, - swap_next = { - ["a]"] = "@parameter.inner", - }, - swap_previous = { - ["a["] = "@parameter.inner", - }, - }, - }, - }, - }, -} From 24b44e172fb51099b182014c6fa654700cb01fd1 Mon Sep 17 00:00:00 2001 From: iofq Date: Mon, 11 Aug 2025 01:34:47 -0500 Subject: [PATCH 143/160] flake.lock: Update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'gen-luarc': 'github:mrcjkb/nix-gen-luarc-json/b36b69c4ded9f31b079523bc452e23458734cf00' (2024-08-19) → 'github:mrcjkb/nix-gen-luarc-json/4b8d4da04808062e2b1ef0e7bcd0a03bcb93e043' (2025-08-07) • Updated input 'neovim-nightly-overlay': 'github:nix-community/neovim-nightly-overlay/e63079523e06e0b7d8d766d40573409d2c5ecc9d' (2025-07-21) → 'github:nix-community/neovim-nightly-overlay/83aaf3085f808dec9ea1b5d16b216875a8081b37' (2025-08-08) • Updated input 'neovim-nightly-overlay/flake-parts': 'github:hercules-ci/flake-parts/77826244401ea9de6e3bac47c2db46005e1f30b5?narHash=sha256-Tyw1RjYEsp5scoigs1384gIg6e0GoBVjms4aXFfRssQ%3D' (2025-07-01) → 'github:hercules-ci/flake-parts/af66ad14b28a127c5c0f3bbb298218fc63528a18?narHash=sha256-pHYj8gUBapuUzKV/kN/tR3Zvqc7o6gdFB9XKXIp1SQ8%3D' (2025-08-06) • Updated input 'neovim-nightly-overlay/git-hooks': 'github:cachix/git-hooks.nix/16ec914f6fb6f599ce988427d9d94efddf25fe6d?narHash=sha256-wibppH3g/E2lxU43ZQHC5yA/7kIKLGxVEnsnVK1BtRg%3D' (2025-06-24) → 'github:cachix/git-hooks.nix/9c52372878df6911f9afc1e2a1391f55e4dfc864?narHash=sha256-c6yg0EQ9xVESx6HGDOCMcyRSjaTpNJP10ef%2B6fRcofA%3D' (2025-08-05) • Updated input 'neovim-nightly-overlay/git-hooks/flake-compat': 'github:edolstra/flake-compat/0f9255e01c2351cc7d116c072cb317785dd33b33?narHash=sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U%3D' (2023-10-04) → 'github:edolstra/flake-compat/9100a0f413b0c601e0533d1d94ffd501ce2e7885?narHash=sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX%2BfjA8Xf8PUmqCY%3D' (2025-05-12) • Updated input 'neovim-nightly-overlay/neovim-src': 'github:neovim/neovim/8ee82da3cfd228d50816aeb5f5db22175f5a4ede?narHash=sha256-VHCJ/E%2B3iI5pH20rW%2Baqq830erPrAzTfOT8Wndax2pI%3D' (2025-07-20) → 'github:neovim/neovim/038eb01b41b66379f75164507571497929f8847c?narHash=sha256-ORfF40X4BGiFxnLNQbdsQbUTW4TkUHfPqyZWHaYL5NE%3D' (2025-08-07) • Updated input 'neovim-nightly-overlay/nixpkgs': 'github:NixOS/nixpkgs/6b4955211758ba47fac850c040a27f23b9b4008f?narHash=sha256-dPALCtmik9Wr14MGqVXm%2BOQcv7vhPBXcWNIOThGnB/Q%3D' (2025-07-19) → 'github:NixOS/nixpkgs/a683adc19ff5228af548c6539dbc3440509bfed3?narHash=sha256-fbnmAwTQkuXHKBlcL5Nq1sMAzd3GFqCOQgEQw6Hy0Ak%3D' (2025-08-05) • Updated input 'neovim-nightly-overlay/treefmt-nix': 'github:numtide/treefmt-nix/421b56313c65a0815a52b424777f55acf0b56ddf?narHash=sha256-tzbhc4XttkyEhswByk5R38l%2BztN9UDbnj0cTcP6Hp9A%3D' (2025-07-20) → 'github:numtide/treefmt-nix/1298185c05a56bff66383a20be0b41a307f52228?narHash=sha256-B%2B3g9%2B76KlGe34Yk9za8AF3RL%2BlnbHXkLiVHLjYVOAc%3D' (2025-08-06) • Updated input 'nixpkgs': 'github:NixOS/nixpkgs/78fcdb5d8e08a2d449739aa4796417f2e6cf5724' (2025-07-22) → 'github:NixOS/nixpkgs/defc725219d1fb9b56662370e014012929e557af' (2025-08-11) • Updated input 'nvim-treesitter': 'github:nvim-treesitter/nvim-treesitter/4eb35c03443742a4c3b2db13d36da9cddb6268c3' (2025-08-06) → 'github:nvim-treesitter/nvim-treesitter/9866036ec3c5db40700a9178494e0cfdcfe6ecfd' (2025-08-08) --- flake.lock | 52 ++++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/flake.lock b/flake.lock index 3f6e7f2..a451654 100644 --- a/flake.lock +++ b/flake.lock @@ -50,11 +50,11 @@ "flake-compat_3": { "flake": false, "locked": { - "lastModified": 1696426674, - "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "lastModified": 1747046372, + "narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=", "owner": "edolstra", "repo": "flake-compat", - "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885", "type": "github" }, "original": { @@ -89,11 +89,11 @@ ] }, "locked": { - "lastModified": 1751413152, - "narHash": "sha256-Tyw1RjYEsp5scoigs1384gIg6e0GoBVjms4aXFfRssQ=", + "lastModified": 1754487366, + "narHash": "sha256-pHYj8gUBapuUzKV/kN/tR3Zvqc7o6gdFB9XKXIp1SQ8=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "77826244401ea9de6e3bac47c2db46005e1f30b5", + "rev": "af66ad14b28a127c5c0f3bbb298218fc63528a18", "type": "github" }, "original": { @@ -150,10 +150,10 @@ ] }, "locked": { - "lastModified": 1724097937, + "lastModified": 1754586557, "owner": "mrcjkb", "repo": "nix-gen-luarc-json", - "rev": "b36b69c4ded9f31b079523bc452e23458734cf00", + "rev": "4b8d4da04808062e2b1ef0e7bcd0a03bcb93e043", "type": "github" }, "original": { @@ -196,11 +196,11 @@ ] }, "locked": { - "lastModified": 1750779888, - "narHash": "sha256-wibppH3g/E2lxU43ZQHC5yA/7kIKLGxVEnsnVK1BtRg=", + "lastModified": 1754416808, + "narHash": "sha256-c6yg0EQ9xVESx6HGDOCMcyRSjaTpNJP10ef+6fRcofA=", "owner": "cachix", "repo": "git-hooks.nix", - "rev": "16ec914f6fb6f599ce988427d9d94efddf25fe6d", + "rev": "9c52372878df6911f9afc1e2a1391f55e4dfc864", "type": "github" }, "original": { @@ -302,10 +302,10 @@ "treefmt-nix": "treefmt-nix" }, "locked": { - "lastModified": 1753116172, + "lastModified": 1754641381, "owner": "nix-community", "repo": "neovim-nightly-overlay", - "rev": "e63079523e06e0b7d8d766d40573409d2c5ecc9d", + "rev": "83aaf3085f808dec9ea1b5d16b216875a8081b37", "type": "github" }, "original": { @@ -317,11 +317,11 @@ "neovim-src": { "flake": false, "locked": { - "lastModified": 1753055671, - "narHash": "sha256-VHCJ/E+3iI5pH20rW+aqq830erPrAzTfOT8Wndax2pI=", + "lastModified": 1754610154, + "narHash": "sha256-ORfF40X4BGiFxnLNQbdsQbUTW4TkUHfPqyZWHaYL5NE=", "owner": "neovim", "repo": "neovim", - "rev": "8ee82da3cfd228d50816aeb5f5db22175f5a4ede", + "rev": "038eb01b41b66379f75164507571497929f8847c", "type": "github" }, "original": { @@ -332,11 +332,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1752900028, - "narHash": "sha256-dPALCtmik9Wr14MGqVXm+OQcv7vhPBXcWNIOThGnB/Q=", + "lastModified": 1754393734, + "narHash": "sha256-fbnmAwTQkuXHKBlcL5Nq1sMAzd3GFqCOQgEQw6Hy0Ak=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "6b4955211758ba47fac850c040a27f23b9b4008f", + "rev": "a683adc19ff5228af548c6539dbc3440509bfed3", "type": "github" }, "original": { @@ -376,10 +376,10 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1753159279, + "lastModified": 1754893210, "owner": "NixOS", "repo": "nixpkgs", - "rev": "78fcdb5d8e08a2d449739aa4796417f2e6cf5724", + "rev": "defc725219d1fb9b56662370e014012929e557af", "type": "github" }, "original": { @@ -392,10 +392,10 @@ "nvim-treesitter": { "flake": false, "locked": { - "lastModified": 1754498994, + "lastModified": 1754640844, "owner": "nvim-treesitter", "repo": "nvim-treesitter", - "rev": "4eb35c03443742a4c3b2db13d36da9cddb6268c3", + "rev": "9866036ec3c5db40700a9178494e0cfdcfe6ecfd", "type": "github" }, "original": { @@ -455,11 +455,11 @@ ] }, "locked": { - "lastModified": 1753006367, - "narHash": "sha256-tzbhc4XttkyEhswByk5R38l+ztN9UDbnj0cTcP6Hp9A=", + "lastModified": 1754492133, + "narHash": "sha256-B+3g9+76KlGe34Yk9za8AF3RL+lnbHXkLiVHLjYVOAc=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "421b56313c65a0815a52b424777f55acf0b56ddf", + "rev": "1298185c05a56bff66383a20be0b41a307f52228", "type": "github" }, "original": { From 58c0637b786ce76b1c614fc3c44b52d9e7dcb9cc Mon Sep 17 00:00:00 2001 From: iofq Date: Tue, 12 Aug 2025 23:02:55 -0500 Subject: [PATCH 144/160] use qflist for lsp --- nvim/lsp/gopls.lua | 1 + nvim/lsp/lua_ls.lua | 3 +++ nvim/lua/config/autocmd.lua | 7 +------ nvim/lua/config/keymaps.lua | 1 + nvim/lua/plugins/lib/snacks.lua | 34 --------------------------------- nvim/lua/plugins/lsp.lua | 20 +++---------------- nvim/lua/plugins/mini.lua | 2 +- nvim/lua/plugins/misc.lua | 14 ++++++++++++++ nvim/lua/plugins/snacks.lua | 21 +++++++------------- 9 files changed, 31 insertions(+), 72 deletions(-) delete mode 100644 nvim/lua/plugins/lib/snacks.lua diff --git a/nvim/lsp/gopls.lua b/nvim/lsp/gopls.lua index 38f2b64..6b88b92 100644 --- a/nvim/lsp/gopls.lua +++ b/nvim/lsp/gopls.lua @@ -21,6 +21,7 @@ return { compositeLiteralTypes = true, constantValues = true, functionTypeParameters = true, + ignoredError = true, rangeVariableTypes = true, parameterNames = true, }, diff --git a/nvim/lsp/lua_ls.lua b/nvim/lsp/lua_ls.lua index f71f2bd..4be10e8 100644 --- a/nvim/lsp/lua_ls.lua +++ b/nvim/lsp/lua_ls.lua @@ -19,6 +19,9 @@ return { end, settings = { Lua = { + codeLens = { + enable = true, + }, hint = { enable = true, arrayIndex = 'Enable', diff --git a/nvim/lua/config/autocmd.lua b/nvim/lua/config/autocmd.lua index 038f3a4..6184e7a 100644 --- a/nvim/lua/config/autocmd.lua +++ b/nvim/lua/config/autocmd.lua @@ -1,9 +1,3 @@ --- create undopath -vim.api.nvim_create_autocmd('VimEnter', { - command = 'silent !mkdir -p ' .. vim.fn.stdpath('data') .. 'undo', - group = vim.api.nvim_create_augroup('Init', {}), -}) - -- open :h in buffers vim.api.nvim_create_autocmd('BufWinEnter', { pattern = '*', @@ -31,6 +25,7 @@ vim.api.nvim_create_autocmd({ 'FileType' }, { 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, }) diff --git a/nvim/lua/config/keymaps.lua b/nvim/lua/config/keymaps.lua index 51a9f6e..62c630c 100644 --- a/nvim/lua/config/keymaps.lua +++ b/nvim/lua/config/keymaps.lua @@ -1,6 +1,7 @@ -- 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', '<', 'Trouble lsp toggle', { buffer = ev.buf, desc = 'Trouble LSP' }) - vim.keymap.set('n', 'gO', function() Snacks.picker.lsp_symbols { focus = 'list' } end, { buffer = ev.buf, desc = 'LSP symbols' }) - vim.keymap.set('n', '', function() - Snacks.picker.lsp_definitions { focus = 'list' } - end, { buffer = ev.buf, desc = 'LSP definition' }) - vim.keymap.set('n', 'grt', function() - Snacks.picker.lsp_type_definitions { focus = 'list' } - end, { buffer = ev.buf, desc = 'LSP type definition' }) - vim.keymap.set('n', 'grr', function() - Snacks.picker.lsp_references { focus = 'list' } - end, { buffer = ev.buf, desc = 'LSP refrences' }) - vim.keymap.set('n', 'gri', function() - Snacks.picker.lsp_implementations { focus = 'list' } - end, { buffer = ev.buf, desc = 'LSP implementations' }) vim.keymap.set('n', 'grh', function() vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled()) @@ -41,10 +27,10 @@ return { vim.keymap.set('n', 'grl', vim.lsp.codelens.run, { buffer = ev.buf, desc = 'vim.lsp.codelens.run()' }) vim.keymap.set('n', 'gre', function() - require('plugins.lib.snacks').diagnostics { buf = true } + vim.diagnostic.setloclist() end, { buffer = ev.buf, desc = 'LSP buffer diagnostics' }) vim.keymap.set('n', 'grE', function() - require('plugins.lib.snacks').diagnostics { cwd = false } + vim.diagnostic.setqflist() end, { buffer = ev.buf, desc = 'LSP diagnostics' }) vim.keymap.set('n', 'grc', function() @@ -55,7 +41,7 @@ return { end, { buffer = ev.buf, desc = 'LSP outgoing_calls' }) -- Auto-refresh code lenses - if client.server_capabilities.codeLensProvider then + if client:supports_method('textDocument/codeLens') or client.server_capabilities.codeLensProvider then vim.api.nvim_create_autocmd({ 'InsertLeave', 'TextChanged' }, { group = vim.api.nvim_create_augroup(string.format('lsp-%s-%s', ev.buf, client.id), {}), callback = function() diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index 136521a..c82350c 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(), - l = extra_ai.line(), + e = 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' }, diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index d8b1a5f..dda4e34 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -121,6 +121,20 @@ return { 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 index 248937b..d6dd0b2 100644 --- a/nvim/lua/plugins/snacks.lua +++ b/nvim/lua/plugins/snacks.lua @@ -79,20 +79,6 @@ return { mode = { 'n', 't' }, desc = 'terminal open', }, - { - ']r', - function() - Snacks.words.jump(1, true) - end, - desc = 'next reference', - }, - { - '[r', - function() - Snacks.words.jump(-1, true) - end, - desc = 'next reference', - }, { '', function() @@ -179,6 +165,13 @@ return { end, desc = 'pick treesitter nodes', }, + { + 'fq', + function() + Snacks.picker.qflist() + end, + desc = 'pick quickfix list', + }, { 'jf', function() From 71651618566fb03fa9acedbee6276c3e14d3bad3 Mon Sep 17 00:00:00 2001 From: cjurgell Date: Wed, 13 Aug 2025 14:13:05 -0500 Subject: [PATCH 145/160] fix ts --- flake.nix | 2 + nix/mkNeovim.nix | 340 ++++++++++++++++++------------------ nix/neovim-overlay.nix | 44 ++--- nix/plugin-overlay.nix | 29 +++ nvim/colors/iofq.lua | 4 +- nvim/init.lua | 1 + nvim/lua/config/autocmd.lua | 14 +- nvim/lua/config/init.lua | 7 +- nvim/lua/plugins/lsp.lua | 1 + nvim/lua/plugins/misc.lua | 15 +- 10 files changed, 234 insertions(+), 223 deletions(-) create mode 100644 nix/plugin-overlay.nix diff --git a/flake.nix b/flake.nix index 260a049..68da80f 100644 --- a/flake.nix +++ b/flake.nix @@ -39,6 +39,7 @@ 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 ( @@ -49,6 +50,7 @@ config.allowUnfree = true; overlays = [ inputs.neovim-nightly-overlay.overlays.default + plugin-overlay neovim-overlay # This adds a function can be used to generate a .luarc.json # containing the Neovim API all plugins in the workspace directory. diff --git a/nix/mkNeovim.nix b/nix/mkNeovim.nix index 956f2c3..7d2e3a6 100644 --- a/nix/mkNeovim.nix +++ b/nix/mkNeovim.nix @@ -7,195 +7,191 @@ 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 ? null, - # 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, - }: 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 = {}; - }; +{ + # 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, +}: +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]); + 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; + # 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. - neovimConfig = pkgs-wrapNeovim.neovimUtils.makeNeovimConfig { - inherit - extraPython3Packages - withPython3 - withRuby - withNodeJs - viAlias - vimAlias - ; - plugins = normalizedPlugins; - }; + # 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 = normalizedPlugins; + }; - packDir = pkgs.neovimUtils.packDir { - myNeovimPackages = pkgs.neovimUtils.normalizedPluginsToVimPackage normalizedPlugins; - }; + packDir = pkgs.neovimUtils.packDir { + myNeovimPackages = pkgs.neovimUtils.normalizedPluginsToVimPackage normalizedPlugins; + }; - # This uses the ignoreConfigRegexes list to filter - # the nvim directory - nvimRtpSrc = let + # 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 + 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/ - ''; - - installPhase = '' - cp -r . $out/ - ''; + lib.all (regex: builtins.match regex relPath == null) ignoreConfigRegexes; }; - # 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 = - '' - 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); + # 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; - # 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"'') - ); + buildPhase = '' + mkdir -p $out/ + ''; - luaPackages = neovim-unwrapped.lua.pkgs; - resolvedExtraLuaPackages = extraLuaPackages luaPackages; + installPhase = '' + cp -r . $out/ + ''; + }; - # Native Lua libraries - extraMakeWrapperLuaCArgs = - optionalString (resolvedExtraLuaPackages != []) + # 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 = '' + 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); + + # 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 - }"''; + concatMapStringsSep ";" luaPackages.getLuaCPath resolvedExtraLuaPackages + }"''; - # Lua libraries - extraMakeWrapperLuaArgs = - optionalString (resolvedExtraLuaPackages != []) + # Lua libraries + extraMakeWrapperLuaArgs = + optionalString (resolvedExtraLuaPackages != [ ]) ''--suffix LUA_PATH ";" "${ - concatMapStringsSep ";" luaPackages.getLuaPath resolvedExtraLuaPackages - }"''; + 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; - } - ); + # 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"; - 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} - ''; - }) + isCustomAppName = appName != null && appName != "nvim"; +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} + ''; +}) diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index 00e3dd1..204e118 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -3,28 +3,13 @@ final: prev: with final.pkgs.lib; let - pkgs = final; - pkgs-wrapNeovim = prev; + mkNeovim = prev.callPackage ./mkNeovim.nix { pkgs-wrapNeovim = prev; }; - mkNvimPlugin = - src: pname: - pkgs.vimUtils.buildVimPlugin { - inherit pname src; - version = src.lastModifiedDate; - }; - mkNeovim = pkgs.callPackage ./mkNeovim.nix { inherit pkgs-wrapNeovim; }; - - dart-nvim-git = mkNvimPlugin inputs.dart "dart.nvim"; - nvim-treesitter-textobjects-git = mkNvimPlugin inputs.nvim-treesitter-textobjects "nvim-treesitter-textobjects"; - nvim-treesitter-git = pkgs.vimPlugins.nvim-treesitter.overrideAttrs (old: { - src = inputs.nvim-treesitter; - }); - - all-plugins = with pkgs.vimPlugins; [ + plugins = with final.vimPlugins; [ blink-cmp blink-ripgrep-nvim conform-nvim - dart-nvim-git + dart-nvim diffview-nvim eyeliner-nvim friendly-snippets @@ -33,22 +18,21 @@ let nvim-autopairs nvim-lint nvim-lspconfig - nvim-treesitter-git.withAllGrammars + nvim-treesitter.withAllGrammars nvim-treesitter-context - nvim-treesitter-textobjects-git - nvim-treesitter-textsubjects + nvim-treesitter-textobjects quicker-nvim refactoring-nvim render-markdown-nvim snacks-nvim ]; - basePackages = with pkgs; [ + basePackages = with final; [ ripgrep fd ]; # Extra packages that should be included on nixos but don't need to be bundled - extraPackages = with pkgs; [ + extraPackages = with final; [ # linters yamllint jq @@ -69,26 +53,20 @@ let in { nvim-pkg = mkNeovim { - plugins = all-plugins; - appName = "nvim"; + inherit plugins; extraPackages = basePackages ++ extraPackages; - withNodeJs = false; - withSqlite = true; }; nvim-min-pkg = mkNeovim { - plugins = all-plugins; - appName = "nvim"; + inherit plugins; extraPackages = basePackages; - withNodeJs = false; - withSqlite = true; }; # 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 { - plugins = all-plugins; + inherit plugins; extraPackages = basePackages ++ extraPackages; appName = "nvim-dev"; wrapRc = false; @@ -96,6 +74,6 @@ in # This can be symlinked in the devShell's shellHook nvim-luarc-json = final.mk-luarc-json { - plugins = all-plugins; + inherit plugins; }; } diff --git a/nix/plugin-overlay.nix b/nix/plugin-overlay.nix new file mode 100644 index 0000000..9a51a54 --- /dev/null +++ b/nix/plugin-overlay.nix @@ -0,0 +1,29 @@ +{ 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 0f9db6f..be525d8 100644 --- a/nvim/colors/iofq.lua +++ b/nvim/colors/iofq.lua @@ -468,8 +468,8 @@ hi(0, 'MiniTablineVisible', { bg = '#1d3337', fg = '#cbd9d8' }) hi(0, 'MiniTablineModifiedVisible', { bg = '#587b7b', fg = '#1d3337' }) hi(0, 'MiniTablineTabpagesection', { bg = '#152528', bold = true, fg = '#e6eaea' }) hi(0, 'MiniTablineFill', { link = 'TabLineFill' }) --- hi(0, 'MiniTablineHidden', { bg = '#1d3337', fg = '#587b7b' }) --- hi(0, 'MiniTablineModifiedHidden', { bg = '#587b7b', fg = '#1d3337' }) +hi(0, 'MiniTablineHidden', { bg = '#1d3337', fg = '#587b7b' }) +hi(0, 'MiniTablineModifiedHidden', { bg = '#587b7b', fg = '#1d3337' }) hi(0, 'MiniTestEmphasis', { bold = true }) hi(0, 'MiniTestFail', { bold = true, fg = '#e85c51' }) hi(0, 'MiniTestPass', { bold = true, fg = '#7aa4a1' }) diff --git a/nvim/init.lua b/nvim/init.lua index a4da977..622287b 100644 --- a/nvim/init.lua +++ b/nvim/init.lua @@ -29,5 +29,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/lua/config/autocmd.lua b/nvim/lua/config/autocmd.lua index 6184e7a..d40ad17 100644 --- a/nvim/lua/config/autocmd.lua +++ b/nvim/lua/config/autocmd.lua @@ -82,24 +82,24 @@ vim.api.nvim_create_autocmd('FileType', { map('[c', function() require('treesitter-context').go_to_context(vim.v.count1) - end, { desc = 'jump to TS context' }) + end, { buffer = bufnr, desc = 'jump to TS context' }) map(']f', function() require('nvim-treesitter-textobjects.move').goto_next_start('@function.outer', 'textobjects') - end, { desc = 'next function def' }) + end, { buffer = bufnr, desc = 'next function def' }) map('[f', function() require('nvim-treesitter-textobjects.move').goto_previous_start('@function.outer', 'textobjects') - end, { desc = 'prev function def' }) + end, { buffer = bufnr, desc = 'prev function def' }) map(']a', function() require('nvim-treesitter-textobjects.move').goto_next_start('@parameter.inner', 'textobjects') - end, { desc = 'next param def' }) + end, { buffer = bufnr, desc = 'next param def' }) map('[a', function() require('nvim-treesitter-textobjects.move').goto_previous_start('@parameter.inner', 'textobjects') - end, { desc = 'prev param def' }) + end, { buffer = bufnr, desc = 'prev param def' }) map('a]', function() require('nvim-treesitter-textobjects.swap').swap_next('@parameter.inner') - end, { desc = 'swap next arg' }) + end, { buffer = bufnr, desc = 'swap next arg' }) map('a[', function() require('nvim-treesitter-textobjects.swap').swap_previous('@parameter.inner') - end, { desc = 'swap prev arg' }) + end, { buffer = bufnr, desc = 'swap prev arg' }) end, }) diff --git a/nvim/lua/config/init.lua b/nvim/lua/config/init.lua index 2e6a1fd..f9ba85f 100644 --- a/nvim/lua/config/init.lua +++ b/nvim/lua/config/init.lua @@ -19,7 +19,6 @@ vim.opt.tabstop = 2 -- 2 space tabs are based vim.opt.updatetime = 250 -- decrease update time vim.opt.virtualedit = 'onemore' vim.opt.winborder = 'rounded' -vim.cmd('colorscheme iofq') -- Configure Neovim diagnostic messages vim.diagnostic.config { @@ -32,5 +31,7 @@ vim.diagnostic.config { source = 'if_many', }, } -require('config.keymaps') -require('config.autocmd') +vim.schedule(function() + require('config.autocmd') + require('config.keymaps') +end) diff --git a/nvim/lua/plugins/lsp.lua b/nvim/lua/plugins/lsp.lua index 4301885..6015930 100644 --- a/nvim/lua/plugins/lsp.lua +++ b/nvim/lua/plugins/lsp.lua @@ -8,6 +8,7 @@ return { 'phpactor', 'gopls', 'lua_ls', + 'basedpyright', } vim.api.nvim_create_autocmd('LspAttach', { diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index dda4e34..7dacf20 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -1,7 +1,8 @@ return { { 'iofq/dart.nvim', - event = 'VeryLazy', + lazy = false, + priority = 1001, config = true, }, { @@ -13,15 +14,12 @@ return { 'nvim-treesitter/nvim-treesitter', event = 'VeryLazy', branch = 'main', - main = 'nvim-treesitter.configs', - config = true, dependencies = { { 'nvim-treesitter/nvim-treesitter-textobjects', branch = 'main', config = true, }, - 'RRethy/nvim-treesitter-textsubjects', { 'nvim-treesitter/nvim-treesitter-context', opts = { @@ -49,6 +47,7 @@ return { 'sindrets/diffview.nvim', event = 'VeryLazy', opts = { + use_icons = false, enhanced_diff_hl = true, default_args = { DiffviewOpen = { '--imply-local' }, @@ -105,12 +104,16 @@ return { { 'stevearc/quicker.nvim', event = 'VeryLazy', - config = true, + opts = { + follow = { + enabled = true, + }, + }, keys = { { 'qf', function() - require('quicker').toggle() + require('quicker').toggle { max_height = 20 } end, desc = 'Toggle qflist', }, From ac26b74e43e4c57a1364870104f1b56ad264d972 Mon Sep 17 00:00:00 2001 From: iofq Date: Fri, 15 Aug 2025 00:59:00 -0500 Subject: [PATCH 146/160] 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 147/160] 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 148/160] 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 149/160] 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 150/160] 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 151/160] 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 152/160] 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 153/160] 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 a004f2472820018a9eb5b7dad31cec27a042945c Mon Sep 17 00:00:00 2001 From: iofq Date: Wed, 22 Oct 2025 01:15:51 -0500 Subject: [PATCH 154/160] jj file hist --- flake.lock | 60 +++++++++++++++---------------- new | 1 + nvim/after/lua/iofq/snacks_jj.lua | 38 ++++++++++++++++++++ nvim/after/plugin/autocmd.lua | 30 ++++++++++++++-- nvim/after/plugin/plugins.lua | 4 ++- 5 files changed, 100 insertions(+), 33 deletions(-) create mode 100644 new diff --git a/flake.lock b/flake.lock index 76ad5f1..f7bb4eb 100644 --- a/flake.lock +++ b/flake.lock @@ -6,11 +6,11 @@ "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1760366615, - "narHash": "sha256-qGWNl+UQLvdFl8AAgywOHthizfKovk8az1xhRhQeVn8=", + "lastModified": 1760745932, + "narHash": "sha256-Z9idyP9kiKxC10VL0vHnxcBwrkpNtBrC+Zxl9mQbCj8=", "owner": "iofq", "repo": "dart.nvim", - "rev": "5fac43b0f7b5500c69a51a3717aef8ccceacd178", + "rev": "26b476f2113143329637a27d4e52ce9772bcae5b", "type": "github" }, "original": { @@ -93,11 +93,11 @@ ] }, "locked": { - "lastModified": 1759362264, - "narHash": "sha256-wfG0S7pltlYyZTM+qqlhJ7GMw2fTF4mLKCIVhLii/4M=", + "lastModified": 1760813311, + "narHash": "sha256-lbHQ7FXGzt6/IygWvJ1lCq+Txcut3xYYd6VIpF1ojkg=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "758cf7296bee11f1706a574c77d072b8a7baa881", + "rev": "4e627ac2e1b8f1de7f5090064242de9a259dbbc8", "type": "github" }, "original": { @@ -198,11 +198,11 @@ ] }, "locked": { - "lastModified": 1759523803, - "narHash": "sha256-PTod9NG+i3XbbnBKMl/e5uHDBYpwIWivQ3gOWSEuIEM=", + "lastModified": 1760663237, + "narHash": "sha256-BflA6U4AM1bzuRMR8QqzPXqh8sWVCNDzOdsxXEguJIc=", "owner": "cachix", "repo": "git-hooks.nix", - "rev": "cfc9f7bb163ad8542029d303e599c0f7eee09835", + "rev": "ca5b894d3e3e151ffc1db040b6ce4dcc75d31c37", "type": "github" }, "original": { @@ -309,11 +309,11 @@ "treefmt-nix": "treefmt-nix" }, "locked": { - "lastModified": 1760313895, - "narHash": "sha256-39JFRb006AOsIcOq+03H3y6YcGyaphk1CW5DRi14cOE=", + "lastModified": 1760832323, + "narHash": "sha256-THAk4qzBOsp03bDBYK9Ek3mQEvl2g8Fea0QhpCoEzfs=", "owner": "nix-community", "repo": "neovim-nightly-overlay", - "rev": "7ff73a295b0065bde2f8b43b31558136ca77bd98", + "rev": "3c9432813e5528a13075f5493da6ff9ef249ad1d", "type": "github" }, "original": { @@ -325,11 +325,11 @@ "neovim-src": { "flake": false, "locked": { - "lastModified": 1760312166, - "narHash": "sha256-RnB+oJcP37YT9pjr1osUQtJc+1qcVyaaeSbiSyXwm1Y=", + "lastModified": 1760810839, + "narHash": "sha256-VYkZdjjMOYsugoSydDDWE/1l79swm4zc4NJl1Z0brjA=", "owner": "neovim", "repo": "neovim", - "rev": "72b0bfa1fb7e897e5126aabae718a5480f466b9e", + "rev": "be73c35943f85e7835c3a0fc89bddaeba944db29", "type": "github" }, "original": { @@ -383,11 +383,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1760326837, - "narHash": "sha256-z+C6KRPRjwqEsTEAwUavapBWcbR7YOlQP91O+W5L1ek=", + "lastModified": 1760913523, + "narHash": "sha256-Il5+67iRA3xp0cIErILj4VwEJ2ICrDrvTAHEmBsZJKQ=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "cfe6b045750c3aa5127817bc3f44f2909b1ee175", + "rev": "6a3b08503e9cab108f9f0ec27065c5854655662a", "type": "github" }, "original": { @@ -399,11 +399,11 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1760038930, - "narHash": "sha256-Oncbh0UmHjSlxO7ErQDM3KM0A5/Znfofj2BSzlHLeVw=", + "lastModified": 1760524057, + "narHash": "sha256-EVAqOteLBFmd7pKkb0+FIUyzTF61VKi7YmvP1tw4nEw=", "owner": "nixos", "repo": "nixpkgs", - "rev": "0b4defa2584313f3b781240b29d61f6f9f7e0df3", + "rev": "544961dfcce86422ba200ed9a0b00dd4b1486ec5", "type": "github" }, "original": { @@ -416,11 +416,11 @@ "nvim-treesitter": { "flake": false, "locked": { - "lastModified": 1760260935, - "narHash": "sha256-To/syCZPs7vKA0WkuBz7ZxCGT/wzj705QfxZng6Nsjo=", + "lastModified": 1760866486, + "narHash": "sha256-ZeNCXy6+I18N+Nu2sKnEk2otVEb8V3tKhL8Jq95wS5k=", "owner": "nvim-treesitter", "repo": "nvim-treesitter", - "rev": "0606c7a9dcaa5c5beee0b0f09043e9fdd1ba0a68", + "rev": "71bf1665f804d46f7e4b24ad7ffc11f6ea5b271a", "type": "github" }, "original": { @@ -437,11 +437,11 @@ "nvim-treesitter-textobjects": "nvim-treesitter-textobjects" }, "locked": { - "lastModified": 1760324917, - "narHash": "sha256-ZlVGaUbxHf4DNR4GWhF1mvlMhP8IBbwF0g8WO1SL+Yw=", + "lastModified": 1760906917, + "narHash": "sha256-WJScDX0q/+PCRpvBSlJfV01kwvu9WCk5YDpzW2Zswj8=", "owner": "iofq", "repo": "nvim-treesitter-main", - "rev": "da2262419eb66cfa426aa62ccf1fc8fdea33b4a0", + "rev": "420c14c0523d65c6c7ce943e8f2fb896eff950e3", "type": "github" }, "original": { @@ -515,11 +515,11 @@ ] }, "locked": { - "lastModified": 1760120816, - "narHash": "sha256-gq9rdocpmRZCwLS5vsHozwB6b5nrOBDNc2kkEaTXHfg=", + "lastModified": 1760802554, + "narHash": "sha256-5YkOYOCF8/XNw89/ABKFB0c/P78U2EVuKRDGTql6+kA=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "761ae7aff00907b607125b2f57338b74177697ed", + "rev": "296ebf0c3668ebceb3b0bfee55298f112b4b5754", "type": "github" }, "original": { diff --git a/new b/new new file mode 100644 index 0000000..fab9518 --- /dev/null +++ b/new @@ -0,0 +1 @@ +print('kjsnadf') diff --git a/nvim/after/lua/iofq/snacks_jj.lua b/nvim/after/lua/iofq/snacks_jj.lua index 639ecfd..aae14fa 100644 --- a/nvim/after/lua/iofq/snacks_jj.lua +++ b/nvim/after/lua/iofq/snacks_jj.lua @@ -49,4 +49,42 @@ function M.status() } end +function M.file_history(filename) + local function preview(ctx) + if ctx.item.rev then + Snacks.picker.preview.cmd( + { 'jj', 'log', '--ignore-working-copy', '--git', '-r', ctx.item.rev, '-p', filename }, + ctx + ) + else + ctx.preview:reset() + return 'No preview available.' + end + end + + local function get_history(f) + local status_raw = vim.fn.system( + 'jj log --ignore-working-copy --no-graph' + .. ' --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",),)\'' + .. ' -- ' + .. f + ) + local lines = {} + for line in status_raw:gmatch('[^\r\n]+') do + local rev = string.match(line, '(%w+)%s.*') + table.insert(lines, { + text = line, + rev = rev, + }) + end + return lines + end + + Snacks.picker.pick { + format = 'text', + title = 'jj file history for ' .. filename, + items = get_history(filename), + preview = preview, + } +end return M diff --git a/nvim/after/plugin/autocmd.lua b/nvim/after/plugin/autocmd.lua index e22f2b7..81cb335 100644 --- a/nvim/after/plugin/autocmd.lua +++ b/nvim/after/plugin/autocmd.lua @@ -30,7 +30,7 @@ cmd({ 'FocusGained', 'TermClose', 'TermLeave' }, { }) -- Configure difftool buffers -vim.api.nvim_create_autocmd('FileType', { +cmd('FileType', { pattern = 'qf', group = vim.api.nvim_create_augroup('difftool', { clear = true }), callback = function(event) @@ -41,7 +41,7 @@ vim.api.nvim_create_autocmd('FileType', { local qf = vim.fn.getqflist() local entry = qf[1] - if not entry or not entry.user_data.diff then + if not entry or not entry.user_data or not entry.user_data.diff then return nil end @@ -75,6 +75,32 @@ vim.api.nvim_create_autocmd('FileType', { end, }) +-- open conflicts in qflist +cmd('BufWinEnter', { + callback = function(event) + if not vim.wo.diff then + return + end + + local items = {} + while true do + local found = vim.fn.search('^<<<<<<<', 'W') + if found == 0 then + break + end + local line = vim.api.nvim_buf_get_lines(event.buf, found - 1, found, false)[1] + table.insert(items, { bufnr = event.buf, lnum = found, text = line }) + end + + if #items > 1 then + vim.fn.setqflist(items, 'r') + vim.schedule(function() + vim.cmd(string.format('%dcopen', math.min(10, #items))) + end) + end + end, +}) + -- Init treesitter cmd('FileType', { group = vim.api.nvim_create_augroup('treesitter', { clear = true }), diff --git a/nvim/after/plugin/plugins.lua b/nvim/after/plugin/plugins.lua index 58dae3e..2d8e7c4 100644 --- a/nvim/after/plugin/plugins.lua +++ b/nvim/after/plugin/plugins.lua @@ -56,11 +56,13 @@ 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) +map('n', 'jh', function() + require('iofq.snacks_jj').file_history(vim.api.nvim_buf_get_name(0)) +end) vim.schedule(function() require('nvim-treesitter').setup() require('nvim-treesitter-textobjects').setup() - require('render-markdown').setup() require('nvim-autopairs').setup() require('refactoring').setup() From c8d9279372ec4d863b65a2e838d949bbbfc755bc Mon Sep 17 00:00:00 2001 From: iofq Date: Fri, 24 Oct 2025 21:58:25 -0500 Subject: [PATCH 155/160] combine diffs --- .github/workflows/main.yml | 2 +- README.md | 2 +- flake.lock | 60 +++++++++++++++---------------- flake.nix | 1 - nix/neovim-overlay.nix | 27 ++------------ nvim/after/lua/iofq/snacks_jj.lua | 16 +++++++++ nvim/after/plugin/autocmd.lua | 41 ++++++++++++++++++++- nvim/after/plugin/mini.lua | 4 +-- nvim/after/plugin/plugins.lua | 16 ++------- 9 files changed, 93 insertions(+), 76 deletions(-) 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 f7bb4eb..3513204 100644 --- a/flake.lock +++ b/flake.lock @@ -6,11 +6,11 @@ "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1760745932, - "narHash": "sha256-Z9idyP9kiKxC10VL0vHnxcBwrkpNtBrC+Zxl9mQbCj8=", + "lastModified": 1761202123, + "narHash": "sha256-ULrZW4b8SKRvPpJPt8/jkqqc/blQiIWUriNWVXA33so=", "owner": "iofq", "repo": "dart.nvim", - "rev": "26b476f2113143329637a27d4e52ce9772bcae5b", + "rev": "71421e7ef5aee8267e24dc562fdd07a83bda192e", "type": "github" }, "original": { @@ -93,11 +93,11 @@ ] }, "locked": { - "lastModified": 1760813311, - "narHash": "sha256-lbHQ7FXGzt6/IygWvJ1lCq+Txcut3xYYd6VIpF1ojkg=", + "lastModified": 1760948891, + "narHash": "sha256-TmWcdiUUaWk8J4lpjzu4gCGxWY6/Ok7mOK4fIFfBuU4=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "4e627ac2e1b8f1de7f5090064242de9a259dbbc8", + "rev": "864599284fc7c0ba6357ed89ed5e2cd5040f0c04", "type": "github" }, "original": { @@ -267,11 +267,11 @@ ] }, "locked": { - "lastModified": 1758022363, - "narHash": "sha256-ENUhCRWgSX4ni751HieNuQoq06dJvApV/Nm89kh+/A0=", + "lastModified": 1761230615, + "narHash": "sha256-pLE7U5gOtlA/2wbKCsVRYf5DqMQ5TWBCrCfZGytDDeo=", "owner": "hercules-ci", "repo": "hercules-ci-effects", - "rev": "1a3667d33e247ad35ca250698d63f49a5453d824", + "rev": "7db2b867219a26781437d840ce457b75b7645154", "type": "github" }, "original": { @@ -309,11 +309,11 @@ "treefmt-nix": "treefmt-nix" }, "locked": { - "lastModified": 1760832323, - "narHash": "sha256-THAk4qzBOsp03bDBYK9Ek3mQEvl2g8Fea0QhpCoEzfs=", + "lastModified": 1761437965, + "narHash": "sha256-X4SNeOXdFkE7Gt+waO5ck3TqfqWskqJHxt1WIu3nnUQ=", "owner": "nix-community", "repo": "neovim-nightly-overlay", - "rev": "3c9432813e5528a13075f5493da6ff9ef249ad1d", + "rev": "21595d9f79b5da0eef177dcfdd84ca981ac253a9", "type": "github" }, "original": { @@ -325,11 +325,11 @@ "neovim-src": { "flake": false, "locked": { - "lastModified": 1760810839, - "narHash": "sha256-VYkZdjjMOYsugoSydDDWE/1l79swm4zc4NJl1Z0brjA=", + "lastModified": 1761434579, + "narHash": "sha256-S+YmbP/bPETjKk6B/tlh+jwIH7K7iPoXyHLLwTqVOhk=", "owner": "neovim", "repo": "neovim", - "rev": "be73c35943f85e7835c3a0fc89bddaeba944db29", + "rev": "a121ede1bfee2704c26159124f8f61f96c6aa136", "type": "github" }, "original": { @@ -383,11 +383,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1760913523, - "narHash": "sha256-Il5+67iRA3xp0cIErILj4VwEJ2ICrDrvTAHEmBsZJKQ=", + "lastModified": 1761497392, + "narHash": "sha256-aK+BZgnXKktKD1DFAJoB+8KD9L8sf/dmiOa2bShlhlk=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "6a3b08503e9cab108f9f0ec27065c5854655662a", + "rev": "887b4accbb94043a752c086c2aae6c6b365f7b3f", "type": "github" }, "original": { @@ -399,11 +399,11 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1760524057, - "narHash": "sha256-EVAqOteLBFmd7pKkb0+FIUyzTF61VKi7YmvP1tw4nEw=", + "lastModified": 1761114652, + "narHash": "sha256-f/QCJM/YhrV/lavyCVz8iU3rlZun6d+dAiC3H+CDle4=", "owner": "nixos", "repo": "nixpkgs", - "rev": "544961dfcce86422ba200ed9a0b00dd4b1486ec5", + "rev": "01f116e4df6a15f4ccdffb1bcd41096869fb385c", "type": "github" }, "original": { @@ -416,11 +416,11 @@ "nvim-treesitter": { "flake": false, "locked": { - "lastModified": 1760866486, - "narHash": "sha256-ZeNCXy6+I18N+Nu2sKnEk2otVEb8V3tKhL8Jq95wS5k=", + "lastModified": 1761385693, + "narHash": "sha256-/SGikTPEMxI7rcfGvuJlNZs73/wZiQx14QX9xlfsTv0=", "owner": "nvim-treesitter", "repo": "nvim-treesitter", - "rev": "71bf1665f804d46f7e4b24ad7ffc11f6ea5b271a", + "rev": "98fe644cb3b5ba390d1bc3f89299f93c70020803", "type": "github" }, "original": { @@ -437,11 +437,11 @@ "nvim-treesitter-textobjects": "nvim-treesitter-textobjects" }, "locked": { - "lastModified": 1760906917, - "narHash": "sha256-WJScDX0q/+PCRpvBSlJfV01kwvu9WCk5YDpzW2Zswj8=", + "lastModified": 1761496664, + "narHash": "sha256-xTQUiJu0jJNSEHEv4La1HbaFokup0eWr67Kqf/wDENA=", "owner": "iofq", "repo": "nvim-treesitter-main", - "rev": "420c14c0523d65c6c7ce943e8f2fb896eff950e3", + "rev": "834d66648bb7a96a2ad11d53a33f2d9b13766447", "type": "github" }, "original": { @@ -515,11 +515,11 @@ ] }, "locked": { - "lastModified": 1760802554, - "narHash": "sha256-5YkOYOCF8/XNw89/ABKFB0c/P78U2EVuKRDGTql6+kA=", + "lastModified": 1761311587, + "narHash": "sha256-Msq86cR5SjozQGCnC6H8C+0cD4rnx91BPltZ9KK613Y=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "296ebf0c3668ebceb3b0bfee55298f112b4b5754", + "rev": "2eddae033e4e74bf581c2d1dfa101f9033dbd2dc", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index a9cc1ad..e5890fa 100644 --- a/flake.nix +++ b/flake.nix @@ -73,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 430c345..efc75a1 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -17,41 +17,18 @@ let nvim-treesitter nvim-treesitter-textobjects quicker-nvim - refactoring-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 c60ec00..76b5fe9 100644 --- a/nvim/after/plugin/mini.lua +++ b/nvim/after/plugin/mini.lua @@ -18,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 2d8e7c4..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 }, @@ -65,12 +60,6 @@ vim.schedule(function() require('nvim-treesitter-textobjects').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 } @@ -82,7 +71,6 @@ vim.schedule(function() json = { 'jq' }, lua = { 'stylua' }, python = { 'ruff' }, - nix = { 'nixfmt' }, fish = { 'fish_indent' }, ['*'] = { 'trim_whitespace' }, }, @@ -128,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', From 8fc4e6a40762bc511b36533cb4a96de028fc1e8e Mon Sep 17 00:00:00 2001 From: iofq Date: Sun, 9 Nov 2025 10:13:55 -0600 Subject: [PATCH 156/160] flake.lock: Update 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/71421e7ef5aee8267e24dc562fdd07a83bda192e?narHash=sha256-ULrZW4b8SKRvPpJPt8/jkqqc/blQiIWUriNWVXA33so%3D' (2025-10-23) → 'github:iofq/dart.nvim/8822aabbfef95eda2b22a8f7ee08912c762ef941?narHash=sha256-ADZ2b2Oz%2BMOSjdKKCcQX9KmlhtmvVlZFEJr0HigWsOY%3D' (2025-11-01) • Updated input 'neovim-nightly-overlay': 'github:nix-community/neovim-nightly-overlay/21595d9f79b5da0eef177dcfdd84ca981ac253a9?narHash=sha256-X4SNeOXdFkE7Gt%2BwaO5ck3TqfqWskqJHxt1WIu3nnUQ%3D' (2025-10-26) → 'github:nix-community/neovim-nightly-overlay/2c33f92a62588cd30dbba26fa39384e29229bc6f?narHash=sha256-h3c8Mcs4wI0U9JKzDyj1X%2BJUMc5KsfIXu2eyRE5ktAs%3D' (2025-11-09) • Removed input 'neovim-nightly-overlay/flake-compat' • Updated input 'neovim-nightly-overlay/flake-parts': 'github:hercules-ci/flake-parts/864599284fc7c0ba6357ed89ed5e2cd5040f0c04?narHash=sha256-TmWcdiUUaWk8J4lpjzu4gCGxWY6/Ok7mOK4fIFfBuU4%3D' (2025-10-20) → 'github:hercules-ci/flake-parts/26d05891e14c88eb4a5d5bee659c0db5afb609d8?narHash=sha256-xxdepIcb39UJ94%2BYydGP221rjnpkDZUlykKuF54PsqI%3D' (2025-11-06) • 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/a121ede1bfee2704c26159124f8f61f96c6aa136?narHash=sha256-S%2BYmbP/bPETjKk6B/tlh%2BjwIH7K7iPoXyHLLwTqVOhk%3D' (2025-10-25) → 'github:neovim/neovim/ded578625219d5056fdacdba4b04f0d5bf4fbe9d?narHash=sha256-npSk%2BFSPkiaGwKTluegZ3tXqDpe3EFiRMQJ2Cc6rq4Y%3D' (2025-11-08) • Removed input 'neovim-nightly-overlay/treefmt-nix' • Removed input 'neovim-nightly-overlay/treefmt-nix/nixpkgs' • Updated input 'nixpkgs': 'github:NixOS/nixpkgs/887b4accbb94043a752c086c2aae6c6b365f7b3f?narHash=sha256-aK%2BBZgnXKktKD1DFAJoB%2B8KD9L8sf/dmiOa2bShlhlk%3D' (2025-10-26) → 'github:NixOS/nixpkgs/cdfa60cc7448c7943dd3feb0ab18e342d569c7a4?narHash=sha256-kGEigbGxzpXpyeU9BtILXsMwTls5XcLyXEwYVfNjO4g%3D' (2025-11-09) • Updated input 'nvim-treesitter-main': 'github:iofq/nvim-treesitter-main/834d66648bb7a96a2ad11d53a33f2d9b13766447?narHash=sha256-xTQUiJu0jJNSEHEv4La1HbaFokup0eWr67Kqf/wDENA%3D' (2025-10-26) → 'github:iofq/nvim-treesitter-main/69e9583fe72fa2dbffcb740563a9cc48396e3f75?narHash=sha256-hRGD%2BCE04Z1qAJAaiJs6o%2BblS0WUEqfVS/5cqA0NcDI%3D' (2025-11-09) • Updated input 'nvim-treesitter-main/nixpkgs': 'github:nixos/nixpkgs/01f116e4df6a15f4ccdffb1bcd41096869fb385c?narHash=sha256-f/QCJM/YhrV/lavyCVz8iU3rlZun6d%2BdAiC3H%2BCDle4%3D' (2025-10-22) → 'github:nixos/nixpkgs/ae814fd3904b621d8ab97418f1d0f2eb0d3716f4?narHash=sha256-YRqMDEtSMbitIMj%2BJLpheSz0pwEr0Rmy5mC7myl17xs%3D' (2025-11-05) • Updated input 'nvim-treesitter-main/nvim-treesitter': 'github:nvim-treesitter/nvim-treesitter/98fe644cb3b5ba390d1bc3f89299f93c70020803?narHash=sha256-/SGikTPEMxI7rcfGvuJlNZs73/wZiQx14QX9xlfsTv0%3D' (2025-10-25) → 'github:nvim-treesitter/nvim-treesitter/d97d226cfd4c00af000b3b8529261352677fc6a8?narHash=sha256-hXs9TdytYtBeXW6nx9QZiQcqsuj1uLuZMf8kclaScQ8%3D' (2025-11-08) • Updated input 'nvim-treesitter-main/nvim-treesitter-textobjects': 'github:nvim-treesitter/nvim-treesitter-textobjects/1b2d85d3de6114c4bcea89ffb2cd1ce9e3a19931?narHash=sha256-%2BKmOpRi4JAqm6UqYdtk80jwFrJhLCs0lZM/Liofq0R4%3D' (2025-08-28) → 'github:nvim-treesitter/nvim-treesitter-textobjects/7024f8687b060dd9a425bde1fa8621c896a38138?narHash=sha256-gzeT2gtmFaXhRSC13mijH6tlk/eWRZaUrGiEpKoAorA%3D' (2025-11-08) --- flake.lock | 183 ++++++++--------------------------------------------- 1 file changed, 28 insertions(+), 155 deletions(-) diff --git a/flake.lock b/flake.lock index 3513204..4bf9aa7 100644 --- a/flake.lock +++ b/flake.lock @@ -6,11 +6,11 @@ "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1761202123, - "narHash": "sha256-ULrZW4b8SKRvPpJPt8/jkqqc/blQiIWUriNWVXA33so=", + "lastModified": 1762016984, + "narHash": "sha256-ADZ2b2Oz+MOSjdKKCcQX9KmlhtmvVlZFEJr0HigWsOY=", "owner": "iofq", "repo": "dart.nvim", - "rev": "71421e7ef5aee8267e24dc562fdd07a83bda192e", + "rev": "8822aabbfef95eda2b22a8f7ee08912c762ef941", "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": 1760948891, - "narHash": "sha256-TmWcdiUUaWk8J4lpjzu4gCGxWY6/Ok7mOK4fIFfBuU4=", + "lastModified": 1762440070, + "narHash": "sha256-xxdepIcb39UJ94+YydGP221rjnpkDZUlykKuF54PsqI=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "864599284fc7c0ba6357ed89ed5e2cd5040f0c04", + "rev": "26d05891e14c88eb4a5d5bee659c0db5afb609d8", "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": 1760663237, - "narHash": "sha256-BflA6U4AM1bzuRMR8QqzPXqh8sWVCNDzOdsxXEguJIc=", - "owner": "cachix", - "repo": "git-hooks.nix", - "rev": "ca5b894d3e3e151ffc1db040b6ce4dcc75d31c37", - "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": 1761230615, - "narHash": "sha256-pLE7U5gOtlA/2wbKCsVRYf5DqMQ5TWBCrCfZGytDDeo=", - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "rev": "7db2b867219a26781437d840ce457b75b7645154", - "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": 1761437965, - "narHash": "sha256-X4SNeOXdFkE7Gt+waO5ck3TqfqWskqJHxt1WIu3nnUQ=", + "lastModified": 1762646693, + "narHash": "sha256-h3c8Mcs4wI0U9JKzDyj1X+JUMc5KsfIXu2eyRE5ktAs=", "owner": "nix-community", "repo": "neovim-nightly-overlay", - "rev": "21595d9f79b5da0eef177dcfdd84ca981ac253a9", + "rev": "2c33f92a62588cd30dbba26fa39384e29229bc6f", "type": "github" }, "original": { @@ -325,11 +219,11 @@ "neovim-src": { "flake": false, "locked": { - "lastModified": 1761434579, - "narHash": "sha256-S+YmbP/bPETjKk6B/tlh+jwIH7K7iPoXyHLLwTqVOhk=", + "lastModified": 1762624437, + "narHash": "sha256-npSk+FSPkiaGwKTluegZ3tXqDpe3EFiRMQJ2Cc6rq4Y=", "owner": "neovim", "repo": "neovim", - "rev": "a121ede1bfee2704c26159124f8f61f96c6aa136", + "rev": "ded578625219d5056fdacdba4b04f0d5bf4fbe9d", "type": "github" }, "original": { @@ -383,11 +277,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1761497392, - "narHash": "sha256-aK+BZgnXKktKD1DFAJoB+8KD9L8sf/dmiOa2bShlhlk=", + "lastModified": 1762704076, + "narHash": "sha256-kGEigbGxzpXpyeU9BtILXsMwTls5XcLyXEwYVfNjO4g=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "887b4accbb94043a752c086c2aae6c6b365f7b3f", + "rev": "cdfa60cc7448c7943dd3feb0ab18e342d569c7a4", "type": "github" }, "original": { @@ -399,11 +293,11 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1761114652, - "narHash": "sha256-f/QCJM/YhrV/lavyCVz8iU3rlZun6d+dAiC3H+CDle4=", + "lastModified": 1762363567, + "narHash": "sha256-YRqMDEtSMbitIMj+JLpheSz0pwEr0Rmy5mC7myl17xs=", "owner": "nixos", "repo": "nixpkgs", - "rev": "01f116e4df6a15f4ccdffb1bcd41096869fb385c", + "rev": "ae814fd3904b621d8ab97418f1d0f2eb0d3716f4", "type": "github" }, "original": { @@ -416,11 +310,11 @@ "nvim-treesitter": { "flake": false, "locked": { - "lastModified": 1761385693, - "narHash": "sha256-/SGikTPEMxI7rcfGvuJlNZs73/wZiQx14QX9xlfsTv0=", + "lastModified": 1762599340, + "narHash": "sha256-hXs9TdytYtBeXW6nx9QZiQcqsuj1uLuZMf8kclaScQ8=", "owner": "nvim-treesitter", "repo": "nvim-treesitter", - "rev": "98fe644cb3b5ba390d1bc3f89299f93c70020803", + "rev": "d97d226cfd4c00af000b3b8529261352677fc6a8", "type": "github" }, "original": { @@ -437,11 +331,11 @@ "nvim-treesitter-textobjects": "nvim-treesitter-textobjects" }, "locked": { - "lastModified": 1761496664, - "narHash": "sha256-xTQUiJu0jJNSEHEv4La1HbaFokup0eWr67Kqf/wDENA=", + "lastModified": 1762704339, + "narHash": "sha256-hRGD+CE04Z1qAJAaiJs6o+blS0WUEqfVS/5cqA0NcDI=", "owner": "iofq", "repo": "nvim-treesitter-main", - "rev": "834d66648bb7a96a2ad11d53a33f2d9b13766447", + "rev": "69e9583fe72fa2dbffcb740563a9cc48396e3f75", "type": "github" }, "original": { @@ -453,11 +347,11 @@ "nvim-treesitter-textobjects": { "flake": false, "locked": { - "lastModified": 1756368113, - "narHash": "sha256-+KmOpRi4JAqm6UqYdtk80jwFrJhLCs0lZM/Liofq0R4=", + "lastModified": 1762622273, + "narHash": "sha256-gzeT2gtmFaXhRSC13mijH6tlk/eWRZaUrGiEpKoAorA=", "owner": "nvim-treesitter", "repo": "nvim-treesitter-textobjects", - "rev": "1b2d85d3de6114c4bcea89ffb2cd1ce9e3a19931", + "rev": "7024f8687b060dd9a425bde1fa8621c896a38138", "type": "github" }, "original": { @@ -506,27 +400,6 @@ "repo": "default", "type": "github" } - }, - "treefmt-nix": { - "inputs": { - "nixpkgs": [ - "neovim-nightly-overlay", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1761311587, - "narHash": "sha256-Msq86cR5SjozQGCnC6H8C+0cD4rnx91BPltZ9KK613Y=", - "owner": "numtide", - "repo": "treefmt-nix", - "rev": "2eddae033e4e74bf581c2d1dfa101f9033dbd2dc", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "treefmt-nix", - "type": "github" - } } }, "root": "root", From 63f5dd46e9b8c58fc753c25dac116f48156f3d31 Mon Sep 17 00:00:00 2001 From: iofq Date: Thu, 18 Dec 2025 00:12:40 -0600 Subject: [PATCH 157/160] flake.lock: Update 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/8822aabbfef95eda2b22a8f7ee08912c762ef941?narHash=sha256-ADZ2b2Oz%2BMOSjdKKCcQX9KmlhtmvVlZFEJr0HigWsOY%3D' (2025-11-01) → 'github:iofq/dart.nvim/205f809fbb27d56aff22756a97b5ba6f0c7243c3?narHash=sha256-lLY34wnbyzi21zE8i%2BVM0AoEt67r4aPn/EoaZ8o4NgU%3D' (2025-12-07) • Updated input 'neovim-nightly-overlay': 'github:nix-community/neovim-nightly-overlay/2c33f92a62588cd30dbba26fa39384e29229bc6f?narHash=sha256-h3c8Mcs4wI0U9JKzDyj1X%2BJUMc5KsfIXu2eyRE5ktAs%3D' (2025-11-09) → 'github:nix-community/neovim-nightly-overlay/f7fbc4e3d4ccea45eaa5b187884592eb42dfdbbd?narHash=sha256-YMf/PUyY4z7RlIe/Dzn1NnxZGS0Vp2eHxcMNWJM9q%2BA%3D' (2025-12-18) • Updated input 'neovim-nightly-overlay/flake-parts': 'github:hercules-ci/flake-parts/26d05891e14c88eb4a5d5bee659c0db5afb609d8?narHash=sha256-xxdepIcb39UJ94%2BYydGP221rjnpkDZUlykKuF54PsqI%3D' (2025-11-06) → 'github:hercules-ci/flake-parts/a34fae9c08a15ad73f295041fec82323541400a9?narHash=sha256-XswHlK/Qtjasvhd1nOa1e8MgZ8GS//jBoTqWtrS1Giw%3D' (2025-12-15) • Updated input 'neovim-nightly-overlay/neovim-src': 'github:neovim/neovim/ded578625219d5056fdacdba4b04f0d5bf4fbe9d?narHash=sha256-npSk%2BFSPkiaGwKTluegZ3tXqDpe3EFiRMQJ2Cc6rq4Y%3D' (2025-11-08) → 'github:neovim/neovim/c172fd9f464d5766eab9071e8f4770504c920c05?narHash=sha256-KE/ufBGH8XFXTw3Vt1DrK1rQmAEp1Q%2BoyLQibX5UKO0%3D' (2025-12-17) • Updated input 'nixpkgs': 'github:NixOS/nixpkgs/cdfa60cc7448c7943dd3feb0ab18e342d569c7a4?narHash=sha256-kGEigbGxzpXpyeU9BtILXsMwTls5XcLyXEwYVfNjO4g%3D' (2025-11-09) → 'github:NixOS/nixpkgs/1306659b587dc277866c7b69eb97e5f07864d8c4?narHash=sha256-KJ2wa/BLSrTqDjbfyNx70ov/HdgNBCBBSQP3BIzKnv4%3D' (2025-12-15) • Updated input 'nvim-treesitter-main': 'github:iofq/nvim-treesitter-main/69e9583fe72fa2dbffcb740563a9cc48396e3f75?narHash=sha256-hRGD%2BCE04Z1qAJAaiJs6o%2BblS0WUEqfVS/5cqA0NcDI%3D' (2025-11-09) → 'github:iofq/nvim-treesitter-main/2e8b5c686fc346c34b1d2a269584b32f480e7b7f?narHash=sha256-%2BUw%2B965kDJTriyUGiYF/eYAuQBowoBZpLzJswInqLCY%3D' (2025-12-14) • Updated input 'nvim-treesitter-main/nixpkgs': 'github:nixos/nixpkgs/ae814fd3904b621d8ab97418f1d0f2eb0d3716f4?narHash=sha256-YRqMDEtSMbitIMj%2BJLpheSz0pwEr0Rmy5mC7myl17xs%3D' (2025-11-05) → 'github:nixos/nixpkgs/2fbfb1d73d239d2402a8fe03963e37aab15abe8b?narHash=sha256-9VvC20PJPsleGMewwcWYKGzDIyjckEz8uWmT0vCDYK0%3D' (2025-12-11) • Updated input 'nvim-treesitter-main/nvim-treesitter': 'github:nvim-treesitter/nvim-treesitter/d97d226cfd4c00af000b3b8529261352677fc6a8?narHash=sha256-hXs9TdytYtBeXW6nx9QZiQcqsuj1uLuZMf8kclaScQ8%3D' (2025-11-08) → 'github:nvim-treesitter/nvim-treesitter/74b119812e9f82bccc2f0eca156faff0354362ae?narHash=sha256-HT%2BUzX1m4hm2QAqDa0dltArr3gMyYhXHnHoYkkQBWZA%3D' (2025-12-13) • Updated input 'nvim-treesitter-main/nvim-treesitter-textobjects': 'github:nvim-treesitter/nvim-treesitter-textobjects/7024f8687b060dd9a425bde1fa8621c896a38138?narHash=sha256-gzeT2gtmFaXhRSC13mijH6tlk/eWRZaUrGiEpKoAorA%3D' (2025-11-08) → 'github:nvim-treesitter/nvim-treesitter-textobjects/0d7c800fadcfe2d33089f5726cb8907fc846eece?narHash=sha256-w2dzc5oWyEoPUgbqaAuNKCeFeh81rYJPOCPVRnFC724%3D' (2025-12-14) --- flake.lock | 56 +++++++++++++++++++++++++++--------------------------- flake.nix | 2 +- new | 1 - 3 files changed, 29 insertions(+), 30 deletions(-) delete mode 100644 new diff --git a/flake.lock b/flake.lock index 4bf9aa7..dc6be5d 100644 --- a/flake.lock +++ b/flake.lock @@ -6,11 +6,11 @@ "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1762016984, - "narHash": "sha256-ADZ2b2Oz+MOSjdKKCcQX9KmlhtmvVlZFEJr0HigWsOY=", + "lastModified": 1765140120, + "narHash": "sha256-lLY34wnbyzi21zE8i+VM0AoEt67r4aPn/EoaZ8o4NgU=", "owner": "iofq", "repo": "dart.nvim", - "rev": "8822aabbfef95eda2b22a8f7ee08912c762ef941", + "rev": "205f809fbb27d56aff22756a97b5ba6f0c7243c3", "type": "github" }, "original": { @@ -61,11 +61,11 @@ ] }, "locked": { - "lastModified": 1762440070, - "narHash": "sha256-xxdepIcb39UJ94+YydGP221rjnpkDZUlykKuF54PsqI=", + "lastModified": 1765835352, + "narHash": "sha256-XswHlK/Qtjasvhd1nOa1e8MgZ8GS//jBoTqWtrS1Giw=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "26d05891e14c88eb4a5d5bee659c0db5afb609d8", + "rev": "a34fae9c08a15ad73f295041fec82323541400a9", "type": "github" }, "original": { @@ -203,11 +203,11 @@ ] }, "locked": { - "lastModified": 1762646693, - "narHash": "sha256-h3c8Mcs4wI0U9JKzDyj1X+JUMc5KsfIXu2eyRE5ktAs=", + "lastModified": 1766016290, + "narHash": "sha256-YMf/PUyY4z7RlIe/Dzn1NnxZGS0Vp2eHxcMNWJM9q+A=", "owner": "nix-community", "repo": "neovim-nightly-overlay", - "rev": "2c33f92a62588cd30dbba26fa39384e29229bc6f", + "rev": "f7fbc4e3d4ccea45eaa5b187884592eb42dfdbbd", "type": "github" }, "original": { @@ -219,11 +219,11 @@ "neovim-src": { "flake": false, "locked": { - "lastModified": 1762624437, - "narHash": "sha256-npSk+FSPkiaGwKTluegZ3tXqDpe3EFiRMQJ2Cc6rq4Y=", + "lastModified": 1766014002, + "narHash": "sha256-KE/ufBGH8XFXTw3Vt1DrK1rQmAEp1Q+oyLQibX5UKO0=", "owner": "neovim", "repo": "neovim", - "rev": "ded578625219d5056fdacdba4b04f0d5bf4fbe9d", + "rev": "c172fd9f464d5766eab9071e8f4770504c920c05", "type": "github" }, "original": { @@ -277,27 +277,27 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1762704076, - "narHash": "sha256-kGEigbGxzpXpyeU9BtILXsMwTls5XcLyXEwYVfNjO4g=", + "lastModified": 1765779637, + "narHash": "sha256-KJ2wa/BLSrTqDjbfyNx70ov/HdgNBCBBSQP3BIzKnv4=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "cdfa60cc7448c7943dd3feb0ab18e342d569c7a4", + "rev": "1306659b587dc277866c7b69eb97e5f07864d8c4", "type": "github" }, "original": { "owner": "NixOS", - "ref": "master", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } }, "nixpkgs_3": { "locked": { - "lastModified": 1762363567, - "narHash": "sha256-YRqMDEtSMbitIMj+JLpheSz0pwEr0Rmy5mC7myl17xs=", + "lastModified": 1765472234, + "narHash": "sha256-9VvC20PJPsleGMewwcWYKGzDIyjckEz8uWmT0vCDYK0=", "owner": "nixos", "repo": "nixpkgs", - "rev": "ae814fd3904b621d8ab97418f1d0f2eb0d3716f4", + "rev": "2fbfb1d73d239d2402a8fe03963e37aab15abe8b", "type": "github" }, "original": { @@ -310,11 +310,11 @@ "nvim-treesitter": { "flake": false, "locked": { - "lastModified": 1762599340, - "narHash": "sha256-hXs9TdytYtBeXW6nx9QZiQcqsuj1uLuZMf8kclaScQ8=", + "lastModified": 1765632521, + "narHash": "sha256-HT+UzX1m4hm2QAqDa0dltArr3gMyYhXHnHoYkkQBWZA=", "owner": "nvim-treesitter", "repo": "nvim-treesitter", - "rev": "d97d226cfd4c00af000b3b8529261352677fc6a8", + "rev": "74b119812e9f82bccc2f0eca156faff0354362ae", "type": "github" }, "original": { @@ -331,11 +331,11 @@ "nvim-treesitter-textobjects": "nvim-treesitter-textobjects" }, "locked": { - "lastModified": 1762704339, - "narHash": "sha256-hRGD+CE04Z1qAJAaiJs6o+blS0WUEqfVS/5cqA0NcDI=", + "lastModified": 1765744132, + "narHash": "sha256-+Uw+965kDJTriyUGiYF/eYAuQBowoBZpLzJswInqLCY=", "owner": "iofq", "repo": "nvim-treesitter-main", - "rev": "69e9583fe72fa2dbffcb740563a9cc48396e3f75", + "rev": "2e8b5c686fc346c34b1d2a269584b32f480e7b7f", "type": "github" }, "original": { @@ -347,11 +347,11 @@ "nvim-treesitter-textobjects": { "flake": false, "locked": { - "lastModified": 1762622273, - "narHash": "sha256-gzeT2gtmFaXhRSC13mijH6tlk/eWRZaUrGiEpKoAorA=", + "lastModified": 1765672441, + "narHash": "sha256-w2dzc5oWyEoPUgbqaAuNKCeFeh81rYJPOCPVRnFC724=", "owner": "nvim-treesitter", "repo": "nvim-treesitter-textobjects", - "rev": "7024f8687b060dd9a425bde1fa8621c896a38138", + "rev": "0d7c800fadcfe2d33089f5726cb8907fc846eece", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index e5890fa..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"; diff --git a/new b/new deleted file mode 100644 index fab9518..0000000 --- a/new +++ /dev/null @@ -1 +0,0 @@ -print('kjsnadf') From 775af7d730c6d72ba8363de9f8c5a3cb9fadf115 Mon Sep 17 00:00:00 2001 From: iofq Date: Fri, 9 Jan 2026 23:08:24 -0600 Subject: [PATCH 158/160] flake.lock: Update 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/26b476f2113143329637a27d4e52ce9772bcae5b?narHash=sha256-Z9idyP9kiKxC10VL0vHnxcBwrkpNtBrC%2BZxl9mQbCj8%3D' (2025-10-18) → 'github:iofq/dart.nvim/205f809fbb27d56aff22756a97b5ba6f0c7243c3?narHash=sha256-lLY34wnbyzi21zE8i%2BVM0AoEt67r4aPn/EoaZ8o4NgU%3D' (2025-12-07) • Updated input 'neovim-nightly-overlay': 'github:nix-community/neovim-nightly-overlay/3c9432813e5528a13075f5493da6ff9ef249ad1d?narHash=sha256-THAk4qzBOsp03bDBYK9Ek3mQEvl2g8Fea0QhpCoEzfs%3D' (2025-10-19) → 'github:nix-community/neovim-nightly-overlay/d31b28318affe5d58ef12e7f72a7adfa66930a7a?narHash=sha256-pxxUR3VRDcDpMgF1qb9FnlHAEOGi24bk6pdB1QzL1II%3D' (2026-01-10) • Removed input 'neovim-nightly-overlay/flake-compat' • Updated input 'neovim-nightly-overlay/flake-parts': 'github:hercules-ci/flake-parts/4e627ac2e1b8f1de7f5090064242de9a259dbbc8?narHash=sha256-lbHQ7FXGzt6/IygWvJ1lCq%2BTxcut3xYYd6VIpF1ojkg%3D' (2025-10-18) → 'github:hercules-ci/flake-parts/250481aafeb741edfe23d29195671c19b36b6dca?narHash=sha256-feveD98mQpptwrAEggBQKJTYbvwwglSbOv53uCfH9PY%3D' (2026-01-05) • 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/be73c35943f85e7835c3a0fc89bddaeba944db29?narHash=sha256-VYkZdjjMOYsugoSydDDWE/1l79swm4zc4NJl1Z0brjA%3D' (2025-10-18) → 'github:neovim/neovim/930817f1009d9d392103b5440e2503cb47fdacc0?narHash=sha256-hcdQHR8l8oZDIl0vXKNtbrN%2B32dTs9EYvlqppoHgG2k%3D' (2026-01-09) • Removed input 'neovim-nightly-overlay/treefmt-nix' • Removed input 'neovim-nightly-overlay/treefmt-nix/nixpkgs' • Updated input 'nixpkgs': 'github:NixOS/nixpkgs/6a3b08503e9cab108f9f0ec27065c5854655662a?narHash=sha256-Il5%2B67iRA3xp0cIErILj4VwEJ2ICrDrvTAHEmBsZJKQ%3D' (2025-10-19) → 'github:NixOS/nixpkgs/299d331f770cdf7c466a4faa08b3070a767d681d?narHash=sha256-V7El1ktdJ0/WWEr6wGBKFYu433vitrWvxmvPk79FsSc%3D' (2026-01-10) • Updated input 'nvim-treesitter-main': 'github:iofq/nvim-treesitter-main/420c14c0523d65c6c7ce943e8f2fb896eff950e3?narHash=sha256-WJScDX0q/%2BPCRpvBSlJfV01kwvu9WCk5YDpzW2Zswj8%3D' (2025-10-19) → 'github:iofq/nvim-treesitter-main/d82b04e1a05f88ed88c6221672ca0636dc8d6ef7?narHash=sha256-ej7y4nhiJNFE/HcZSPTEIrU6/WQmkMJo%2BbVQfgT3abE%3D' (2026-01-06) • Updated input 'nvim-treesitter-main/nixpkgs': 'github:nixos/nixpkgs/544961dfcce86422ba200ed9a0b00dd4b1486ec5?narHash=sha256-EVAqOteLBFmd7pKkb0%2BFIUyzTF61VKi7YmvP1tw4nEw%3D' (2025-10-15) → 'github:nixos/nixpkgs/fb7944c166a3b630f177938e478f0378e64ce108?narHash=sha256-EgE0pxsrW9jp9YFMkHL9JMXxcqi/OoumPJYwf%2BOkucw%3D' (2026-01-02) • Updated input 'nvim-treesitter-main/nvim-treesitter': 'github:nvim-treesitter/nvim-treesitter/71bf1665f804d46f7e4b24ad7ffc11f6ea5b271a?narHash=sha256-ZeNCXy6%2BI18N%2BNu2sKnEk2otVEb8V3tKhL8Jq95wS5k%3D' (2025-10-19) → 'github:nvim-treesitter/nvim-treesitter/300b906a9514d5e0ce02911d371445382fe35a31?narHash=sha256-LX0rKTZ56Rp0uQfIXZ2JrcWxuCA/t8NJjK05aKiT0Yw%3D' (2026-01-03) • Updated input 'nvim-treesitter-main/nvim-treesitter-textobjects': 'github:nvim-treesitter/nvim-treesitter-textobjects/1b2d85d3de6114c4bcea89ffb2cd1ce9e3a19931?narHash=sha256-%2BKmOpRi4JAqm6UqYdtk80jwFrJhLCs0lZM/Liofq0R4%3D' (2025-08-28) → 'github:nvim-treesitter/nvim-treesitter-textobjects/28a3494c075ef0f353314f627546537e43c09592?narHash=sha256-5VeIAW09my%2B4fqXbzVG7RnLXrjpXAk/g2vd7RbhNws8%3D' (2026-01-03) --- flake.lock | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/flake.lock b/flake.lock index dc6be5d..845f50d 100644 --- a/flake.lock +++ b/flake.lock @@ -61,11 +61,11 @@ ] }, "locked": { - "lastModified": 1765835352, - "narHash": "sha256-XswHlK/Qtjasvhd1nOa1e8MgZ8GS//jBoTqWtrS1Giw=", + "lastModified": 1767609335, + "narHash": "sha256-feveD98mQpptwrAEggBQKJTYbvwwglSbOv53uCfH9PY=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "a34fae9c08a15ad73f295041fec82323541400a9", + "rev": "250481aafeb741edfe23d29195671c19b36b6dca", "type": "github" }, "original": { @@ -203,11 +203,11 @@ ] }, "locked": { - "lastModified": 1766016290, - "narHash": "sha256-YMf/PUyY4z7RlIe/Dzn1NnxZGS0Vp2eHxcMNWJM9q+A=", + "lastModified": 1768003501, + "narHash": "sha256-pxxUR3VRDcDpMgF1qb9FnlHAEOGi24bk6pdB1QzL1II=", "owner": "nix-community", "repo": "neovim-nightly-overlay", - "rev": "f7fbc4e3d4ccea45eaa5b187884592eb42dfdbbd", + "rev": "d31b28318affe5d58ef12e7f72a7adfa66930a7a", "type": "github" }, "original": { @@ -219,11 +219,11 @@ "neovim-src": { "flake": false, "locked": { - "lastModified": 1766014002, - "narHash": "sha256-KE/ufBGH8XFXTw3Vt1DrK1rQmAEp1Q+oyLQibX5UKO0=", + "lastModified": 1768000044, + "narHash": "sha256-hcdQHR8l8oZDIl0vXKNtbrN+32dTs9EYvlqppoHgG2k=", "owner": "neovim", "repo": "neovim", - "rev": "c172fd9f464d5766eab9071e8f4770504c920c05", + "rev": "930817f1009d9d392103b5440e2503cb47fdacc0", "type": "github" }, "original": { @@ -277,27 +277,27 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1765779637, - "narHash": "sha256-KJ2wa/BLSrTqDjbfyNx70ov/HdgNBCBBSQP3BIzKnv4=", + "lastModified": 1768020509, + "narHash": "sha256-V7El1ktdJ0/WWEr6wGBKFYu433vitrWvxmvPk79FsSc=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "1306659b587dc277866c7b69eb97e5f07864d8c4", + "rev": "299d331f770cdf7c466a4faa08b3070a767d681d", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixos-unstable", + "ref": "master", "repo": "nixpkgs", "type": "github" } }, "nixpkgs_3": { "locked": { - "lastModified": 1765472234, - "narHash": "sha256-9VvC20PJPsleGMewwcWYKGzDIyjckEz8uWmT0vCDYK0=", + "lastModified": 1767379071, + "narHash": "sha256-EgE0pxsrW9jp9YFMkHL9JMXxcqi/OoumPJYwf+Okucw=", "owner": "nixos", "repo": "nixpkgs", - "rev": "2fbfb1d73d239d2402a8fe03963e37aab15abe8b", + "rev": "fb7944c166a3b630f177938e478f0378e64ce108", "type": "github" }, "original": { @@ -310,11 +310,11 @@ "nvim-treesitter": { "flake": false, "locked": { - "lastModified": 1765632521, - "narHash": "sha256-HT+UzX1m4hm2QAqDa0dltArr3gMyYhXHnHoYkkQBWZA=", + "lastModified": 1767460514, + "narHash": "sha256-LX0rKTZ56Rp0uQfIXZ2JrcWxuCA/t8NJjK05aKiT0Yw=", "owner": "nvim-treesitter", "repo": "nvim-treesitter", - "rev": "74b119812e9f82bccc2f0eca156faff0354362ae", + "rev": "300b906a9514d5e0ce02911d371445382fe35a31", "type": "github" }, "original": { @@ -331,11 +331,11 @@ "nvim-treesitter-textobjects": "nvim-treesitter-textobjects" }, "locked": { - "lastModified": 1765744132, - "narHash": "sha256-+Uw+965kDJTriyUGiYF/eYAuQBowoBZpLzJswInqLCY=", + "lastModified": 1767660784, + "narHash": "sha256-ej7y4nhiJNFE/HcZSPTEIrU6/WQmkMJo+bVQfgT3abE=", "owner": "iofq", "repo": "nvim-treesitter-main", - "rev": "2e8b5c686fc346c34b1d2a269584b32f480e7b7f", + "rev": "d82b04e1a05f88ed88c6221672ca0636dc8d6ef7", "type": "github" }, "original": { @@ -347,11 +347,11 @@ "nvim-treesitter-textobjects": { "flake": false, "locked": { - "lastModified": 1765672441, - "narHash": "sha256-w2dzc5oWyEoPUgbqaAuNKCeFeh81rYJPOCPVRnFC724=", + "lastModified": 1767434017, + "narHash": "sha256-5VeIAW09my+4fqXbzVG7RnLXrjpXAk/g2vd7RbhNws8=", "owner": "nvim-treesitter", "repo": "nvim-treesitter-textobjects", - "rev": "0d7c800fadcfe2d33089f5726cb8907fc846eece", + "rev": "28a3494c075ef0f353314f627546537e43c09592", "type": "github" }, "original": { From 3c5c3a6745fd93970e5bebfb5a75b5bca53557a3 Mon Sep 17 00:00:00 2001 From: iofq Date: Fri, 9 Jan 2026 23:15:13 -0600 Subject: [PATCH 159/160] misc cleanup --- .github/workflows/main.yml | 2 +- README.md | 2 +- flake.lock | 73 +------------------------------ flake.nix | 17 +------ nix/neovim-overlay.nix | 28 ++++++++++-- nvim/after/lua/iofq/snacks_jj.lua | 16 ------- nvim/after/plugin/autocmd.lua | 41 +---------------- nvim/after/plugin/mini.lua | 6 +-- nvim/after/plugin/plugins.lua | 13 +++--- 9 files changed, 42 insertions(+), 156 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4c6ddd7..36b3551 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"] + package_name: ["nvim-min"] steps: - uses: actions/checkout@v3 - uses: DeterminateSystems/nix-installer-action@main diff --git a/README.md b/README.md index 223d62a..29a9c20 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## Usage Try it out! ```bash -nix run "github:iofq/nvim.nix" #nvim +nix run "github:iofq/nvim.nix" #nvim-min ``` Or use in a flake: diff --git a/flake.lock b/flake.lock index 845f50d..15c4ba2 100644 --- a/flake.lock +++ b/flake.lock @@ -291,84 +291,13 @@ "type": "github" } }, - "nixpkgs_3": { - "locked": { - "lastModified": 1767379071, - "narHash": "sha256-EgE0pxsrW9jp9YFMkHL9JMXxcqi/OoumPJYwf+Okucw=", - "owner": "nixos", - "repo": "nixpkgs", - "rev": "fb7944c166a3b630f177938e478f0378e64ce108", - "type": "github" - }, - "original": { - "owner": "nixos", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nvim-treesitter": { - "flake": false, - "locked": { - "lastModified": 1767460514, - "narHash": "sha256-LX0rKTZ56Rp0uQfIXZ2JrcWxuCA/t8NJjK05aKiT0Yw=", - "owner": "nvim-treesitter", - "repo": "nvim-treesitter", - "rev": "300b906a9514d5e0ce02911d371445382fe35a31", - "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": 1767660784, - "narHash": "sha256-ej7y4nhiJNFE/HcZSPTEIrU6/WQmkMJo+bVQfgT3abE=", - "owner": "iofq", - "repo": "nvim-treesitter-main", - "rev": "d82b04e1a05f88ed88c6221672ca0636dc8d6ef7", - "type": "github" - }, - "original": { - "owner": "iofq", - "repo": "nvim-treesitter-main", - "type": "github" - } - }, - "nvim-treesitter-textobjects": { - "flake": false, - "locked": { - "lastModified": 1767434017, - "narHash": "sha256-5VeIAW09my+4fqXbzVG7RnLXrjpXAk/g2vd7RbhNws8=", - "owner": "nvim-treesitter", - "repo": "nvim-treesitter-textobjects", - "rev": "28a3494c075ef0f353314f627546537e43c09592", - "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", - "nvim-treesitter-main": "nvim-treesitter-main" + "nixpkgs": "nixpkgs_2" } }, "systems": { diff --git a/flake.nix b/flake.nix index 2798e5f..5312b1a 100644 --- a/flake.nix +++ b/flake.nix @@ -2,7 +2,7 @@ description = "Neovim derivation"; inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + nixpkgs.url = "github:NixOS/nixpkgs/master"; flake-utils.url = "github:numtide/flake-utils"; neovim-nightly-overlay = { url = "github:nix-community/neovim-nightly-overlay"; @@ -15,9 +15,6 @@ dart = { url = "github:iofq/dart.nvim"; }; - nvim-treesitter-main = { - url = "github:iofq/nvim-treesitter-main"; - }; }; outputs = inputs@{ @@ -32,17 +29,6 @@ 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 @@ -73,6 +59,7 @@ 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 efc75a1..6cf2234 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -14,21 +14,43 @@ let nvim-autopairs nvim-lint nvim-lspconfig - nvim-treesitter + nvim-treesitter.withAllGrammars nvim-treesitter-textobjects quicker-nvim render-markdown-nvim snacks-nvim ]; - packages = with prev; [ + basePackages = 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; + inherit plugins; + packages = basePackages ++ extraPackages; + }; + + nvim-min-pkg = mkNeovim { + inherit plugins; + packages = basePackages; }; 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 a9c78fe..aae14fa 100644 --- a/nvim/after/lua/iofq/snacks_jj.lua +++ b/nvim/after/lua/iofq/snacks_jj.lua @@ -62,21 +62,6 @@ 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' @@ -100,7 +85,6 @@ 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 7e8e994..81cb335 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, ':.') + local path = vim.fn.fnamemodify(item.user_data.right, ':t') local hl = 'Added' if exec('git diff --quiet -- %s', path) ~= 0 @@ -98,45 +98,6 @@ 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 76b5fe9..30d5984 100644 --- a/nvim/after/plugin/mini.lua +++ b/nvim/after/plugin/mini.lua @@ -9,8 +9,6 @@ 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' }, }, @@ -18,7 +16,9 @@ vim.schedule(function() require('mini.git').setup() map('n', 'gb', 'Git blame -- %') - map('n', 'go', MiniGit.show_at_cursor) + map('n', 'go', function() + return MiniGit.show_at_cursor() + end) local jump = require('mini.jump2d') jump.setup { diff --git a/nvim/after/plugin/plugins.lua b/nvim/after/plugin/plugins.lua index 21c9339..abd3c45 100644 --- a/nvim/after/plugin/plugins.lua +++ b/nvim/after/plugin/plugins.lua @@ -3,7 +3,12 @@ local map = vim.keymap.set require('mini.basics').setup { mappings = { windows = true } } require('mini.icons').setup() -require('dart').setup {} +require('dart').setup { + tabline = { + icons = false, + label_marked_fg = 'cyan', + }, +} require('snacks').setup { bigfile = { enabled = true }, @@ -71,6 +76,7 @@ vim.schedule(function() json = { 'jq' }, lua = { 'stylua' }, python = { 'ruff' }, + nix = { 'nixfmt' }, fish = { 'fish_indent' }, ['*'] = { 'trim_whitespace' }, }, @@ -93,14 +99,11 @@ 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() @@ -116,7 +119,7 @@ vim.schedule(function() sources = { default = { 'lsp', 'path', 'snippets', 'ripgrep', 'buffer' }, providers = { - lsp = { fallbacks = {}, async = true }, -- include buffer even when LSP is active + 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', From 7a86861f09e39b6ce41fd0d046efbf298028a453 Mon Sep 17 00:00:00 2001 From: iofq Date: Sun, 18 Jan 2026 02:20:54 -0600 Subject: [PATCH 160/160] use jj.nvim instead of custom jank --- flake.lock | 17 ++++++ flake.nix | 4 ++ nix/neovim-overlay.nix | 8 +++ nvim/after/lua/iofq/jj.lua | 17 ++++++ nvim/after/lua/iofq/snacks_jj.lua | 90 ------------------------------- nvim/after/plugin/mini.lua | 7 +-- nvim/after/plugin/plugins.lua | 14 +++-- 7 files changed, 57 insertions(+), 100 deletions(-) create mode 100644 nvim/after/lua/iofq/jj.lua delete mode 100644 nvim/after/lua/iofq/snacks_jj.lua diff --git a/flake.lock b/flake.lock index 15c4ba2..64a1675 100644 --- a/flake.lock +++ b/flake.lock @@ -178,6 +178,22 @@ "type": "github" } }, + "jj-nvim": { + "flake": false, + "locked": { + "lastModified": 1768169857, + "narHash": "sha256-8POSGuNYdAR2peyzN92vWR87GqWf+Y6I1arOwNxwd6U=", + "owner": "NicolasGB", + "repo": "jj.nvim", + "rev": "d13a5c9aec08318323f19fcdc1a1d2c469e00739", + "type": "github" + }, + "original": { + "owner": "NicolasGB", + "repo": "jj.nvim", + "type": "github" + } + }, "luvit-meta": { "flake": false, "locked": { @@ -296,6 +312,7 @@ "dart": "dart", "flake-utils": "flake-utils_2", "gen-luarc": "gen-luarc", + "jj-nvim": "jj-nvim", "neovim-nightly-overlay": "neovim-nightly-overlay", "nixpkgs": "nixpkgs_2" } diff --git a/flake.nix b/flake.nix index 5312b1a..c722d83 100644 --- a/flake.nix +++ b/flake.nix @@ -15,6 +15,10 @@ dart = { url = "github:iofq/dart.nvim"; }; + jj-nvim = { + url = "github:NicolasGB/jj.nvim"; + flake = false; + }; }; outputs = inputs@{ diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index 6cf2234..d7f4cb0 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -4,12 +4,20 @@ final: prev: let mkNeovim = prev.callPackage ./mkNeovim.nix { pkgs = final; }; dart-nvim = inputs.dart.packages.x86_64-linux.default; + mkPlugin = + src: pname: + prev.vimUtils.buildVimPlugin { + inherit pname src; + version = src.lastModifiedDate; + }; + jj-nvim = mkPlugin inputs.jj-nvim "jj-nvim"; plugins = with prev.vimPlugins; [ blink-cmp blink-ripgrep-nvim conform-nvim dart-nvim + jj-nvim mini-nvim nvim-autopairs nvim-lint diff --git a/nvim/after/lua/iofq/jj.lua b/nvim/after/lua/iofq/jj.lua new file mode 100644 index 0000000..4556b7f --- /dev/null +++ b/nvim/after/lua/iofq/jj.lua @@ -0,0 +1,17 @@ +local M = {} + +M.is_jj_diffedit_open = function() + local qf = vim.fn.getqflist() + + local entry = qf[1] + if not entry or not entry.user_data or not entry.user_data.diff then + return 0 + else + return 1 + end +end + +M.diffedit = function() + vim.fn.jobstart('jj diffedit --tool diffview-new') +end +return M diff --git a/nvim/after/lua/iofq/snacks_jj.lua b/nvim/after/lua/iofq/snacks_jj.lua deleted file mode 100644 index aae14fa..0000000 --- a/nvim/after/lua/iofq/snacks_jj.lua +++ /dev/null @@ -1,90 +0,0 @@ -local M = {} - -function M.status() - local function get_files() - local status_raw = vim.fn.system('jj diff --no-pager --quiet --summary') - local files = {} - - for status in status_raw:gmatch('[^\r\n]+') do - local state, file = string.match(status, '^(%a)%s(.+)$') - - if state and file then - local hl = '' - if state == 'A' then - hl = 'SnacksPickerGitStatusAdded' - elseif state == 'M' then - hl = 'SnacksPickerGitStatusModified' - elseif state == 'D' then - hl = 'SnacksPickerGitStatusDeleted' - elseif state == 'R' then - hl = 'SnacksPickerGitStatusRenamed' - file = string.match(file, '{.-=>%s*(.-)}') - end - - local diff = vim.fn.system('jj diff ' .. file .. ' --no-pager --stat --git') - table.insert(files, { - file = file, - filename_hl = hl, - diff = diff, - }) - end - end - - return files - end - - Snacks.picker.pick { - source = 'jj_status', - items = get_files(), - format = 'file', - title = 'jj status', - preview = function(ctx) - if ctx.item.file then - Snacks.picker.preview.diff(ctx) - else - ctx.preview:reset() - ctx.preview:set_title('No preview') - end - end, - } -end - -function M.file_history(filename) - local function preview(ctx) - if ctx.item.rev then - Snacks.picker.preview.cmd( - { 'jj', 'log', '--ignore-working-copy', '--git', '-r', ctx.item.rev, '-p', filename }, - ctx - ) - else - ctx.preview:reset() - return 'No preview available.' - end - end - - local function get_history(f) - local status_raw = vim.fn.system( - 'jj log --ignore-working-copy --no-graph' - .. ' --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",),)\'' - .. ' -- ' - .. f - ) - local lines = {} - for line in status_raw:gmatch('[^\r\n]+') do - local rev = string.match(line, '(%w+)%s.*') - table.insert(lines, { - text = line, - rev = rev, - }) - end - return lines - end - - Snacks.picker.pick { - format = 'text', - title = 'jj file history for ' .. filename, - items = get_history(filename), - preview = preview, - } -end -return M diff --git a/nvim/after/plugin/mini.lua b/nvim/after/plugin/mini.lua index 30d5984..d4728c5 100644 --- a/nvim/after/plugin/mini.lua +++ b/nvim/after/plugin/mini.lua @@ -9,17 +9,12 @@ vim.schedule(function() 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() - map('n', 'gb', 'Git blame -- %') - map('n', 'go', function() - return MiniGit.show_at_cursor() - end) - local jump = require('mini.jump2d') jump.setup { mappings = { diff --git a/nvim/after/plugin/plugins.lua b/nvim/after/plugin/plugins.lua index abd3c45..730ed82 100644 --- a/nvim/after/plugin/plugins.lua +++ b/nvim/after/plugin/plugins.lua @@ -55,16 +55,22 @@ 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) -map('n', 'jh', function() - require('iofq.snacks_jj').file_history(vim.api.nvim_buf_get_name(0)) -end) vim.schedule(function() require('nvim-treesitter').setup() require('nvim-treesitter-textobjects').setup() require('nvim-autopairs').setup() + require('jj').setup {} + map('n', 'gb', require('jj.annotate').file) + map('n', 'jf', require('jj.picker').status) + map('n', 'jj', require('jj.cmd').log) + map('n', 'jh', require('jj.picker').file_history) + map('n', 'je', require('iofq.jj').diffedit) + map('n', 'jd', function() + require('jj.diff').open_vdiff { rev = 'trunk()' } + end) + require('quicker').setup() map('n', 'qf', function() require('quicker').toggle { max_height = 20 }