return { { 'nvim-tree/nvim-tree.lua', cmd = { 'NvimTreeToggle', 'NvimTreeFocus' }, config = function(_, opts) require('nvim-tree').setup(opts) end, keys = { { '', ' NvimTreeToggle ', desc = '[T]oggle [F]ile explorer' }, { 'tf', ' NvimTreeToggle ', desc = '[T]oggle [F]ile explorer' }, }, }, { 'ggandor/leap.nvim', lazy = false, }, { 'ggandor/flit.nvim', lazy = false, config = function() require('flit').setup { keys = { f = 'f', F = 'F', t = 't', T = 'T' }, -- A string like "nv", "nvo", "o", etc. labeled_modes = 'v', multiline = true, -- Like `leap`s similar argument (call-specific overrides). -- E.g.: opts = { equivalence_classes = {} } opts = {}, } end, }, { 'kdheepak/lazygit.nvim', keys = { 'gg', ' LazyGit ', 'Open LazyGit' }, cmd = 'LazyGit', -- optional for floating window border decoration dependencies = { 'nvim-lua/plenary.nvim', }, }, { 'folke/which-key.nvim', keys = { '', '', '', '', '"', "'", '`', 'c', 'v', 'g' }, defaults = { mode = { 'n', 'v' }, [';'] = { name = '+telescope' }, [';f'] = { name = '+find' }, ['g'] = { name = '+goto' }, [']'] = { name = '+next' }, ['['] = { name = '+prev' }, ['d'] = { name = '+lsp/debug' }, ['r'] = { name = '+diagnostics/quickfix' }, ['c'] = { name = '+code' }, ['g'] = { name = '+git' }, ['t'] = { name = '+toggle/tools' }, ['w'] = { name = '+window/which' }, ['f'] = { name = '+formatting' }, }, opts = { triggers_nowait = { -- marks '`', "'", 'g`', "g'", -- registers '"', '', -- spelling 'z=', }, triggers_blacklist = { -- list of mode / prefixes that should never be hooked by WhichKey -- this is mostly relevant for keymaps that start with a native binding i = { 'j', 'k' }, v = { 'j', 'k' }, n = { 'o', 'O' }, }, }, }, { 'echasnovski/mini.trailspace', lazy = false, event = { 'BufReadPost', 'BufNewFile' }, opts = {}, }, { 'itchyny/vim-cursorword', event = 'FileType', init = function() vim.g.cursorword = 0 end, config = function() local augroup = vim.api.nvim_create_augroup('plex_cursorword', {}) vim.api.nvim_create_autocmd('FileType', { group = augroup, pattern = { 'conf', 'dosini', 'json', 'markdown', 'nginx', 'text', 'yaml', }, callback = function() if vim.wo.diff or vim.wo.previewwindow then vim.b.cursorword = 0 else vim.b.cursorword = 1 end end, }) vim.api.nvim_create_autocmd('InsertEnter', { group = augroup, callback = function() if vim.b['cursorword'] == 1 then vim.b['cursorword'] = 0 end end, }) vim.api.nvim_create_autocmd('InsertLeave', { group = augroup, callback = function() if vim.b['cursorword'] == 0 then vim.b['cursorword'] = 1 end end, }) end, }, { -- Useful plugin to show you pending keybinds. 'folke/which-key.nvim', event = 'VimEnter', -- Sets the loading event to 'VimEnter' config = function() -- This is the function that runs, AFTER loading require('which-key').setup() -- Document existing key chains require('which-key').register { ['c'] = { name = '[C]ode', _ = 'which_key_ignore' }, ['d'] = { name = '[D]ocument', _ = 'which_key_ignore' }, ['r'] = { name = '[R]ename', _ = 'which_key_ignore' }, ['f'] = { name = '[F]ind', _ = 'which_key_ignore' }, ['w'] = { name = '[W]orkspace', _ = 'which_key_ignore' }, ['t'] = { name = '[T]oggle', _ = 'which_key_ignore' }, ['h'] = { name = 'Git [H]unk', _ = 'which_key_ignore' }, } -- visual mode require('which-key').register({ ['h'] = { 'Git [H]unk' }, }, { mode = 'v' }) end, }, { 'RRethy/vim-illuminate', lazy = false, event = { 'BufReadPost', 'BufNewFile' }, opts = { delay = 200, under_cursor = false, modes_allowlist = { 'n', 'no', 'nt' }, filetypes_denylist = { 'DiffviewFileHistory', 'DiffviewFiles', 'SidebarNvim', 'fugitive', 'git', 'minifiles', 'neo-tree', }, }, keys = { { ']]', desc = 'Next Reference' }, { '[[', desc = 'Prev Reference' }, }, config = function(_, opts) require('illuminate').configure(opts) local function map(key, dir, buffer) vim.keymap.set('n', key, function() require('illuminate')['goto_' .. dir .. '_reference'](false) end, { desc = dir:sub(1, 1):upper() .. dir:sub(2) .. ' Reference', buffer = buffer, }) end map(']]', 'next') map('[[', 'prev') -- also set it after loading ftplugins, since a lot overwrite [[ and ]] vim.api.nvim_create_autocmd('FileType', { group = vim.api.nvim_create_augroup('plex_illuminate', {}), callback = function() local buffer = vim.api.nvim_get_current_buf() map(']]', 'next', buffer) map('[[', 'prev', buffer) end, }) end, }, { 'folke/todo-comments.nvim', lazy = false, dependencies = 'nvim-telescope/telescope.nvim', -- stylua: ignore keys = { { ']t', function() require('todo-comments').jump_next() end, desc = 'Next todo comment' }, { '[t', function() require('todo-comments').jump_prev() end, desc = 'Previous todo comment' }, { 'dt', 'TodoTelescope', desc = 'todo' }, { 'xt', 'TodoTrouble', desc = 'Todo (Trouble)' }, { 'xT', 'TodoTrouble keywords=TODO,FIX,FIXME', desc = 'Todo/Fix/Fixme (Trouble)' }, }, opts = { signs = true, keywords = { FIX = { icon = ' ', -- icon used for the sign, and in search results color = 'error', -- can be a hex color, or a named color (see below) alt = { 'FIXME', 'BUG', 'FIXIT', 'ISSUE' }, -- a set of other keywords that all map to this FIX keywords }, TODO = { icon = ' ', color = 'todo' }, HACK = { icon = ' ', color = 'hack' }, SECURITY = { icon = '󰒃 ', color = 'security' }, WARN = { icon = ' ', color = 'warning', alt = { 'WARNING', 'XXX' } }, PERF = { icon = ' ', color = 'perf', alt = { 'OPTIM', 'PERFORMANCE', 'OPTIMIZE' } }, NOTE = { icon = ' ', color = 'hint', alt = { 'INFO' } }, TEST = { icon = '⏲ ', color = 'test', alt = { 'TESTING', 'PASSED', 'FAILED' } }, }, colors = { error = { 'DiagnosticError', 'ErrorMsg', '#DC2626' }, warning = { 'DiagnosticWarn', 'WarningMsg', '#FBBF24' }, todo = { 'DiagnosticTodo', '#80e64d' }, hint = { 'DiagnosticHint', '#10B981' }, hack = { 'DiagnosticHack', '#FF33FF' }, security = { 'DiagnosticSecurity', '#FF6600' }, default = { 'Identifier', '#7C3AED' }, test = { 'DiagnosticTest', '#E6E600' }, perf = { 'DiagnosticPerf', '#9999ff' }, }, }, }, { 'akinsho/toggleterm.nvim', keys = { { '', 'exe v:count1 "ToggleTerm direction=float"', desc = 'Toggle a big floating terminal' }, { '', 'exe v:count1 "ToggleTerm direction=float"', desc = 'Toggle a big floating terminal' }, { '', 'exe v:count1 "ToggleTerm direction=tab"', desc = 'Toggle a terminal in a new tab' }, { '', 'exe v:count1 "ToggleTerm direction=horizontal"', desc = 'Toggle a horizontal terminal' }, { '', 'exe v:count1 "ToggleTerm direction=vertical"', desc = 'Toggle a vertical terminal' }, }, cmd = 'ToggleTerm', opts = { size = function(term) if term.direction == 'horizontal' then return vim.o.lines * 0.35 elseif term.direction == 'vertical' then return vim.o.columns * 0.35 else return 20 end end, open_mapping = false, float_opts = { border = 'curved', }, }, }, { -- You can easily change to a different colorscheme. -- Change the name of the colorscheme plugin below, and then -- change the command in the config to whatever the name of that colorscheme is. -- -- If you want to see what colorschemes are already installed, you can use `:Telescope colorscheme`. 'folke/tokyonight.nvim', priority = 1000, -- Make sure to load this before all the other start plugins. init = function() -- Load the colorscheme here. -- Like many other themes, this one has different styles, and you could load -- any other, such as 'tokyonight-storm', 'tokyonight-moon', or 'tokyonight-day'. vim.cmd.colorscheme 'tokyonight-night' -- You can configure highlights by doing something like: vim.cmd.hi 'Comment gui=none' end, }, { 'folke/noice.nvim', enabled = not vim.g.started_by_firenvim, event = 'VeryLazy', -- config.lsp.signature.enabled = false dependencies = { -- if you lazy-load any plugin below, make sure to add proper `module="..."` entries 'MunifTanjim/nui.nvim', -- OPTIONAL: -- `nvim-notify` is only needed, if you want to use the notification view. -- If not available, we use `mini` as the fallback 'rcarriga/nvim-notify', }, config = function() require('notify').setup { top_down = false, } require('noice').setup { lsp = { override = { ['vim.lsp.util.convert_input_to_markdown_lines'] = true, ['vim.lsp.util.stylize_markdown'] = true, ['cmp.entry.get_documentation'] = true, }, -- IDK how to disable the nvchad builtins for this, which would -- produce a conflict signature = { enabled = false }, hover = { enabled = false }, progress = { enabled = true, -- Lsp Progress is formatted using the builtins for lsp_progress. See config.format.builtin -- See the section on formatting for more details on how to customize. --- @type NoiceFormat|string format = 'lsp_progress', --- @type NoiceFormat|string format_done = 'lsp_progress_done', throttle = 1000 / 30, -- frequency to update lsp progress message view = 'mini', -- default: mini }, }, -- you can enable a preset for easier configuration presets = { bottom_search = true, -- use a classic bottom cmdline for search command_palette = true, -- position the cmdline and popupmenu together long_message_to_split = true, -- long messages will be sent to a split inc_rename = true, -- enables an input dialog for inc-rename.nvim lsp_doc_border = true, -- add a border to hover docs and signature help }, messages = { enabled = true, -- NOTE: we keep it with notify, -- change this to something else if you want view_error = 'notify', }, popupmenu = { enabled = true, }, notify = { enabled = true, }, } end, }, { 'stevearc/dressing.nvim', init = function() ---@diagnostic disable-next-line: duplicate-set-field vim.ui.select = function(...) require('lazy').load { plugins = { 'dressing.nvim' } } return vim.ui.select(...) end ---@diagnostic disable-next-line: duplicate-set-field vim.ui.input = function(...) require('lazy').load { plugins = { 'dressing.nvim' } } return vim.ui.input(...) end end, }, { 'chentoast/marks.nvim', lazy = false, dependencies = 'lewis6991/gitsigns.nvim', event = 'FileType', opts = { sign_priority = { lower = 10, upper = 15, builtin = 8, bookmark = 20 }, bookmark_1 = { sign = '󰉀' }, -- ⚐ ⚑ 󰈻 󰈼 󰈽 󰈾 󰈿 󰉀 }, }, { 'Bekaboo/deadcolumn.nvim', event = { 'BufReadPre', 'BufNewFile' }, }, { 'kevinhwang91/nvim-ufo', event = { 'BufReadPost', 'BufNewFile' }, -- stylua: ignore keys = { { 'zR', function() require('ufo').openAllFolds() end }, { 'zM', function() require('ufo').closeAllFolds() end }, }, dependencies = { 'kevinhwang91/promise-async', 'nvim-treesitter/nvim-treesitter', 'neovim/nvim-lspconfig', }, opts = function() -- fancy display function for folds (stolen from nvim-ufo readme) local handler = function(virtText, lnum, endLnum, width, truncate) local newVirtText = {} local suffix = (' 󰁂 %d '):format(endLnum - lnum) local sufWidth = vim.fn.strdisplaywidth(suffix) local targetWidth = width - sufWidth local curWidth = 0 for _, chunk in ipairs(virtText) do local chunkText = chunk[1] local chunkWidth = vim.fn.strdisplaywidth(chunkText) if targetWidth > curWidth + chunkWidth then table.insert(newVirtText, chunk) else chunkText = truncate(chunkText, targetWidth - curWidth) local hlGroup = chunk[2] table.insert(newVirtText, { chunkText, hlGroup }) chunkWidth = vim.fn.strdisplaywidth(chunkText) -- str width returned from truncate() may less than 2nd argument, need padding if curWidth + chunkWidth < targetWidth then suffix = suffix .. (' '):rep(targetWidth - curWidth - chunkWidth) end break end curWidth = curWidth + chunkWidth end table.insert(newVirtText, { suffix, 'MoreMsg' }) return newVirtText end require('ufo').setup { -- use treesitter to get the folds provider_selector = function(bufnr, filetype, buftype) return { 'treesitter', 'indent' } end, -- apply out fancy fold display fold_virt_text_handler = handler, } end, }, { 'b0o/incline.nvim', event = 'FileType', config = function() local function get_diagnostic_label(props) local icons = { error = '', warn = '', info = '', hint = '' } local label = {} for severity, icon in pairs(icons) do local n = #vim.diagnostic.get(props.buf, { severity = vim.diagnostic.severity[string.upper(severity)] }) if n > 0 then table.insert(label, { icon .. ' ' .. n .. ' ', group = 'DiagnosticSign' .. severity }) end end if #label > 0 then table.insert(label, { '| ' }) end return label end local function get_git_diff(props) local icons = { removed = '', changed = '', added = '' } local labels = {} -- local signs = vim.api.nvim_buf_get_var(props.buf, "gitsigns_status_dict") -- local signs = vim.b.gitsigns_status_dict -- for name, icon in pairs(icons) do -- if tonumber(signs[name]) and signs[name] > 0 then -- table.insert(labels, { icon .. " " .. signs[name] .. " ", group = "Diff" .. name }) -- end -- end if #labels > 0 then table.insert(labels, { '| ' }) end return labels end require('incline').setup { render = function(props) local filename = vim.fn.fnamemodify(vim.api.nvim_buf_get_name(props.buf), ':t') local ft_icon, ft_color = require('nvim-web-devicons').get_icon_color(filename) local modified = vim.api.nvim_buf_get_option(props.buf, 'modified') and 'bold,italic' or 'bold' local buffer = { { get_diagnostic_label(props) }, { get_git_diff(props) }, { ft_icon, guifg = ft_color }, { ' ' }, { filename, gui = modified }, } return buffer end, } end, }, { 'iamcco/markdown-preview.nvim', cmd = { 'MarkdownPreviewToggle', 'MarkdownPreview', 'MarkdownPreviewStop' }, ft = { 'markdown' }, build = function() vim.fn['mkdp#util#install']() end, config = function() -- Ugly fix for wsl not finding my browser -- I HATE windows vim.g.mkdp_echo_preview_url = 1 end, }, { 'nvim-lualine/lualine.nvim', lazy = false, dependencies = { 'nvim-tree/nvim-web-devicons', 'NvChad/ui', -- load after nvchad ui }, config = function() -- TODO: add lsp module for lualine -- Maybe we can steal modules from the nvchad ui require('lualine').setup() end, }, }