diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..8b176d5 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,7 @@ +root = true + +[*] +insert_final_newline = true +indent_style = space +indent_size = 2 +charset = utf-8 diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index 9441643..dd77c5c 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.10.2" + ".": "11.17.1" } diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 4a77601..5c225eb 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -6,7 +6,10 @@ body: - type: markdown attributes: value: | - **Before** reporting an issue, make sure to read the [documentation](https://github.com/folke/lazy.nvim) and search [existing issues](https://github.com/folke/lazy.nvim/issues). Usage questions such as ***"How do I...?"*** belong in [Discussions](https://github.com/folke/lazy.nvim/discussions) and will be closed. + **Before** reporting an issue, make sure to read the [documentation](https://github.com/folke/lazy.nvim) + and search [existing issues](https://github.com/folke/lazy.nvim/issues). + + Usage questions such as ***"How do I...?"*** belong in [Discussions](https://github.com/folke/lazy.nvim/discussions) and will be closed. - type: checkboxes attributes: label: Did you check docs and existing issues? @@ -14,6 +17,8 @@ body: options: - label: I have read all the lazy.nvim docs required: true + - label: I have updated the plugin to the latest version before submitting this issue + required: true - label: I have searched the existing issues of lazy.nvim required: true - label: I have searched the existing issues of plugins related to this issue @@ -57,32 +62,14 @@ body: label: Repro description: Minimal `init.lua` to reproduce this issue. Save as `repro.lua` and run with `nvim -u repro.lua` value: | - -- DO NOT change the paths and don't remove the colorscheme - local root = vim.fn.fnamemodify("./.repro", ":p") + vim.env.LAZY_STDPATH = ".repro" + load(vim.fn.system("curl -s https://raw.githubusercontent.com/folke/lazy.nvim/main/bootstrap.lua"))() - -- set stdpaths to use .repro - for _, name in ipairs({ "config", "data", "state", "cache" }) do - vim.env[("XDG_%s_HOME"):format(name:upper())] = root .. "/" .. name - end - - -- bootstrap lazy - local lazypath = root .. "/plugins/lazy.nvim" - if not vim.loop.fs_stat(lazypath) then - vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", lazypath, }) - end - vim.opt.runtimepath:prepend(lazypath) - - -- install plugins - local plugins = { - "folke/tokyonight.nvim", - -- add any other plugins here - } - require("lazy").setup(plugins, { - root = root .. "/plugins", + require("lazy.minit").repro({ + spec = { + -- add any other plugins here + }, }) - - vim.cmd.colorscheme("tokyonight") - -- add anything else here - render: Lua + render: lua validations: required: false diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 60f92cf..95c1e6f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,3 +12,4 @@ jobs: with: plugin: lazy.nvim repo: folke/lazy.nvim + docs: false diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index a0c704b..4e0273b 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -5,6 +5,7 @@ on: - cron: "30 1 * * *" jobs: - ci: + stale: + if: contains(fromJSON('["folke", "LazyVim"]'), github.repository_owner) uses: folke/github/.github/workflows/stale.yml@main secrets: inherit diff --git a/.github/workflows/update.yml b/.github/workflows/update.yml index 2177a50..6784ef9 100644 --- a/.github/workflows/update.yml +++ b/.github/workflows/update.yml @@ -7,6 +7,7 @@ on: - cron: "0 * * * *" jobs: - ci: + update: + if: contains(fromJSON('["folke", "LazyVim"]'), github.repository_owner) uses: folke/github/.github/workflows/update.yml@main secrets: inherit diff --git a/CHANGELOG.md b/CHANGELOG.md index b265fe9..521777a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,180 @@ # Changelog +## [11.17.1](https://github.com/folke/lazy.nvim/compare/v11.17.0...v11.17.1) (2025-02-25) + + +### Bug Fixes + +* **bootstrap:** support for older Neovim versions ([1c9ba37](https://github.com/folke/lazy.nvim/commit/1c9ba3704564a2e34a22191bb89678680ffeb245)) +* **meta:** rebuild dirty right after disable. See [#1889](https://github.com/folke/lazy.nvim/issues/1889) ([d51cf69](https://github.com/folke/lazy.nvim/commit/d51cf6978321d659e68a8bc38ee806bd2517a196)) + +## [11.17.0](https://github.com/folke/lazy.nvim/compare/v11.16.2...v11.17.0) (2025-02-24) + + +### Features + +* **config,render:** allow customizing the debug icon ([#1863](https://github.com/folke/lazy.nvim/issues/1863)) ([a9c660d](https://github.com/folke/lazy.nvim/commit/a9c660d6ef1b396869d3d951760aa7a3dbfe575f)) +* **util:** pass lang to `vim.notify` so that snacks notifier can render the ft. Closes [#1919](https://github.com/folke/lazy.nvim/issues/1919) ([c6a57a3](https://github.com/folke/lazy.nvim/commit/c6a57a3534d3494bcc5ff9b0586e141bdb0280eb)) + + +### Bug Fixes + +* **config:** add missing space on the default debug icon ([#1879](https://github.com/folke/lazy.nvim/issues/1879)) ([4df5c4d](https://github.com/folke/lazy.nvim/commit/4df5c4d65a3bbf801edd9ec55fb1ae55cfa72dd0)) +* **meta:** disable top-level specs before the rest. Closes [#1889](https://github.com/folke/lazy.nvim/issues/1889) ([f81a3fb](https://github.com/folke/lazy.nvim/commit/f81a3fb7feaf460ec7c8c983682b4a693b18fdd4)) +* **ui:** do not show virt_lines for messages ([#1904](https://github.com/folke/lazy.nvim/issues/1904)) ([f15a939](https://github.com/folke/lazy.nvim/commit/f15a93907ddad3d9139aea465ae18336d87f5ce6)) + +## [11.16.2](https://github.com/folke/lazy.nvim/compare/v11.16.1...v11.16.2) (2024-12-13) + + +### Bug Fixes + +* **meta:** when a plugin is both optional and disabled, then just delete it from the list ([805b85c](https://github.com/folke/lazy.nvim/commit/805b85c2ea3bd6f9506ef22cbd6e3a39172b5b08)) + +## [11.16.1](https://github.com/folke/lazy.nvim/compare/v11.16.0...v11.16.1) (2024-12-09) + + +### Bug Fixes + +* **types:** ensure all fields for `LazyPluginSpec` are optional ([#1843](https://github.com/folke/lazy.nvim/issues/1843)) ([703be1d](https://github.com/folke/lazy.nvim/commit/703be1dda35e142e76e94e7503cf67d6b98a1d35)), closes [#1842](https://github.com/folke/lazy.nvim/issues/1842) + +## [11.16.0](https://github.com/folke/lazy.nvim/compare/v11.15.0...v11.16.0) (2024-12-07) + + +### Features + +* **plugin:** added support for virtual plugins. Closes [#1836](https://github.com/folke/lazy.nvim/issues/1836) ([ee64abc](https://github.com/folke/lazy.nvim/commit/ee64abc76be2b237b95d241a924b0323005b868a)) + + +### Bug Fixes + +* **plugin:** don't check if dir exists for virtual plugins ([656cf43](https://github.com/folke/lazy.nvim/commit/656cf4309396b7b8b62984e923bf8d8a0013f7d7)) +* **render:** show correct key for home. Fixes [#1796](https://github.com/folke/lazy.nvim/issues/1796) ([b08dba8](https://github.com/folke/lazy.nvim/commit/b08dba8107b5bdaaa007f18cf6c0cc0e0fd576aa)) + +## [11.15.0](https://github.com/folke/lazy.nvim/compare/v11.14.2...v11.15.0) (2024-12-05) + + +### Features + +* **plugin:** show error for local plugins that don't exist. Fixes [#1773](https://github.com/folke/lazy.nvim/issues/1773) ([9570a5a](https://github.com/folke/lazy.nvim/commit/9570a5ae7b17dcde4718c7458fd986c10f015a99)) + +## [11.14.2](https://github.com/folke/lazy.nvim/compare/v11.14.1...v11.14.2) (2024-11-10) + + +### Bug Fixes + +* **bootstrap:** single forward slash. Fixes [#1747](https://github.com/folke/lazy.nvim/issues/1747) ([aca30f6](https://github.com/folke/lazy.nvim/commit/aca30f63619a7492ecdea8833a065cf83c80f764)) +* **completion:** check if command string is a prefix of Lazy ([#1760](https://github.com/folke/lazy.nvim/issues/1760)) ([e9fd76e](https://github.com/folke/lazy.nvim/commit/e9fd76e239cc18da289f9a3f80f35fa16b003175)), closes [#1758](https://github.com/folke/lazy.nvim/issues/1758) +* **docs:** always update helptags for local plugins ([60cf258](https://github.com/folke/lazy.nvim/commit/60cf258a9ae7fffe04bb31141141a91845158dcc)) +* **luarocks:** try to install from root manifest ([#1687](https://github.com/folke/lazy.nvim/issues/1687)) ([591ef40](https://github.com/folke/lazy.nvim/commit/591ef40f2da3a26fbcc0466988cd6fe45ca68cae)) +* **rocks:** add lib64 plugin directory to package.cpath ([#1717](https://github.com/folke/lazy.nvim/issues/1717)) ([80da254](https://github.com/folke/lazy.nvim/commit/80da254e645f579c28394ee0f08f75a9c9481744)) +* **rockspec:** allow binary lua files. Fixes [#1800](https://github.com/folke/lazy.nvim/issues/1800) ([408449a](https://github.com/folke/lazy.nvim/commit/408449a59adb8c2a31c32fff606676b32ce4552a)) + +## [11.14.1](https://github.com/folke/lazy.nvim/compare/v11.14.0...v11.14.1) (2024-07-25) + + +### Bug Fixes + +* **plugins:** "Vim:E150: Not a directory" on plugin update ([#1679](https://github.com/folke/lazy.nvim/issues/1679)) ([7108809](https://github.com/folke/lazy.nvim/commit/7108809ab18dc1b1e6f402b29e2e1d35a5d311d5)) + +## [11.14.0](https://github.com/folke/lazy.nvim/compare/v11.13.5...v11.14.0) (2024-07-24) + + +### Features + +* added `opts.git.cooldown` to allow updating plugins on slow connections. Fixes [#1656](https://github.com/folke/lazy.nvim/issues/1656) ([d5686ef](https://github.com/folke/lazy.nvim/commit/d5686efbd00942b3e38de7c08b8df69d961b02f0)) +* **plugin:** improve error handling and show better error message ([c02268a](https://github.com/folke/lazy.nvim/commit/c02268ac6e6aab92249d020d75efc588bd9d24fa)) + + +### Bug Fixes + +* **plugin:** make .lazy.lua work again ([b4a5a12](https://github.com/folke/lazy.nvim/commit/b4a5a1209e4c64fa67aedf721a383541a64056d1)) + +## [11.13.5](https://github.com/folke/lazy.nvim/compare/v11.13.4...v11.13.5) (2024-07-22) + + +### Bug Fixes + +* **health:** dont use vim.fn.system to get cmd versions ([7d29719](https://github.com/folke/lazy.nvim/commit/7d29719ade6f5a269e3b7d08b246641b5b079aaa)) + +## [11.13.4](https://github.com/folke/lazy.nvim/compare/v11.13.3...v11.13.4) (2024-07-22) + + +### Bug Fixes + +* **loader:** add plugins whose rtp got loaded early to start plugins ([34b0126](https://github.com/folke/lazy.nvim/commit/34b0126e5b3966f1dbe148d6f8450213115e76b2)) +* **loader:** explicitely set package.loaded.modname to nil to prevent recursive loading errors ([12f2c74](https://github.com/folke/lazy.nvim/commit/12f2c74244cc768d97c83972aa63722389b5d96d)) + +## [11.13.3](https://github.com/folke/lazy.nvim/compare/v11.13.2...v11.13.3) (2024-07-21) + + +### Reverts + +* fix(loader): add auto loaded module to package.loaded early to prevent require loops ([a692bf8](https://github.com/folke/lazy.nvim/commit/a692bf86883457f45fe3f773bfc8bc4d9e4b070c)) + +## [11.13.2](https://github.com/folke/lazy.nvim/compare/v11.13.1...v11.13.2) (2024-07-21) + + +### Bug Fixes + +* **loader:** add auto loaded module to package.loaded early to prevent require loops ([18d1c1b](https://github.com/folke/lazy.nvim/commit/18d1c1b47e175cd58dc12bf4792ef4e9a50505fa)) + +## [11.13.1](https://github.com/folke/lazy.nvim/compare/v11.13.0...v11.13.1) (2024-07-19) + + +### Bug Fixes + +* **build:** only load the plugin before build for `:` build commands ([5bdb12a](https://github.com/folke/lazy.nvim/commit/5bdb12a038e5a72cc793f38893f1a9c9fb741759)) + +## [11.13.0](https://github.com/folke/lazy.nvim/compare/v11.12.0...v11.13.0) (2024-07-17) + + +### Features + +* **ui:** added mapping descriptions ([6ca90a2](https://github.com/folke/lazy.nvim/commit/6ca90a21202808796418e46d3cebfbb5a44e54a2)) + +## [11.12.0](https://github.com/folke/lazy.nvim/compare/v11.11.1...v11.12.0) (2024-07-16) + + +### Features + +* **git:** added git network throttle to limit network related git ops per interval. Closes [#1635](https://github.com/folke/lazy.nvim/issues/1635) ([d731a6b](https://github.com/folke/lazy.nvim/commit/d731a6b005fd239e85e555bd57362382f6c1e461)) + +## [11.11.1](https://github.com/folke/lazy.nvim/compare/v11.11.0...v11.11.1) (2024-07-13) + + +### Bug Fixes + +* **config:** check for lib64. Fixes [#1343](https://github.com/folke/lazy.nvim/issues/1343) ([93499c5](https://github.com/folke/lazy.nvim/commit/93499c5deb37641c6cf71528a93f101d186b409f)) +* **lockfile:** ensure newline at EOF for lockfile ([#1639](https://github.com/folke/lazy.nvim/issues/1639)) ([7ed9f71](https://github.com/folke/lazy.nvim/commit/7ed9f7173cdec71a057053d7e6efc20c2c230b95)) + +## [11.11.0](https://github.com/folke/lazy.nvim/compare/v11.10.4...v11.11.0) (2024-07-11) + + +### Features + +* add plugin name to handlers.managed ([17473db](https://github.com/folke/lazy.nvim/commit/17473db1d79ea30e06126834be7fd95ca511557b)) + + +### Bug Fixes + +* **minit:** add tests to package.path when running busted (helpers.lua etc) ([fadebdc](https://github.com/folke/lazy.nvim/commit/fadebdc76b71a1d3658a88a025c6c8fb4749e0f8)) +* **util:** strip `-lua` in normname ([54b003c](https://github.com/folke/lazy.nvim/commit/54b003c650f07b771e61566f7be2629beb2b781f)) + +## [11.10.4](https://github.com/folke/lazy.nvim/compare/v11.10.3...v11.10.4) (2024-07-08) + + +### Bug Fixes + +* **rocks:** try building anyway even when prerequisits have not been met. (will likely fail) ([f0324de](https://github.com/folke/lazy.nvim/commit/f0324defdd43be8aa14aaf3a794ff3d5581f36ba)) +* **ui:** don't treat suspended as headless. Closes [#1626](https://github.com/folke/lazy.nvim/issues/1626) ([2dfccd7](https://github.com/folke/lazy.nvim/commit/2dfccd7b948beb26d8bcff7f9113a3a5c85cbc4a)) + +## [11.10.3](https://github.com/folke/lazy.nvim/compare/v11.10.2...v11.10.3) (2024-07-07) + + +### Bug Fixes + +* **git:** local plugin fixes ([#1624](https://github.com/folke/lazy.nvim/issues/1624)) ([72c0dc9](https://github.com/folke/lazy.nvim/commit/72c0dc9462ab3bf1a68198afabc1eb4e2940d299)) + ## [11.10.2](https://github.com/folke/lazy.nvim/compare/v11.10.1...v11.10.2) (2024-07-07) diff --git a/bootstrap.lua b/bootstrap.lua index 16d9f1d..c934c48 100644 --- a/bootstrap.lua +++ b/bootstrap.lua @@ -1,4 +1,4 @@ --- Lay Bootstrapper +-- Lazy Bootstrapper -- Usage: -- ```lua -- load(vim.fn.system("curl -s https://raw.githubusercontent.com/folke/lazy.nvim/main/bootstrap.lua"))() @@ -6,19 +6,20 @@ local M = {} function M.setup() + local uv = vim.uv or vim.loop if vim.env.LAZY_STDPATH then - local root = vim.fn.fnamemodify(vim.env.LAZY_STDPATH, ":p") + local root = vim.fn.fnamemodify(vim.env.LAZY_STDPATH, ":p"):gsub("[\\/]$", "") for _, name in ipairs({ "config", "data", "state", "cache" }) do vim.env[("XDG_%s_HOME"):format(name:upper())] = root .. "/" .. name end end - if vim.env.LAZY_PATH and not vim.uv.fs_stat(vim.env.LAZY_PATH) then + if vim.env.LAZY_PATH and not uv.fs_stat(vim.env.LAZY_PATH) then vim.env.LAZY_PATH = nil end local lazypath = vim.env.LAZY_PATH or vim.fn.stdpath("data") .. "/lazy/lazy.nvim" - if not vim.env.LAZY_PATH and not (vim.uv or vim.loop).fs_stat(lazypath) then + if not vim.env.LAZY_PATH and not uv.fs_stat(lazypath) then vim.api.nvim_echo({ { "Cloning lazy.nvim\n\n", diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index 73bd0ae..2ae3b36 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -294,9 +294,9 @@ SPEC SETUP *lazy.nvim-🔌-plugin-spec-spec-setup* -------------------------------------------------------------------------------------------------- Property Type Description ---------- ----------------------------- --------------------------------------------------------- - init fun(LazyPlugin) init functions are always executed during. Mostly useful - for setting vim.g.* configuration used by Vim plugins - startup + init fun(LazyPlugin) init functions are always executed during startup. Mostly + useful for setting vim.g.* configuration used by Vim + plugins startup opts table or opts should be a table (will be merged with parent fun(LazyPlugin, opts:table) specs), return a table (replaces parent specs) or should @@ -540,9 +540,7 @@ function. keys = { { "ft", "Neotree toggle", desc = "NeoTree" }, }, - config = function() - require("neo-tree").setup() - end, + opts = {}, } < @@ -646,24 +644,42 @@ will be added to the plugin’s spec. -- then set the below to false. This should work, but is NOT supported and will -- increase downloads a lot. filter = true, + -- rate of network related git operations (clone, fetch, checkout) + throttle = { + enabled = false, -- not enabled by default + -- max 2 ops every 5 seconds + rate = 2, + duration = 5 * 1000, -- in ms + }, + -- Time in seconds to wait before running fetch again for a plugin. + -- Repeated update/check operations will not run again until this + -- cooldown period has passed. + cooldown = 0, }, pkg = { enabled = true, cache = vim.fn.stdpath("state") .. "/lazy/pkg-cache.lua", - versions = true, -- Honor versions in pkg sources -- the first package source that is found for a plugin will be used. sources = { "lazy", - "rockspec", + "rockspec", -- will only be used when rocks.enabled is true "packspec", }, }, rocks = { + enabled = true, root = vim.fn.stdpath("data") .. "/lazy-rocks", server = "https://nvim-neorocks.github.io/rocks-binaries/", + -- use hererocks to install luarocks? + -- set to `nil` to use hererocks when luarocks is not found + -- set to `true` to always use hererocks + -- set to `false` to always use luarocks + hererocks = nil, }, dev = { - ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects + -- Directory where you store your local plugin projects. If a function is used, + -- the plugin directory (e.g. `~/projects/plugin-name`) must be returned. + ---@type string | fun(plugin: LazyPlugin): string path = "~/projects", ---@type string[] plugins that match these patterns will use your local versions instead of being fetched from GitHub patterns = {}, -- For example {"folke"} @@ -690,6 +706,7 @@ will be added to the plugin’s spec. icons = { cmd = " ", config = "", + debug = "● ", event = " ", favorite = " ", ft = " ", @@ -715,7 +732,7 @@ will be added to the plugin’s spec. -- leave nil, to automatically select a browser depending on your OS. -- If you want to use a specific browser, you can define it here browser = nil, ---@type string? - throttle = 20, -- how frequently should the ui process render events + throttle = 1000 / 30, -- how frequently should the ui process render events custom_keys = { -- You can define custom key maps here. If present, the description will -- be shown in the help menu. @@ -730,6 +747,16 @@ will be added to the plugin’s spec. desc = "Open lazygit log", }, + ["i"] = { + function(plugin) + Util.notify(vim.inspect(plugin), { + title = "Inspect " .. plugin.name, + lang = "lua", + }) + end, + desc = "Inspect Plugin", + }, + ["t"] = { function(plugin) require("lazy.util").float_term(nil, { @@ -740,6 +767,17 @@ will be added to the plugin’s spec. }, }, }, + -- Output options for headless mode + headless = { + -- show the output from process commands like git + process = true, + -- show log messages + log = true, + -- show task start/end + task = true, + -- use ansi colors + colors = true, + }, diff = { -- diff command can be one of: -- * browser: opens the github compare view. Note that this is always mapped to as well, @@ -791,7 +829,7 @@ will be added to the plugin’s spec. enabled = true, root = vim.fn.stdpath("state") .. "/lazy/readme", files = { "README.md", "lua/**/README.md" }, - -- only generate markdown helptags for plugins that dont have docs + -- only generate markdown helptags for plugins that don't have docs skip_if_doc_exists = true, }, state = vim.fn.stdpath("state") .. "/lazy/state.json", -- state info for checker and other things @@ -837,6 +875,8 @@ If you don’t want to use a Nerd Font, you can replace the icons with Unicode s ----------------------------------------------------------------------- Highlight Group Default Group Description ----------------------- ----------------------- ----------------------- + LazyBold { bold = true } + LazyButton CursorLine LazyButtonActive Visual @@ -857,10 +897,16 @@ If you don’t want to use a Nerd Font, you can replace the icons with Unicode s LazyDir @markup.link directory + LazyError DiagnosticError task errors + LazyH1 IncSearch home button LazyH2 Bold titles + LazyInfo DiagnosticInfo task errors + + LazyItalic { italic = true } + LazyLocal Constant LazyNoCond DiagnosticWarn unloaded icon for a @@ -897,13 +943,13 @@ If you don’t want to use a Nerd Font, you can replace the icons with Unicode s LazySpecial @punctuation.special - LazyTaskError ErrorMsg task errors - LazyTaskOutput MsgArea task output LazyUrl @markup.link url LazyValue @string value of a property + + LazyWarning DiagnosticWarn task errors ----------------------------------------------------------------------- ============================================================================== diff --git a/lua/lazy/community/_generated.lua b/lua/lazy/community/_generated.lua index 87b46dd..a5ed0ee 100644 --- a/lua/lazy/community/_generated.lua +++ b/lua/lazy/community/_generated.lua @@ -1,758 +1,2 @@ return -{ { - name = "15puzzle.nvim", - url = "NStefan002/15puzzle.nvim", - version = "1.4.1-1" - }, { - name = "2048.nvim", - url = "NStefan002/2048.nvim", - version = "2.8.2-1" - }, { - name = "adopure.nvim", - url = "Willem-J-an/adopure.nvim", - version = "1.1.0-1" - }, { - name = "aerial.nvim", - url = "stevearc/aerial.nvim", - version = "1.7.0-1" - }, { - name = "ai.nvim", - url = "S1M0N38/ai.nvim", - version = "0.1.0-1" - }, { - name = "auto-hlsearch.nvim", - url = "asiryk/auto-hlsearch.nvim", - version = "1.1.0-1" - }, { - name = "better-escape.nvim", - url = "max397574/better-escape.nvim", - version = "1.0.0-1" - }, { - name = "bufferline.nvim", - url = "akinsho/bufferline.nvim", - version = "4.6.1-1" - }, { - name = "ccc.nvim", - url = "uga-rosa/ccc.nvim", - version = "1.6.0-1" - }, { - name = "ci-template.nvim", - url = "linrongbin16/ci-template.nvim", - version = "8.1.0-1" - }, { - name = "cmp-rg", - url = "lukas-reineke/cmp-rg", - version = "1.3.9-1" - }, { - name = "colorbox.nvim", - url = "linrongbin16/colorbox.nvim", - version = "3.1.0-1" - }, { - name = "colorbuddy.nvim", - url = "tjdevries/colorbuddy.nvim", - version = "1.0.0-1" - }, { - name = "colortils.nvim", - url = "nvim-colortils/colortils.nvim", - version = "1.1.0-1" - }, { - name = "commander.nvim", - url = "FeiyouG/commander.nvim", - version = "0.2.0-1" - }, { - name = "comment-box.nvim", - url = "LudoPinelli/comment-box.nvim", - version = "1.0.2-1" - }, { - name = "comment.nvim", - url = "numToStr/Comment.nvim", - version = "0.8.0-1" - }, { - name = "commons.nvim", - url = "linrongbin16/commons.nvim", - version = "18.0.0-1" - }, { - name = "conform.nvim", - url = "stevearc/conform.nvim", - version = "6.0.0-1" - }, { - name = "cybu.nvim", - url = "ghillb/cybu.nvim", - version = "1.0-1" - }, { - name = "daylight.nvim", - url = "NTBBloodbath/daylight.nvim", - version = "1.1.0-1" - }, { - name = "deadcolumn.nvim", - url = "Bekaboo/deadcolumn.nvim", - version = "1.0.0-1" - }, { - name = "decipher.nvim", - url = "MisanthropicBit/decipher.nvim", - version = "1.0.1-1" - }, { - name = "detour.nvim", - url = "carbon-steel/detour.nvim", - version = "1.4.0-1" - }, { - name = "dial.nvim", - url = "monaqa/dial.nvim", - version = "0.4.0-1" - }, { - name = "distant.nvim", - url = "chipsenkbeil/distant.nvim", - version = "0.1.2-1" - }, { - name = "donut.nvim", - url = "NStefan002/donut.nvim", - version = "2.1.0-1" - }, { - name = "dressing.nvim", - url = "stevearc/dressing.nvim", - version = "2.2.2-1" - }, { - name = "dropbar.nvim", - url = "Bekaboo/dropbar.nvim", - version = "8.4.0-1" - }, { - name = "duck.nvim", - url = "tamton-aquib/duck.nvim", - version = "main-1" - }, { - name = "easypick.nvim", - url = "axkirillov/easypick.nvim", - version = "0.6.0-1" - }, { - name = "edgy.nvim", - url = "folke/edgy.nvim", - version = "1.9.1-1" - }, { - name = "elixir-tools.nvim", - url = "elixir-tools/elixir-tools.nvim", - version = "0.14.3-1" - }, { - name = "feline.nvim", - url = "freddiehaddad/feline.nvim", - version = "1.6.2-1" - }, { - name = "fidget.nvim", - url = "j-hui/fidget.nvim", - version = "1.4.1-1" - }, { - name = "flash.nvim", - url = "folke/flash.nvim", - version = "1.18.3-1" - }, { - name = "flatten.nvim", - url = "willothy/flatten.nvim", - version = "0.5.1-1" - }, { - name = "flutter-tools.nvim", - url = "akinsho/flutter-tools.nvim", - version = "1.10.0-1" - }, { - name = "focus.nvim", - url = "nvim-focus/focus.nvim", - version = "1.0.2-1" - }, { - name = "freeze-code.nvim", - url = "AlejandroSuero/freeze-code.nvim", - version = "0.2.0-1" - }, { - name = "fugit2.nvim", - url = "SuperBo/fugit2.nvim", - version = "0.2.0-1" - }, { - name = "funnyfiles.nvim", - url = "aikooo7/funnyfiles.nvim", - version = "1.0.1-1" - }, { - name = "fzfx.nvim", - url = "linrongbin16/fzfx.nvim", - version = "6.4.0-1" - }, { - name = "galileo.nvim", - url = "S1M0N38/galileo.nvim", - version = "0.0.2-1" - }, { - name = "gentags.nvim", - url = "linrongbin16/gentags.nvim", - version = "3.0.2-1" - }, { - name = "git-worktree.nvim", - url = "polarmutex/git-worktree.nvim", - version = "1.0.0-1" - }, { - name = "github-nvim-theme", - url = "projekt0n/github-nvim-theme", - version = "1.0.2-1" - }, { - name = "gitlinker.nvim", - url = "linrongbin16/gitlinker.nvim", - version = "4.13.1-1" - }, { - name = "gitsigns.nvim", - url = "lewis6991/gitsigns.nvim", - version = "scm-1" - }, { - name = "glow.nvim", - url = "ellisonleao/glow.nvim", - version = "0.2.0-1" - }, { - name = "go.nvim", - url = "ray-x/go.nvim", - version = "0.2.1-1" - }, { - name = "godo.nvim", - url = "arthuradolfo/godo.nvim", - version = "1.1.0-0" - }, { - name = "grapple.nvim", - url = "cbochs/grapple.nvim", - version = "0.30.0-1" - }, { - name = "gruvbox.nvim", - url = "ellisonleao/gruvbox.nvim", - version = "2.0.0-1" - }, { - name = "haskell-snippets.nvim", - url = "mrcjkb/haskell-snippets.nvim", - version = "1.4.4-1" - }, { - name = "haskell-tools.nvim", - url = "mrcjkb/haskell-tools.nvim", - version = "3.1.10-1" - }, { - name = "headlines.nvim", - url = "lukas-reineke/headlines.nvim", - version = "4.0.1-1" - }, { - name = "heirline.nvim", - url = "rebelot/heirline.nvim", - version = "1.0.6-1" - }, { - name = "hlchunk.nvim", - url = "shellRaining/hlchunk.nvim", - version = "1.1.0-1" - }, { - name = "hotpot.nvim", - url = "rktjmp/hotpot.nvim", - version = "0.12.1-1" - }, { - name = "hydra.nvim", - url = "nvimtools/hydra.nvim", - version = "1.0.2-1" - }, { - name = "image.nvim", - url = "3rd/image.nvim", - version = "1.3.0-1" - }, { - name = "incline.nvim", - url = "b0o/incline.nvim", - version = "0.0.1-1" - }, { - name = "indent-blankline.nvim", - url = "lukas-reineke/indent-blankline.nvim", - version = "3.6.3-1" - }, { - name = "kai.nvim", - url = "Kamilcuk/kai.nvim", - version = "0.0.6-1" - }, { - name = "lazy.nvim", - url = "folke/lazy.nvim", - version = "11.2.1-1" - }, { - name = "leetcode.nvim", - url = "kawre/leetcode.nvim", - version = "0.2.0-1" - }, { - name = "legendary.nvim", - url = "mrjones2014/legendary.nvim", - version = "2.13.11-1" - }, { - name = "live-command.nvim", - url = "smjonas/live-command.nvim", - version = "1.2.1-1" - }, { - name = "logging.nvim", - url = "NTBBloodbath/logging.nvim", - version = "1.1.0-1" - }, { - name = "love2d.nvim", - url = "S1M0N38/love2d.nvim", - version = "0.2-1" - }, { - name = "lsp-progress.nvim", - url = "linrongbin16/lsp-progress.nvim", - version = "1.0.12-1" - }, { - name = "lsp_signature.nvim", - url = "ray-x/lsp_signature.nvim", - version = "0.3.1-1" - }, { - name = "ltreesitter", - url = "euclidianAce/ltreesitter", - version = "0.0.7-1" - }, { - name = "lua-obfuscator.nvim", - url = "git+ssh://git@github.com/kdssoftware/lua-obfuscator.nvim.git", - version = "1.0.1-1" - }, { - name = "lua-tree-sitter", - url = "xcb-xwii/lua-tree-sitter", - version = "0.1.0-1" - }, { - name = "lua-utils.nvim", - url = "nvim-neorg/lua-utils.nvim", - version = "1.0.2-1" - }, { - name = "luarocks-build-treesitter-parser", - url = "nvim-neorocks/luarocks-build-treesitter-parser", - version = "4.1.0-1" - }, { - name = "mapx.nvim", - url = "b0o/mapx.nvim", - version = "0.2.1-1" - }, { - name = "mason-lspconfig.nvim", - url = "williamboman/mason-lspconfig.nvim", - version = "1.29.0-1" - }, { - name = "mason-nvim-dap.nvim", - url = "jay-babu/mason-nvim-dap.nvim", - version = "2.3.0-1" - }, { - name = "mason.nvim", - url = "williamboman/mason.nvim", - version = "1.10.0-1" - }, { - name = "mini.nvim", - url = "echasnovski/mini.nvim", - version = "0.9.0-1" - }, { - name = "mkdnflow.nvim", - url = "jakewvincent/mkdnflow.nvim", - version = "1.2.0-1" - }, { - name = "move.nvim", - url = "fedepujol/move.nvim", - version = "2.0.0-1" - }, { - name = "multicursors.nvim", - url = "smoka7/multicursors.nvim", - version = "1.0.0-1" - }, { - name = "my-awesome-plugin.nvim", - url = "S1M0N38/my-awesome-plugin.nvim", - version = "0.1.1-1" - }, { - name = "navigator.nvim", - url = "numToStr/Navigator.nvim", - version = "0.6-1" - }, { - name = "neo-tree.nvim", - url = "nvim-neo-tree/neo-tree.nvim", - version = "3.26-1" - }, { - name = "neoconf.nvim", - url = "folke/neoconf.nvim", - version = "1.2.2-1" - }, { - name = "neodev.nvim", - url = "folke/neodev.nvim", - version = "3.0.0-1" - }, { - name = "neogen", - url = "danymat/neogen", - version = "2.17.1-1" - }, { - name = "neogit", - url = "NeogitOrg/neogit", - version = "1.0.0-1" - }, { - name = "neorg", - url = "nvim-neorg/neorg", - version = "8.7.1-1" - }, { - name = "neorg-telescope", - url = "nvim-neorg/neorg-telescope", - version = "1.1.0-1" - }, { - name = "neoscroll.nvim", - url = "karb94/neoscroll.nvim", - version = "0.2.0-1" - }, { - name = "neotest", - url = "nvim-neotest/neotest", - version = "5.3.3-1" - }, { - name = "neotest-haskell", - url = "mrcjkb/neotest-haskell", - version = "2.0.0-1" - }, { - name = "nightfox.nvim", - url = "EdenEast/nightfox.nvim", - version = "3.9.3-1" - }, { - name = "no-neck-pain.nvim", - url = "shortcuts/no-neck-pain.nvim", - version = "1.14.0-1" - }, { - name = "noice.nvim", - url = "folke/noice.nvim", - version = "4.3.0-1" - }, { - name = "npackages.nvim", - url = "diegofigs/npackages.nvim", - version = "0.1.0-1" - }, { - name = "nui-components.nvim", - url = "grapp-dev/nui-components.nvim", - version = "1.5.2-1" - }, { - name = "nui.nvim", - url = "MunifTanjim/nui.nvim", - version = "0.3.0-1" - }, { - name = "nvim-client", - url = "neovim/lua-client", - version = "0.2.4-1" - }, { - name = "nvim-client-proxy", - url = "hjdivad/nvim-client-proxy", - version = "0.1.0-1" - }, { - name = "nvim-cmp", - url = "hrsh7th/nvim-cmp", - version = "0.0.1-2" - }, { - name = "nvim-cokeline", - url = "willothy/nvim-cokeline", - version = "0.4.0-1" - }, { - name = "nvim-dap", - url = "mfussenegger/nvim-dap", - version = "0.8.0-1" - }, { - name = "nvim-dap-ui", - url = "rcarriga/nvim-dap-ui", - version = "4.0.0-1" - }, { - name = "nvim-dbee", - url = "kndndrj/nvim-dbee", - version = "0.1.6-1" - }, { - name = "nvim-dev-container", - url = "esensar/nvim-dev-container", - version = "0.2.0-1" - }, { - name = "nvim-java", - url = "nvim-java/nvim-java", - version = "1.0.0-1" - }, { - name = "nvim-java-core", - url = "nvim-java/nvim-java-core", - version = "1.0.0-1" - }, { - name = "nvim-java-dap", - url = "nvim-java/nvim-java-dap", - version = "1.0.0-1" - }, { - name = "nvim-jdtls", - url = "mfussenegger/nvim-jdtls", - version = "0.2.0-1" - }, { - name = "nvim-jqx", - url = "gennaro-tedesco/nvim-jqx", - version = "0.1.4-1" - }, { - name = "nvim-lastplace", - url = "mrcjkb/nvim-lastplace", - version = "1.0.0-1" - }, { - name = "nvim-lightbulb", - url = "kosayoda/nvim-lightbulb", - version = "1.0.0-1" - }, { - name = "nvim-lspconfig", - url = "neovim/nvim-lspconfig", - version = "0.1.8-1" - }, { - name = "nvim-metals", - url = "scalameta/nvim-metals", - version = "0.9.x-1" - }, { - name = "nvim-nio", - url = "nvim-neotest/nvim-nio", - version = "1.9.4-1" - }, { - name = "nvim-notify", - url = "rcarriga/nvim-notify", - version = "3.13.5-1" - }, { - name = "nvim-parinfer", - url = "gpanders/nvim-parinfer", - version = "1.2.0-1" - }, { - name = "nvim-peekup", - url = "gennaro-tedesco/nvim-peekup", - version = "0.1.1-1" - }, { - name = "nvim-possession", - url = "gennaro-tedesco/nvim-possession", - version = "0.0.13-1" - }, { - name = "nvim-scrollview", - url = "dstein64/nvim-scrollview", - version = "5.1.0-1" - }, { - name = "nvim-smuggler", - url = "Klafyvel/nvim-smuggler", - version = "main-1" - }, { - name = "nvim-snippy", - url = "dcampos/nvim-snippy", - version = "1.0.0-1" - }, { - name = "nvim-surround", - url = "kylechui/nvim-surround", - version = "2.1.5-1" - }, { - name = "nvim-tree.lua", - url = "nvim-tree/nvim-tree.lua", - version = "1.4.0-1" - }, { - name = "nvim-treesitter-legacy-api", - url = "nvim-treesitter/nvim-treesitter", - version = "0.9.2-1" - }, { - name = "nvim-ufo", - url = "kevinhwang91/nvim-ufo", - version = "1.4.0-1" - }, { - name = "nvim-web-devicons", - url = "nvim-tree/nvim-web-devicons", - version = "0.100-1" - }, { - name = "obsidian.nvim", - url = "epwalsh/obsidian.nvim", - version = "3.8.0-1" - }, { - name = "oil.nvim", - url = "stevearc/oil.nvim", - version = "2.10.0-1" - }, { - name = "onedarkpro.nvim", - url = "olimorris/onedarkpro.nvim", - version = "0.8.0-1" - }, { - name = "onenord.nvim", - url = "rmehri01/onenord.nvim", - version = "0.7.0-1" - }, { - name = "otter.nvim", - url = "jmbuhr/otter.nvim", - version = "1.15.1-1" - }, { - name = "overseer.nvim", - url = "stevearc/overseer.nvim", - version = "1.4.0-1" - }, { - name = "oz.nvim", - url = "luxluth/oz.nvim", - version = "0.0.3-1" - }, { - name = "package-info.nvim", - url = "vuki656/package-info.nvim", - version = "2.0-1" - }, { - name = "paperplanes.nvim", - url = "rktjmp/paperplanes.nvim", - version = "0.1.6-1" - }, { - name = "papis.nvim", - url = "jghauser/papis.nvim", - version = "0.5.1-1" - }, { - name = "paq-nvim", - url = "savq/paq-nvim", - version = "2.0.0-1" - }, { - name = "pathlib.nvim", - url = "pysan3/pathlib.nvim", - version = "2.2.2-1" - }, { - name = "persistence.nvim", - url = "folke/persistence.nvim", - version = "2.0.0-1" - }, { - name = "plenary.nvim", - url = "nvim-lua/plenary.nvim", - version = "0.1.4-1" - }, { - name = "pretty-fold.nvim", - url = "anuvyklack/pretty-fold.nvim", - version = "3.0-1" - }, { - name = "rainbow-delimiters.nvim", - url = "HiPhish/rainbow-delimiters.nvim", - version = "0.4.0-1" - }, { - name = "renamer.nvim", - url = "filipdutescu/renamer.nvim", - version = "5.1.0-1" - }, { - name = "rest.nvim", - url = "rest-nvim/rest.nvim", - version = "2.0.1-1" - }, { - name = "rocks-config.nvim", - url = "nvim-neorocks/rocks-config.nvim", - version = "2.1.0-1" - }, { - name = "rocks-dev.nvim", - url = "nvim-neorocks/rocks-dev.nvim", - version = "1.2.3-1" - }, { - name = "rocks-git.nvim", - url = "nvim-neorocks/rocks-git.nvim", - version = "1.5.1-1" - }, { - name = "rocks.nvim", - url = "nvim-neorocks/rocks.nvim", - version = "2.32.0-1" - }, { - name = "rtp.nvim", - url = "nvim-neorocks/rtp.nvim", - version = "1.0.0-1" - }, { - name = "rustaceanvim", - url = "mrcjkb/rustaceanvim", - version = "4.25.1-1" - }, { - name = "schemastore.nvim", - url = "b0o/SchemaStore.nvim", - version = "0.2.0-1" - }, { - name = "screenkey.nvim", - url = "NStefan002/screenkey.nvim", - version = "2.1.0-1" - }, { - name = "scrollbar.nvim", - url = "Xuyuanp/scrollbar.nvim", - version = "0.4.0-1" - }, { - name = "session.nvim", - url = "Kibadda/session.nvim", - version = "2.0.0-1" - }, { - name = "sg.nvim", - url = "sourcegraph/sg.nvim", - version = "1.1.0-1" - }, { - name = "smart-splits.nvim", - url = "mrjones2014/smart-splits.nvim", - version = "1.5.0-1" - }, { - name = "squirrel.nvim", - url = "xiaoshihou514/squirrel.nvim", - version = "1.0.0-1" - }, { - name = "storm-mode.nvim", - url = "HoppenR/storm-mode.nvim", - version = "1.2.0-1" - }, { - name = "structlog.nvim", - url = "git+ssh://git@github.com/Tastyep/structlog.nvim.git", - version = "0.1-1" - }, { - name = "substitute.nvim", - url = "gbprod/substitute.nvim", - version = "2.0.0-1" - }, { - name = "sweetie.nvim", - url = "NTBBloodbath/sweetie.nvim", - version = "3.1.1-1" - }, { - name = "tabby.nvim", - url = "nanozuki/tabby.nvim", - version = "2.5.1-1" - }, { - name = "telescope-zf-native.nvim", - url = "natecraddock/telescope-zf-native.nvim", - version = "1.0.0-1" - }, { - name = "telescope.nvim", - url = "nvim-telescope/telescope.nvim", - version = "0.1.8-1" - }, { - name = "todo-comments.nvim", - url = "folke/todo-comments.nvim", - version = "1.2.0-1" - }, { - name = "toggleterm.nvim", - url = "akinsho/toggleterm.nvim", - version = "2.11.0-1" - }, { - name = "tokyonight.nvim", - url = "folke/tokyonight.nvim", - version = "3.0.1-1" - }, { - name = "tree-sitter-norg", - url = "nvim-neorg/tree-sitter-norg", - version = "0.2.4-1" - }, { - name = "tree-sitter-norg-meta", - url = "nvim-neorg/tree-sitter-norg-meta", - version = "0.1.0-1" - }, { - name = "tree-sitter-orgmode", - url = "nvim-orgmode/tree-sitter-org", - version = "1.3.2-1" - }, { - name = "trouble.nvim", - url = "folke/trouble.nvim", - version = "3.4.3-1" - }, { - name = "tsc.nvim", - url = "dmmulroy/tsc.nvim", - version = "2.3.0-1" - }, { - name = "twilight.nvim", - url = "folke/twilight.nvim", - version = "1.0.0-1" - }, { - name = "unimpaired.nvim", - url = "tummetott/unimpaired.nvim", - version = "0.2.0-1" - }, { - name = "vgit.nvim", - url = "tanvirtin/vgit.nvim", - version = "0.2.2-1" - }, { - name = "which-key.nvim", - url = "folke/which-key.nvim", - version = "2.1.0-1" - }, { - name = "windline.nvim", - url = "windwp/windline.nvim", - version = "1.1.0-1" - }, { - name = "yanky.nvim", - url = "gbprod/yanky.nvim", - version = "2.0.0-1" - }, { - name = "yazi.nvim", - url = "mikavilpas/yazi.nvim", - version = "master-1" - }, { - name = "zen-mode.nvim", - url = "folke/zen-mode.nvim", - version = "1.3.0-1" - }, { - name = "zk-nvim", - url = "zk-org/zk-nvim", - version = "0.1.0-1" - } } \ No newline at end of file +{} \ No newline at end of file diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index f1eff9c..603dd1a 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -34,6 +34,17 @@ M.defaults = { -- then set the below to false. This should work, but is NOT supported and will -- increase downloads a lot. filter = true, + -- rate of network related git operations (clone, fetch, checkout) + throttle = { + enabled = false, -- not enabled by default + -- max 2 ops every 5 seconds + rate = 2, + duration = 5 * 1000, -- in ms + }, + -- Time in seconds to wait before running fetch again for a plugin. + -- Repeated update/check operations will not run again until this + -- cooldown period has passed. + cooldown = 0, }, pkg = { enabled = true, @@ -56,7 +67,9 @@ M.defaults = { hererocks = nil, }, dev = { - ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects + -- Directory where you store your local plugin projects. If a function is used, + -- the plugin directory (e.g. `~/projects/plugin-name`) must be returned. + ---@type string | fun(plugin: LazyPlugin): string path = "~/projects", ---@type string[] plugins that match these patterns will use your local versions instead of being fetched from GitHub patterns = {}, -- For example {"folke"} @@ -83,6 +96,7 @@ M.defaults = { icons = { cmd = " ", config = "", + debug = "● ", event = " ", favorite = " ", ft = " ", @@ -205,7 +219,7 @@ M.defaults = { enabled = true, root = vim.fn.stdpath("state") .. "/lazy/readme", files = { "README.md", "lua/**/README.md" }, - -- only generate markdown helptags for plugins that dont have docs + -- only generate markdown helptags for plugins that don't have docs skip_if_doc_exists = true, }, state = vim.fn.stdpath("state") .. "/lazy/state.json", -- state info for checker and other things @@ -228,7 +242,7 @@ function M.hererocks() return M.options.rocks.hererocks end -M.version = "11.10.2" -- x-release-please-version +M.version = "11.17.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") @@ -253,9 +267,10 @@ M.mapleader = nil ---@type string M.maplocalleader = nil -local headless = #vim.api.nvim_list_uis() == 0 +M.suspended = false + function M.headless() - return headless + return not M.suspended and #vim.api.nvim_list_uis() == 0 end ---@param opts? LazyConfig @@ -283,6 +298,9 @@ function M.setup(opts) M.me = debug.getinfo(1, "S").source:sub(2) M.me = Util.norm(vim.fn.fnamemodify(M.me, ":p:h:h:h:h")) + local lib = vim.fn.fnamemodify(vim.v.progpath, ":p:h:h") .. "/lib" + lib = vim.uv.fs_stat(lib .. "64") and (lib .. "64") or lib + lib = lib .. "/nvim" if M.options.performance.rtp.reset then ---@type vim.Option vim.opt.rtp = { @@ -290,7 +308,7 @@ function M.setup(opts) vim.fn.stdpath("data") .. "/site", M.me, vim.env.VIMRUNTIME, - vim.fn.fnamemodify(vim.v.progpath, ":p:h:h") .. "/lib/nvim", + lib, vim.fn.stdpath("config") .. "/after", } end @@ -338,6 +356,12 @@ function M.setup(opts) end end, }) + + vim.api.nvim_create_autocmd({ "VimSuspend", "VimResume" }, { + callback = function(ev) + M.suspended = ev.event == "VimSuspend" + end, + }) end, }) end diff --git a/lua/lazy/core/handler/init.lua b/lua/lazy/core/handler/init.lua index b7ce3e5..22d3252 100644 --- a/lua/lazy/core/handler/init.lua +++ b/lua/lazy/core/handler/init.lua @@ -5,7 +5,7 @@ local Util = require("lazy.core.util") ---@field type LazyHandlerTypes ---@field extends? LazyHandler ---@field active table> ----@field managed table +---@field managed table mapping handler keys to plugin names ---@field super LazyHandler local M = {} @@ -114,7 +114,7 @@ function M:add(plugin) if not self.active[key] then self.active[key] = {} self:_add(value) - self.managed[key] = key + self.managed[key] = plugin.name end self.active[key][plugin.name] = plugin.name end diff --git a/lua/lazy/core/handler/keys.lua b/lua/lazy/core/handler/keys.lua index 57fbc18..5b5f173 100644 --- a/lua/lazy/core/handler/keys.lua +++ b/lua/lazy/core/handler/keys.lua @@ -11,7 +11,7 @@ local Util = require("lazy.core.util") ---@class LazyKeysSpec: LazyKeysBase ---@field [1] string lhs ----@field [2]? string|fun()|false rhs +---@field [2]? string|fun():string?|false rhs ---@field mode? string|string[] ---@class LazyKeys: LazyKeysBase diff --git a/lua/lazy/core/loader.lua b/lua/lazy/core/loader.lua index c5cdca2..1501efd 100644 --- a/lua/lazy/core/loader.lua +++ b/lua/lazy/core/loader.lua @@ -161,7 +161,7 @@ function M.get_start_plugins() ---@type LazyPlugin[] local start = {} for _, plugin in pairs(Config.plugins) do - if plugin.lazy == false and not plugin._.loaded then + if not plugin._.loaded and (plugin._.rtp_loaded or plugin.lazy == false) then start[#start + 1] = plugin end end @@ -341,7 +341,9 @@ function M._load(plugin, reason, opts) Util.track({ plugin = plugin.name, start = reason.start }) Handler.disable(plugin) - M.add_to_rtp(plugin) + if not plugin.virtual then + M.add_to_rtp(plugin) + end if plugin._.pkg and plugin._.pkg.source == "rockspec" then M.add_to_luapath(plugin) @@ -353,7 +355,9 @@ function M._load(plugin, reason, opts) end, "Failed to load deps for " .. plugin.name) end - M.packadd(plugin.dir) + if not plugin.virtual then + M.packadd(plugin.dir) + end if plugin.config or plugin.opts then M.config(plugin) end @@ -493,8 +497,11 @@ function M.add_to_luapath(plugin) local root = Config.options.rocks.root .. "/" .. plugin.name local path = root .. "/share/lua/5.1" local cpath = root .. "/lib/lua/5.1" + local cpath2 = root .. "/lib64/lua/5.1" + package.path = package.path .. ";" .. path .. "/?.lua;" .. path .. "/?/init.lua;" package.cpath = package.cpath .. ";" .. cpath .. "/?." .. (jit.os:find("Windows") and "dll" or "so") .. ";" + package.cpath = package.cpath .. ";" .. cpath2 .. "/?." .. (jit.os:find("Windows") and "dll" or "so") .. ";" end function M.source(path) @@ -552,6 +559,8 @@ function M.loader(modname) end if ret then + -- explicitly set to nil to prevent loading errors + package.loaded[modname] = nil M.auto_load(modname, ret.modpath) local mod = package.loaded[modname] if type(mod) == "table" then diff --git a/lua/lazy/core/meta.lua b/lua/lazy/core/meta.lua index 6e781a0..6fbdfc4 100644 --- a/lua/lazy/core/meta.lua +++ b/lua/lazy/core/meta.lua @@ -179,6 +179,7 @@ function M:_rebuild(name) local super = nil plugin.url = nil plugin._.dep = true + plugin._.top = true plugin.optional = true assert(#plugin._.frags > 0, "no fragments found for plugin " .. name) @@ -195,6 +196,7 @@ function M:_rebuild(name) plugin._.dep = plugin._.dep and fragment.dep plugin.optional = plugin.optional and (rawget(fragment.spec, "optional") == true) plugin.url = fragment.url or plugin.url + plugin._.top = plugin._.top and fragment.pid == nil -- dependencies for _, dep in ipairs(fragment.deps or {}) do @@ -213,6 +215,8 @@ function M:_rebuild(name) plugin.dir = super.dir if plugin.dir then plugin.dir = Util.norm(plugin.dir) + elseif super.virtual then + plugin.dir = Util.norm("/dev/null/" .. plugin.name) else if plugin.dev == nil and plugin.url then for _, pattern in ipairs(Config.options.dev.patterns) do @@ -300,13 +304,26 @@ end --- Removes plugins that are disabled. function M:fix_disabled() local changes = 0 - for _, plugin in pairs(self.plugins) do - if plugin.enabled == false or (type(plugin.enabled) == "function" and not plugin.enabled()) then - changes = changes + 1 - self:disable(plugin) + local function check(top) + for _, plugin in pairs(self.plugins) do + if (plugin._.top or false) == top then + if plugin.enabled == false or (type(plugin.enabled) == "function" and not plugin.enabled()) then + changes = changes + 1 + if plugin.optional then + self:del(plugin.name) + else + self:disable(plugin) + end + self:rebuild() + end + end end end - self:rebuild() + -- disable top-level plugins first, since they may have non-top-level frags + -- that disable other plugins + check(true) + -- then disable non-top-level plugins + check(false) return changes end diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index d121fdf..37d1a8f 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -146,33 +146,43 @@ function Spec:import(spec) local imported = 0 - ---@type (string|(fun():LazyPluginSpec))[] + ---@type {modname: string, load: fun():(LazyPluginSpec?, string?)}[] local modspecs = {} if type(import) == "string" then Util.lsmod(import, function(modname, modpath) - modspecs[#modspecs + 1] = modname - package.preload[modname] = function() - return loadfile(modpath)() - end + modspecs[#modspecs + 1] = { + modname = modname, + load = function() + local mod, err = loadfile(modpath) + if mod then + return mod() + else + return nil, err + end + end, + } + end) + table.sort(modspecs, function(a, b) + return a.modname < b.modname end) - table.sort(modspecs) else - modspecs = { spec.import } + modspecs = { { modname = import_name, load = spec.import } } end for _, modspec in ipairs(modspecs) do imported = imported + 1 - local modname = type(modspec) == "string" and modspec or import_name + local modname = modspec.modname Util.track({ import = modname }) self.importing = modname -- unload the module so we get a clean slate ---@diagnostic disable-next-line: no-unknown package.loaded[modname] = nil Util.try(function() - local mod = type(modspec) == "function" and modspec() or require(modspec) - if type(mod) ~= "table" then - self.importing = nil + local mod, err = modspec.load() + if err then + self:error("Failed to load `" .. modname .. "`:\n" .. err) + elseif type(mod) ~= "table" then return self:error( "Invalid spec module: `" .. modname @@ -180,21 +190,20 @@ function Spec:import(spec) .. type(mod) .. "` was returned instead" ) + else + self:normalize(mod) end - self:normalize(mod) - self.importing = nil - Util.track() end, { msg = "Failed to load `" .. modname .. "`", on_error = function(msg) self:error(msg) - self.importing = nil - Util.track() end, }) + self.importing = nil + Util.track() end if imported == 0 then - self:error("No specs found for module " .. spec.import) + self:error("No specs found for module " .. vim.inspect(spec.import)) end end @@ -228,12 +237,15 @@ function M.update_state() or plugin.cmd plugin.lazy = lazy and true or false end - if plugin.dir:find(Config.options.root, 1, true) == 1 then + if plugin.virtual then + plugin._.is_local = true + plugin._.installed = true -- local plugins are managed by the user + elseif plugin.dir:find(Config.options.root, 1, true) == 1 then plugin._.installed = installed[plugin.name] ~= nil installed[plugin.name] = nil else plugin._.is_local = true - plugin._.installed = true -- local plugins are managed by the user + plugin._.installed = vim.fn.isdirectory(plugin.dir) == 1 end end diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index 6d7c3b8..83e8a92 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -66,7 +66,7 @@ end ---@param name string ---@return string function M.normname(name) - local ret = name:lower():gsub("^n?vim%-", ""):gsub("%.n?vim$", ""):gsub("%.lua", ""):gsub("[^a-z]+", "") + local ret = name:lower():gsub("^n?vim%-", ""):gsub("%.n?vim$", ""):gsub("[%.%-]lua", ""):gsub("[^a-z]+", "") return ret end @@ -270,7 +270,7 @@ function M.get_unloaded_rtp(modname, opts) local Config = require("lazy.core.config") if Config.spec then for _, plugin in pairs(Config.spec.plugins) do - if not (plugin._.loaded or plugin.module == false) then + if not (plugin._.loaded or plugin.module == false or plugin.virtual) then if norm == M.normname(plugin.name) then table.insert(rtp, 1, plugin.dir) else @@ -374,6 +374,7 @@ function M.notify(msg, opts) local lang = opts.lang or "markdown" local n = opts.once and vim.notify_once or vim.notify n(msg, opts.level or vim.log.levels.INFO, { + ft = lang, on_open = function(win) local ok = pcall(function() vim.treesitter.language.add("markdown") diff --git a/lua/lazy/docs.lua b/lua/lazy/docs.lua index 36880a1..a5e0b9e 100644 --- a/lua/lazy/docs.lua +++ b/lua/lazy/docs.lua @@ -61,7 +61,11 @@ end ---@return string function M.extract(file, pattern) local init = Util.read_file(file) - return assert(init:match(pattern)) + local ret = assert(init:match(pattern)) --[[@as string]] + local lines = vim.tbl_filter(function(line) + return not line:find("^%s*%-%-%s*stylua%s*:%s*ignore%s*$") + end, vim.split(ret, "\n")) + return table.concat(lines, "\n") end ---@return ReadmeBlock @@ -131,7 +135,8 @@ function M.colors(opts) { "---", "---", "---" }, } Util.foreach(require(opts.modname).colors, function(group, link) - lines[#lines + 1] = { "**" .. opts.name .. group .. "**", "***" .. link .. "***", comments[group] or "" } + link = type(link) == "table" and "`" .. vim.inspect(link):gsub("%s+", " ") .. "`" or "***" .. link .. "***" + lines[#lines + 1] = { "**" .. opts.name .. group .. "**", link, comments[group] or "" } end) return { content = M.table(lines) } end diff --git a/lua/lazy/health.lua b/lua/lazy/health.lua index 9e2a869..6a6d60d 100644 --- a/lua/lazy/health.lua +++ b/lua/lazy/health.lua @@ -1,4 +1,5 @@ local Config = require("lazy.core.config") +local Process = require("lazy.manage.process") local uv = vim.uv or vim.loop local M = {} @@ -36,11 +37,11 @@ function M.have(cmd, opts) local found for _, c in ipairs(cmd) do if vim.fn.executable(c) == 1 then - local version = vim.fn.system(c .. " " .. opts.version) or "" - if vim.v.shell_error ~= 0 then - opts.error(("failed to get version of {%s}\n%s"):format(c, version)) + local out, exit_code = Process.exec({ c, opts.version }) + if exit_code ~= 0 then + opts.error(("failed to get version of {%s}\n%s"):format(c, table.concat(out, "\n"))) else - version = vim.trim(vim.split(version, "\n")[1]) + local version = vim.trim(out[1] or "") version = version:gsub("^%s*" .. vim.pesc(c) .. "%s*", "") if opts.version_pattern and not version:find(opts.version_pattern, 1, true) then opts.warn(("`%s` version `%s` needed, but found `%s`"):format(c, opts.version_pattern, version)) diff --git a/lua/lazy/manage/checker.lua b/lua/lazy/manage/checker.lua index 8e03d9e..6efc5a7 100644 --- a/lua/lazy/manage/checker.lua +++ b/lua/lazy/manage/checker.lua @@ -35,7 +35,9 @@ end function M.fast_check(opts) opts = opts or {} for _, plugin in pairs(Config.plugins) do - if not plugin.pin and not plugin.dev and plugin._.installed then + -- don't check local plugins here, since we mark them as needing updates + -- only if local is behind upstream (if the git log task gives no output) + if plugin._.installed and not (plugin.pin or plugin._.is_local) then plugin._.updates = nil local info = Git.info(plugin.dir) local ok, target = pcall(Git.get_target, plugin) diff --git a/lua/lazy/manage/git.lua b/lua/lazy/manage/git.lua index 201e4e7..ef68cc7 100644 --- a/lua/lazy/manage/git.lua +++ b/lua/lazy/manage/git.lua @@ -116,6 +116,12 @@ end ---@param plugin LazyPlugin ---@return GitInfo? function M.get_target(plugin) + if plugin._.is_local then + local info = M.info(plugin.dir) + local branch = assert(info and info.branch or M.get_branch(plugin)) + return { branch = branch, commit = M.get_commit(plugin.dir, branch, true) } + end + local branch = assert(M.get_branch(plugin)) if plugin.commit then @@ -144,15 +150,6 @@ function M.get_target(plugin) } end end - ---@diagnostic disable-next-line: return-type-mismatch - return { branch = branch, commit = M.get_commit(plugin.dir, branch, true) } -end - ----@param plugin LazyPlugin ----@return GitInfo? -function M.get_local_target(plugin) - local info = M.info(plugin.dir) - local branch = assert(info and info.branch or M.get_branch(plugin)) return { branch = branch, commit = M.get_commit(plugin.dir, branch, true) } end diff --git a/lua/lazy/manage/init.lua b/lua/lazy/manage/init.lua index ac9ba14..e28d9dd 100644 --- a/lua/lazy/manage/init.lua +++ b/lua/lazy/manage/init.lua @@ -80,6 +80,7 @@ function M.install(opts) opts = M.opts(opts, { mode = "install" }) return M.run({ pipeline = { + "plugin.exists", "git.clone", { "git.checkout", lockfile = opts.lockfile }, "plugin.docs", @@ -108,6 +109,7 @@ function M.update(opts) opts = M.opts(opts, { mode = "update" }) return M.run({ pipeline = { + "plugin.exists", "git.origin", "git.branch", "git.fetch", @@ -147,6 +149,7 @@ function M.check(opts) opts = opts or {} return M.run({ pipeline = { + "plugin.exists", { "git.origin", check = true }, "git.fetch", "git.status", diff --git a/lua/lazy/manage/lock.lua b/lua/lazy/manage/lock.lua index a1b4c74..b3c4444 100644 --- a/lua/lazy/manage/lock.lua +++ b/lua/lazy/manage/lock.lua @@ -42,7 +42,7 @@ function M.update() f:write(",\n") end end - f:write("\n}") + f:write("\n}\n") f:close() end diff --git a/lua/lazy/manage/task/fs.lua b/lua/lazy/manage/task/fs.lua index 3401c29..41a18a8 100644 --- a/lua/lazy/manage/task/fs.lua +++ b/lua/lazy/manage/task/fs.lua @@ -21,16 +21,23 @@ M.clean = { skip = function(plugin) return plugin._.is_local end, - run = function(self) + ---@param opts? {rocks_only?:boolean} + run = function(self, opts) + opts = opts or {} local dir = self.plugin.dir:gsub("/+$", "") assert(dir:find(Config.options.root, 1, true) == 1, self.plugin.dir .. " should be under packpath!") - rm(dir) local rock_root = Config.options.rocks.root .. "/" .. self.plugin.name if vim.uv.fs_stat(rock_root) then rm(rock_root) end + if opts.rocks_only then + return + end + + rm(dir) + self.plugin._.installed = false end, } diff --git a/lua/lazy/manage/task/git.lua b/lua/lazy/manage/task/git.lua index 8e0ef48..ef848f9 100644 --- a/lua/lazy/manage/task/git.lua +++ b/lua/lazy/manage/task/git.lua @@ -1,8 +1,54 @@ +local Async = require("lazy.async") local Config = require("lazy.core.config") local Git = require("lazy.manage.git") local Lock = require("lazy.manage.lock") local Util = require("lazy.util") +local throttle = {} +throttle.running = 0 +throttle.waiting = {} ---@type Async[] +throttle.timer = vim.uv.new_timer() + +function throttle.next() + throttle.running = 0 + while #throttle.waiting > 0 and throttle.running < Config.options.git.throttle.rate do + ---@type Async + local task = table.remove(throttle.waiting, 1) + task:resume() + throttle.running = throttle.running + 1 + end + if throttle.running == 0 then + throttle.timer:stop() + end +end + +function throttle.wait() + if not Config.options.git.throttle.enabled then + return + end + if not throttle.timer:is_active() then + throttle.timer:start(0, Config.options.git.throttle.duration, vim.schedule_wrap(throttle.next)) + end + local running = Async.running() + if throttle.running < Config.options.git.throttle.rate then + throttle.running = throttle.running + 1 + else + table.insert(throttle.waiting, running) + coroutine.yield("waiting") + running:suspend() + coroutine.yield("") + end +end + +---@param plugin LazyPlugin +local function cooldown(plugin) + if not plugin._.last_check then + return false + end + local delta = (vim.uv.now() - plugin._.last_check) / 1000 + return delta < Config.options.git.cooldown +end + ---@type table local M = {} @@ -32,11 +78,13 @@ M.log = { "--no-show-signature", } + local info, target + if opts.updated then table.insert(args, self.plugin._.updated.from .. ".." .. (self.plugin._.updated.to or "HEAD")) elseif opts.check then - local info = assert(Git.info(self.plugin.dir)) - local target = assert(self.plugin._.is_local and Git.get_local_target(self.plugin) or Git.get_target(self.plugin)) + info = assert(Git.info(self.plugin.dir)) + target = assert(Git.get_target(self.plugin)) if not target.commit then for k, v in pairs(target) do error(k .. " '" .. v .. "' not found") @@ -44,15 +92,17 @@ M.log = { error("no target commit found") end assert(target.commit, self.plugin.name .. " " .. target.branch) - if Git.eq(info, target) then - if Config.options.checker.check_pinned then - local last_commit = Git.get_commit(self.plugin.dir, target.branch, true) - if not Git.eq(info, { commit = last_commit }) then - self.plugin._.outdated = true + if not self.plugin._.is_local then + if Git.eq(info, target) then + if Config.options.checker.check_pinned then + local last_commit = Git.get_commit(self.plugin.dir, target.branch, true) + if not Git.eq(info, { commit = last_commit }) then + self.plugin._.outdated = true + end end + else + self.plugin._.updates = { from = info, to = target } end - else - self.plugin._.updates = { from = info, to = target } end table.insert(args, info.commit .. ".." .. target.commit) else @@ -63,6 +113,14 @@ M.log = { args = args, cwd = self.plugin.dir, }) + + -- for local plugins, mark as needing updates only if local is + -- behind upstream, i.e. if git log gave no output + if opts.check and self.plugin._.is_local then + if not vim.tbl_isempty(self:get_log()) then + self.plugin._.updates = { from = info, to = target } + end + end end, } @@ -72,6 +130,7 @@ M.clone = { end, ---@async run = function(self) + throttle.wait() local args = { "clone", self.plugin.url, @@ -216,11 +275,12 @@ M.status = { -- fetches all needed origin branches M.fetch = { skip = function(plugin) - return not plugin._.installed or plugin._.is_local + return not plugin._.installed or plugin._.is_local or cooldown(plugin) end, ---@async run = function(self) + throttle.wait() local args = { "fetch", "--recurse-submodules", @@ -236,6 +296,11 @@ M.fetch = { self:spawn("git", { args = args, cwd = self.plugin.dir, + on_exit = function(ok) + if ok then + self.plugin._.last_check = vim.uv.now() + end + end, }) end, } @@ -250,6 +315,7 @@ M.checkout = { ---@async ---@param opts {lockfile?:boolean} run = function(self, opts) + throttle.wait() local info = assert(Git.info(self.plugin.dir)) local target = assert(Git.get_target(self.plugin)) @@ -269,7 +335,7 @@ M.checkout = { end end - -- dont run checkout if target is already reached. + -- don't run checkout if target is already reached. -- unless we just cloned, since then we won't have any data yet if Git.eq(info, target) and info.branch == target.branch then self.plugin._.updated = { diff --git a/lua/lazy/manage/task/plugin.lua b/lua/lazy/manage/task/plugin.lua index fd6c12b..cec9762 100644 --- a/lua/lazy/manage/task/plugin.lua +++ b/lua/lazy/manage/task/plugin.lua @@ -19,6 +19,9 @@ local B = {} ---@param task LazyTask ---@param build string function B.cmd(task, build) + if task.plugin.build ~= "rockspec" then + Loader.load(task.plugin, { task = "build" }) + end local cmd = vim.api.nvim_parse_cmd(build:sub(2), {}) --[[@as vim.api.keyset.cmd]] task:log(vim.api.nvim_cmd(cmd, { output = true })) end @@ -48,10 +51,6 @@ M.build = { run = function(self) vim.cmd([[silent! runtime plugin/rplugin.vim]]) - if self.plugin.build ~= "rockspec" then - Loader.load(self.plugin, { task = "build" }) - end - local builders = self.plugin.build -- Skip if `build` is set to `false` @@ -88,14 +87,25 @@ M.build = { M.docs = { skip = function(plugin) - return not plugin._.dirty + return not plugin._.is_local and not plugin._.dirty end, run = function(self) - local docs = self.plugin.dir .. "/doc/" + local docs = self.plugin.dir .. "/doc" if Util.file_exists(docs) then self:log(vim.api.nvim_cmd({ cmd = "helptags", args = { docs } }, { output = true })) end end, } +M.exists = { + skip = function(plugin) + return not plugin._.is_local or plugin.virtual + end, + run = function(self) + if not Util.file_exists(self.plugin.dir) then + self:error("Local plugin does not exist at `" .. self.plugin.dir .. "`") + end + end, +} + return M diff --git a/lua/lazy/minit.lua b/lua/lazy/minit.lua index 838ac36..21d2163 100644 --- a/lua/lazy/minit.lua +++ b/lua/lazy/minit.lua @@ -25,13 +25,22 @@ function M.setup(opts) opts = M.extend({ local_spec = false, change_detection = { enabled = false }, + dev = { + patterns = vim.env.LAZY_DEV and vim.split(vim.env.LAZY_DEV, ",") or nil, + }, }, opts) local args = {} local is_busted = false + local is_minitest = false + local offline = vim.env.LAZY_OFFLINE == "1" or vim.env.LAZY_OFFLINE == "true" for _, a in ipairs(_G.arg) do if a == "--busted" then is_busted = true + elseif a == "--minitest" then + is_minitest = true + elseif a == "--offline" then + offline = true else table.insert(args, a) end @@ -40,6 +49,8 @@ function M.setup(opts) if is_busted then opts = M.busted.setup(opts) + elseif is_minitest then + opts = M.minitest.setup(opts) end -- set stdpaths to use .tests @@ -49,13 +60,14 @@ function M.setup(opts) vim.env[("XDG_%s_HOME"):format(name:upper())] = root .. "/" .. name end end - vim.o.loadplugins = true require("lazy").setup(opts) if vim.g.colors_name == nil then vim.cmd("colorscheme habamax") end - require("lazy").update():wait() + if not offline then + require("lazy").update():wait() + end if vim.bo.filetype == "lazy" then local errors = false for _, plugin in pairs(require("lazy.core.config").spec.plugins) do @@ -68,6 +80,8 @@ function M.setup(opts) if is_busted then M.busted.run() + elseif is_minitest then + M.minitest.run() end end @@ -89,6 +103,70 @@ function M.repro(opts) M.setup(opts) end +M.minitest = {} + +function M.minitest.run() + local Config = require("lazy.core.config") + -- disable termnial output for the tests + Config.options.headless = {} + + if not require("lazy.core.config").headless() then + return vim.notify("busted can only run in headless mode. Please run with `nvim -l`", vim.log.levels.WARN) + end + package.path = package.path .. ";" .. vim.uv.cwd() .. "/tests/?.lua" + local Test = require("mini.test") + local expect = Test.expect + local _assert = assert + local Assert = { + __call = function(_, ...) + return _assert(...) + end, + same = expect.equality, + equal = expect.equality, + are = { + equal = expect.equality, + }, + is_not = { + same = expect.no_equality, + }, + is_not_nil = function(a) + return expect.no_equality(nil, a) + end, + is_true = function(a) + return expect.equality(true, a) + end, + is_false = function(a) + return expect.equality(false, a) + end, + } + Assert.__index = Assert + assert = setmetatable({}, Assert) + assert = require("luassert") + require("mini.test").run() +end + +---@param opts LazyConfig +function M.minitest.setup(opts) + return M.extend({ + spec = { + "lunarmodules/luassert", + { + "echasnovski/mini.test", + opts = { + collect = { + find_files = function() + return #_G.arg > 0 and _G.arg or vim.fn.globpath("tests", "**/*_spec.lua", true, true) + end, + }, + -- script_path = "tests/minit.lua", + }, + }, + { dir = vim.uv.cwd() }, + }, + rocks = { hererocks = true }, + }, opts) +end + M.busted = {} function M.busted.run() @@ -99,6 +177,7 @@ function M.busted.run() if not require("lazy.core.config").headless() then return vim.notify("busted can only run in headless mode. Please run with `nvim -l`", vim.log.levels.WARN) end + package.path = package.path .. ";" .. vim.uv.cwd() .. "/tests/?.lua" -- run busted return pcall(require("busted.runner"), { standalone = false, diff --git a/lua/lazy/pkg/init.lua b/lua/lazy/pkg/init.lua index 7b52da1..90cfbfc 100644 --- a/lua/lazy/pkg/init.lua +++ b/lua/lazy/pkg/init.lua @@ -63,6 +63,9 @@ function M.update() pkg.spec = { _raw = spec.code } end table.insert(ret.pkgs, pkg) + if not plugin._.pkg and plugin._.loaded and pkg.source == "rockspec" then + require("lazy.core.loader").add_to_luapath(plugin) + end break end end diff --git a/lua/lazy/pkg/rockspec.lua b/lua/lazy/pkg/rockspec.lua index e1d2c6e..e8ece1b 100644 --- a/lua/lazy/pkg/rockspec.lua +++ b/lua/lazy/pkg/rockspec.lua @@ -78,25 +78,23 @@ function M.check(opts) else ok = Health.have(M.python, opts) ok = Health.have(M.hererocks.bin("luarocks")) and ok - ok = Health.have( + Health.have( M.hererocks.bin("lua"), vim.tbl_extend("force", opts, { version = "-v", version_pattern = "5.1", }) - ) and ok + ) end else ok = Health.have("luarocks", opts) - ok = ( - Health.have( - { "lua5.1", "lua", "lua-5.1" }, - vim.tbl_extend("force", opts, { - version = "-v", - version_pattern = "5.1", - }) - ) - ) and ok + Health.have( + { "lua5.1", "lua", "lua-5.1" }, + vim.tbl_extend("force", opts, { + version = "-v", + version_pattern = "5.1", + }) + ) end return ok end @@ -104,17 +102,17 @@ end ---@async ---@param task LazyTask function M.build(task) - if - not M.check({ - error = function(msg) - task:error(msg:gsub("[{}]", "`")) - end, - warn = function(msg) - task:warn(msg) - end, - ok = function(msg) end, - }) - then + M.check({ + error = function(msg) + task:error(msg:gsub("[{}]", "`")) + end, + warn = function(msg) + task:warn(msg) + end, + ok = function(msg) end, + }) + + if task:has_warnings() then task:log({ "", "This plugin requires `luarocks`. Try one of the following:", @@ -123,7 +121,11 @@ function M.build(task) or " - enable `hererocks` with `opts.rocks.hererocks = true`", " - disable `luarocks` support completely with `opts.rocks.enabled = false`", }) - return + task:warn("\nWill try building anyway, but will likely fail...") + + task:warn("\n" .. string.rep("-", 80) .. "\n") + + task:set_level(vim.log.levels.WARN) end if task.plugin.name == "hererocks" then @@ -170,7 +172,6 @@ function M.build(task) root, "--server", Config.options.rocks.server, - "--dev", "--lua-version", "5.1", "install", -- use install so that we can make use of pre-built rocks @@ -187,11 +188,13 @@ function M.build(task) return end - task:warn("Failed installing " .. rockspec.package .. " with `luarocks`.\nTrying to build from source.") + task:warn("Failed installing " .. rockspec.package .. " with `luarocks`.") + task:warn("\n" .. string.rep("-", 80) .. "\n") + task:warn("Trying to build from source.") -- install failed, so try building from source task:set_level() -- reset level - task:spawn(luarocks, { + ok = task:spawn(luarocks, { args = { "--tree", root, @@ -206,6 +209,9 @@ function M.build(task) cwd = task.plugin.dir, env = env, }) + if not ok then + require("lazy.manage.task.fs").clean.run(task, { rocks_only = true }) + end end ---@param rockspec RockSpec @@ -218,9 +224,10 @@ end ---@return table? function M.parse(file) local ret = {} - return pcall(function() - loadfile(file, "t", ret)() + local ok = pcall(function() + loadfile(file, nil, ret)() end) and ret or nil + return ok and ret or nil end ---@param plugin LazyPlugin diff --git a/lua/lazy/stats.lua b/lua/lazy/stats.lua index 015a2be..d721971 100644 --- a/lua/lazy/stats.lua +++ b/lua/lazy/stats.lua @@ -35,11 +35,10 @@ function M.cputime() if M.C == nil then pcall(function() ffi.cdef([[ - typedef long time_t; typedef int clockid_t; typedef struct timespec { - time_t tv_sec; /* seconds */ - long tv_nsec; /* nanoseconds */ + int64_t tv_sec; /* Use fixed 64-bit type for portability */ + long tv_nsec; /* nanoseconds */ } nanotime; int clock_gettime(clockid_t clk_id, struct timespec *tp); ]]) @@ -48,7 +47,8 @@ function M.cputime() end local function real() - local pnano = assert(ffi.new("nanotime[?]", 1)) + -- Zero-initialize to handle 32-bit systems where only lower 32 bits are written + local pnano = ffi.new("nanotime[1]") local CLOCK_PROCESS_CPUTIME_ID = jit.os == "OSX" and 12 or 2 ffi.C.clock_gettime(CLOCK_PROCESS_CPUTIME_ID, pnano) return tonumber(pnano[0].tv_sec) * 1e3 + tonumber(pnano[0].tv_nsec) / 1e6 diff --git a/lua/lazy/types.lua b/lua/lazy/types.lua index 0a10467..7700229 100644 --- a/lua/lazy/types.lua +++ b/lua/lazy/types.lua @@ -10,6 +10,7 @@ ---@field dirty? boolean ---@field build? boolean ---@field frags? number[] +---@field top? boolean ---@field handlers? LazyPluginHandlers ---@field installed? boolean ---@field is_local? boolean @@ -20,6 +21,7 @@ ---@field tasks? LazyTask[] ---@field updated? {from:string, to:string} ---@field updates? {from:GitInfo, to:GitInfo} +---@field last_check? number ---@field working? boolean ---@field pkg? LazyPkg @@ -59,6 +61,7 @@ ---@field priority? number Only useful for lazy=false plugins to force loading certain plugins first. Default priority is 50 ---@field dev? boolean If set, then link to the respective folder under your ~/projects ---@field rocks? string[] +---@field virtual? boolean virtual plugins won't be installed or added to the rtp. ---@class LazyPlugin: LazyPluginBase,LazyPluginHandlers,LazyPluginHooks,LazyPluginRef ---@field dependencies? string[] @@ -73,6 +76,8 @@ ---@field module? false ---@class LazyPluginSpec: LazyPluginBase,LazyPluginSpecHandlers,LazyPluginHooks,LazyPluginRef +---@field name? string display name and name used for plugin config files +---@field dir? string ---@field dependencies? string|string[]|LazyPluginSpec[] ---@field specs? string|string[]|LazyPluginSpec[] diff --git a/lua/lazy/view/commands.lua b/lua/lazy/view/commands.lua index 9791924..fd4af3d 100644 --- a/lua/lazy/view/commands.lua +++ b/lua/lazy/view/commands.lua @@ -146,7 +146,7 @@ end ---@return string, string[] function M.parse(args) local parts = vim.split(vim.trim(args), "%s+") - if parts[1]:find("Lazy") then + if vim.startswith("Lazy", parts[1]) then table.remove(parts, 1) end if args:sub(-1) == " " then diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua index 3a59069..4131d72 100644 --- a/lua/lazy/view/float.lua +++ b/lua/lazy/view/float.lua @@ -166,7 +166,7 @@ function M:mount() self:augroup(true) end, { win = true }) self:focus() - self:on_key(ViewConfig.keys.close, self.close) + self:on_key(ViewConfig.keys.close, self.close, "Close") self:on({ "BufDelete", "BufHidden" }, self.close) if vim.bo[self.buf].buftype == "" then diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index 313d3ad..e8444eb 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -85,7 +85,7 @@ function M.create() require("lazy.manage.process").abort() require("lazy.async").abort() return ViewConfig.keys.abort - end, { silent = true, buffer = self.buf, expr = true }) + end, { silent = true, buffer = self.buf, expr = true, desc = "Abort" }) vim.keymap.set("n", "gx", "K", { buffer = self.buf, remap = true }) @@ -110,7 +110,7 @@ function M.create() self.state.plugin = open and selected or nil self:update() end - end) + end, "Details") self:on_key(ViewConfig.keys.next, function() local cursor = vim.api.nvim_win_get_cursor(self.view.win) @@ -121,7 +121,7 @@ function M.create() return end end - end) + end, "Next Plugin") self:on_key(ViewConfig.keys.prev, function() local cursor = vim.api.nvim_win_get_cursor(self.view.win) @@ -132,14 +132,14 @@ function M.create() return end end - end) + end, "Prev Plugin") self:on_key(ViewConfig.keys.profile_sort, function() if self.state.mode == "profile" then self.state.profile.sort_time_taken = not self.state.profile.sort_time_taken self:update() end - end) + end, "Sort Profile") self:on_key(ViewConfig.keys.profile_filter, function() if self.state.mode == "profile" then @@ -159,17 +159,18 @@ function M.create() end end) end - end) + end, "Filter Profile") for lhs, rhs in pairs(Config.options.ui.custom_keys) do if rhs then local handler = type(rhs) == "table" and rhs[1] or rhs + local desc = type(rhs) == "table" and rhs.desc or nil self:on_key(lhs, function() local plugin = self.render:get_plugin() if plugin then handler(plugin) end - end) + end, desc) end end @@ -219,17 +220,17 @@ function M:setup_patterns() ["(https?://%S+)"] = function(url) Util.open(url) end, - }, self.hover) + }, self.hover, "Hover") self:on_pattern(ViewConfig.keys.diff, { [commit_pattern] = function(hash) self:diff({ commit = hash }) end, - }, self.diff) + }, self.diff, "Diff") self:on_pattern(ViewConfig.commands.restore.key_plugin, { [commit_pattern] = function(hash) self:restore({ commit = hash }) end, - }, self.restore) + }, self.restore, "Restore") end ---@param opts? {commit:string} @@ -294,7 +295,8 @@ end ---@param key string ---@param patterns table ---@param fallback? fun(self) -function M:on_pattern(key, patterns, fallback) +---@param desc? string +function M:on_pattern(key, patterns, fallback, desc) self:on_key(key, function() local line = vim.api.nvim_get_current_line() local pos = vim.api.nvim_win_get_cursor(0) @@ -316,7 +318,7 @@ function M:on_pattern(key, patterns, fallback) if fallback then fallback(self) end - end) + end, desc) end function M:setup_modes() diff --git a/lua/lazy/view/render.lua b/lua/lazy/view/render.lua index e1eec6c..b545af0 100644 --- a/lua/lazy/view/render.lua +++ b/lua/lazy/view/render.lua @@ -94,7 +94,7 @@ function M:update() diag.lnum = diag.row - 1 return diag end, self._diagnostics), - { signs = false, virtual_text = true, underline = false } + { signs = false, virtual_text = true, underline = false, virtual_lines = false } ) end @@ -144,8 +144,6 @@ function M:title() if mode.name == "home" then if self.view.state.mode == "home" then title = " lazy.nvim " .. Config.options.ui.icons.lazy - else - title = " lazy.nvim (H) " end end @@ -761,7 +759,7 @@ function M:debug() ---@type string[] plugins = vim.tbl_values(plugins) table.sort(plugins) - self:append("● ", "LazySpecial", { indent = 2 }) + self:append(Config.options.ui.icons.debug, "LazySpecial", { indent = 2 }) if handler_type == "keys" then for k, v in pairs(Config.plugins[plugins[1]]._.handlers.keys) do if k == value then diff --git a/scripts/test b/scripts/test index 4baf621..354a1a1 100755 --- a/scripts/test +++ b/scripts/test @@ -1,3 +1,3 @@ -#!/bin/env bash +#!/usr/bin/env bash -nvim -l tests/minit.lua --busted tests -o utfTerminal "$@" +nvim -l tests/minit.lua --minitest "$@" diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index 166dc2a..7982649 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -25,6 +25,7 @@ local function clean(plugins) if plugin._.dep == false then plugin._.dep = nil end + plugin._.top = nil return plugin end, plugins) end diff --git a/vim.toml b/vim.toml deleted file mode 100644 index df7e67e..0000000 --- a/vim.toml +++ /dev/null @@ -1,21 +0,0 @@ -[selene] -base = "lua51" -name = "vim" - -[vim] -any = true - -[jit] -any = true - -[assert] -any = true - -[describe] -any = true - -[it] -any = true - -[before_each.args] -any = true diff --git a/vim.yml b/vim.yml new file mode 100644 index 0000000..eb58a87 --- /dev/null +++ b/vim.yml @@ -0,0 +1,19 @@ +base: lua51 +lua_versions: + - luajit + +globals: + Snacks: + any: true + vim: + any: true + jit: + any: true + assert: + any: true + describe: + any: true + it: + any: true + before_each: + any: true