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)