diff --git a/init.lua b/init.lua
index 7b83faa4..82fbb075 100644
--- a/init.lua
+++ b/init.lua
@@ -1,4 +1,4 @@
vim.g.mapleader = " "
vim.g.maplocalleader = " "
-require("lazyvim").setup()
+require("lazyvim.config.lazy")
diff --git a/lua/lazyvim/config/autocmds.lua b/lua/lazyvim/config/autocmds.lua
index 116caa7f..83e0ffeb 100644
--- a/lua/lazyvim/config/autocmds.lua
+++ b/lua/lazyvim/config/autocmds.lua
@@ -1,3 +1,5 @@
+-- This file is automatically loaded by plugins.config
+
-- Check if we need to reload the file when it changed
vim.api.nvim_create_autocmd({ "FocusGained", "TermClose", "TermLeave" }, { command = "checktime" })
diff --git a/lua/lazyvim/config/keymaps.lua b/lua/lazyvim/config/keymaps.lua
index 1f3cd492..21c5c60d 100644
--- a/lua/lazyvim/config/keymaps.lua
+++ b/lua/lazyvim/config/keymaps.lua
@@ -1,3 +1,5 @@
+-- This file is automatically loaded by plugins.config
+
-- Move to window using the movement keys
vim.keymap.set("n", "", "h")
vim.keymap.set("n", "", "j")
diff --git a/lua/lazyvim/config/options.lua b/lua/lazyvim/config/options.lua
index c74cb4b8..7879a858 100644
--- a/lua/lazyvim/config/options.lua
+++ b/lua/lazyvim/config/options.lua
@@ -1,3 +1,5 @@
+-- This file is automatically loaded by plugins.config
+
vim.opt.autowrite = true -- enable auto write
vim.opt.clipboard = "unnamedplus" -- sync with system clipboard
vim.opt.cmdheight = 1
diff --git a/lua/lazyvim/init.lua b/lua/lazyvim/init.lua
deleted file mode 100644
index ae316bd4..00000000
--- a/lua/lazyvim/init.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local M = {}
-
----@param opts? LazyVimSettings
-function M.setup(opts)
- if not package.loaded.lazy then
- require("lazyvim.config.lazy")
- end
- local settings = require("lazyvim.config.settings")
- package.loaded["lazyvim.config.settings"] = vim.tbl_deep_extend("force", settings, opts or {})
- require("lazyvim.config.options")
- require("lazyvim.config.autocmds")
- require("lazyvim.config.keymaps")
-end
-
-return M
diff --git a/lua/lazyvim/plugins/config.lua b/lua/lazyvim/plugins/config.lua
new file mode 100644
index 00000000..d4b2acaf
--- /dev/null
+++ b/lua/lazyvim/plugins/config.lua
@@ -0,0 +1,33 @@
+local function load(name)
+ local Util = require("lazy.core.util")
+ -- always load lazyvim, then user file
+ for _, mod in ipairs({ "lazyvim.config." .. name, "config." .. name }) do
+ Util.try(function()
+ require(mod)
+ end, {
+ msg = "Failed loading " .. mod,
+ on_error = function(msg)
+ local modpath = require("lazy.core.cache").find(mod)
+ if modpath then
+ Util.error(msg)
+ end
+ end,
+ })
+ end
+end
+
+-- load options here, before lazy init while sourcing plugin modules
+-- this is needed to make sure options will be correctly applied
+-- after installing missing plugins
+load("options")
+
+-- autocmds and keymaps can wait to load
+vim.api.nvim_create_autocmd("User", {
+ pattern = "VeryLazy",
+ callback = function()
+ load("autocmds")
+ load("keymaps")
+ end,
+})
+
+return {}