diff --git a/home/.config/nvim/lua/plugins.lua b/home/.config/nvim/lua/plugins.lua deleted file mode 100644 index 4acce21..0000000 --- a/home/.config/nvim/lua/plugins.lua +++ /dev/null @@ -1,69 +0,0 @@ -local plugins = require("utility.plugins") -local vim = require("vim") -local cmd = vim.cmd -local fn = vim.fn - --- Automatically run :PackerCompile if plugins.lua is updated -cmd[[ -augroup packer_user_config - autocmd! - autocmd BufWritePost ~/.config/nvim/lua/plugins.lua source | PackerCompile -augroup end -]] - - --- Extend plugins.get_plugin_file function and automatically pass a plugin_directory --- into it. Expects a relative path to the plugin file settings from this directory -local function plug_cfg(plugin_file) - local plugin_directory = fn.stdpath("config") .. "lua/pluginconf" - plugins.get_plugin_file(plugin_file, plugin_directory) -end - - --- Define packer plugins -local plugin_configs = { - { "airblade/vim-gitgutter" }, - { "dhruvasagar/vim-table-mode" }, - { "tmhedberg/SimpylFold" }, - { "wakatime/vim-wakatime" }, - { "mhinz/vim-startify" }, - { "ryanoasis/vim-devicons" }, - { "vimwiki/vimwiki", config = plug_cfg("vimwiki.lua") }, - { "sheerun/vim-polyglot", setup = plug_cfg("polyglot.lua") }, - { "tpope/vim-commentary", config = plug_cfg("commentary.lua") }, - { "junegunn/fzf", run = function() fn['fzf#install']() end }, - { "tomasiser/vim-code-dark", config = plug_cfg("vim-code-dark.lua") }, - { - "vim-airline/vim-airline", - config = plug_cfg("airline.lua"), - requires = { "vim-airline/vim-airline-themes", opt = true }, - }, - { - "preservim/nerdtree", - config = plug_cfg("nerdtree.lua"), - requires = { - { "Xuyuanp/nerdtree-git-plugin", opt = true }, - { "tiagofumo/vim-nerdtree-syntax-highlight", opt = true }, - }, - }, - { - "mfussenegger/nvim-dap", - config = plug_cfg("nvim-dap.lua"), - requires = { "mfussenegger/nvim-dap-python", opt = true }, - }, - { - "junegunn/fzf.vim", - config = plug_cfg("fzf.lua"), - after = "fzf", - requires = { "stsewd/fzf-checkout.vim", opt = true }, - }, - { - "neoclide/coc.nvim", - branch = "release", - config = plug_cfg("coc.vim"), - requires = { "antoinemadec/coc-fzf", opt = true }, - }, -} - --- Set up packer and use given plugins -plugins.packer_setup(plugin_configs) diff --git a/home/.config/nvim/lua/plugins/init.lua b/home/.config/nvim/lua/plugins/init.lua new file mode 100644 index 0000000..d93a202 --- /dev/null +++ b/home/.config/nvim/lua/plugins/init.lua @@ -0,0 +1,36 @@ +local vim = require("vim") +local packer_m = require("plugins.packer") + +-- Require packer_compiled to lazy-load all of the plugins and their settings +-- automatically. If this fails, it means we probably didn't yet compile +-- packer. This file is generated upon running :PackerCompile, so if we didn't +-- find it, we inform the user to run it. We can't run it here directly, +-- because packer may not yet be installed, bootstrapping happens only after +-- this to allow this lazy loadning behavior. If we required packer before +-- this, the lazy-loading would have no effect. +local packer_compiled_ok, _ = pcall(require, "compiled.packer_compiled") +if not packer_compiled_ok then + vim.notify( + "Run :PackerCompile or :PackerSync", + vim.log.levels.WARN, + { title = "Notification" } + ) +end + +-- If packer isn't present, install it automatically it +local present, packer = pcall(require, "packer") + +local first_install = false +if not present then + first_install = packer_m.bootstrap_packer() + if first_install then + -- We know this will work now that packer was bootstrapped + -- Otherwise we'd receive false in first_install + ---@diagnostic disable-next-line:different-requires + packer = require("packer") + end +end + +-- Obtain the plugins defined in plugin_list.ua +local plugin_list = require("plugins.plugin_list") +packer_m.startup(packer, plugin_list, first_install) diff --git a/home/.config/nvim/lua/plugins/packer.lua b/home/.config/nvim/lua/plugins/packer.lua new file mode 100644 index 0000000..624b663 --- /dev/null +++ b/home/.config/nvim/lua/plugins/packer.lua @@ -0,0 +1,114 @@ +local vim = require("vim") +local cmd = vim.cmd +local fn = vim.fn + +local M = {} + +-- Define some paths used in the functions +M.packer_install_path = fn.stdpath("data") .. "/site/pack/packer/start/packer.nvim" +M.packer_compile_path = fn.stdpath("config") .. "/lua/compiled/packer_compiled.lua" + +-- Define basic default settings for packer +M.packer_settings = { + display = { + open_fn = function() + return require('packer.util').float({ border = "rounded" }) + end, + prompt_border = "rounded", + }, + git = { + -- Timeout for git clones in seconds + clone_timeout = 600, + }, + profile = { + enable = true, + -- The time that a pluign's load time must surpass for it to be included + -- in the profile (in miliseconds) + threshold = 1, + }, + compile_path = M.packer_compile_path, + auto_clean = true, + compile_on_sync = true +} + +-- Define default plugins which should always be used +M.default_plugin_list = { + -- Let packer manager itself, so that it gets updates + { "wbthomason/packer.nvim" }, + + -- Add plugin for speeding up `require` in lua by caching + --{ "lewis6991/impatient.nvim" }, + + -- Replaces default filetype.vim sourced on startup, which includes + -- 800+ autocommands setting the filetype based on the filename. This + -- is very slow and this plugin merges them into single autocommand, + -- which is 175x faster, improving startup time + --{ "nathom/filetype.nvim" }, +} + +-- Download and load packer plugin manager +function M.bootstrap_packer() + print("Clonning pakcer plugin manager, please wait...") + -- First remove the directory in case it already exists but packer isn't present + fn.delete(M.packer_install_path, "rf") + fn.system({ + "git", "clone", "--depth", "1", + "https://github.com/wbthomason/packer.nvim", + M.packer_install_path + }) + + -- Add packer plugin via nvim's internal plugin system + -- and make sure that we can now require it. + cmd("packadd packer.nvim") + local present, packer = pcall(require, "packer") + if present then + print("Packer clonned successfully.") + return true + else + print("Couldn't clone packer! Packer path: " .. M.packer_install_path .. "\n" .. packer) + return false + end +end + +-- Run packer startup with the default config and given plugin settings +-- Expects: `packer`, `plugin_list`, `run_sync`, `settings_override` +function M.startup(packer, plugin_list, run_sync, settings_override) + -- Initialize packer with default settings extended by + -- the given settings override + local settings = M.packer_settings + if settings_override then + settings = vim.tbl_extend("foce", settings, settings_override) + end + packer.reset() + packer.init(settings) + + -- Run packer startup and use all given plugins with their settings + -- including the default plugins + local use = packer.use + return packer.startup(function() + -- Use the default plugins (should be first) + for _, plugin_settings in pairs(M.default_plugin_list) do + use(plugin_settings) + end + + -- Use the obtained plugins + if plugin_list and not vim.tbl_isempty(plugin_list) then + for _, plugin_settings in pairs(plugin_list) do + use(plugin_settings) + end + end + + -- We can also automatically run sync to install all specified plugins + -- immediately, this is useful if we've just bootstrapped packer. + if run_sync then + vim.notify( + "Make sure to restart after packer sync!", + vim.log.levels.WARN, + { title = "Notification" } + ) + packer.sync() + end + end) +end + +return M diff --git a/home/.config/nvim/lua/plugins/plugin_list.lua b/home/.config/nvim/lua/plugins/plugin_list.lua new file mode 100644 index 0000000..046eab0 --- /dev/null +++ b/home/.config/nvim/lua/plugins/plugin_list.lua @@ -0,0 +1,62 @@ +local vim = require("vim") +local fn = vim.fn + +local plugin_directory = fn.stdpath("config") .. "/lua/pluginconf" + +-- Return the line (string) to be executed with lua that loads in given plugin file. +-- This is useful for the `config` or `setup` parameters of packer's use to source +-- both `.vim` and `.lua` files. +-- Expects a `plugin_file` which is a relative path from the `plugin_directory` folder. +local function get_plugin_file(plugin_file) + local source_line = string.format('source %s/%s', plugin_directory, plugin_file) + return string.format("vim.fn.execute('%s')", source_line) +end + + +-- Define packer plugins +-- The individual tables will get passed into the packer's use function +local plugin_list = { + { "airblade/vim-gitgutter" }, + { "dhruvasagar/vim-table-mode" }, + { "tmhedberg/SimpylFold" }, + { "wakatime/vim-wakatime" }, + { "mhinz/vim-startify" }, + { "ryanoasis/vim-devicons" }, + { "sheerun/vim-polyglot", setup = get_plugin_file("polyglot.lua") }, + { "vimwiki/vimwiki", config = get_plugin_file("vimwiki.lua") }, + { "tpope/vim-commentary", config = get_plugin_file("commentary.lua") }, + { "junegunn/fzf", run = function() fn['fzf#install']() end }, + { "tomasiser/vim-code-dark", config = get_plugin_file("vim-code-dark.lua") }, + { + "vim-airline/vim-airline", + config = get_plugin_file("airline.lua"), + requires = { "vim-airline/vim-airline-themes", opt = true }, + }, + { + "preservim/nerdtree", + config = get_plugin_file("nerdtree.lua"), + requires = { + { "Xuyuanp/nerdtree-git-plugin", opt = true }, + { "tiagofumo/vim-nerdtree-syntax-highlight", opt = true }, + }, + }, + { + "mfussenegger/nvim-dap", + config = get_plugin_file("nvim-dap.lua"), + requires = { "mfussenegger/nvim-dap-python", opt = true }, + }, + { + "junegunn/fzf.vim", + config = get_plugin_file("fzf.lua"), + after = "fzf", + requires = { "stsewd/fzf-checkout.vim", opt = true }, + }, + { + "neoclide/coc.nvim", + branch = "release", + config = get_plugin_file("coc.vim"), + requires = { "antoinemadec/coc-fzf", opt = true }, + }, +} + +return plugin_list diff --git a/home/.config/nvim/lua/utility/plugins.lua b/home/.config/nvim/lua/utility/plugins.lua deleted file mode 100644 index 62e5de3..0000000 --- a/home/.config/nvim/lua/utility/plugins.lua +++ /dev/null @@ -1,122 +0,0 @@ -local vim = require("vim") -local cmd = vim.cmd -local api = vim.api -local fn = vim.fn - --- This module contains several functions regarding packer plugin manager --- Most notably the get_plugin_file and packer_setup fucntions -local M = {} - --- Drectory containing the individual plugin configuration files. --- File to hold the compiled packer binary -M.packer_compiled_path = fn.stdpath("config") .. "plugin/packer_compiled.lua" - --- Return the line (string) to be executed with lua that loads in given plugin file. --- This is useful for the `config` or `setup` parameters of packer's use to either --- source `.vim` files, or require `.lua` files. --- Expects a `plugin_file` which is a relative path from the `plugin_directory` folder. -function M.get_plugin_file(plugin_file, plugin_directory) - local filename, extension = plugin_file:match("^(.+)(%..+)$") - if (extension == ".vim") then - local source_line = string.format('source "%s/%s"', plugin_directory, plugin_file) - return string.format("vim.fn.execute('%s')", source_line) - else - return string.format('require("%s/%s")', plugin_directory, filename) - end -end - --- Download packer plugin manager in case it isn't already installed -function M.packer_bootstrap() - local first_install = false - local present, packer = pcall(require, "packer") - if not present then - local packer_install_path = fn.stdpath("data") .. "/site/pack/packer/start/packer.nvim" - print("Clonning pakcer plugin manager, please wait...") - -- First remove the directory in case it already exists but packer isn't present - fn.delete(packer_install_path, "rf") - fn.system({ - "git", "clone", "--depth", "1", - "https://github.com/wbthomason/packer.nvim", - packer_install_path - }) - - -- Make sure packer was installed properly - cmd("packadd packer.nvim") - present, packer = pcall(require, "packer") - - if present then - print("Packer clonned successfully.") - first_install = true - else - print("Couldn't clone packer! Packer path: " .. packer_install_path .. "\n" .. packer) - end - end - - return { present = present, first_install = first_install, packer = packer } -end - --- Initialize packer with our desired configuration --- If packer isn't instaleld, this also performs the installation -function M.packer_init() - local details = M.packer_bootstrap() - -- Only continue if we actually managed to install packer - if not details.present then - return details - end - - details.packer.init({ - display = { - open_fn = function() - return require('packer.util').float({ border = "rounded" }) - end, - prompt_border = "rounded", - }, - git = { - -- Timeout for git clones in seconds - clone_timeout = 600, - }, - profile = { - enable = true, - -- The time that a pluign's load time must surpass for it to be included - -- in the profile (in miliseconds) - threshold = 1, - }, - compile_path = M.packer_compiled_path, - }) - - return details -end - --- Run packer's setup function and define all of the used plugins --- Expects table/list of tables holding the individual plugin settings -function M.packer_setup(plugin_configs) - local details = M.packer_init() - if not details.present then - return false - end - - local packer = details.packer - local use = packer.use - local first_install = details.first_install - - -- Make sure to add packer here, even if it's opt - api.nvim_command("packadd packer.nvim") - - return packer.startup(function() - -- We always want to let packer manage itself - use("wbthomason/packer.nvim") - - -- Load the obtained plugins (in any) - if plugin_configs and not vim.tbl_isempty(plugin_configs) then - for _, plugin in pairs(plugin_configs) do - use(plugin) - end - end - - if first_install then - packer.sync() - end - end) -end - -return M