From 9bf418a874e9d46e94b22f7511b7a0d8f00ea77c Mon Sep 17 00:00:00 2001 From: Sebastian Lyng Johansen Date: Thu, 4 Sep 2025 19:31:31 +0200 Subject: [PATCH 1/3] feat!: lazy auto setup --- lua/crates/config/init.lua | 27 +++++++++------------------ lua/crates/init.lua | 11 ++--------- plugin/crates.lua | 10 ++++++++++ 3 files changed, 21 insertions(+), 27 deletions(-) create mode 100644 plugin/crates.lua diff --git a/lua/crates/config/init.lua b/lua/crates/config/init.lua index 57e2310..dd16f29 100644 --- a/lua/crates/config/init.lua +++ b/lua/crates/config/init.lua @@ -1993,35 +1993,26 @@ local function setup_neoconf(config) end ---@param schema table|SchemaElement[] ----@param user_config table ---@return table -local function build_config(schema, user_config) +local function build_config(schema) ---@type table local config = {} for _, elem in ipairs(schema) do local key = elem.name - local user_value = user_config[key] - local value_type = type(user_value) if elem.type.config_type == "section" then - if value_type == "table" then - config[key] = build_config(elem.fields, user_value) - else - config[key] = build_config(elem.fields, {}) - end + config[key] = build_config(elem.fields) else - if matches_type(value_type, elem.type) then - config[key] = user_value - else - config[key] = elem.default - end + config[key] = elem.default end end return config end +local current_config = build_config(M.schema) + ---comment ---@param user_config table? ---@return Config @@ -2035,11 +2026,11 @@ function M.build(user_config) handle_deprecated({}, M.schema, user_config, user_config) validate_schema({}, M.schema, user_config) - local config = build_config(M.schema, user_config) - if config.neoconf.enabled then - return setup_neoconf(config) + current_config = vim.tbl_deep_extend("force", current_config, user_config) + if current_config.neoconf.enabled then + return setup_neoconf(current_config) else - return config + return current_config end end diff --git a/lua/crates/init.lua b/lua/crates/init.lua index 8d9726d..756c6d8 100644 --- a/lua/crates/init.lua +++ b/lua/crates/init.lua @@ -1,12 +1,8 @@ local actions = require("crates.actions") local async = require("crates.async") -local command = require("crates.command") -local config = require("crates.config") local core = require("crates.core") -local highlight = require("crates.highlight") local popup = require("crates.popup") local state = require("crates.state") -local util = require("crates.util") local function attach() if state.cfg.completion.cmp.enabled then @@ -18,15 +14,12 @@ local function attach() end core.update() - state.cfg.on_attach(util.current_buf()) + state.cfg.on_attach(require("crates.util").current_buf()) end ---@param cfg crates.UserConfig local function setup(cfg) - state.cfg = config.build(cfg) - - command.register() - highlight.define() + state.cfg = require("crates.config").build(cfg) ---@type integer local group = vim.api.nvim_create_augroup("Crates", {}) diff --git a/plugin/crates.lua b/plugin/crates.lua new file mode 100644 index 0000000..9141e26 --- /dev/null +++ b/plugin/crates.lua @@ -0,0 +1,10 @@ +require("crates.command").register() +require("crates.highlight").define() + +vim.api.nvim_create_autocmd("BufRead", { + pattern = "Cargo.toml", + once = true, + callback = function() + require("crates").setup({}) + end, +}) From 437f2ff9f6ed4882ee5df659d4f15c89502bab29 Mon Sep 17 00:00:00 2001 From: Sebastian Lyng Johansen Date: Thu, 4 Sep 2025 19:44:36 +0200 Subject: [PATCH 2/3] fix: lazily require modules Improves setup time with a couple of milliseconds :) --- lua/crates/command.lua | 56 ++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 30 deletions(-) diff --git a/lua/crates/command.lua b/lua/crates/command.lua index 257af52..171f447 100644 --- a/lua/crates/command.lua +++ b/lua/crates/command.lua @@ -1,41 +1,37 @@ -local actions = require("crates.actions") -local core = require("crates.core") -local popup = require("crates.popup") - local M = {} ---@type {[1]: string, [2]: function}[] local sub_commands = { - { "hide", core.hide }, - { "show", core.show }, - { "toggle", core.toggle }, - { "update", core.update }, - { "reload", core.reload }, + { "hide", function() return require("crates.core").hide() end }, + { "show", function() return require("crates.core").show() end }, + { "toggle", function() return require("crates.core").toggle() end }, + { "update", function() return require("crates.core").update() end }, + { "reload", function() return require("crates.core").reload() end }, - { "upgrade_crate", actions.upgrade_crate }, - { "upgrade_crates", actions.upgrade_crates }, - { "upgrade_all_crates", actions.upgrade_all_crates }, - { "update_crate", actions.update_crate }, - { "update_crates", actions.update_crates }, - { "update_all_crates", actions.update_all_crates }, - { "use_git_source", actions.use_git_source }, + { "upgrade_crate", function() return require("crates.actions").upgrade_crate() end }, + { "upgrade_crates", function() return require("crates.actions").upgrade_crates() end }, + { "upgrade_all_crates", function() return require("crates.actions").upgrade_all_crates() end }, + { "update_crate", function() return require("crates.actions").update_crate() end }, + { "update_crates", function() return require("crates.actions").update_crates() end }, + { "update_all_crates", function() return require("crates.actions").update_all_crates() end }, + { "use_git_source", function() return require("crates.actions").use_git_source() end }, - { "expand_plain_crate_to_inline_table", actions.expand_plain_crate_to_inline_table }, - { "extract_crate_into_table", actions.extract_crate_into_table }, + { "expand_plain_crate_to_inline_table", function() return require("crates.actions").expand_plain_crate_to_inline_table() end }, + { "extract_crate_into_table", function() return require("crates.actions").extract_crate_into_table() end }, - { "open_homepage", actions.open_homepage }, - { "open_repository", actions.open_repository }, - { "open_documentation", actions.open_documentation }, - { "open_cratesio", actions.open_crates_io }, + { "open_homepage", function() return require("crates.actions").open_homepage() end }, + { "open_repository", function() return require("crates.actions").open_repository() end }, + { "open_documentation", function() return require("crates.actions").open_documentation() end }, + { "open_cratesio", function() return require("crates.actions").open_crates_io() end }, - { "popup_available", popup.available }, - { "show_popup", popup.show }, - { "show_crate_popup", popup.show_crate }, - { "show_versions_popup", popup.show_versions }, - { "show_features_popup", popup.show_features }, - { "show_dependencies_popup", popup.show_dependencies }, - { "focus_popup", popup.focus }, - { "hide_popup", popup.hide }, + { "popup_available", function() return require("crates.popup").available() end }, + { "show_popup", function() return require("crates.popup").show() end }, + { "show_crate_popup", function() return require("crates.popup").show_crate() end }, + { "show_versions_popup", function() return require("crates.popup").show_versions() end }, + { "show_features_popup", function() return require("crates.popup").show_features() end }, + { "show_dependencies_popup", function() return require("crates.popup").show_dependencies() end }, + { "focus_popup", function() return require("crates.popup").focus() end }, + { "hide_popup", function() return require("crates.popup").hide() end }, } ---@param arglead string From e6fae79b09820ec040c464ea4fc3ce37815404c6 Mon Sep 17 00:00:00 2001 From: Sebastian Lyng Johansen Date: Thu, 4 Sep 2025 20:32:54 +0200 Subject: [PATCH 3/3] docs: remove section about lazy loading This is now handled by the plugin itself, so no need for users to lazy load themselves --- README.md | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/README.md b/README.md index 2a19123..00ca2fe 100644 --- a/README.md +++ b/README.md @@ -54,20 +54,6 @@ lua require('crates').setup() -
-For lazy loading. - -```lua -{ - 'saecki/crates.nvim', - event = { "BufRead Cargo.toml" }, - config = function() - require('crates').setup() - end, -} -``` -
- ## [Documentation](https://github.com/Saecki/crates.nvim/wiki) - [Stable](https://github.com/Saecki/crates.nvim/wiki/Documentation-v0.7.1) - [Unstable](https://github.com/Saecki/crates.nvim/wiki/Documentation-unstable)