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 a30099e..dd77c5c 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "11.8.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/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..8dba2f4 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: Ask a question + url: https://github.com/folke/lazy.nvim/discussions + about: Use Github discussions instead diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..3f7c92e --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,16 @@ +## Description + + + +## Related Issue(s) + + + +## Screenshots + + + diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 0d08e26..5ace460 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,11 +1,6 @@ -# To get started with Dependabot version updates, you'll need to specify which -# package ecosystems to update and where the package manifests are located. -# Please see the documentation for all configuration options: -# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file - version: 2 updates: - - package-ecosystem: "github-actions" # See documentation for possible values - directory: "/" # Location of package manifests + - package-ecosystem: "github-actions" + directory: "/" schedule: interval: "weekly" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 029531d..95c1e6f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,94 +1,15 @@ name: CI + on: push: + branches: [main, master] pull_request: jobs: - tests: - strategy: - matrix: - # os: [ubuntu-latest, windows-latest] - os: [ubuntu-latest] - runs-on: ${{ matrix.os }} - steps: - - uses: actions/checkout@v4 - - name: Install Neovim - shell: bash - run: | - mkdir -p /tmp/nvim - wget -q https://github.com/neovim/neovim/releases/download/nightly/nvim.appimage -O /tmp/nvim/nvim.appimage - cd /tmp/nvim - chmod a+x ./nvim.appimage - ./nvim.appimage --appimage-extract - echo "/tmp/nvim/squashfs-root/usr/bin/" >> $GITHUB_PATH - - name: Run Tests - run: | - nvim --version - [ ! -d tests ] && exit 0 - ./tests/run - docs: - runs-on: ubuntu-latest - needs: tests - env: - GH_TOKEN: ${{ github.token }} - steps: - - uses: actions/checkout@v4 - with: - ref: docs - - name: Generate Docs - shell: bash - run: gh workflow run "Deploy to Github Pages" --ref docs - community: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Install Neovim - shell: bash - run: | - mkdir -p /tmp/nvim - wget -q https://github.com/neovim/neovim/releases/download/nightly/nvim.appimage -O /tmp/nvim/nvim.appimage - cd /tmp/nvim - chmod a+x ./nvim.appimage - ./nvim.appimage --appimage-extract - echo "/tmp/nvim/squashfs-root/usr/bin/" >> $GITHUB_PATH - - name: Rockspec Build - id: rockspec-build - uses: actions/cache@v4 - with: - path: build - key: rockspec-build - - name: Generate Rockspec - if: steps.rockspec-build.cache-hit != 'true' - run: | - nvim -l lua/lazy/build.lua - - name: Push changes - uses: stefanzweifel/git-auto-commit-action@v5 - with: - commit_message: "chore(build): auto-generate rockspec mappings" - commit_user_name: "github-actions[bot]" - commit_user_email: "github-actions[bot]@users.noreply.github.com" - commit_author: "github-actions[bot] " - release: - name: release - if: ${{ github.ref == 'refs/heads/main' }} - needs: - - tests - - docs - runs-on: ubuntu-latest - steps: - - uses: googleapis/release-please-action@v4 - id: release - with: - config-file: .github/release-please-config.json - manifest-file: .github/.release-please-manifest.json - - uses: actions/checkout@v4 - - name: tag stable versions - if: ${{ steps.release.outputs.release_created }} - run: | - git config user.name github-actions[bot] - git config user.email github-actions[bot]@users.noreply.github.com - git remote add gh-token "https://${{ secrets.GITHUB_TOKEN }}@github.com/google-github-actions/release-please-action.git" - git tag -d stable || true - git push origin :stable || true - git tag -a stable -m "Last Stable Release" - git push origin stable + ci: + uses: folke/github/.github/workflows/ci.yml@main + secrets: inherit + with: + plugin: lazy.nvim + repo: folke/lazy.nvim + docs: false diff --git a/.github/workflows/community.yml b/.github/workflows/community.yml new file mode 100644 index 0000000..85d3248 --- /dev/null +++ b/.github/workflows/community.yml @@ -0,0 +1,30 @@ +name: Community +on: + push: + branches: + - main + +jobs: + community: + runs-on: ubuntu-latest + if: ${{ github.ref == 'refs/heads/main' && github.repository_owner == 'folke' }} + steps: + - uses: actions/checkout@v4 + - uses: folke/github/neovim@main + - name: Rockspec Build + id: rockspec-build + uses: actions/cache@v4 + with: + path: build + key: rockspec-build + - name: Generate Rockspec + if: steps.rockspec-build.cache-hit != 'true' + run: | + nvim -l lua/lazy/build.lua + - name: Push changes + uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: "chore(build): auto-generate rockspec mappings" + commit_user_name: "github-actions[bot]" + commit_user_email: "github-actions[bot]@users.noreply.github.com" + commit_author: "github-actions[bot] " diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..4b0363f --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,19 @@ +name: Docs +on: + push: + branches: + - main + +jobs: + docs: + runs-on: ubuntu-latest + if: ${{ github.ref == 'refs/heads/main' && github.repository_owner == 'folke' }} + env: + GH_TOKEN: ${{ github.token }} + steps: + - uses: actions/checkout@v4 + with: + ref: docs + - name: Generate Docs + shell: bash + run: gh workflow run "Deploy to Github Pages" --ref docs diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml new file mode 100644 index 0000000..0908727 --- /dev/null +++ b/.github/workflows/labeler.yml @@ -0,0 +1,8 @@ +name: "PR Labeler" +on: + - pull_request_target + +jobs: + labeler: + uses: folke/github/.github/workflows/labeler.yml@main + secrets: inherit diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml new file mode 100644 index 0000000..6d9df36 --- /dev/null +++ b/.github/workflows/pr.yml @@ -0,0 +1,18 @@ +name: PR Title + +on: + pull_request_target: + types: + - opened + - edited + - synchronize + - reopened + - ready_for_review + +permissions: + pull-requests: read + +jobs: + pr-title: + uses: folke/github/.github/workflows/pr.yml@main + secrets: inherit diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 0000000..4e0273b --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,11 @@ +name: Stale Issues & PRs + +on: + schedule: + - cron: "30 1 * * *" + +jobs: + 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 new file mode 100644 index 0000000..6784ef9 --- /dev/null +++ b/.github/workflows/update.yml @@ -0,0 +1,13 @@ +name: Update Repo + +on: + workflow_dispatch: + schedule: + # Run every hour + - cron: "0 * * * *" + +jobs: + update: + if: contains(fromJSON('["folke", "LazyVim"]'), github.repository_owner) + uses: folke/github/.github/workflows/update.yml@main + secrets: inherit diff --git a/.gitignore b/.gitignore index 7217496..771c835 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,9 @@ -tt.* -.tests -doc/tags -debug -.repro -foo.* *.log -data -build +/.repro +/.tests +/build +/debug +/doc/tags +foo.* +node_modules +tt.* diff --git a/.styluaignore b/.styluaignore new file mode 100644 index 0000000..0ad920d --- /dev/null +++ b/.styluaignore @@ -0,0 +1 @@ +lua/lazy/community/_generated.lua diff --git a/CHANGELOG.md b/CHANGELOG.md index 3fe0915..521777a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,240 @@ # 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) + + +### Bug Fixes + +* **git:** only check for new commits for local plugins. Closes [#1512](https://github.com/folke/lazy.nvim/issues/1512) ([81d2bff](https://github.com/folke/lazy.nvim/commit/81d2bfffdc8c84a40d25cae7fd4800178c19a138)) + +## [11.10.1](https://github.com/folke/lazy.nvim/compare/v11.10.0...v11.10.1) (2024-07-05) + + +### Bug Fixes + +* **lockfile:** keep cond=false and enabed=false in lockfile. Fixes [#1535](https://github.com/folke/lazy.nvim/issues/1535). Fixes [#1606](https://github.com/folke/lazy.nvim/issues/1606) ([baac551](https://github.com/folke/lazy.nvim/commit/baac5517770abd6eee63d11cf4791ef5bf5702e8)) + +## [11.10.0](https://github.com/folke/lazy.nvim/compare/v11.9.2...v11.10.0) (2024-07-04) + + +### Features + +* **profiling:** merge VeryLazy stats and show startuptime in profile view ([0f2786b](https://github.com/folke/lazy.nvim/commit/0f2786bcc91347188627534471ee75c3f6f16b2d)) + + +### Bug Fixes + +* **config:** determine headless only during startup. Fixes [#1608](https://github.com/folke/lazy.nvim/issues/1608) ([6fdd904](https://github.com/folke/lazy.nvim/commit/6fdd904ee45b66d933c5d2f72bcec337e13744f8)) +* **plugin:** local spec name ([923e1aa](https://github.com/folke/lazy.nvim/commit/923e1aa7a49d945afa4c03da4f8ff052cd6d14a6)) + +## [11.9.2](https://github.com/folke/lazy.nvim/compare/v11.9.1...v11.9.2) (2024-07-02) + + +### Bug Fixes + +* **async:** make asyncs abortable ([1fad617](https://github.com/folke/lazy.nvim/commit/1fad61712bd3937dda925775a7736b8efbcbf1a7)) +* **health:** check for errors when executing commands. Closes [#1599](https://github.com/folke/lazy.nvim/issues/1599) ([d0921f5](https://github.com/folke/lazy.nvim/commit/d0921f5b9b3d2c5e09618da55a018228edcc4d16)) + + +### Performance Improvements + +* **plugin:** minor optim to resolve imports a bit faster ([a9d7ade](https://github.com/folke/lazy.nvim/commit/a9d7ade203b3f3ee3058c082c62afdf8e4bcb416)) + +## [11.9.1](https://github.com/folke/lazy.nvim/compare/v11.9.0...v11.9.1) (2024-06-30) + + +### Performance Improvements + +* automatically suspend the scheduler when all threads are waiting ([#1591](https://github.com/folke/lazy.nvim/issues/1591)) ([c7ed87f](https://github.com/folke/lazy.nvim/commit/c7ed87f9ca03ea412134d6a6ea55b43232eb6b0c)) +* suspend when tasks are active ([2f4ac03](https://github.com/folke/lazy.nvim/commit/2f4ac035bcc66292250de7134d73007b147f64e8)) + +## [11.9.0](https://github.com/folke/lazy.nvim/compare/v11.8.2...v11.9.0) (2024-06-29) + + +### Features + +* **ui:** use [[ & ]] to navigate between plugins. Fixes [#1463](https://github.com/folke/lazy.nvim/issues/1463) ([5e3c112](https://github.com/folke/lazy.nvim/commit/5e3c112cb32c9cb6e8622aab4446358e039def7c)) + + +### Bug Fixes + +* **ui:** when closing details, jump to plugin header. Closes [#1338](https://github.com/folke/lazy.nvim/issues/1338) ([3772914](https://github.com/folke/lazy.nvim/commit/37729140751577e87318c137d90d0e6bb00ceff1)) + ## [11.8.2](https://github.com/folke/lazy.nvim/compare/v11.8.1...v11.8.2) (2024-06-29) diff --git a/bootstrap.lua b/bootstrap.lua index e39db4d..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,15 +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 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", @@ -22,23 +27,21 @@ function M.setup() }, }, true, {}) local lazyrepo = "https://github.com/folke/lazy.nvim.git" - local ok, out = - pcall(vim.fn.system, { "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) + local ok, out = pcall(vim.fn.system, { + "git", + "clone", + "--filter=blob:none", + lazyrepo, + lazypath, + }) if not ok or vim.v.shell_error ~= 0 then vim.api.nvim_echo({ - { - "Failed to clone lazy.nvim\n", - "ErrorMsg", - }, - { - vim.trim(out or ""), - "WarningMsg", - }, - { "\nPress any key to exit", "MoreMsg" }, + { "Failed to clone lazy.nvim\n", "ErrorMsg" }, + { vim.trim(out or ""), "WarningMsg" }, + { "\nPress any key to exit...", "MoreMsg" }, }, true, {}) - vim.fn.getchar() - vim.cmd([[quit]]) + os.exit(1) end end vim.opt.rtp:prepend(lazypath) diff --git a/doc/lazy.nvim.txt b/doc/lazy.nvim.txt index eae1268..2ae3b36 100644 --- a/doc/lazy.nvim.txt +++ b/doc/lazy.nvim.txt @@ -157,7 +157,16 @@ STRUCTURED SETUP *lazy.nvim-🛠️-installation-structured-setup* local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" if not (vim.uv or vim.loop).fs_stat(lazypath) then local lazyrepo = "https://github.com/folke/lazy.nvim.git" - vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) + local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) + if vim.v.shell_error ~= 0 then + vim.api.nvim_echo({ + { "Failed to clone lazy.nvim:\n", "ErrorMsg" }, + { out, "WarningMsg" }, + { "\nPress any key to exit..." }, + }, true, {}) + vim.fn.getchar() + os.exit(1) + end end vim.opt.rtp:prepend(lazypath) @@ -196,7 +205,16 @@ SINGLE FILE SETUP *lazy.nvim-🛠️-installation-single-file-setup* local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" if not (vim.uv or vim.loop).fs_stat(lazypath) then local lazyrepo = "https://github.com/folke/lazy.nvim.git" - vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) + local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) + if vim.v.shell_error ~= 0 then + vim.api.nvim_echo({ + { "Failed to clone lazy.nvim:\n", "ErrorMsg" }, + { out, "WarningMsg" }, + { "\nPress any key to exit..." }, + }, true, {}) + vim.fn.getchar() + os.exit(1) + end end vim.opt.rtp:prepend(lazypath) @@ -273,23 +291,25 @@ SPEC LOADING *lazy.nvim-🔌-plugin-spec-spec-loading* SPEC SETUP *lazy.nvim-🔌-plugin-spec-spec-setup* - --------------------------------------------------------------------------------------------------- + -------------------------------------------------------------------------------------------------- Property Type Description - ---------- ----------------------------- ---------------------------------------------------------- - init fun(LazyPlugin) init functions are always executed during 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 specs), - fun(LazyPlugin, opts:table) return a table (replaces parent specs) or should change a - table. The table will be passed to the Plugin.config() - function. Setting this value will imply Plugin.config() + 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 + change a table. The table will be passed to the + Plugin.config() function. Setting this value will imply + Plugin.config() config fun(LazyPlugin, opts:table) config is executed when the plugin loads. The default or true implementation will automatically run - require(MAIN).setup(opts) if opts or config = true is set. - Lazy uses several heuristics to determine the plugin’s - MAIN module automatically based on the plugin’s name. See - also opts. To use the default implementation without opts - set config to true. + require(MAIN).setup(opts) if opts or config = true is + set. Lazy uses several heuristics to determine the + plugin’s MAIN module automatically based on the plugin’s + name. (opts is the recommended way to configure plugins). main string? You can specify the main module to use for config() and opts(), in case it can not be determined automatically. @@ -298,7 +318,12 @@ SPEC SETUP *lazy.nvim-🔌-plugin-spec-spec-setup* build fun(LazyPlugin) or string or build is executed when a plugin is installed or updated. false or a list of build See Building for more information. commands - --------------------------------------------------------------------------------------------------- + -------------------------------------------------------------------------------------------------- +Always use `opts` instead of `config` when possible. `config` is almost never +needed. + + + SPEC LAZY LOADING *lazy.nvim-🔌-plugin-spec-spec-lazy-loading* @@ -515,9 +540,7 @@ function. keys = { { "ft", "Neotree toggle", desc = "NeoTree" }, }, - config = function() - require("neo-tree").setup() - end, + opts = {}, } < @@ -621,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"} @@ -665,6 +706,7 @@ will be added to the plugin’s spec. icons = { cmd = " ", config = "", + debug = "● ", event = " ", favorite = " ", ft = " ", @@ -690,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. @@ -705,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, { @@ -715,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, @@ -766,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 @@ -812,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 @@ -832,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 @@ -872,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 ----------------------------------------------------------------------- ============================================================================== @@ -1223,6 +1294,8 @@ BEST PRACTICES *lazy.nvim-🔥-developers-best-practices* >lua { "nvim-lua/plenary.nvim", lazy = true } < +- Always use `opts` instead of `config` when possible. `config` is almost never + needed. - Only use `dependencies` if a plugin needs the dep to be installed **AND** loaded. Lua plugins/libraries are automatically loaded when they are `require()`d, so they don’t need to be in `dependencies`. diff --git a/lua/lazy/async.lua b/lua/lazy/async.lua index 58145a6..7a865b3 100644 --- a/lua/lazy/async.lua +++ b/lua/lazy/async.lua @@ -1,11 +1,14 @@ +local Util = require("lazy.core.util") + local M = {} ---@type Async[] -M._queue = {} -M._executor = assert(vim.loop.new_timer()) +M._active = {} +---@type Async[] +M._suspended = {} +M._executor = assert(vim.loop.new_check()) -M.TIMER = 10 -M.BUDGET = 100 +M.BUDGET = 10 ---@type table M._threads = setmetatable({}, { __mode = "k" }) @@ -42,11 +45,6 @@ function Async:init(fn) return M.add(self) end -function Async:restart() - assert(not self:running(), "Cannot restart a running async") - self:init(self._fn) -end - ---@param event AsyncEvent ---@param cb async fun(res:any, async:Async) function Async:on(event, cb) @@ -77,27 +75,41 @@ function Async:sleep(ms) end ---@async -function Async:suspend() +---@param yield? boolean +function Async:suspend(yield) self._suspended = true - if coroutine.running() == self._co then - coroutine.yield() + if coroutine.running() == self._co and yield ~= false then + M.yield() end end function Async:resume() self._suspended = false + M._run() end -function Async:wait() +---@async +---@param yield? boolean +function Async:wake(yield) local async = M.running() + assert(async, "Not in an async context") + self:on("done", function() + async:resume() + end) + async:suspend(yield) +end + +---@async +function Async:wait() if coroutine.running() == self._co then error("Cannot wait on self") end - while self:running() do - if async then - coroutine.yield() - else + local async = M.running() + if async then + self:wake() + else + while self:running() do vim.wait(10) end end @@ -120,36 +132,75 @@ function Async:step() return self:running() end +function M.abort() + for _, async in ipairs(M._active) do + coroutine.resume(async._co, "abort") + end +end + +function M.yield() + if coroutine.yield() == "abort" then + error("aborted", 2) + end +end + function M.step() - local budget = M.BUDGET * 1e6 local start = vim.uv.hrtime() - local count = #M._queue - local i = 0 - while #M._queue > 0 and vim.uv.hrtime() - start < budget do - ---@type Async - local state = table.remove(M._queue, 1) - if state:step() then - table.insert(M._queue, state) - end - i = i + 1 - if i >= count then + for _ = 1, #M._active do + if Util.exiting() or vim.uv.hrtime() - start > M.BUDGET * 1e6 then break end + + local state = table.remove(M._active, 1) + if state:step() then + if state._suspended then + table.insert(M._suspended, state) + else + table.insert(M._active, state) + end + end end - if #M._queue == 0 then + for _ = 1, #M._suspended do + local state = table.remove(M._suspended, 1) + table.insert(state._suspended and M._suspended or M._active, state) + end + + -- M.debug() + if #M._active == 0 or Util.exiting() then return M._executor:stop() end end +function M.debug() + local lines = { + "- active: " .. #M._active, + "- suspended: " .. #M._suspended, + } + for _, async in ipairs(M._active) do + local info = debug.getinfo(async._fn) + local file = vim.fn.fnamemodify(info.short_src:sub(1), ":~:.") + table.insert(lines, ("%s:%d"):format(file, info.linedefined)) + if #lines > 10 then + break + end + end + local msg = table.concat(lines, "\n") + M._notif = vim.notify(msg, nil, { replace = M._notif }) +end + ---@param async Async function M.add(async) - table.insert(M._queue, async) - if not M._executor:is_active() then - M._executor:start(1, M.TIMER, vim.schedule_wrap(M.step)) - end + table.insert(M._active, async) + M._run() return async end +function M._run() + if not Util.exiting() and not M._executor:is_active() then + M._executor:start(vim.schedule_wrap(M.step)) + end +end + function M.running() local co = coroutine.running() if co then diff --git a/lua/lazy/community/_generated.lua b/lua/lazy/community/_generated.lua index 87b46dd..7e41487 100644 --- a/lua/lazy/community/_generated.lua +++ b/lua/lazy/community/_generated.lua @@ -10,43 +10,87 @@ return }, { name = "adopure.nvim", url = "Willem-J-an/adopure.nvim", - version = "1.1.0-1" + version = "2.1.0-1" }, { name = "aerial.nvim", url = "stevearc/aerial.nvim", - version = "1.7.0-1" + version = "2.4.0-1" + }, { + name = "age.nvim", + url = "KingMichaelPark/age.nvim", + version = "0.1.0-1" }, { name = "ai.nvim", url = "S1M0N38/ai.nvim", - version = "0.1.0-1" + version = "1.5.0-1" + }, { + name = "astral.nvim", + url = "rootiest/astral.nvim", + version = "1.0.9-1" }, { name = "auto-hlsearch.nvim", url = "asiryk/auto-hlsearch.nvim", version = "1.1.0-1" + }, { + name = "autosave.nvim", + url = "brianhuster/autosave.nvim", + version = "0.4.2-1" + }, { + name = "avante.nvim", + url = "yetone/avante.nvim", + version = "0.0.18-1" + }, { + name = "banana.nvim", + url = "CWood-sdf/banana.nvim", + version = "0.2.0-1" + }, { + name = "bars-n-lines.nvim", + url = "OXY2DEV/bars-N-lines.nvim", + version = "1.0.0-1" + }, { + name = "base.nvim", + url = "S1M0N38/base.nvim", + version = "1.0.2-1" }, { name = "better-escape.nvim", url = "max397574/better-escape.nvim", - version = "1.0.0-1" + version = "2.3.3-1" }, { name = "bufferline.nvim", url = "akinsho/bufferline.nvim", - version = "4.6.1-1" + version = "4.9.1-1" + }, { + name = "care.nvim", + url = "max397574/care.nvim", + version = "0.1.0-1" }, { name = "ccc.nvim", url = "uga-rosa/ccc.nvim", - version = "1.6.0-1" + version = "2.0.3-1" + }, { + name = "chatml.nvim", + url = "S1M0N38/chatml.nvim", + version = "1.0.0-1" }, { name = "ci-template.nvim", url = "linrongbin16/ci-template.nvim", version = "8.1.0-1" + }, { + name = "cinnamon.nvim", + url = "declancm/cinnamon.nvim", + version = "1.2.5-1" }, { name = "cmp-rg", url = "lukas-reineke/cmp-rg", - version = "1.3.9-1" + version = "1.3.11-1" + }, { + name = "code-stats.nvim", + url = "Freed-Wu/code-stats.nvim", + version = "0.0.2-1" }, { name = "colorbox.nvim", url = "linrongbin16/colorbox.nvim", - version = "3.1.0-1" + version = "3.1.1-1" }, { name = "colorbuddy.nvim", url = "tjdevries/colorbuddy.nvim", @@ -54,7 +98,11 @@ return }, { name = "colortils.nvim", url = "nvim-colortils/colortils.nvim", - version = "1.1.0-1" + version = "1.2.0-1" + }, { + name = "command.nvim", + url = "cultab/command.nvim", + version = "0.1.1-1" }, { name = "commander.nvim", url = "FeiyouG/commander.nvim", @@ -70,15 +118,35 @@ return }, { name = "commons.nvim", url = "linrongbin16/commons.nvim", - version = "18.0.0-1" + version = "27.0.0-1" }, { name = "conform.nvim", url = "stevearc/conform.nvim", - version = "6.0.0-1" + version = "8.4.0-1" + }, { + name = "coop.nvim", + url = "gregorias/coop.nvim", + version = "1.0.1-0" + }, { + name = "copy-diagnostics.nvim", + url = "NickStafford2/copy-diagnostics.nvim", + version = "main-1" + }, { + name = "cord.nvim", + url = "vyfor/cord.nvim", + version = "2.0.3-1" + }, { + name = "cursor-text-objects.nvim", + url = "ColinKennedy/cursor-text-objects.nvim", + version = "1.3.0-1" }, { name = "cybu.nvim", url = "ghillb/cybu.nvim", version = "1.0-1" + }, { + name = "dante.nvim", + url = "S1M0N38/dante.nvim", + version = "1.3.1-1" }, { name = "daylight.nvim", url = "NTBBloodbath/daylight.nvim", @@ -86,11 +154,19 @@ return }, { name = "deadcolumn.nvim", url = "Bekaboo/deadcolumn.nvim", - version = "1.0.0-1" + version = "1.0.1-1" + }, { + name = "decasify.nvim", + url = "alerque/decasify", + version = "0.8.0-1" }, { name = "decipher.nvim", url = "MisanthropicBit/decipher.nvim", - version = "1.0.1-1" + version = "1.0.3-1" + }, { + name = "delog.nvim", + url = "ej-shafran/delog.nvim", + version = "0.0.2-1" }, { name = "detour.nvim", url = "carbon-steel/detour.nvim", @@ -106,15 +182,27 @@ return }, { name = "donut.nvim", url = "NStefan002/donut.nvim", - version = "2.1.0-1" + version = "2.2.1-1" + }, { + name = "donutlify.nvim", + url = "NStefan002/donutlify.nvim", + version = "1.0.0-1" + }, { + name = "doris.nvim", + url = "jackokring/doris.nvim", + version = "0.3.2-1" + }, { + name = "down.nvim", + url = "clpi/down.nvim", + version = "master-1" }, { name = "dressing.nvim", url = "stevearc/dressing.nvim", - version = "2.2.2-1" + version = "3.1.1-1" }, { name = "dropbar.nvim", url = "Bekaboo/dropbar.nvim", - version = "8.4.0-1" + version = "12.0.0-1" }, { name = "duck.nvim", url = "tamton-aquib/duck.nvim", @@ -126,23 +214,35 @@ return }, { name = "edgy.nvim", url = "folke/edgy.nvim", - version = "1.9.1-1" + version = "1.10.2-1" + }, { + name = "efmls-configs-nvim", + url = "creativenull/efmls-configs-nvim", + version = "1.9.0-1" }, { name = "elixir-tools.nvim", url = "elixir-tools/elixir-tools.nvim", - version = "0.14.3-1" + version = "0.17.0-1" + }, { + name = "fake.nvim", + url = "Kibadda/fake.nvim", + version = "4.0.1-1" + }, { + name = "feed.nvim", + url = "neo451/feed.nvim", + version = "1.16.4-1" }, { name = "feline.nvim", url = "freddiehaddad/feline.nvim", - version = "1.6.2-1" + version = "1.7.1-1" }, { name = "fidget.nvim", url = "j-hui/fidget.nvim", - version = "1.4.1-1" + version = "1.6.0-1" }, { name = "flash.nvim", url = "folke/flash.nvim", - version = "1.18.3-1" + version = "2.1.0-1" }, { name = "flatten.nvim", url = "willothy/flatten.nvim", @@ -150,11 +250,15 @@ return }, { name = "flutter-tools.nvim", url = "akinsho/flutter-tools.nvim", - version = "1.10.0-1" + version = "1.14.0-1" }, { name = "focus.nvim", url = "nvim-focus/focus.nvim", version = "1.0.2-1" + }, { + name = "foldtext.nvim", + url = "OXY2DEV/foldtext.nvim", + version = "1.0.0-1" }, { name = "freeze-code.nvim", url = "AlejandroSuero/freeze-code.nvim", @@ -162,7 +266,7 @@ return }, { name = "fugit2.nvim", url = "SuperBo/fugit2.nvim", - version = "0.2.0-1" + version = "0.2.1-1" }, { name = "funnyfiles.nvim", url = "aikooo7/funnyfiles.nvim", @@ -170,7 +274,7 @@ return }, { name = "fzfx.nvim", url = "linrongbin16/fzfx.nvim", - version = "6.4.0-1" + version = "8.1.1-1" }, { name = "galileo.nvim", url = "S1M0N38/galileo.nvim", @@ -182,19 +286,23 @@ return }, { name = "git-worktree.nvim", url = "polarmutex/git-worktree.nvim", - version = "1.0.0-1" + version = "2.0.1-1" + }, { + name = "git.nvim", + url = "Kibadda/git.nvim", + version = "5.1.0-1" }, { name = "github-nvim-theme", url = "projekt0n/github-nvim-theme", - version = "1.0.2-1" + version = "1.1.2-1" }, { name = "gitlinker.nvim", url = "linrongbin16/gitlinker.nvim", - version = "4.13.1-1" + version = "5.0.1-1" }, { name = "gitsigns.nvim", url = "lewis6991/gitsigns.nvim", - version = "scm-1" + version = "1.0.0-1" }, { name = "glow.nvim", url = "ellisonleao/glow.nvim", @@ -202,7 +310,7 @@ return }, { name = "go.nvim", url = "ray-x/go.nvim", - version = "0.2.1-1" + version = "0.9.0-1" }, { name = "godo.nvim", url = "arthuradolfo/godo.nvim", @@ -215,6 +323,14 @@ return name = "gruvbox.nvim", url = "ellisonleao/gruvbox.nvim", version = "2.0.0-1" + }, { + name = "guard.nvim", + url = "nvimdev/guard.nvim", + version = "2.1.2-1" + }, { + name = "hardhat.nvim", + url = "TheSnakeWitcher/hardhat.nvim", + version = "0.1.0-1" }, { name = "haskell-snippets.nvim", url = "mrcjkb/haskell-snippets.nvim", @@ -222,23 +338,35 @@ return }, { name = "haskell-tools.nvim", url = "mrcjkb/haskell-tools.nvim", - version = "3.1.10-1" + version = "4.4.2-1" }, { name = "headlines.nvim", url = "lukas-reineke/headlines.nvim", - version = "4.0.1-1" + version = "5.0.0-1" }, { name = "heirline.nvim", url = "rebelot/heirline.nvim", - version = "1.0.6-1" + version = "1.0.7-1" + }, { + name = "helpview.nvim", + url = "OXY2DEV/helpview.nvim", + version = "2.0.1-1" + }, { + name = "hibiscus.nvim", + url = "udayvir-singh/hibiscus.nvim", + version = "1.7-1" }, { name = "hlchunk.nvim", url = "shellRaining/hlchunk.nvim", - version = "1.1.0-1" + version = "1.3.0-1" }, { name = "hotpot.nvim", url = "rktjmp/hotpot.nvim", - version = "0.12.1-1" + version = "0.14.7-1" + }, { + name = "hurl.nvim", + url = "jellydn/hurl.nvim", + version = "2.1.0-1" }, { name = "hydra.nvim", url = "nvimtools/hydra.nvim", @@ -247,34 +375,58 @@ return name = "image.nvim", url = "3rd/image.nvim", version = "1.3.0-1" + }, { + name = "ime.nvim", + url = "Freed-Wu/ime.nvim", + version = "0.0.1-1" }, { name = "incline.nvim", url = "b0o/incline.nvim", - version = "0.0.1-1" + version = "0.0.3-1" }, { name = "indent-blankline.nvim", url = "lukas-reineke/indent-blankline.nvim", - version = "3.6.3-1" + version = "3.8.7-1" }, { name = "kai.nvim", url = "Kamilcuk/kai.nvim", version = "0.0.6-1" + }, { + name = "kanban.nvim", + url = "Kibadda/kanban.nvim", + version = "1.3.0-1" + }, { + name = "kube.nvim", + url = "mimparat132/kube.nvim", + version = "1.2.0-1" }, { name = "lazy.nvim", url = "folke/lazy.nvim", - version = "11.2.1-1" + version = "11.16.2-1" + }, { + name = "lazydev.nvim", + url = "folke/lazydev.nvim", + version = "1.9.0-1" + }, { + name = "lean.nvim", + url = "Julian/lean.nvim", + version = "2024.12.2-1" }, { name = "leetcode.nvim", url = "kawre/leetcode.nvim", - version = "0.2.0-1" + version = "0.3.0-1" }, { name = "legendary.nvim", url = "mrjones2014/legendary.nvim", - version = "2.13.11-1" + version = "2.13.13-1" }, { name = "live-command.nvim", url = "smjonas/live-command.nvim", - version = "1.2.1-1" + version = "2.2.0-1" + }, { + name = "live-preview.nvim", + url = "brianhuster/live-preview.nvim", + version = "0.9.4-1" }, { name = "logging.nvim", url = "NTBBloodbath/logging.nvim", @@ -283,10 +435,14 @@ return name = "love2d.nvim", url = "S1M0N38/love2d.nvim", version = "0.2-1" + }, { + name = "lsp-format.nvim", + url = "lukas-reineke/lsp-format.nvim", + version = "2.7.1-1" }, { name = "lsp-progress.nvim", url = "linrongbin16/lsp-progress.nvim", - version = "1.0.12-1" + version = "1.0.13-1" }, { name = "lsp_signature.nvim", url = "ray-x/lsp_signature.nvim", @@ -295,6 +451,14 @@ return name = "ltreesitter", url = "euclidianAce/ltreesitter", version = "0.0.7-1" + }, { + name = "ltreesitter-ts", + url = "FourierTransformer/ltreesitter-ts", + version = "0.0.1-1" + }, { + name = "lua-console.nvim", + url = "YaroSpace/lua-console.nvim", + version = "1.2.4-1" }, { name = "lua-obfuscator.nvim", url = "git+ssh://git@github.com/kdssoftware/lua-obfuscator.nvim.git", @@ -307,34 +471,66 @@ return name = "lua-utils.nvim", url = "nvim-neorg/lua-utils.nvim", version = "1.0.2-1" + }, { + name = "luarocks-build-tree-sitter-cli", + url = "FourierTransformer/luarocks-build-tree-sitter-cli", + version = "0.0.2-1" }, { name = "luarocks-build-treesitter-parser", url = "nvim-neorocks/luarocks-build-treesitter-parser", - version = "4.1.0-1" + version = "6.0.0-1" + }, { + name = "luarocks-build-treesitter-parser-cpp", + url = "nvim-neorocks/luarocks-build-treesitter-parser-cpp", + version = "2.0.4-1" + }, { + name = "mag-nvim-lsp", + url = "iguanacucumber/mag-nvim-lsp", + version = "0.2-1" + }, { + name = "mag-nvim-lua", + url = "iguanacucumber/mag-nvim-lua", + version = "0.1-1" + }, { + name = "magazine.nvim", + url = "iguanacucumber/magazine.nvim", + version = "0.4.4-1" }, { name = "mapx.nvim", url = "b0o/mapx.nvim", version = "0.2.1-1" + }, { + name = "markview.nvim", + url = "OXY2DEV/markview.nvim", + version = "25.3.1-1" }, { name = "mason-lspconfig.nvim", url = "williamboman/mason-lspconfig.nvim", - version = "1.29.0-1" + version = "1.31.0-1" }, { name = "mason-nvim-dap.nvim", url = "jay-babu/mason-nvim-dap.nvim", - version = "2.3.0-1" + version = "2.4.0-1" }, { name = "mason.nvim", url = "williamboman/mason.nvim", version = "1.10.0-1" + }, { + name = "melange-nvim", + url = "savq/melange-nvim", + version = "0.9.0-1" }, { name = "mini.nvim", url = "echasnovski/mini.nvim", - version = "0.9.0-1" + version = "0.15.0-1" + }, { + name = "minuet-ai.nvim", + url = "milanglacier/minuet-ai.nvim", + version = "0.3.2-1" }, { name = "mkdnflow.nvim", url = "jakewvincent/mkdnflow.nvim", - version = "1.2.0-1" + version = "1.2.4-1" }, { name = "move.nvim", url = "fedepujol/move.nvim", @@ -342,7 +538,7 @@ return }, { name = "multicursors.nvim", url = "smoka7/multicursors.nvim", - version = "1.0.0-1" + version = "2.0.0-1" }, { name = "my-awesome-plugin.nvim", url = "S1M0N38/my-awesome-plugin.nvim", @@ -354,11 +550,11 @@ return }, { name = "neo-tree.nvim", url = "nvim-neo-tree/neo-tree.nvim", - version = "3.26-1" + version = "3.29-1" }, { name = "neoconf.nvim", url = "folke/neoconf.nvim", - version = "1.2.2-1" + version = "1.4.0-1" }, { name = "neodev.nvim", url = "folke/neodev.nvim", @@ -366,19 +562,43 @@ return }, { name = "neogen", url = "danymat/neogen", - version = "2.17.1-1" + version = "2.20.0-1" }, { name = "neogit", url = "NeogitOrg/neogit", - version = "1.0.0-1" + version = "2.0.0-1" }, { name = "neorg", url = "nvim-neorg/neorg", - version = "8.7.1-1" + version = "9.2.0-1" + }, { + name = "neorg-archive", + url = "bottd/neorg-archive", + version = "1.0.0-1" + }, { + name = "neorg-conceal-wrap", + url = "benlubas/neorg-conceal-wrap", + version = "1.0.1-1" + }, { + name = "neorg-interim-ls", + url = "benlubas/neorg-interim-ls", + version = "2.1.0-1" + }, { + name = "neorg-query", + url = "benlubas/neorg-query", + version = "1.3.1-1" + }, { + name = "neorg-se", + url = "benlubas/neorg-se", + version = "1.1.10-1" }, { name = "neorg-telescope", url = "nvim-neorg/neorg-telescope", - version = "1.1.0-1" + version = "1.2.2-1" + }, { + name = "neorg-worklog", + url = "bottd/neorg-worklog", + version = "1.3.4-1" }, { name = "neoscroll.nvim", url = "karb94/neoscroll.nvim", @@ -386,27 +606,55 @@ return }, { name = "neotest", url = "nvim-neotest/neotest", - version = "5.3.3-1" + version = "5.8.0-1" + }, { + name = "neotest-busted", + url = "MisanthropicBit/neotest-busted", + version = "0.5.0-1" + }, { + name = "neotest-dotnet", + url = "Issafalcon/neotest-dotnet", + version = "stable-1" + }, { + name = "neotest-golang", + url = "fredrikaverpil/neotest-golang", + version = "1.10.1-1" }, { name = "neotest-haskell", url = "mrcjkb/neotest-haskell", - version = "2.0.0-1" + version = "2.1.1-1" + }, { + name = "neotest-java", + url = "rcasia/neotest-java", + version = "0.17.6-1" + }, { + name = "neotest-zig", + url = "lawrence-laz/neotest-zig", + version = "1.3.1-1" + }, { + name = "nerdy.nvim", + url = "2KAbhishek/nerdy.nvim", + version = "1.4-1" + }, { + name = "netman.nvim", + url = "miversen33/netman.nvim", + version = "1.15-1" }, { name = "nightfox.nvim", url = "EdenEast/nightfox.nvim", - version = "3.9.3-1" + version = "3.10.0-1" }, { name = "no-neck-pain.nvim", url = "shortcuts/no-neck-pain.nvim", - version = "1.14.0-1" + version = "2.1.5-1" }, { name = "noice.nvim", url = "folke/noice.nvim", - version = "4.3.0-1" + version = "4.10.0-1" }, { name = "npackages.nvim", url = "diegofigs/npackages.nvim", - version = "0.1.0-1" + version = "0.3.0-1" }, { name = "nui-components.nvim", url = "grapp-dev/nui-components.nvim", @@ -415,6 +663,18 @@ return name = "nui.nvim", url = "MunifTanjim/nui.nvim", version = "0.3.0-1" + }, { + name = "nvim-a2-pack", + url = "dfgordon/nvim-a2-pack", + version = "0.3.1-1" + }, { + name = "nvim-best-practices-plugin-template", + url = "ColinKennedy/nvim-best-practices-plugin-template", + version = "1.7.0-1" + }, { + name = "nvim-bqf", + url = "kevinhwang91/nvim-bqf", + version = "1.1.1-1" }, { name = "nvim-client", url = "neovim/lua-client", @@ -423,10 +683,6 @@ return 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", @@ -434,7 +690,7 @@ return }, { name = "nvim-dap", url = "mfussenegger/nvim-dap", - version = "0.8.0-1" + version = "0.9.0-1" }, { name = "nvim-dap-ui", url = "rcarriga/nvim-dap-ui", @@ -442,11 +698,15 @@ return }, { name = "nvim-dbee", url = "kndndrj/nvim-dbee", - version = "0.1.6-1" + version = "0.1.9-1" }, { name = "nvim-dev-container", url = "esensar/nvim-dev-container", version = "0.2.0-1" + }, { + name = "nvim-faker", + url = "git+ssh://git@github.com/tehdb/nvim-faker.git", + version = "1.0.0-1" }, { name = "nvim-java", url = "nvim-java/nvim-java", @@ -478,7 +738,7 @@ return }, { name = "nvim-lspconfig", url = "neovim/nvim-lspconfig", - version = "0.1.8-1" + version = "1.6.0-1" }, { name = "nvim-metals", url = "scalameta/nvim-metals", @@ -486,11 +746,11 @@ return }, { name = "nvim-nio", url = "nvim-neotest/nvim-nio", - version = "1.9.4-1" + version = "1.10.1-1" }, { name = "nvim-notify", url = "rcarriga/nvim-notify", - version = "3.13.5-1" + version = "3.15.0-1" }, { name = "nvim-parinfer", url = "gpanders/nvim-parinfer", @@ -502,15 +762,19 @@ return }, { name = "nvim-possession", url = "gennaro-tedesco/nvim-possession", - version = "0.0.13-1" + version = "0.1.0-1" }, { name = "nvim-scrollview", url = "dstein64/nvim-scrollview", - version = "5.1.0-1" + version = "6.0.0-1" }, { name = "nvim-smuggler", url = "Klafyvel/nvim-smuggler", - version = "main-1" + version = "0.5.0-1" + }, { + name = "nvim-snippets", + url = "garymjr/nvim-snippets", + version = "1.0.0-1" }, { name = "nvim-snippy", url = "dcampos/nvim-snippy", @@ -519,10 +783,14 @@ return name = "nvim-surround", url = "kylechui/nvim-surround", version = "2.1.5-1" + }, { + name = "nvim-telescope-cycler", + url = "heindsight/nvim-telescope-cycler", + version = "0.1.0-1" }, { name = "nvim-tree.lua", url = "nvim-tree/nvim-tree.lua", - version = "1.4.0-1" + version = "1.6.0-1" }, { name = "nvim-treesitter-legacy-api", url = "nvim-treesitter/nvim-treesitter", @@ -535,18 +803,26 @@ return name = "nvim-web-devicons", url = "nvim-tree/nvim-web-devicons", version = "0.100-1" + }, { + name = "nvim-window-picker", + url = "s1n7ax/nvim-window-picker", + version = "2.3.1-1" + }, { + name = "obazel.nvim", + url = "glindstedt/obazel.nvim", + version = "0.1.1-1" }, { name = "obsidian.nvim", url = "epwalsh/obsidian.nvim", - version = "3.8.0-1" + version = "3.9.0-1" }, { name = "oil.nvim", url = "stevearc/oil.nvim", - version = "2.10.0-1" + version = "2.14.0-1" }, { name = "onedarkpro.nvim", url = "olimorris/onedarkpro.nvim", - version = "0.8.0-1" + version = "2.9.0-1" }, { name = "onenord.nvim", url = "rmehri01/onenord.nvim", @@ -554,15 +830,15 @@ return }, { name = "otter.nvim", url = "jmbuhr/otter.nvim", - version = "1.15.1-1" + version = "2.6.1-1" }, { name = "overseer.nvim", url = "stevearc/overseer.nvim", - version = "1.4.0-1" + version = "1.5.0-1" }, { name = "oz.nvim", url = "luxluth/oz.nvim", - version = "0.0.3-1" + version = "0.0.4-1" }, { name = "package-info.nvim", url = "vuki656/package-info.nvim", @@ -574,7 +850,7 @@ return }, { name = "papis.nvim", url = "jghauser/papis.nvim", - version = "0.5.1-1" + version = "0.7.0-1" }, { name = "paq-nvim", url = "savq/paq-nvim", @@ -582,11 +858,15 @@ return }, { name = "pathlib.nvim", url = "pysan3/pathlib.nvim", - version = "2.2.2-1" + version = "2.2.3-1" + }, { + name = "persisted.nvim", + url = "olimorris/persisted.nvim", + version = "2.0.2-1" }, { name = "persistence.nvim", url = "folke/persistence.nvim", - version = "2.0.0-1" + version = "3.1.0-1" }, { name = "plenary.nvim", url = "nvim-lua/plenary.nvim", @@ -595,42 +875,78 @@ return name = "pretty-fold.nvim", url = "anuvyklack/pretty-fold.nvim", version = "3.0-1" + }, { + name = "processing.nvim", + url = "sophieforrest/processing.nvim", + version = "1.1.0-1" + }, { + name = "quarry.nvim", + url = "rudionrails/quarry.nvim", + version = "4.0.0-1" + }, { + name = "quicker.nvim", + url = "stevearc/quicker.nvim", + version = "1.3.0-1" }, { name = "rainbow-delimiters.nvim", url = "HiPhish/rainbow-delimiters.nvim", - version = "0.4.0-1" + version = "0.8.0-1" + }, { + name = "remember.nvim", + url = "vladdoster/remember.nvim", + version = "1.4.1-1" }, { name = "renamer.nvim", url = "filipdutescu/renamer.nvim", version = "5.1.0-1" + }, { + name = "render-markdown.nvim", + url = "MeanderingProgrammer/render-markdown.nvim", + version = "8.0.0-1" }, { name = "rest.nvim", url = "rest-nvim/rest.nvim", - version = "2.0.1-1" + version = "3.11.1-1" + }, { + name = "rime.nvim", + url = "Freed-Wu/rime.nvim", + version = "0.0.1-1" }, { name = "rocks-config.nvim", url = "nvim-neorocks/rocks-config.nvim", - version = "2.1.0-1" + version = "3.1.0-1" }, { name = "rocks-dev.nvim", url = "nvim-neorocks/rocks-dev.nvim", - version = "1.2.3-1" + version = "1.7.0-1" }, { name = "rocks-git.nvim", url = "nvim-neorocks/rocks-git.nvim", - version = "1.5.1-1" + version = "2.5.2-1" + }, { + name = "rocks-lazy.nvim", + url = "nvim-neorocks/rocks-lazy.nvim", + version = "1.2.0-1" + }, { + name = "rocks-treesitter.nvim", + url = "nvim-neorocks/rocks-treesitter.nvim", + version = "1.3.0-1" }, { name = "rocks.nvim", url = "nvim-neorocks/rocks.nvim", - version = "2.32.0-1" + version = "2.43.1-1" }, { name = "rtp.nvim", url = "nvim-neorocks/rtp.nvim", - version = "1.0.0-1" + version = "1.2.0-1" + }, { + name = "runt.nvim", + url = "Julian/runt.nvim", + version = "2024.10.2-1" }, { name = "rustaceanvim", url = "mrcjkb/rustaceanvim", - version = "4.25.1-1" + version = "5.24.4-1" }, { name = "schemastore.nvim", url = "b0o/SchemaStore.nvim", @@ -638,7 +954,7 @@ return }, { name = "screenkey.nvim", url = "NStefan002/screenkey.nvim", - version = "2.1.0-1" + version = "2.4.2-1" }, { name = "scrollbar.nvim", url = "Xuyuanp/scrollbar.nvim", @@ -646,7 +962,11 @@ return }, { name = "session.nvim", url = "Kibadda/session.nvim", - version = "2.0.0-1" + version = "3.0.0-1" + }, { + name = "sf.nvim", + url = "xixiaofinland/sf.nvim", + version = "1.9.0-1" }, { name = "sg.nvim", url = "sourcegraph/sg.nvim", @@ -654,11 +974,23 @@ return }, { name = "smart-splits.nvim", url = "mrjones2014/smart-splits.nvim", - version = "1.5.0-1" + version = "1.8.1-1" + }, { + name = "snacks.nvim", + url = "folke/snacks.nvim", + version = "2.20.0-1" + }, { + name = "sos.nvim", + url = "tmillr/sos.nvim", + version = "1.0.0-1" }, { name = "squirrel.nvim", url = "xiaoshihou514/squirrel.nvim", version = "1.0.0-1" + }, { + name = "starter.nvim", + url = "Kibadda/starter.nvim", + version = "1.2.0-1" }, { name = "storm-mode.nvim", url = "HoppenR/storm-mode.nvim", @@ -671,14 +1003,34 @@ return name = "substitute.nvim", url = "gbprod/substitute.nvim", version = "2.0.0-1" + }, { + name = "sus.nvim", + url = "TarunDaCoder/sus.nvim", + version = "1.0.0-1" }, { name = "sweetie.nvim", url = "NTBBloodbath/sweetie.nvim", - version = "3.1.1-1" + version = "3.2.0-1" }, { name = "tabby.nvim", url = "nanozuki/tabby.nvim", - version = "2.5.1-1" + version = "2.7.4-1" + }, { + name = "tangerine.nvim", + url = "udayvir-singh/tangerine.nvim", + version = "2.9-1" + }, { + name = "teacup.neovim", + url = "Clivern/teacup.neovim", + version = "0.0.1-1" + }, { + name = "telescope-cmdline.nvim", + url = "jonarrien/telescope-cmdline.nvim", + version = "0.2.1-1" + }, { + name = "telescope-frecency.nvim", + url = "nvim-telescope/telescope-frecency.nvim", + version = "1.2.0-1" }, { name = "telescope-zf-native.nvim", url = "natecraddock/telescope-zf-native.nvim", @@ -690,69 +1042,1369 @@ return }, { name = "todo-comments.nvim", url = "folke/todo-comments.nvim", - version = "1.2.0-1" + version = "1.4.0-1" }, { name = "toggleterm.nvim", url = "akinsho/toggleterm.nvim", - version = "2.11.0-1" + version = "2.13.1-1" }, { name = "tokyonight.nvim", url = "folke/tokyonight.nvim", - version = "3.0.1-1" + version = "4.11.0-1" + }, { + name = "tree-sitter-ada", + url = "briot/tree-sitter-ada", + version = "0.0.29-1" + }, { + name = "tree-sitter-agda", + url = "tree-sitter/tree-sitter-agda", + version = "0.0.31-1" + }, { + name = "tree-sitter-angular", + url = "dlvandenberg/tree-sitter-angular", + version = "0.0.30-1" + }, { + name = "tree-sitter-apex", + url = "aheber/tree-sitter-sfapex", + version = "0.0.47-1" + }, { + name = "tree-sitter-arduino", + url = "tree-sitter-grammars/tree-sitter-arduino", + version = "0.0.31-1" + }, { + name = "tree-sitter-asm", + url = "RubixDev/tree-sitter-asm", + version = "0.0.30-1" + }, { + name = "tree-sitter-astro", + url = "virchau13/tree-sitter-astro", + version = "0.0.33-1" + }, { + name = "tree-sitter-authzed", + url = "mleonidas/tree-sitter-authzed", + version = "0.0.29-1" + }, { + name = "tree-sitter-awk", + url = "Beaglefoot/tree-sitter-awk", + version = "0.0.32-1" + }, { + name = "tree-sitter-bash", + url = "tree-sitter/tree-sitter-bash", + version = "0.0.40-1" + }, { + name = "tree-sitter-bass", + url = "vito/tree-sitter-bass", + version = "0.0.29-1" + }, { + name = "tree-sitter-beancount", + url = "polarmutex/tree-sitter-beancount", + version = "0.0.30-1" + }, { + name = "tree-sitter-bibtex", + url = "latex-lsp/tree-sitter-bibtex", + version = "0.0.29-1" + }, { + name = "tree-sitter-bicep", + url = "tree-sitter-grammars/tree-sitter-bicep", + version = "0.0.30-1" + }, { + name = "tree-sitter-bitbake", + url = "tree-sitter-grammars/tree-sitter-bitbake", + version = "0.0.30-1" + }, { + name = "tree-sitter-blueprint", + url = "https://gitlab.com/gabmus/tree-sitter-blueprint/-/archive/60ba73739c6083c693d86a1a7cf039c07eb4ed59.zip", + version = "0.0.29-1" + }, { + name = "tree-sitter-bp", + url = "ambroisie/tree-sitter-bp", + version = "0.0.30-1" + }, { + name = "tree-sitter-c", + url = "tree-sitter/tree-sitter-c", + version = "0.0.41-1" + }, { + name = "tree-sitter-c_sharp", + url = "tree-sitter/tree-sitter-c-sharp", + version = "0.0.40-1" + }, { + name = "tree-sitter-cairo", + url = "tree-sitter-grammars/tree-sitter-cairo", + version = "0.0.29-1" + }, { + name = "tree-sitter-capnp", + url = "tree-sitter-grammars/tree-sitter-capnp", + version = "0.0.29-1" + }, { + name = "tree-sitter-chatito", + url = "tree-sitter-grammars/tree-sitter-chatito", + version = "0.0.30-1" + }, { + name = "tree-sitter-circom", + url = "Decurity/tree-sitter-circom", + version = "0.0.1-1" + }, { + name = "tree-sitter-cli", + url = "FourierTransformer/tree-sitter-cli", + version = "0.25.1-2" + }, { + name = "tree-sitter-clojure", + url = "sogaiu/tree-sitter-clojure", + version = "0.0.29-1" + }, { + name = "tree-sitter-cmake", + url = "uyha/tree-sitter-cmake", + version = "0.0.31-1" + }, { + name = "tree-sitter-comment", + url = "stsewd/tree-sitter-comment", + version = "0.0.29-1" + }, { + name = "tree-sitter-commonlisp", + url = "tree-sitter-grammars/tree-sitter-commonlisp", + version = "0.0.29-1" + }, { + name = "tree-sitter-cooklang", + url = "addcninblue/tree-sitter-cooklang", + version = "0.0.29-1" + }, { + name = "tree-sitter-corn", + url = "jakestanger/tree-sitter-corn", + version = "0.0.29-1" + }, { + name = "tree-sitter-cpon", + url = "tree-sitter-grammars/tree-sitter-cpon", + version = "0.0.29-1" + }, { + name = "tree-sitter-cpp", + url = "tree-sitter/tree-sitter-cpp", + version = "0.0.41-1" + }, { + name = "tree-sitter-css", + url = "tree-sitter/tree-sitter-css", + version = "0.0.36-1" + }, { + name = "tree-sitter-csv", + url = "tree-sitter-grammars/tree-sitter-csv", + version = "0.0.29-1" + }, { + name = "tree-sitter-cuda", + url = "tree-sitter-grammars/tree-sitter-cuda", + version = "0.0.30-1" + }, { + name = "tree-sitter-cue", + url = "eonpatapon/tree-sitter-cue", + version = "0.0.30-1" + }, { + name = "tree-sitter-cylc", + url = "elliotfontaine/tree-sitter-cylc", + version = "0.0.1-1" + }, { + name = "tree-sitter-d", + url = "gdamore/tree-sitter-d", + version = "0.0.33-1" + }, { + name = "tree-sitter-dart", + url = "UserNobody14/tree-sitter-dart", + version = "0.0.34-1" + }, { + name = "tree-sitter-desktop", + url = "ValdezFOmar/tree-sitter-desktop", + version = "0.0.8-1" + }, { + name = "tree-sitter-devicetree", + url = "joelspadin/tree-sitter-devicetree", + version = "0.0.32-1" + }, { + name = "tree-sitter-dhall", + url = "jbellerb/tree-sitter-dhall", + version = "0.0.31-1" + }, { + name = "tree-sitter-diff", + url = "the-mikedavis/tree-sitter-diff", + version = "0.0.32-1" + }, { + name = "tree-sitter-disassembly", + url = "ColinKennedy/tree-sitter-disassembly", + version = "0.0.29-1" + }, { + name = "tree-sitter-djot", + url = "treeman/tree-sitter-djot", + version = "0.0.34-1" + }, { + name = "tree-sitter-dockerfile", + url = "camdencheek/tree-sitter-dockerfile", + version = "0.0.30-1" + }, { + name = "tree-sitter-dot", + url = "rydesun/tree-sitter-dot", + version = "0.0.29-1" + }, { + name = "tree-sitter-doxygen", + url = "tree-sitter-grammars/tree-sitter-doxygen", + version = "0.0.29-1" + }, { + name = "tree-sitter-dtd", + url = "tree-sitter-grammars/tree-sitter-xml", + version = "0.0.34-1" + }, { + name = "tree-sitter-earthfile", + url = "glehmann/tree-sitter-earthfile", + version = "0.0.35-1" + }, { + name = "tree-sitter-ebnf", + url = "RubixDev/ebnf", + version = "0.0.29-1" + }, { + name = "tree-sitter-ecma", + url = "nvim-neorocks/luarocks-stub", + version = "0.0.30-1" + }, { + name = "tree-sitter-editorconfig", + url = "ValdezFOmar/tree-sitter-editorconfig", + version = "0.0.47-1" + }, { + name = "tree-sitter-eds", + url = "uyha/tree-sitter-eds", + version = "0.0.30-1" + }, { + name = "tree-sitter-eex", + url = "connorlay/tree-sitter-eex", + version = "0.0.29-1" + }, { + name = "tree-sitter-elixir", + url = "elixir-lang/tree-sitter-elixir", + version = "0.0.39-1" + }, { + name = "tree-sitter-elm", + url = "elm-tooling/tree-sitter-elm", + version = "0.0.31-1" + }, { + name = "tree-sitter-elsa", + url = "glapa-grossklag/tree-sitter-elsa", + version = "0.0.29-1" + }, { + name = "tree-sitter-elvish", + url = "elves/tree-sitter-elvish", + version = "0.0.29-1" + }, { + name = "tree-sitter-embedded_template", + url = "tree-sitter/tree-sitter-embedded-template", + version = "0.0.34-1" + }, { + name = "tree-sitter-enforce", + url = "simonvic/tree-sitter-enforce", + version = "0.0.2-1" + }, { + name = "tree-sitter-erlang", + url = "WhatsApp/tree-sitter-erlang", + version = "0.0.40-1" + }, { + name = "tree-sitter-facility", + url = "FacilityApi/tree-sitter-facility", + version = "0.0.30-1" + }, { + name = "tree-sitter-faust", + url = "khiner/tree-sitter-faust", + version = "0.0.29-1" + }, { + name = "tree-sitter-fennel", + url = "alexmozaidze/tree-sitter-fennel", + version = "0.0.29-1" + }, { + name = "tree-sitter-fidl", + url = "google/tree-sitter-fidl", + version = "0.0.29-1" + }, { + name = "tree-sitter-firrtl", + url = "tree-sitter-grammars/tree-sitter-firrtl", + version = "0.0.29-1" + }, { + name = "tree-sitter-fish", + url = "ram02z/tree-sitter-fish", + version = "0.0.30-1" + }, { + name = "tree-sitter-foam", + url = "FoamScience/tree-sitter-foam", + version = "0.0.30-1" + }, { + name = "tree-sitter-forth", + url = "AlexanderBrevig/tree-sitter-forth", + version = "0.0.29-1" + }, { + name = "tree-sitter-fortran", + url = "stadelmanma/tree-sitter-fortran", + version = "0.0.41-1" + }, { + name = "tree-sitter-fsh", + url = "mgramigna/tree-sitter-fsh", + version = "0.0.29-1" + }, { + name = "tree-sitter-fsharp", + url = "ionide/tree-sitter-fsharp", + version = "0.0.11-1" + }, { + name = "tree-sitter-func", + url = "tree-sitter-grammars/tree-sitter-func", + version = "0.0.29-1" + }, { + name = "tree-sitter-fusion", + url = "https://gitlab.com/jirgn/tree-sitter-fusion/-/archive/19db2f47ba4c3a0f6238d4ae0e2abfca16e61dd6.zip", + version = "0.0.29-1" + }, { + name = "tree-sitter-gap", + url = "gap-system/tree-sitter-gap", + version = "0.0.31-1" + }, { + name = "tree-sitter-gaptst", + url = "gap-system/tree-sitter-gaptst", + version = "0.0.30-1" + }, { + name = "tree-sitter-gdscript", + url = "PrestonKnopp/tree-sitter-gdscript", + version = "0.0.34-1" + }, { + name = "tree-sitter-gdshader", + url = "GodOfAvacyn/tree-sitter-gdshader", + version = "0.0.29-1" + }, { + name = "tree-sitter-git_config", + url = "the-mikedavis/tree-sitter-git-config", + version = "0.0.29-1" + }, { + name = "tree-sitter-git_rebase", + url = "the-mikedavis/tree-sitter-git-rebase", + version = "0.0.29-1" + }, { + name = "tree-sitter-gitattributes", + url = "tree-sitter-grammars/tree-sitter-gitattributes", + version = "0.0.30-1" + }, { + name = "tree-sitter-gitcommit", + url = "gbprod/tree-sitter-gitcommit", + version = "0.0.33-1" + }, { + name = "tree-sitter-gitignore", + url = "shunsambongi/tree-sitter-gitignore", + version = "0.0.29-1" + }, { + name = "tree-sitter-gleam", + url = "gleam-lang/tree-sitter-gleam", + version = "0.0.35-1" + }, { + name = "tree-sitter-glimmer", + url = "ember-tooling/tree-sitter-glimmer", + version = "0.0.29-1" + }, { + name = "tree-sitter-glimmer_javascript", + url = "NullVoxPopuli/tree-sitter-glimmer-javascript", + version = "0.0.30-1" + }, { + name = "tree-sitter-glimmer_typescript", + url = "NullVoxPopuli/tree-sitter-glimmer-typescript", + version = "0.0.30-1" + }, { + name = "tree-sitter-glsl", + url = "tree-sitter-grammars/tree-sitter-glsl", + version = "0.0.30-1" + }, { + name = "tree-sitter-gn", + url = "tree-sitter-grammars/tree-sitter-gn", + version = "0.0.29-1" + }, { + name = "tree-sitter-gnuplot", + url = "dpezto/tree-sitter-gnuplot", + version = "0.0.30-1" + }, { + name = "tree-sitter-go", + url = "tree-sitter/tree-sitter-go", + version = "0.0.39-1" + }, { + name = "tree-sitter-goctl", + url = "chaozwn/tree-sitter-goctl", + version = "0.0.29-1" + }, { + name = "tree-sitter-godot_resource", + url = "PrestonKnopp/tree-sitter-godot-resource", + version = "0.0.32-1" + }, { + name = "tree-sitter-gomod", + url = "camdencheek/tree-sitter-go-mod", + version = "0.0.33-1" + }, { + name = "tree-sitter-gosum", + url = "tree-sitter-grammars/tree-sitter-go-sum", + version = "0.0.29-1" + }, { + name = "tree-sitter-gotmpl", + url = "ngalaiko/tree-sitter-go-template", + version = "0.0.35-1" + }, { + name = "tree-sitter-gowork", + url = "omertuc/tree-sitter-go-work", + version = "0.0.29-1" + }, { + name = "tree-sitter-gpg", + url = "tree-sitter-grammars/tree-sitter-gpg-config", + version = "0.0.30-1" + }, { + name = "tree-sitter-graphql", + url = "bkegley/tree-sitter-graphql", + version = "0.0.29-1" + }, { + name = "tree-sitter-gren", + url = "MaeBrooks/tree-sitter-gren", + version = "0.0.6-1" + }, { + name = "tree-sitter-groovy", + url = "murtaza64/tree-sitter-groovy", + version = "0.0.33-1" + }, { + name = "tree-sitter-gstlaunch", + url = "tree-sitter-grammars/tree-sitter-gstlaunch", + version = "0.0.29-1" + }, { + name = "tree-sitter-hack", + url = "slackhq/tree-sitter-hack", + version = "0.0.30-1" + }, { + name = "tree-sitter-hare", + url = "tree-sitter-grammars/tree-sitter-hare", + version = "0.0.29-1" + }, { + name = "tree-sitter-haskell", + url = "tree-sitter/tree-sitter-haskell", + version = "0.0.32-1" + }, { + name = "tree-sitter-haskell_persistent", + url = "MercuryTechnologies/tree-sitter-haskell-persistent", + version = "0.0.29-1" + }, { + name = "tree-sitter-hcl", + url = "tree-sitter-grammars/tree-sitter-hcl", + version = "0.0.29-1" + }, { + name = "tree-sitter-heex", + url = "connorlay/tree-sitter-heex", + version = "0.0.34-1" + }, { + name = "tree-sitter-helm", + url = "ngalaiko/tree-sitter-go-template", + version = "0.0.35-1" + }, { + name = "tree-sitter-hjson", + url = "winston0410/tree-sitter-hjson", + version = "0.0.29-1" + }, { + name = "tree-sitter-hlsl", + url = "tree-sitter-grammars/tree-sitter-hlsl", + version = "0.0.31-1" + }, { + name = "tree-sitter-hlsplaylist", + url = "Freed-Wu/tree-sitter-hlsplaylist", + version = "0.0.29-1" + }, { + name = "tree-sitter-hocon", + url = "antosha417/tree-sitter-hocon", + version = "0.0.29-1" + }, { + name = "tree-sitter-hoon", + url = "urbit-pilled/tree-sitter-hoon", + version = "0.0.32-1" + }, { + name = "tree-sitter-html", + url = "tree-sitter/tree-sitter-html", + version = "0.0.36-1" + }, { + name = "tree-sitter-html_tags", + url = "nvim-neorocks/luarocks-stub", + version = "0.0.29-1" + }, { + name = "tree-sitter-htmldjango", + url = "interdependence/tree-sitter-htmldjango", + version = "0.0.29-1" + }, { + name = "tree-sitter-http", + url = "rest-nvim/tree-sitter-http", + version = "0.0.35-1" + }, { + name = "tree-sitter-hurl", + url = "pfeiferj/tree-sitter-hurl", + version = "0.0.30-1" + }, { + name = "tree-sitter-hyprlang", + url = "tree-sitter-grammars/tree-sitter-hyprlang", + version = "0.0.34-1" + }, { + name = "tree-sitter-idl", + url = "cathaysia/tree-sitter-idl", + version = "0.0.32-1" + }, { + name = "tree-sitter-idris", + url = "kayhide/tree-sitter-idris", + version = "0.0.1-1" + }, { + name = "tree-sitter-ini", + url = "justinmk/tree-sitter-ini", + version = "0.0.29-1" + }, { + name = "tree-sitter-inko", + url = "inko-lang/tree-sitter-inko", + version = "0.0.38-1" + }, { + name = "tree-sitter-ipkg", + url = "srghma/tree-sitter-ipkg", + version = "0.0.1-1" + }, { + name = "tree-sitter-ispc", + url = "tree-sitter-grammars/tree-sitter-ispc", + version = "0.0.30-1" + }, { + name = "tree-sitter-janet_simple", + url = "sogaiu/tree-sitter-janet-simple", + version = "0.0.33-1" + }, { + name = "tree-sitter-java", + url = "tree-sitter/tree-sitter-java", + version = "0.0.40-1" + }, { + name = "tree-sitter-javascript", + url = "tree-sitter/tree-sitter-javascript", + version = "0.0.36-1" + }, { + name = "tree-sitter-jinja", + url = "cathaysia/tree-sitter-jinja", + version = "0.0.2-1" + }, { + name = "tree-sitter-jinja_inline", + url = "cathaysia/tree-sitter-jinja", + version = "0.0.2-1" + }, { + name = "tree-sitter-jq", + url = "flurie/tree-sitter-jq", + version = "0.0.29-1" + }, { + name = "tree-sitter-jsdoc", + url = "tree-sitter/tree-sitter-jsdoc", + version = "0.0.35-1" + }, { + name = "tree-sitter-json", + url = "tree-sitter/tree-sitter-json", + version = "0.0.36-1" + }, { + name = "tree-sitter-json5", + url = "Joakker/tree-sitter-json5", + version = "0.0.29-1" + }, { + name = "tree-sitter-jsonc", + url = "https://gitlab.com/WhyNotHugo/tree-sitter-jsonc/-/archive/02b01653c8a1c198ae7287d566efa86a135b30d5.zip", + version = "0.0.29-1" + }, { + name = "tree-sitter-jsonnet", + url = "sourcegraph/tree-sitter-jsonnet", + version = "0.0.29-1" + }, { + name = "tree-sitter-jsx", + url = "nvim-neorocks/luarocks-stub", + version = "0.0.29-1" + }, { + name = "tree-sitter-julia", + url = "tree-sitter/tree-sitter-julia", + version = "0.0.42-1" + }, { + name = "tree-sitter-just", + url = "IndianBoy42/tree-sitter-just", + version = "0.0.36-1" + }, { + name = "tree-sitter-kconfig", + url = "tree-sitter-grammars/tree-sitter-kconfig", + version = "0.0.32-1" + }, { + name = "tree-sitter-kdl", + url = "tree-sitter-grammars/tree-sitter-kdl", + version = "0.0.29-1" + }, { + name = "tree-sitter-kotlin", + url = "fwcd/tree-sitter-kotlin", + version = "0.0.32-1" + }, { + name = "tree-sitter-koto", + url = "koto-lang/tree-sitter-koto", + version = "0.0.37-1" + }, { + name = "tree-sitter-kusto", + url = "Willem-J-an/tree-sitter-kusto", + version = "0.0.29-1" + }, { + name = "tree-sitter-lalrpop", + url = "traxys/tree-sitter-lalrpop", + version = "0.0.31-1" + }, { + name = "tree-sitter-latex", + url = "latex-lsp/tree-sitter-latex", + version = "0.0.33-1" + }, { + name = "tree-sitter-ledger", + url = "cbarrete/tree-sitter-ledger", + version = "0.0.33-1" + }, { + name = "tree-sitter-leo", + url = "r001/tree-sitter-leo", + version = "0.0.33-1" + }, { + name = "tree-sitter-linkerscript", + url = "tree-sitter-grammars/tree-sitter-linkerscript", + version = "0.0.29-1" + }, { + name = "tree-sitter-liquid", + url = "hankthetank27/tree-sitter-liquid", + version = "0.0.29-1" + }, { + name = "tree-sitter-liquidsoap", + url = "savonet/tree-sitter-liquidsoap", + version = "0.0.30-1" + }, { + name = "tree-sitter-llvm", + url = "benwilliamgraham/tree-sitter-llvm", + version = "0.0.30-1" + }, { + name = "tree-sitter-lua", + url = "tree-sitter-grammars/tree-sitter-lua", + version = "0.0.33-1" + }, { + name = "tree-sitter-luadoc", + url = "tree-sitter-grammars/tree-sitter-luadoc", + version = "0.0.29-1" + }, { + name = "tree-sitter-luap", + url = "tree-sitter-grammars/tree-sitter-luap", + version = "0.0.29-1" + }, { + name = "tree-sitter-luau", + url = "tree-sitter-grammars/tree-sitter-luau", + version = "0.0.30-1" + }, { + name = "tree-sitter-m68k", + url = "grahambates/tree-sitter-m68k", + version = "0.0.29-1" + }, { + name = "tree-sitter-make", + url = "alemuller/tree-sitter-make", + version = "0.0.29-1" + }, { + name = "tree-sitter-markdown", + url = "tree-sitter-grammars/tree-sitter-markdown", + version = "0.0.37-1" + }, { + name = "tree-sitter-markdown_inline", + url = "tree-sitter-grammars/tree-sitter-markdown", + version = "0.0.37-1" + }, { + name = "tree-sitter-matlab", + url = "acristoffers/tree-sitter-matlab", + version = "0.0.32-1" + }, { + name = "tree-sitter-menhir", + url = "Kerl13/tree-sitter-menhir", + version = "0.0.29-1" + }, { + name = "tree-sitter-mermaid", + url = "monaqa/tree-sitter-mermaid", + version = "0.0.29-1" + }, { + name = "tree-sitter-meson", + url = "tree-sitter-grammars/tree-sitter-meson", + version = "0.0.30-1" + }, { + name = "tree-sitter-mlir", + url = "artagnon/tree-sitter-mlir", + version = "0.0.44-1" + }, { + name = "tree-sitter-muttrc", + url = "neomutt/tree-sitter-muttrc", + version = "0.0.29-1" + }, { + name = "tree-sitter-nasm", + url = "naclsn/tree-sitter-nasm", + version = "0.0.30-1" + }, { + name = "tree-sitter-nginx", + url = "opa-oz/tree-sitter-nginx", + version = "0.0.30-1" + }, { + name = "tree-sitter-nickel", + url = "nickel-lang/tree-sitter-nickel", + version = "0.0.31-1" + }, { + name = "tree-sitter-nim", + url = "alaviss/tree-sitter-nim", + version = "0.0.29-1" + }, { + name = "tree-sitter-nim_format_string", + url = "aMOPel/tree-sitter-nim-format-string", + version = "0.0.29-1" + }, { + name = "tree-sitter-ninja", + url = "alemuller/tree-sitter-ninja", + version = "0.0.29-1" + }, { + name = "tree-sitter-nix", + url = "cstrahan/tree-sitter-nix", + version = "0.0.56-1" }, { name = "tree-sitter-norg", url = "nvim-neorg/tree-sitter-norg", - version = "0.2.4-1" + version = "0.2.6-1" }, { name = "tree-sitter-norg-meta", url = "nvim-neorg/tree-sitter-norg-meta", version = "0.1.0-1" + }, { + name = "tree-sitter-nqc", + url = "tree-sitter-grammars/tree-sitter-nqc", + version = "0.0.30-1" + }, { + name = "tree-sitter-nu", + url = "nushell/tree-sitter-nu", + version = "0.0.32-1" + }, { + name = "tree-sitter-objc", + url = "tree-sitter-grammars/tree-sitter-objc", + version = "0.0.31-1" + }, { + name = "tree-sitter-objdump", + url = "ColinKennedy/tree-sitter-objdump", + version = "0.0.29-1" + }, { + name = "tree-sitter-ocaml", + url = "tree-sitter/tree-sitter-ocaml", + version = "0.0.39-1" + }, { + name = "tree-sitter-ocaml_interface", + url = "tree-sitter/tree-sitter-ocaml", + version = "0.0.40-1" + }, { + name = "tree-sitter-ocamllex", + url = "atom-ocaml/tree-sitter-ocamllex", + version = "0.0.30-1" + }, { + name = "tree-sitter-odin", + url = "tree-sitter-grammars/tree-sitter-odin", + version = "0.0.32-1" + }, { + name = "tree-sitter-org", + url = "milisims/tree-sitter-org", + version = "0.0.1-1" }, { name = "tree-sitter-orgmode", url = "nvim-orgmode/tree-sitter-org", version = "1.3.2-1" + }, { + name = "tree-sitter-pascal", + url = "Isopod/tree-sitter-pascal", + version = "0.0.29-1" + }, { + name = "tree-sitter-passwd", + url = "ath3/tree-sitter-passwd", + version = "0.0.29-1" + }, { + name = "tree-sitter-pem", + url = "tree-sitter-grammars/tree-sitter-pem", + version = "0.0.30-1" + }, { + name = "tree-sitter-perl", + url = "tree-sitter-perl/tree-sitter-perl", + version = "0.0.41-1" + }, { + name = "tree-sitter-php", + url = "tree-sitter/tree-sitter-php", + version = "0.0.38-1" + }, { + name = "tree-sitter-php_only", + url = "tree-sitter/tree-sitter-php", + version = "0.0.39-1" + }, { + name = "tree-sitter-phpdoc", + url = "claytonrcarter/tree-sitter-phpdoc", + version = "0.0.30-1" + }, { + name = "tree-sitter-pioasm", + url = "leo60228/tree-sitter-pioasm", + version = "0.0.30-1" + }, { + name = "tree-sitter-po", + url = "tree-sitter-grammars/tree-sitter-po", + version = "0.0.29-1" + }, { + name = "tree-sitter-pod", + url = "tree-sitter-perl/tree-sitter-pod", + version = "0.0.29-1" + }, { + name = "tree-sitter-poe_filter", + url = "tree-sitter-grammars/tree-sitter-poe-filter", + version = "0.0.31-1" + }, { + name = "tree-sitter-pony", + url = "tree-sitter-grammars/tree-sitter-pony", + version = "0.0.29-1" + }, { + name = "tree-sitter-powershell", + url = "airbus-cert/tree-sitter-powershell", + version = "0.0.36-1" + }, { + name = "tree-sitter-printf", + url = "tree-sitter-grammars/tree-sitter-printf", + version = "0.0.32-1" + }, { + name = "tree-sitter-prisma", + url = "victorhqc/tree-sitter-prisma", + version = "0.0.30-1" + }, { + name = "tree-sitter-problog", + url = "foxyseta/tree-sitter-prolog", + version = "0.0.29-1" + }, { + name = "tree-sitter-prolog", + url = "foxyseta/tree-sitter-prolog", + version = "0.0.29-1" + }, { + name = "tree-sitter-promql", + url = "MichaHoffmann/tree-sitter-promql", + version = "0.0.29-1" + }, { + name = "tree-sitter-properties", + url = "tree-sitter-grammars/tree-sitter-properties", + version = "0.0.31-1" + }, { + name = "tree-sitter-proto", + url = "treywood/tree-sitter-proto", + version = "0.0.29-1" + }, { + name = "tree-sitter-prql", + url = "PRQL/tree-sitter-prql", + version = "0.0.30-1" + }, { + name = "tree-sitter-psv", + url = "tree-sitter-grammars/tree-sitter-csv", + version = "0.0.29-1" + }, { + name = "tree-sitter-pug", + url = "zealot128/tree-sitter-pug", + version = "0.0.30-1" + }, { + name = "tree-sitter-puppet", + url = "tree-sitter-grammars/tree-sitter-puppet", + version = "0.0.30-1" + }, { + name = "tree-sitter-purescript", + url = "postsolar/tree-sitter-purescript", + version = "0.0.29-1" + }, { + name = "tree-sitter-pymanifest", + url = "tree-sitter-grammars/tree-sitter-pymanifest", + version = "0.0.29-1" + }, { + name = "tree-sitter-python", + url = "tree-sitter/tree-sitter-python", + version = "0.0.40-1" + }, { + name = "tree-sitter-ql", + url = "tree-sitter/tree-sitter-ql", + version = "0.0.31-1" + }, { + name = "tree-sitter-qmldir", + url = "tree-sitter-grammars/tree-sitter-qmldir", + version = "0.0.29-1" + }, { + name = "tree-sitter-qmljs", + url = "yuja/tree-sitter-qmljs", + version = "0.0.31-1" + }, { + name = "tree-sitter-query", + url = "tree-sitter-grammars/tree-sitter-query", + version = "0.0.34-1" + }, { + name = "tree-sitter-r", + url = "r-lib/tree-sitter-r", + version = "0.0.34-1" + }, { + name = "tree-sitter-racket", + url = "6cdh/tree-sitter-racket", + version = "0.0.31-1" + }, { + name = "tree-sitter-ralph", + url = "alephium/tree-sitter-ralph", + version = "0.0.29-1" + }, { + name = "tree-sitter-rasi", + url = "Fymyte/tree-sitter-rasi", + version = "0.0.29-1" + }, { + name = "tree-sitter-razor", + url = "tris203/tree-sitter-razor", + version = "0.0.1-1" + }, { + name = "tree-sitter-rbs", + url = "joker1007/tree-sitter-rbs", + version = "0.0.31-1" + }, { + name = "tree-sitter-re2c", + url = "tree-sitter-grammars/tree-sitter-re2c", + version = "0.0.31-1" + }, { + name = "tree-sitter-readline", + url = "tree-sitter-grammars/tree-sitter-readline", + version = "0.0.30-1" + }, { + name = "tree-sitter-regex", + url = "tree-sitter/tree-sitter-regex", + version = "0.0.40-1" + }, { + name = "tree-sitter-rego", + url = "FallenAngel97/tree-sitter-rego", + version = "0.0.29-1" + }, { + name = "tree-sitter-requirements", + url = "tree-sitter-grammars/tree-sitter-requirements", + version = "0.0.29-1" + }, { + name = "tree-sitter-rescript", + url = "rescript-lang/tree-sitter-rescript", + version = "0.0.29-1" + }, { + name = "tree-sitter-rnoweb", + url = "bamonroe/tree-sitter-rnoweb", + version = "0.0.29-1" + }, { + name = "tree-sitter-robot", + url = "Hubro/tree-sitter-robot", + version = "0.0.32-1" + }, { + name = "tree-sitter-robots", + url = "opa-oz/tree-sitter-robots-txt", + version = "0.0.29-1" + }, { + name = "tree-sitter-roc", + url = "faldor20/tree-sitter-roc", + version = "0.0.31-1" + }, { + name = "tree-sitter-ron", + url = "tree-sitter-grammars/tree-sitter-ron", + version = "0.0.29-1" + }, { + name = "tree-sitter-rst", + url = "stsewd/tree-sitter-rst", + version = "0.0.32-1" + }, { + name = "tree-sitter-ruby", + url = "tree-sitter/tree-sitter-ruby", + version = "0.0.35-1" + }, { + name = "tree-sitter-runescript", + url = "2004Scape/tree-sitter-runescript", + version = "0.0.1-1" + }, { + name = "tree-sitter-rust", + url = "tree-sitter/tree-sitter-rust", + version = "0.0.41-1" + }, { + name = "tree-sitter-scala", + url = "tree-sitter/tree-sitter-scala", + version = "0.0.46-1" + }, { + name = "tree-sitter-scfg", + url = "rockorager/tree-sitter-scfg", + version = "0.0.30-1" + }, { + name = "tree-sitter-scheme", + url = "6cdh/tree-sitter-scheme", + version = "0.0.31-1" + }, { + name = "tree-sitter-scss", + url = "serenadeai/tree-sitter-scss", + version = "0.0.29-1" + }, { + name = "tree-sitter-sflog", + url = "aheber/tree-sitter-sfapex", + version = "0.0.44-1" + }, { + name = "tree-sitter-slang", + url = "tree-sitter-grammars/tree-sitter-slang", + version = "0.0.32-1" + }, { + name = "tree-sitter-slim", + url = "theoo/tree-sitter-slim", + version = "0.0.3-1" + }, { + name = "tree-sitter-slint", + url = "slint-ui/tree-sitter-slint", + version = "0.0.33-1" + }, { + name = "tree-sitter-smali", + url = "tree-sitter-grammars/tree-sitter-smali", + version = "0.0.29-1" + }, { + name = "tree-sitter-smithy", + url = "indoorvivants/tree-sitter-smithy", + version = "0.0.29-1" + }, { + name = "tree-sitter-snakemake", + url = "osthomas/tree-sitter-snakemake", + version = "0.0.31-1" + }, { + name = "tree-sitter-solidity", + url = "JoranHonig/tree-sitter-solidity", + version = "0.0.34-1" + }, { + name = "tree-sitter-soql", + url = "aheber/tree-sitter-sfapex", + version = "0.0.46-1" + }, { + name = "tree-sitter-sosl", + url = "aheber/tree-sitter-sfapex", + version = "0.0.44-1" + }, { + name = "tree-sitter-sourcepawn", + url = "nilshelmig/tree-sitter-sourcepawn", + version = "0.0.30-1" + }, { + name = "tree-sitter-sparql", + url = "GordianDziwis/tree-sitter-sparql", + version = "0.0.30-1" + }, { + name = "tree-sitter-sql", + url = "derekstride/tree-sitter-sql", + version = "0.0.39-1" + }, { + name = "tree-sitter-squirrel", + url = "tree-sitter-grammars/tree-sitter-squirrel", + version = "0.0.29-1" + }, { + name = "tree-sitter-ssh_config", + url = "tree-sitter-grammars/tree-sitter-ssh-config", + version = "0.0.32-1" + }, { + name = "tree-sitter-starlark", + url = "tree-sitter-grammars/tree-sitter-starlark", + version = "0.0.31-1" + }, { + name = "tree-sitter-strace", + url = "sigmaSd/tree-sitter-strace", + version = "0.0.29-1" + }, { + name = "tree-sitter-styled", + url = "mskelton/tree-sitter-styled", + version = "0.0.32-1" + }, { + name = "tree-sitter-supercollider", + url = "madskjeldgaard/tree-sitter-supercollider", + version = "0.0.30-1" + }, { + name = "tree-sitter-superhtml", + url = "kristoff-it/superhtml", + version = "0.0.13-1" + }, { + name = "tree-sitter-surface", + url = "connorlay/tree-sitter-surface", + version = "0.0.29-1" + }, { + name = "tree-sitter-svelte", + url = "tree-sitter-grammars/tree-sitter-svelte", + version = "0.0.32-1" + }, { + name = "tree-sitter-sway", + url = "FuelLabs/tree-sitter-sway", + version = "0.0.3-1" + }, { + name = "tree-sitter-swift", + url = "alex-pinkus/tree-sitter-swift", + version = "0.0.45-1" + }, { + name = "tree-sitter-sxhkdrc", + url = "RaafatTurki/tree-sitter-sxhkdrc", + version = "0.0.30-1" + }, { + name = "tree-sitter-systemtap", + url = "ok-ryoko/tree-sitter-systemtap", + version = "0.0.29-1" + }, { + name = "tree-sitter-systemverilog", + url = "zhangwwpeng/tree-sitter-systemverilog", + version = "0.0.29-1" + }, { + name = "tree-sitter-t32", + url = "https://gitlab.com/xasc/tree-sitter-t32/-/archive/e5a12f798f056049642aa03fbb83786e3a5b95d4.zip", + version = "0.0.41-1" + }, { + name = "tree-sitter-tablegen", + url = "tree-sitter-grammars/tree-sitter-tablegen", + version = "0.0.29-1" + }, { + name = "tree-sitter-tact", + url = "tact-lang/tree-sitter-tact", + version = "0.0.33-1" + }, { + name = "tree-sitter-tcl", + url = "tree-sitter-grammars/tree-sitter-tcl", + version = "0.0.30-1" + }, { + name = "tree-sitter-teal", + url = "euclidianAce/tree-sitter-teal", + version = "0.0.33-1" + }, { + name = "tree-sitter-templ", + url = "vrischmann/tree-sitter-templ", + version = "0.0.45-1" + }, { + name = "tree-sitter-terraform", + url = "MichaHoffmann/tree-sitter-hcl", + version = "0.0.29-1" + }, { + name = "tree-sitter-textproto", + url = "PorterAtGoogle/tree-sitter-textproto", + version = "0.0.31-1" + }, { + name = "tree-sitter-thrift", + url = "tree-sitter-grammars/tree-sitter-thrift", + version = "0.0.30-1" + }, { + name = "tree-sitter-tiger", + url = "ambroisie/tree-sitter-tiger", + version = "0.0.29-1" + }, { + name = "tree-sitter-tlaplus", + url = "tlaplus-community/tree-sitter-tlaplus", + version = "0.0.36-1" + }, { + name = "tree-sitter-tmux", + url = "Freed-Wu/tree-sitter-tmux", + version = "0.0.29-1" + }, { + name = "tree-sitter-todotxt", + url = "arnarg/tree-sitter-todotxt", + version = "0.0.29-1" + }, { + name = "tree-sitter-toml", + url = "tree-sitter-grammars/tree-sitter-toml", + version = "0.0.31-1" + }, { + name = "tree-sitter-tsv", + url = "tree-sitter-grammars/tree-sitter-csv", + version = "0.0.29-1" + }, { + name = "tree-sitter-tsx", + url = "tree-sitter/tree-sitter-typescript", + version = "0.0.35-1" + }, { + name = "tree-sitter-turtle", + url = "GordianDziwis/tree-sitter-turtle", + version = "0.0.29-1" + }, { + name = "tree-sitter-twig", + url = "gbprod/tree-sitter-twig", + version = "0.0.29-1" + }, { + name = "tree-sitter-typescript", + url = "tree-sitter/tree-sitter-typescript", + version = "0.0.36-1" + }, { + name = "tree-sitter-typespec", + url = "happenslol/tree-sitter-typespec", + version = "0.0.33-1" + }, { + name = "tree-sitter-typoscript", + url = "Teddytrombone/tree-sitter-typoscript", + version = "0.0.29-1" + }, { + name = "tree-sitter-typst", + url = "uben0/tree-sitter-typst", + version = "0.0.35-1" + }, { + name = "tree-sitter-udev", + url = "tree-sitter-grammars/tree-sitter-udev", + version = "0.0.30-1" + }, { + name = "tree-sitter-ungrammar", + url = "tree-sitter-grammars/tree-sitter-ungrammar", + version = "0.0.29-1" + }, { + name = "tree-sitter-unison", + url = "kylegoetz/tree-sitter-unison", + version = "0.0.33-1" + }, { + name = "tree-sitter-usd", + url = "ColinKennedy/tree-sitter-usd", + version = "0.0.29-1" + }, { + name = "tree-sitter-uxntal", + url = "tree-sitter-grammars/tree-sitter-uxntal", + version = "0.0.29-1" + }, { + name = "tree-sitter-v", + url = "vlang/v-analyzer", + version = "0.0.43-1" + }, { + name = "tree-sitter-vala", + url = "vala-lang/tree-sitter-vala", + version = "0.0.30-1" + }, { + name = "tree-sitter-vento", + url = "ventojs/tree-sitter-vento", + version = "0.0.30-1" + }, { + name = "tree-sitter-verilog", + url = "gmlarumbe/tree-sitter-systemverilog", + version = "0.0.38-1" + }, { + name = "tree-sitter-vhdl", + url = "jpt13653903/tree-sitter-vhdl", + version = "0.0.38-1" + }, { + name = "tree-sitter-vhs", + url = "charmbracelet/tree-sitter-vhs", + version = "0.0.32-1" + }, { + name = "tree-sitter-vim", + url = "tree-sitter-grammars/tree-sitter-vim", + version = "0.0.30-1" + }, { + name = "tree-sitter-vimdoc", + url = "neovim/tree-sitter-vimdoc", + version = "0.0.31-1" + }, { + name = "tree-sitter-vrl", + url = "belltoy/tree-sitter-vrl", + version = "0.0.29-1" + }, { + name = "tree-sitter-vue", + url = "tree-sitter-grammars/tree-sitter-vue", + version = "0.0.29-1" + }, { + name = "tree-sitter-wgsl", + url = "szebniok/tree-sitter-wgsl", + version = "0.0.31-1" + }, { + name = "tree-sitter-wgsl_bevy", + url = "tree-sitter-grammars/tree-sitter-wgsl-bevy", + version = "0.0.30-1" + }, { + name = "tree-sitter-wing", + url = "winglang/tree-sitter-wing", + version = "0.0.29-1" + }, { + name = "tree-sitter-wit", + url = "liamwh/tree-sitter-wit", + version = "0.0.30-1" + }, { + name = "tree-sitter-xcompose", + url = "tree-sitter-grammars/tree-sitter-xcompose", + version = "0.0.29-1" + }, { + name = "tree-sitter-xml", + url = "tree-sitter-grammars/tree-sitter-xml", + version = "0.0.36-1" + }, { + name = "tree-sitter-xresources", + url = "ValdezFOmar/tree-sitter-xresources", + version = "0.0.19-1" + }, { + name = "tree-sitter-yaml", + url = "tree-sitter-grammars/tree-sitter-yaml", + version = "0.0.31-1" + }, { + name = "tree-sitter-yang", + url = "Hubro/tree-sitter-yang", + version = "0.0.29-1" + }, { + name = "tree-sitter-yuck", + url = "tree-sitter-grammars/tree-sitter-yuck", + version = "0.0.29-1" + }, { + name = "tree-sitter-zathurarc", + url = "Freed-Wu/tree-sitter-zathurarc", + version = "0.0.29-1" + }, { + name = "tree-sitter-zig", + url = "tree-sitter-grammars/tree-sitter-zig", + version = "0.0.34-1" + }, { + name = "tree-sitter-ziggy", + url = "kristoff-it/ziggy", + version = "0.0.9-1" + }, { + name = "tree-sitter-ziggy_schema", + url = "kristoff-it/ziggy", + version = "0.0.9-1" + }, { + name = "treedoc.nvim", + url = "neo451/treedoc.nvim", + version = "1.0.3-1" }, { name = "trouble.nvim", url = "folke/trouble.nvim", - version = "3.4.3-1" + version = "3.7.1-1" + }, { + name = "ts-comments.nvim", + url = "folke/ts-comments.nvim", + version = "1.5.0-1" }, { name = "tsc.nvim", url = "dmmulroy/tsc.nvim", - version = "2.3.0-1" + version = "2.5.0-1" }, { name = "twilight.nvim", url = "folke/twilight.nvim", version = "1.0.0-1" + }, { + name = "u.nvim", + url = "jrop/u.nvim", + version = "0.2.0-1" }, { name = "unimpaired.nvim", url = "tummetott/unimpaired.nvim", - version = "0.2.0-1" + version = "0.3.0-1" }, { name = "vgit.nvim", url = "tanvirtin/vgit.nvim", - version = "0.2.2-1" + version = "1.0.6-1" }, { name = "which-key.nvim", url = "folke/which-key.nvim", - version = "2.1.0-1" + version = "3.16.0-1" }, { name = "windline.nvim", url = "windwp/windline.nvim", version = "1.1.0-1" + }, { + name = "winmove.nvim", + url = "MisanthropicBit/winmove.nvim", + version = "0.1.2-1" + }, { + name = "wormhole.nvim", + url = "NStefan002/wormhole.nvim", + version = "1.1.1-1" + }, { + name = "wrapping-paper.nvim", + url = "benlubas/wrapping-paper.nvim", + version = "1.0.0-1" }, { name = "yanky.nvim", url = "gbprod/yanky.nvim", version = "2.0.0-1" + }, { + name = "yarepl.nvim", + url = "milanglacier/yarepl.nvim", + version = "0.10.1-1" }, { name = "yazi.nvim", url = "mikavilpas/yazi.nvim", - version = "master-1" + version = "7.5.4-1" }, { name = "zen-mode.nvim", url = "folke/zen-mode.nvim", - version = "1.3.0-1" + version = "1.4.0-1" }, { name = "zk-nvim", url = "zk-org/zk-nvim", - version = "0.1.0-1" + version = "0.2.0-1" } } \ No newline at end of file diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index 4dc2419..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.8.2" -- x-release-please-version +M.version = "11.17.1" -- x-release-please-version M.ns = vim.api.nvim_create_namespace("lazy") @@ -253,8 +267,10 @@ M.mapleader = nil ---@type string M.maplocalleader = nil +M.suspended = false + function M.headless() - return #vim.api.nvim_list_uis() == 0 + return not M.suspended and #vim.api.nvim_list_uis() == 0 end ---@param opts? LazyConfig @@ -282,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 = { @@ -289,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 @@ -337,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/event.lua b/lua/lazy/core/handler/event.lua index aff4572..a34e0c5 100644 --- a/lua/lazy/core/handler/event.lua +++ b/lua/lazy/core/handler/event.lua @@ -75,7 +75,9 @@ function M:_add(event) end -- HACK: work-around for https://github.com/neovim/neovim/issues/25526 done = true - Util.track({ [self.type] = event.id }) + if event.id ~= "VeryLazy" then + Util.track({ [self.type] = event.id }) + end local state = M.get_state(ev.event, ev.buf, ev.data) @@ -86,7 +88,9 @@ function M:_add(event) for _, s in ipairs(state) do M.trigger(s) end - Util.track() + if event.id ~= "VeryLazy" then + Util.track() + 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 26b3f6e..37d1a8f 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -146,30 +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) - modspecs[#modspecs + 1] = modname + Util.lsmod(import, function(modname, modpath) + 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 @@ -177,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 @@ -225,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 @@ -272,15 +287,6 @@ function M.update_rocks_state() end end ----@param path string -function M.local_spec(path) - local file = vim.secure.read(path) - if file then - return loadstring(file)() - end - return {} -end - ---@return LazySpecImport? function M.find_local_spec() if not Config.options.local_spec then @@ -295,7 +301,7 @@ function M.find_local_spec() import = function() local data = vim.secure.read(file) if data then - return loadstring(data)() + return loadstring(data, M.LOCAL_SPEC)() end return {} end, diff --git a/lua/lazy/core/util.lua b/lua/lazy/core/util.lua index f42cf6a..83e8a92 100644 --- a/lua/lazy/core/util.lua +++ b/lua/lazy/core/util.lua @@ -29,6 +29,10 @@ function M.track(data, time) end end +function M.exiting() + return vim.v.exiting ~= vim.NIL +end + ---@generic T ---@param list T[] ---@param fn fun(v: T):boolean? @@ -62,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 @@ -167,7 +171,9 @@ function M.very_lazy() return end vim.g.did_very_lazy = true + M.track({ event = "VeryLazy" }) vim.api.nvim_exec_autocmds("User", { pattern = "VeryLazy", modeline = false }) + M.track() end) end @@ -264,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 @@ -283,7 +289,7 @@ function M.find_root(modname) local ret = require("lazy.core.cache").find(modname, { rtp = true, paths = paths, - patterns = { "", ".lua" }, + patterns = { ".lua", "" }, })[1] if not ret and cached then @@ -291,25 +297,27 @@ function M.find_root(modname) ret = require("lazy.core.cache").find(modname, { rtp = false, paths = paths, - patterns = { "", ".lua" }, + patterns = { ".lua", "" }, })[1] end if ret then - local root = ret.modpath:gsub("/init%.lua$", ""):gsub("%.lua$", "") - return root + return ret.modpath:gsub("%.lua$", ""), ret.modpath end end ---@param modname string ---@param fn fun(modname:string, modpath:string) function M.lsmod(modname, fn) - local root = M.find_root(modname) + local root, match = M.find_root(modname) if not root then return end - if vim.uv.fs_stat(root .. ".lua") then - fn(modname, root .. ".lua") + if match:sub(-4) == ".lua" then + fn(modname, match) + if not vim.uv.fs_stat(root) then + return + end end M.ls(root, function(path, name, type) @@ -366,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..afee2d4 100644 --- a/lua/lazy/docs.lua +++ b/lua/lazy/docs.lua @@ -131,7 +131,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 b3bf6f2..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,14 +37,18 @@ 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 "" - version = vim.trim(vim.split(version, "\n")[1]) - 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)) + 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 - found = ("{%s} `%s`"):format(c, version) - break + 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)) + else + found = ("{%s} `%s`"):format(c, version) + break + end end end end 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 a365824..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,7 +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 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 c7ceb4e..b3c4444 100644 --- a/lua/lazy/manage/lock.lua +++ b/lua/lazy/manage/lock.lua @@ -3,50 +3,53 @@ local Git = require("lazy.manage.git") local M = {} ----@type table +---@alias LazyLockfile table +---@type LazyLockfile M.lock = {} M._loaded = false function M.update() + M.load() vim.fn.mkdir(vim.fn.fnamemodify(Config.options.lockfile, ":p:h"), "p") local f = assert(io.open(Config.options.lockfile, "wb")) f:write("{\n") - M.lock = {} - ---@param plugin LazyPlugin - local plugins = vim.tbl_filter(function(plugin) - return not plugin._.is_local and plugin._.installed - end, Config.plugins) + -- keep disabled and cond plugins + for name in pairs(M.lock) do + if not (Config.spec.disabled[name] or Config.spec.ignore_installed[name]) then + M.lock[name] = nil + end + end + + for _, plugin in pairs(Config.plugins) do + if not plugin._.is_local and plugin._.installed then + local info = assert(Git.info(plugin.dir)) + M.lock[plugin.name] = { + branch = info.branch or assert(Git.get_branch(plugin)), + commit = assert(info.commit, "commit is nil"), + } + end + end - ---@param plugin LazyPlugin ---@type string[] - local names = vim.tbl_map(function(plugin) - return plugin.name - end, plugins) + local names = vim.tbl_keys(M.lock) table.sort(names) for n, name in ipairs(names) do - local plugin = Config.plugins[name] - if not plugin._.is_local and plugin._.installed then - local info = assert(Git.info(plugin.dir)) - if not info.branch then - info.branch = assert(Git.get_branch(plugin)) - end - info.commit = info.commit - -- f:write(([[ [%q] = { branch = %q, commit = %q },]]):format(name, info.branch, info.commit) .. "\n") - f:write(([[ %q: { "branch": %q, "commit": %q }]]):format(name, info.branch, info.commit)) - if n ~= #names then - f:write(",\n") - end - ---@diagnostic disable-next-line: assign-type-mismatch - M.lock[plugin.name] = info + local info = M.lock[name] + f:write(([[ %q: { "branch": %q, "commit": %q }]]):format(name, info.branch, info.commit)) + if n ~= #names then + f:write(",\n") end end - f:write("\n}") + f:write("\n}\n") f:close() end function M.load() + if M._loaded then + return + end M.lock = {} M._loaded = true local f = io.open(Config.options.lockfile, "r") @@ -64,9 +67,7 @@ end ---@param plugin LazyPlugin ---@return {commit:string, branch:string} function M.get(plugin) - if not M._loaded then - M.load() - end + M.load() return M.lock[plugin.name] end diff --git a/lua/lazy/manage/process.lua b/lua/lazy/manage/process.lua index c4a4baf..0a67a14 100644 --- a/lua/lazy/manage/process.lua +++ b/lua/lazy/manage/process.lua @@ -93,7 +93,7 @@ function Process:_run() end) self:suspend() while not (self.handle:is_closing() and stdout:is_closing() and stderr:is_closing()) do - coroutine.yield() + Async.yield() end else self.data = "Failed to spawn process " .. self.cmd .. " " .. vim.inspect(self.opts) diff --git a/lua/lazy/manage/runner.lua b/lua/lazy/manage/runner.lua index c5f5c75..81dcde0 100644 --- a/lua/lazy/manage/runner.lua +++ b/lua/lazy/manage/runner.lua @@ -78,6 +78,7 @@ function Runner:_start() ---@type number? local wait_step = nil + ---@async ---@param resume? boolean local function continue(resume) active = 0 @@ -114,22 +115,30 @@ function Runner:_start() end local s = state[name] local plugin = self:plugin(name) - if s.step == #self._pipeline then - -- done - s.task = nil - plugin._.working = false - elseif s.step < #self._pipeline then - -- next - s.step = s.step + 1 - local step = self._pipeline[s.step] - if step.task == "wait" then + while s.step <= #self._pipeline do + if s.step == #self._pipeline then + -- done + s.task = nil plugin._.working = false - waiting = waiting + 1 - wait_step = s.step - else - s.task = self:queue(plugin, step) - plugin._.working = true - active = active + 1 + break + elseif s.step < #self._pipeline then + -- next + s.step = s.step + 1 + local step = self._pipeline[s.step] + if step.task == "wait" then + plugin._.working = false + waiting = waiting + 1 + wait_step = s.step + break + else + s.task = self:queue(plugin, step) + plugin._.working = true + if s.task then + active = active + 1 + s.task:wake(false) + break + end + end end end end @@ -144,7 +153,9 @@ function Runner:_start() end continue(true) end - coroutine.yield() + if active > 0 then + self._running:suspend() + end end 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 4bd7134..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 = {} @@ -21,6 +67,7 @@ M.log = { ---@async ---@param opts {args?: string[], updated?:boolean, check?:boolean} run = function(self, opts) + -- self:spawn({ "sleep", "5" }) local args = { "log", "--pretty=format:%h %s (%cr)", @@ -31,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(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") @@ -43,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 @@ -62,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, } @@ -71,6 +130,7 @@ M.clone = { end, ---@async run = function(self) + throttle.wait() local args = { "clone", self.plugin.url, @@ -215,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", @@ -235,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, } @@ -249,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)) @@ -268,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 7da2b2a..0b8f3ca 100644 --- a/lua/lazy/minit.lua +++ b/lua/lazy/minit.lua @@ -20,11 +20,36 @@ function M.extend(defaults, opts) return vim.tbl_deep_extend("force", defaults, opts, { spec = spec }) end +---@param opts LazyConfig 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 + for _, a in ipairs(_G.arg) do + if a == "--busted" then + is_busted = true + elseif a == "--minitest" then + is_minitest = true + else + table.insert(args, a) + end + end + _G.arg = args + + if is_busted then + opts = M.busted.setup(opts) + elseif is_minitest then + opts = M.minitest.setup(opts) + end + -- set stdpaths to use .tests if vim.env.LAZY_STDPATH then local root = vim.fn.fnamemodify(vim.env.LAZY_STDPATH, ":p") @@ -32,7 +57,6 @@ 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 @@ -48,6 +72,12 @@ function M.setup(opts) vim.cmd.close() end end + + if is_busted then + M.busted.run() + elseif is_minitest then + M.minitest.run() + end end function M.repro(opts) @@ -68,18 +98,9 @@ function M.repro(opts) M.setup(opts) end ----@param opts LazyConfig -function M.busted(opts) - opts = M.extend({ - spec = { - "lunarmodules/busted", - { dir = vim.fn.fnamemodify(".", ":p") }, - }, - rocks = { hererocks = true }, - }, opts) - - M.setup(opts) +M.minitest = {} +function M.minitest.run() local Config = require("lazy.core.config") -- disable termnial output for the tests Config.options.headless = {} @@ -87,10 +108,107 @@ function M.busted(opts) 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 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() + 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" -- run busted return pcall(require("busted.runner"), { standalone = false, }) or os.exit(1) end +---@param opts LazyConfig +function M.busted.setup(opts) + local args = table.concat(_G.arg, " ") + local json = args:find("--output[ =]json") + + return M.extend({ + spec = { + "lunarmodules/busted", + { dir = vim.uv.cwd() }, + }, + headless = { + process = not json, + log = not json, + task = not json, + }, + rocks = { hererocks = true }, + }, opts) +end + +---@param opts LazyConfig +function M.busted.init(opts) + opts = M.busted.setup(opts) + M.setup(opts) + M.busted.run() +end + +setmetatable(M.busted, { + __call = function(_, opts) + M.busted.init(opts) + end, +}) + return M 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 36865db..015a2be 100644 --- a/lua/lazy/stats.lua +++ b/lua/lazy/stats.lua @@ -21,6 +21,7 @@ M.C = nil function M.on_ui_enter() M._stats.startuptime = M.track("UIEnter") + require("lazy.core.util").track({ start = "startuptime" }, M._stats.startuptime * 1e6) vim.api.nvim_exec_autocmds("User", { pattern = "LazyVimStarted", modeline = false }) end 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/config.lua b/lua/lazy/view/config.lua index e834573..d65f03c 100644 --- a/lua/lazy/view/config.lua +++ b/lua/lazy/view/config.lua @@ -34,6 +34,8 @@ M.keys = { profile_sort = "", profile_filter = "", abort = "", + next = "]]", + prev = "[[", } ---@type table diff --git a/lua/lazy/view/float.lua b/lua/lazy/view/float.lua index d57b384..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 @@ -252,7 +252,7 @@ end ---@param fn fun(self?) ---@param desc? string ---@param mode? string[] -function M:on_key(key, fn, desc,mode) +function M:on_key(key, fn, desc, mode) vim.keymap.set(mode or "n", key, function() fn(self) end, { @@ -295,6 +295,7 @@ function M:close(opts) vim.diagnostic.reset(Config.ns, buf) vim.api.nvim_buf_delete(buf, { force = true }) end + vim.cmd.redraw() end) end diff --git a/lua/lazy/view/init.lua b/lua/lazy/view/init.lua index b27a17e..e8444eb 100644 --- a/lua/lazy/view/init.lua +++ b/lua/lazy/view/init.lua @@ -83,8 +83,9 @@ function M.create() vim.keymap.set("n", ViewConfig.keys.abort, function() 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 }) @@ -96,17 +97,49 @@ function M.create() name = plugin.name, kind = plugin._.kind, } - self.state.plugin = not vim.deep_equal(self.state.plugin, selected) and selected or nil + + local open = not vim.deep_equal(self.state.plugin, selected) + + if not open then + local row = self.render:get_row(selected) + if row then + vim.api.nvim_win_set_cursor(self.view.win, { row, 8 }) + end + end + + 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) + for l = 1, #self.render.locations, 1 do + local loc = self.render.locations[l] + if loc.from > cursor[1] then + vim.api.nvim_win_set_cursor(self.view.win, { loc.from, 8 }) + return + end + end + end, "Next Plugin") + + self:on_key(ViewConfig.keys.prev, function() + local cursor = vim.api.nvim_win_get_cursor(self.view.win) + for l = #self.render.locations, 1, -1 do + local loc = self.render.locations[l] + if loc.from < cursor[1] then + vim.api.nvim_win_set_cursor(self.view.win, { loc.from, 8 }) + return + 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 @@ -126,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 @@ -186,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} @@ -261,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) @@ -283,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 b7bd884..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 @@ -122,6 +122,15 @@ function M:get_plugin(row) end end +---@param selected {name:string, kind?: LazyPluginKind} +function M:get_row(selected) + for _, loc in ipairs(self.locations) do + if loc.kind == selected.kind and loc.name == selected.name then + return loc.from + end + end +end + function M:title() self:nl() local modes = vim.tbl_filter(function(c) @@ -135,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 @@ -192,7 +199,15 @@ function M:help() :nl() self:append("or the plugin was just updated. Otherwise the plugin webpage will open."):nl():nl() - self:append("Use "):append("", "LazySpecial"):append(" on a commit or plugin to open the diff view"):nl() + self:append("Use "):append("", "LazySpecial"):append(" on a commit or plugin to open the diff view"):nl():nl() + self + :append("Use ") + :append("<]]>", "LazySpecial") + :append(" and ") + :append("<[[>", "LazySpecial") + :append(" to navigate between plugins") + :nl() + :nl() self:nl() self:append("Keyboard Shortcuts", "LazyH2"):nl() @@ -744,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 new file mode 100755 index 0000000..ffbb540 --- /dev/null +++ b/scripts/test @@ -0,0 +1,3 @@ +#!/bin/env bash + +nvim -l tests/minit.lua --minitest diff --git a/tests/core/init_spec.lua b/tests/core/init_spec.lua index 4970871..356f8e4 100644 --- a/tests/core/init_spec.lua +++ b/tests/core/init_spec.lua @@ -1,4 +1,3 @@ ----@module 'luassert' local Util = require("lazy.core.util") describe("init", function() diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua index d810339..7982649 100644 --- a/tests/core/plugin_spec.lua +++ b/tests/core/plugin_spec.lua @@ -1,5 +1,3 @@ ----@module 'luassert' - local Config = require("lazy.core.config") local Handler = require("lazy.core.handler") local Plugin = require("lazy.core.plugin") @@ -27,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/tests/handlers/keys_spec.lua b/tests/handlers/keys_spec.lua index d6a9df4..6254db8 100644 --- a/tests/handlers/keys_spec.lua +++ b/tests/handlers/keys_spec.lua @@ -1,4 +1,3 @@ ----@module 'luassert' local Keys = require("lazy.core.handler.keys") describe("keys", function() diff --git a/tests/manage/process_spec.lua b/tests/manage/process_spec.lua index 0fbbe89..03b653e 100644 --- a/tests/manage/process_spec.lua +++ b/tests/manage/process_spec.lua @@ -1,4 +1,3 @@ ----@module 'luassert' local Async = require("lazy.async") local Process = require("lazy.manage.process") diff --git a/tests/manage/runner_spec.lua b/tests/manage/runner_spec.lua index 925aaf1..a2507c9 100644 --- a/tests/manage/runner_spec.lua +++ b/tests/manage/runner_spec.lua @@ -1,3 +1,4 @@ +local Async = require("lazy.async") local Runner = require("lazy.manage.runner") describe("runner", function() @@ -33,7 +34,7 @@ describe("runner", function() ---@async ---@param task LazyTask run = function(task) - coroutine.yield() + Async.yield() table.insert(runs, { plugin = task.plugin.name, task = task.name }) end, } diff --git a/tests/manage/task_spec.lua b/tests/manage/task_spec.lua index e161fa2..f41eb80 100644 --- a/tests/manage/task_spec.lua +++ b/tests/manage/task_spec.lua @@ -1,5 +1,5 @@ ----@module 'luassert' --# selene:allow(incorrect_standard_library_use) +local Async = require("lazy.async") local Task = require("lazy.manage.task") describe("task", function() @@ -43,7 +43,7 @@ describe("task", function() local running = true ---@async local task = Task.new(plugin, "test", function() - coroutine.yield() + Async.yield() running = false end, opts) assert(task:running()) diff --git a/tests/busted.lua b/tests/minit.lua similarity index 59% rename from tests/busted.lua rename to tests/minit.lua index 7292d3e..e62be39 100755 --- a/tests/busted.lua +++ b/tests/minit.lua @@ -5,7 +5,8 @@ vim.env.LAZY_STDPATH = ".tests" vim.opt.rtp:prepend(".") -- Setup lazy.nvim -require("lazy.minit").busted({ - spec = {}, - stdpath = ".tests", +require("lazy.minit").setup({ + spec = { + { dir = vim.uv.cwd() }, + }, }) diff --git a/tests/run b/tests/run deleted file mode 100755 index 7872f5a..0000000 --- a/tests/run +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -nvim -l tests/busted.lua tests -o utfTerminal "$@"