local map = vim.keymap.set require('mini.basics').setup { mappings = { windows = true } } require('mini.icons').setup() 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 = { '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('lib.snacks_jj').status) vim.schedule(function() require('nvim-treesitter').setup() require('nvim-treesitter-textobjects').setup() require('render-markdown').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) local close = { { { 'n' }, 'q', vim.cmd.DiffviewClose, { desc = 'Close Diffview' } } } require('diffview').setup { enhanced_diff_hl = true, default_args = { DiffviewOpen = { '--imply-local' } }, view = { merge_tool = { layout = 'diff4_mixed', disable_diagnostics = true, }, }, keymaps = { view = close, file_panel = close, file_history_panel = close, }, } map('n', 'nb', vim.cmd.DiffviewOpen) map('n', 'nH', vim.cmd.DiffviewFileHistory) map('n', 'nh', 'DiffviewFileHistory %') map('n', 'go', function() local id = vim.fn.expand('') vim.cmd('DiffviewOpen ' .. id .. '~1' .. '..' .. id) 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', '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, sources = { default = { 'lsp', 'snippets', 'ripgrep', 'buffer' }, providers = { lsp = { fallbacks = {} }, -- include buffer even when LSP is active 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) 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() map('n', 'gb', '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(), }, } map('n', 'gp', MiniDiff.toggle_overlay) require('mini.files').setup { mappings = { go_in_plus = '' }, windows = { preview = true, width_preview = 50, }, } map('n', 'nc', function() MiniFiles.open(vim.api.nvim_buf_get_name(0), false) -- open current buffer's dir MiniFiles.reveal_cwd() 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) end, }) end)