-- Load plugins -- Bootstrap packer if needed {{ local fn = vim.fn local install_path = fn.stdpath('data')..'/site/pack/packer/start/packer.nvim' if fn.empty(fn.glob(install_path)) > 0 then Packer_bootstrap = fn.system({'git', 'clone', '--depth', '1', 'https://github.com/wbthomason/packer.nvim', install_path}) vim.cmd [[packadd packer.nvim]] end -- }} -- set packer threads {{ -- Reduce the maximum number of jobs in termux (a terminal for android) or if WEAK_SYSTEM is set to true if (os.getenv("TERMUX_VERSION") ~= nil) or (os.getenv("WEAK_SYSTEM") == "true") then Packer_max_jobs = 5 else Packer_max_jobs = 100 end local use = require('packer').use -- }} return require('packer').startup({function() -- TODO: Find a better way to organize this -- impatient (needs to go early) use { -- lewis6991: impatient: Make nvim load faster by caching them - needs to load early 'lewis6991/impatient.nvim', config = function() require('impatient') end, } -- Packer use { -- packer: plugin manager 'wbthomason/packer.nvim', config = function() -- Map :PS to :PackerSync vim.cmd 'cab PS PackerSync' end, } -- Colors (decorations) use { -- treesitter: syntax highlighting and more 'nvim-treesitter/nvim-treesitter', run = ':TSUpdate', config = function() require('blake.lsp').treesitter() end, } use { -- onedark.nvim: onedark theme 'navarasu/onedark.nvim', config = function() -- vim.g.onedark_transparent_background = true vim.cmd [[ "au ColorScheme onedark hi TabLine gui=none guibg='#282C34' guifg='#5C6370' " all tabs color au ColorScheme onedark hi TabLineSel guibg='#282C34' guifg='#B5BBC7' " Highlighted tab color "au ColorScheme onedark hi TabLineFill guibg='#282C34' " tabline portion without tabs (right-hand side) ]] end } use { -- tokyonight.nvim: tokyonight theme 'folke/tokyonight.nvim', config = function() -- vim.g.tokyonight_style = "night" vim.g.tokyonight_italic_functions = true vim.g.tokyonight_sidebars = { "nvimtree", "qf", "vista_kind", "terminal", "packer" } vim.cmd [[ au ColorScheme tokyonight hi TabLine gui=none guibg='#1D202F' guifg='#565F89' " all tabs color au ColorScheme tokyonight hi TabLineSel guibg='#24283B' guifg='#C0CAF5' " Highlighted tab color au ColorScheme tokyonight hi TabLineFill guibg='#1D202F' " tabline portion without tabs (right-hand side) ]] -- Has to be put here so it runs synchronously vim.cmd 'colorscheme tokyonight' end, } use { -- newspring: Good light theme for writing 'NLKNguyen/papercolor-theme', } use { -- statusline: lualine 'nvim-lualine/lualine.nvim', requires = { 'kyazdani42/nvim-web-devicons', opt = true }, config = function() require('blake.other').lualine() end, } -- use { -- nvim-tabline: batter looking tabline -- 'alvarosevilla95/luatab.nvim', -- requires = { 'kyazdani42/nvim-web-devicons' }, -- config = function() -- require('luatab').setup() -- end -- } use { -- nvim-colorizer: css color tag highlighter (ex- #FFB13B) 'norcalli/nvim-colorizer.lua', config = function() vim.cmd 'cab COL ColorizerToggle' end, } use { -- vim-illuminate: highlight other occurrences of the word under cursor 'RRethy/vim-illuminate', -- commit = '27f6ef135a88d9410a33cf92fc47f5c018df552c', -- for finding the correct color to make highlights config = function() vim.keymap.set('n', '', require('illuminate').toggle_freeze_buf) require('illuminate').configure({ providers = { 'treesitter', 'regex', } }) end } -- Tree-sitter use { -- treesitter-context: equivalent to vsc*de's "sticky scrolling" 'nvim-treesitter/nvim-treesitter-context', config = function() require('treesitter-context').setup { enable = true, -- Enable this plugin (Can be enabled/disabled later via commands) max_lines = 5, -- How many lines the window should span. Values <= 0 mean no limit. min_window_height = 0, -- Minimum editor window height to enable context. Values <= 0 mean no limit. line_numbers = true, multiline_threshold = 1, -- Maximum number of lines to show for a single context trim_scope = 'outer', -- Which context lines to discard if `max_lines` is exceeded. Choices: 'inner', 'outer' mode = 'topline', -- Line used to calculate context. Choices: 'cursor', 'topline' -- Separator between context and content. Should be a single character string, like '-'. -- When separator is set, the context will only show up when there are at least 2 lines above cursorline. separator = nil, zindex = 20, -- The Z-index of the context window on_attach = nil, -- (fun(buf: integer): boolean) return false to disable attaching } end } -- IDE features ---- LSP use { -- lspinstall: language server installer, (lspconfig is here too) 'williamboman/nvim-lsp-installer', { -- lspconfig: default language server configurations 'neovim/nvim-lspconfig', config = function() require('blake.lsp').lspinstall() require('blake.lsp').lspconfig() end } } use { -- cmp: completion menu 'hrsh7th/nvim-cmp', config = function() require('blake.lsp').cmp() end, requires = { -- (mostly) nvim-cmp sources (not required by cmp, but reqired by my configuration) 'f3fora/cmp-spell', 'hrsh7th/cmp-buffer', 'hrsh7th/cmp-calc', 'hrsh7th/cmp-cmdline', 'hrsh7th/cmp-emoji', 'hrsh7th/cmp-nvim-lsp', 'hrsh7th/cmp-nvim-lua', 'hrsh7th/cmp-path', 'jc-doyle/cmp-pandoc-references', 'onsails/lspkind-nvim', -- icons for entries of the completion menu, required by config 'ray-x/cmp-treesitter', 'saadparwaiz1/cmp_luasnip', }, } use { -- luasnip: snippits plugin 'L3MON4D3/LuaSnip', config = function() require("luasnip.loaders.from_vscode").lazy_load() end } use { -- friendly-snippets: lots of good snippits 'rafamadriz/friendly-snippets' } use { -- lsp_signature: function parameter previews 'ray-x/lsp_signature.nvim', after = 'nvim-lspconfig', config = function() require('blake.lsp').signature() end, } use { -- symbols-outline: treesitter-based document outline (SO) 'simrat39/symbols-outline.nvim', config = function() vim.cmd 'cab SO SymbolsOutline' vim.cmd 'nnoremap so SymbolsOutline' end, } use { -- null-ls: Support for lots of programming tools, but through nvim lsp 'jose-elias-alvarez/null-ls.nvim', requires = { 'nvim-lua/plenary.nvim' }, config = function() local null_ls = require("null-ls") require("null-ls").setup({ sources = { null_ls.builtins.code_actions.refactoring, null_ls.builtins.formatting.alejandra, null_ls.builtins.formatting.jq, } }) end } use { -- refactoring: Refactoring tools for neovim 'ThePrimeagen/refactoring.nvim', requires = { { 'nvim-lua/plenary.nvim' }, { 'nvim-treesitter/nvim-treesitter' } }, config = function() require('refactoring').setup({}) -- Remaps for the refactoring operations currently offered by the plugin vim.api.nvim_set_keymap("v", "re", [[ lua require('refactoring').refactor('Extract Function')]], {noremap = true, silent = true, expr = false}) vim.api.nvim_set_keymap("v", "rf", [[ lua require('refactoring').refactor('Extract Function To File')]], {noremap = true, silent = true, expr = false}) vim.api.nvim_set_keymap("v", "rv", [[ lua require('refactoring').refactor('Extract Variable')]], {noremap = true, silent = true, expr = false}) vim.api.nvim_set_keymap("v", "ri", [[ lua require('refactoring').refactor('Inline Variable')]], {noremap = true, silent = true, expr = false}) -- Extract block doesn't need visual mode vim.api.nvim_set_keymap("n", "rb", [[ lua require('refactoring').refactor('Extract Block')]], {noremap = true, silent = true, expr = false}) vim.api.nvim_set_keymap("n", "rbf", [[ lua require('refactoring').refactor('Extract Block To File')]], {noremap = true, silent = true, expr = false}) -- Inline variable can also pick up the identifier currently under the cursor without visual mode vim.api.nvim_set_keymap("n", "ri", [[ lua require('refactoring').refactor('Inline Variable')]], {noremap = true, silent = true, expr = false}) -- Refactoring telescope integration -- load refactoring Telescope extension require("telescope").load_extension("refactoring") -- remap to open the Telescope refactoring menu in visual mode vim.api.nvim_set_keymap( "v", "rr", "lua require('telescope').extensions.refactoring.refactors()", { noremap = true } ) end, } ---- DAP (Debug Adapter Protocol) use { -- nvim-dap: DAP support 'mfussenegger/nvim-dap', config = function() require('blake.dap').nvim_dap() end } -- use { -- dap-buddy: DAP adapter installer - DBInstall -- 'Pocco81/dap-buddy.nvim', -- config = function() -- require('blake.dap').dap_buddy() -- end -- } use { -- virtual-text: Print Variable names while debugging 'theHamsta/nvim-dap-virtual-text', requires = {"mfussenegger/nvim-dap", "nvim-neotest/nvim-nio"}, config = function() -- calling this with a parameter to keep lua language server from complaining require("nvim-dap-virtual-text").setup({context_commentstring = {enable = true,}}) end } use { -- nvim-dap-ui: a UI for nvim-dap 'rcarriga/nvim-dap-ui', requires = { 'mfussenegger/nvim-dap' }, config = function() require('blake.dap').dap_ui() end, } use { -- debugprint: automatic debug print statement creator - bind g?{p/P,v/V,o/O} 'andrewferrier/debugprint.nvim', requires = { 'nvim-treesitter/nvim-treesitter' }, config = function() require('debugprint').setup() end } ---- Other IDE features use { -- telescope: fuzzy finder for finding fuzzy things 'nvim-telescope/telescope.nvim', requires = { 'nvim-lua/plenary.nvim' }, config = function() require('blake.other').telescope() end } use { -- trouble: one big list of code errors from all sources (lsp, quickfix) 'folke/trouble.nvim', requires = "kyazdani42/nvim-web-devicons", config = function() require('trouble').setup({ mode = "quickfix" }) end } use { -- bqf: improved quickfix list 'kevinhwang91/nvim-bqf', ft = 'qf', } use { -- pqf: prettier quickfix list 'https://gitlab.com/yorickpeterse/nvim-pqf', ft = 'qf', } use { -- gitsigns: git integration 'lewis6991/gitsigns.nvim', requires = { 'nvim-lua/plenary.nvim' }, config = function() require('blake.other').gitsigns() end, } use { -- toggleterm: terminal 'akinsho/toggleterm.nvim', branch = 'main', config = function() require('blake.other').toggleterm() end } use { -- neoscroll: Smooth Scrolling 'karb94/neoscroll.nvim', disable = true, config = function() require('blake.other').neoscroll() end, } use { -- auto-session: automatic session management 'rmagatti/auto-session', config = function() require('blake.other').autosession() end } use { -- glow: Markdown preview 'ellisonleao/glow.nvim', ft = { 'md', 'markdown', } } use { -- zen mode: (ZenMode or ZM) "folke/zen-mode.nvim", config = function() require('blake.other').zenmode() vim.cmd 'nnoremap ZenMode' vim.cmd 'inoremap ZenMode' end, } -- use { -- twilight.nvim: dim text outside paragraph or function -- 'folke/twilight.nvim', -- config = function() -- vim.cmd 'cab TW Twilight' -- require("twilight").setup() -- end, -- } use { -- matchup: Use the percent (%) key for more things 'andymass/vim-matchup', } use { -- indentline: Line indent indicators 'lukas-reineke/indent-blankline.nvim', config = function() require('blake.other').indent_blankline() end } use { -- targets.vim: fix ci' and other things to work better 'wellle/targets.vim', } use { -- nvim-tree: File explorer 'kyazdani42/nvim-tree.lua', requires = { 'kyazdani42/nvim-web-devicons' }, tag = 'nightly', config = function() require("nvim-tree").setup({ diagnostics = { enable = true, }, }) end } use { -- neogen: annotation generator for neovim 'danymat/neogen', requires = "nvim-treesitter/nvim-treesitter", config = function() require('neogen').setup({ snippet_engine = "luasnip", }) local opts = { noremap = true, silent = true } vim.api.nvim_set_keymap("n", "af", ":lua require('neogen').generate('func')", opts) end } use { -- hop.nvim: Jump around files quickly 'phaazon/hop.nvim', config = function() require('hop').setup { keys = 'etovxqpdygfblzhckisuran' } end } ---- Language-specific packages use { -- rust-tools: make nvim a better rust environment 'simrat39/rust-tools.nvim', requires = { 'mattn/webapi-vim', -- allow :RustPlay }, config = function () local rt = require("rust-tools") rt.setup({ server = { on_attach = function(_, bufnr) -- Hover actions vim.keymap.set("n", "K", rt.hover_actions.hover_actions, { buffer = bufnr }) -- Code action groups vim.keymap.set("n", "a", rt.code_action_group.code_action_group, { buffer = bufnr }) end, }, }) end } use { -- quarto-nvim: tools for writing with quarto 'quarto-dev/quarto-nvim', requires = { 'jmbuhr/otter.nvim', -- execute code in a terminal }, config = function () require'quarto'.setup({ debug = false, closePreviewOnExit = true, lspFeatures = { enabled = true, languages = { 'bash' }, chunks = 'curly', -- 'curly' or 'all' diagnostics = { enabled = true, triggers = { "BufWritePost" } }, completion = { enabled = true, }, }, keymap = { hover = 'K', definition = 'gd', }, }) end } use { -- faust-nvim: faust integration 'madskjeldgaard/faust-nvim', config = function() require 'faust-nvim' require 'faust-nvim'.load_snippets() end, requires = { 'vijaymarupudi/nvim-fzf', 'L3MON4D3/LuaSnip' }--, -- run = require'faust-nvim'.post_install, -- Generate documentation etc (currently doesn't work it seems) } -- Conveniences use { -- sort motion: (gs) 'christoomey/vim-sort-motion', requires = 'navicore/vissort.vim', -- config requires config = function() vim.cmd [[ "let g:sort_motion_flags = 'i' let g:sort_motion_visual_block_command = 'Vissort' ]] end, } use { -- vissort: "Visual Sort" - sort based on selected characters 'navicore/vissort.vim', cmd = 'Vissort', } use { -- AdvancedSorters: More ways to sort text - :Sort.... 'inkarkat/vim-AdvancedSorters' } use { -- ghost: Web browser integration 'raghur/vim-ghost', opt = true, cmd = {'GhostStart', 'GhostInstall', 'GhostStop', 'GhostSync', 'GhostToggleSync',}, } use { -- undotree: visual undo tree 'mbbill/undotree', config = function() vim.api.nvim_set_keymap('n', 'u', 'UndotreeToggle', { noremap = true, silent = true, }) end } use { -- macroeditor: edit macros in another window to avoid making LSP mad 'dohsimpson/vim-macroeditor', config = function() vim.cmd 'cab ME MacroEdit' end } -- use { -- shade.nvim: dim inactive window -- 'sunjon/shade.nvim', -- config = function() -- require'shade'.setup({ -- overlay_opacity = 50, -- opacity_step = 1, -- keys = { -- brightness_up = '', -- brightness_down = '', -- toggle = 's', -- } -- }) -- end -- } use { -- nvim-autopairs: automatic quote pairing 'windwp/nvim-autopairs', config = function() -- If you want insert `(` after select function or method item local cmp_autopairs = require('nvim-autopairs.completion.cmp') local cmp = require('cmp') cmp.event:on( 'confirm_done', cmp_autopairs.on_confirm_done() ) require('nvim-autopairs').setup({ check_ts = true, map_c_h = true, map_c_w = true, }) end, requires = { 'hrsh7th/nvim-cmp' }, -- config requires } use { -- ts-autotag: automatically close html tags 'windwp/nvim-ts-autotag', config = function() require('nvim-ts-autotag').setup() end } use { -- endwise: auto add 'end' keyword when typing loops in various languages 'RRethy/nvim-treesitter-endwise', config = function() require('nvim-treesitter.configs').setup { endwise = { enable = true, }, } end } use { -- nvim-align: Align text 'RRethy/nvim-align', } use { -- comment.nvim: toggle comments - gb and gc 'numToStr/Comment.nvim', config = function() require('Comment').setup { mappings = { extra = true, } } end } use { -- ts-context-commentstring: set commentstring based on context from treesitter (two langs in one file) 'JoosepAlviste/nvim-ts-context-commentstring', requires = { 'nvim-treesitter/nvim-treesitter', }, } use { -- vim-rooter: cd to the root of a project when opening a file or folder 'notjedi/nvim-rooter.lua', } use { -- splitjoin: switch between single line and multiline versions of code - gJ and gS 'AndrewRadev/splitjoin.vim', } use { -- which-key: remind me what that one keybind does again? 'folke/which-key.nvim', config = function() require("which-key").setup() end, } use { -- marks.nvim: Show marks in sign column 'chentoast/marks.nvim', config = function() require('marks').setup() end } use { -- oscyank: copy text to system clipboard over ssh 'ojroques/vim-oscyank', config = function() -- Yanking to "+ will yank to system board vim.cmd [[ autocmd TextYankPost * if v:event.operator is 'y' && v:event.regname is '+' | execute 'OSCYankRegister +' | endif ]] end } use { -- fixcursorhold: fix neovim bug #12587 - https://github.com/neovim/neovim/issues/12587 'antoinemadec/FixCursorHold.nvim', } use { -- rhysd: clever-split: split calculation based on pane dimensions - CS or CleverSplit 'rhysd/clever-split.vim', config = function() vim.cmd [[ cab CH CleverHelp cab CS CleverSplit ]] end } -- use { -- rhysd: accelerated jk: make j and k move faster by pressing them a lot movement -- 'rhysd/accelerated-jk', -- } use { -- rhysd: committia: better commit editing window 'rhysd/committia.vim', } use { -- rhysd: conflict-marker: mark git conflicts - [x, ]x, co, ct, cb, cB, cn 'rhysd/conflict-marker.vim', } use { -- lewis6991: spaceless: Strip trailing whitespace as you are editing 'lewis6991/spaceless.nvim', config = function() require'spaceless'.setup() end, } use { -- lewis6991: foldsigns: signcolumn signs on folded lines 'lewis6991/foldsigns.nvim', config = function() require('foldsigns').setup() end, } use { -- lewis6991: cleanfold: folds have never looked better 'lewis6991/cleanfold.nvim', config = function() require('cleanfold').setup() end, } -- use { -- lewis6991: sattelite: small scroll bar -- 'lewis6991/satellite.nvim', -- config = function() -- require('satellite').setup() -- vim.cmd [[ -- nnoremap nohlsearch\|diffupdate\|SatelliteRefresh -- inoremap nohlsearch\|diffupdate\|SatelliteRefresh -- ]] -- end, -- } use { -- tpope: surround: surround text with quotes, parens, tags, and more - ys 'tpope/vim-surround', } use { -- tpope: fugitive: git integration 'tpope/vim-fugitive', cmd = 'G', } use { -- tpope: repeat: Repeatability for various tpope plugins 'tpope/vim-repeat', } use { -- tpope: sleuth: automatically get info about files and apply it to vim (tabs vs spaces, etc) 'tpope/vim-sleuth', } use { -- tpope: eunuch: some unix shell commands in vim 'tpope/vim-eunuch', cmd = { 'Remove', 'Unlink', 'Delete', 'Copy', 'Duplicate', 'Move', 'Rename', 'Chmod', 'Mkdir', 'Mkdir', 'Cfind', 'Lfind', 'Clocate', 'Llocate', 'SudoEdit', 'SudoWrite', }, } -- Bootstrap packer if needed { if (Packer_bootstrap) then print('Please wait for packer to install plugins') require('packer').sync() end -- } end, config = { -- Make packer a floating window with single border display = { open_fn = function() return require('packer.util').float({ border = 'single' }) end }, -- Move to lua dir so impatient.nvim can cache it compile_path = vim.fn.stdpath('config')..'/lua/packer_compiled.lua', -- Don't ask before removing plugins autoremove = true, -- Limit max jobs to avoid getting killed on low-end hardware max_jobs = Packer_max_jobs, profile = { enable = true, }, }}) -- how to align all plugin descriptions: select all plugins in visual line, :'<,'>Align \(.\+use { -- .\+: \+\)\@<=[^ ][^:]\+$ -- vim:fdm=marker:fmr={,}:fdl=1:expandtab:tabstop=3:sw=3