local oil_detail = false local function parse_output(proc) local result = proc:wait() local ret = {} if result.code == 0 then for line in vim.gsplit(result.stdout, '\n', { plain = true, trimempty = true }) do ret[line:gsub('/$', '')] = true end end return ret end local function new_git_status() return setmetatable({}, { __index = function(self, key) local ignored_proc = vim.system({ 'git', 'ls-files', '--ignored', '--exclude-standard', '--others', '--directory', }, { cwd = key, text = true }) local tracked_proc = vim.system( { 'git', 'ls-tree', 'HEAD', '--name-only' }, { cwd = key, text = true } ) local ret = { ignored = parse_output(ignored_proc), tracked = parse_output(tracked_proc), } rawset(self, key, ret) return ret end, }) end local git_status = new_git_status() return { { 'barrettruth/midnight.nvim', dir = '~/dev/midnight.nvim', config = function() vim.cmd.colorscheme('midnight') end, }, { 'barrettruth/nonicons.nvim', dir = '~/dev/nonicons.nvim', enabled = false, lazy = false, dependencies = { 'nvim-tree/nvim-web-devicons', }, }, { 'echasnovski/mini.pairs', config = true, event = 'InsertEnter', }, { 'echasnovski/mini.ai', opts = { custom_textobjects = { b = false, f = false, e = function(ai_type) local n_lines = vim.fn.line('$') local start_line, end_line = 1, n_lines if ai_type == 'i' then while start_line <= n_lines and vim.fn.getline(start_line):match('^%s*$') do start_line = start_line + 1 end while end_line >= start_line and vim.fn.getline(end_line):match('^%s*$') do end_line = end_line - 1 end end local to_col = math.max(vim.fn.getline(end_line):len(), 1) return { from = { line = start_line, col = 1 }, to = { line = end_line, col = to_col }, } end, l = function(ai_type) local line_num = vim.fn.line('.') local line = vim.fn.getline(line_num) if line == '' then return { from = { line = line_num, col = 1 }, to = { line = line_num, col = 1 }, } end local start_col, end_col if ai_type == 'i' then start_col = line:find('%S') or 1 end_col = line:match('.*%S()') or 1 else start_col, end_col = 1, line:len() end return { from = { line = line_num, col = start_col }, to = { line = line_num, col = end_col }, } end, I = function(ai_type) local cur_line = vim.fn.line('.') local cur_indent = vim.fn.indent(cur_line) if vim.fn.getline(cur_line):match('^%s*$') then local search_line = cur_line + 1 while search_line <= vim.fn.line('$') and vim.fn.getline(search_line):match('^%s*$') do search_line = search_line + 1 end if search_line <= vim.fn.line('$') then cur_indent = vim.fn.indent(search_line) end end local start_line, end_line = cur_line, cur_line while start_line > 1 do local prev = start_line - 1 local prev_blank = vim.fn.getline(prev):match('^%s*$') if ai_type == 'i' and prev_blank then break end if not prev_blank and vim.fn.indent(prev) < cur_indent then break end start_line = prev end while end_line < vim.fn.line('$') do local next = end_line + 1 local next_blank = vim.fn.getline(next):match('^%s*$') if ai_type == 'i' and next_blank then break end if not next_blank and vim.fn.indent(next) < cur_indent then break end end_line = next end local to_col = math.max(vim.fn.getline(end_line):len(), 1) return { from = { line = start_line, col = 1 }, to = { line = end_line, col = to_col }, } end, }, }, keys = { { 'a', mode = { 'x', 'o' } }, { 'i', mode = { 'x', 'o' } }, }, }, { 'lervag/vimtex', ft = { 'latex' }, init = function() vim.g.vimtex_view_method = 'sioyek' vim.g.vimtex_quickfix_mode = 0 end, }, { 'monaqa/dial.nvim', config = function(_) local augend = require('dial.augend') require('dial.config').augends:register_group({ default = { augend.integer.alias.decimal_int, augend.integer.alias.hex, augend.integer.alias.octal, augend.integer.alias.binary, augend.constant.alias.bool, augend.constant.alias.alpha, augend.constant.alias.Alpha, augend.semver.alias.semver, }, }) end, keys = { { '', function() require('dial.map').manipulate('increment', 'normal') end, mode = 'n', }, { '', function() require('dial.map').manipulate('decrement', 'normal') end, mode = 'n', }, { 'g', function() require('dial.map').manipulate('increment', 'gnormal') end, mode = 'n', }, { 'g', function() require('dial.map').manipulate('decrement', 'gnormal') end, mode = 'n', }, { '', function() require('dial.map').manipulate('increment', 'visual') end, mode = 'v', }, { '', function() require('dial.map').manipulate('decrement', 'visual') end, mode = 'v', }, { 'g', function() require('dial.map').manipulate('increment', 'gvisual') end, mode = 'v', }, { 'g', function() require('dial.map').manipulate('decrement', 'gvisual') end, mode = 'v', }, }, }, { 'catgoose/nvim-colorizer.lua', opts = { user_default_options = { names = false, rrggbbaa = true, css = true, css_fn = true, rgb_fn = true, hsl_fn = true, }, }, event = 'BufReadPre', }, { 'stevearc/oil.nvim', dir = '~/dev/oil.nvim', config = function(_, opts) require('oil').setup(opts) local refresh = require('oil.actions').refresh local orig_refresh = refresh.callback refresh.callback = function(...) git_status = new_git_status() orig_refresh(...) end vim.api.nvim_create_autocmd('BufEnter', { callback = function() local ft = vim.bo.filetype if ft == '' then local path = vim.fn.expand('%:p') if vim.fn.isdirectory(path) == 1 then vim.cmd('Oil ' .. path) end end end, group = vim.api.nvim_create_augroup('AOil', { clear = true }), }) end, event = 'VeryLazy', keys = { { '-', 'e .' }, { '_', vim.cmd.Oil }, }, opts = { skip_confirm_for_simple_edits = true, prompt_save_on_select_new_entry = false, float = { border = 'single' }, view_options = { is_hidden_file = function(name, bufnr) local dir = require('oil').get_current_dir(bufnr) local is_dotfile = vim.startswith(name, '.') and name ~= '..' if not dir then return is_dotfile end if is_dotfile then return not git_status[dir].tracked[name] else return git_status[dir].ignored[name] end end, }, keymaps = { [''] = false, [''] = false, [''] = false, [''] = 'actions.refresh', [''] = { 'actions.select', opts = { vertical = true } }, [''] = { 'actions.select', opts = { horizontal = true } }, q = function() local ok, bufremove = pcall(require, 'mini.bufremove') if ok then bufremove.delete() else vim.cmd.bd() end end, }, }, }, { 'echasnovski/mini.misc', config = true, keys = { { 'm', "lua MiniMisc.zoom(0, { title = '', border = 'none' })", }, }, }, { 'nvim-mini/mini.bufremove', config = true, keys = { { 'bd', 'lua MiniBufremove.delete()', }, { 'bw', 'lua MiniBufremove.wipeout()', }, }, }, { 'tpope/vim-abolish', event = 'VeryLazy' }, { 'tpope/vim-sleuth', event = 'BufReadPost' }, { 'kylechui/nvim-surround', config = true, keys = { { 'cs', mode = 'n' }, { 'ds', mode = 'n' }, { 'ys', mode = 'n' }, { 'yS', mode = 'n' }, { 'yss', mode = 'n' }, { 'ySs', mode = 'n' }, }, }, { 'wallpants/github-preview.nvim', keys = { 'm', 'GithubPreviewToggle' }, config = true, }, }