feat: Add custom scripts and hook based setup

This commit introduces a hook system that allows the user to add custom
modules which can use these hooks to invoke function af specific NvChad
events to allow for extending og functionality
This commit is contained in:
Morten Olsen 2021-08-24 21:45:59 +02:00 committed by siduck76
parent ca1ad15ad2
commit bfc10e6034
6 changed files with 71 additions and 1 deletions

22
lua/core/custom.lua Normal file
View file

@ -0,0 +1,22 @@
local function isModuleAvailable(name)
if package.loaded[name] then
return true
else
for _, searcher in ipairs(package.searchers or package.loaders) do
local loader = searcher(name)
if type(loader) == 'function' then
package.preload[name] = loader
return true
end
end
return false
end
end
local loadIfExists = function (module)
if isModuleAvailable(module) then
require(module)
end
end
loadIfExists('custom')

38
lua/core/hooks.lua Normal file
View file

@ -0,0 +1,38 @@
local hooks, M = {}, {};
local allowed_hooks = {
"install_plugins",
"setup_mappings",
"ready",
}
local function has_value (tab, val)
for _, value in ipairs(tab) do
if value == val then
return true
end
end
return false
end
M.add = function(name, fn)
if not(has_value(allowed_hooks, name)) then
error("Custom lua uses unallowed hook " .. name)
end
if hooks[name] == nil then
hooks[name] = {}
end
table.insert(hooks[name], fn);
end
M.run = function(name, args)
if hooks[name] == nil then
return;
end
for _, hook in pairs(hooks[name]) do
hook(args)
end
end
return M;

View file

@ -1,9 +1,12 @@
local core_modules = { local core_modules = {
"core.custom",
"core.options", "core.options",
"core.autocmds", "core.autocmds",
"core.mappings", "core.mappings",
} }
local hooks = require('core.hooks');
for _, module in ipairs(core_modules) do for _, module in ipairs(core_modules) do
local ok, err = pcall(require, module) local ok, err = pcall(require, module)
if not ok then if not ok then
@ -13,3 +16,5 @@ end
-- set all the non plugin mappings -- set all the non plugin mappings
require("core.mappings").misc() require("core.mappings").misc()
hooks.run("ready")

View file

@ -1,8 +1,8 @@
local utils = require "core.utils" local utils = require "core.utils"
local hooks = require "core.hooks"
local config = utils.load_config() local config = utils.load_config()
local map = utils.map local map = utils.map
local maps = config.mappings local maps = config.mappings
local plugin_maps = maps.plugin local plugin_maps = maps.plugin
@ -116,6 +116,7 @@ M.misc = function()
optional_mappings() optional_mappings()
required_mappings() required_mappings()
user_config_mappings() user_config_mappings()
hooks.run("setup_mappings", map)
end end
-- below are all plugin related mappings -- below are all plugin related mappings

2
lua/custom/init.lua Normal file
View file

@ -0,0 +1,2 @@
-- This is where you custom modules and plugins goes.
-- See the wiki for a guide on how to extend NvChad

View file

@ -337,4 +337,6 @@ return packer.startup(function()
require("core.mappings").vim_fugitive() require("core.mappings").vim_fugitive()
end, end,
} }
require("core.hooks").run("install_plugins", use)
end) end)