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', - }, - }, - }, -}