Update generated nvim config
This commit is contained in:
@ -1,5 +1,6 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copy init.lua
|
||||||
INIT_PATH="$(readlink -f ~/.config/nvim/init.lua)"
|
INIT_PATH="$(readlink -f ~/.config/nvim/init.lua)"
|
||||||
cp -f "$INIT_PATH" ./config.lua
|
cp -f "$INIT_PATH" ./config.lua
|
||||||
cp -f "$INIT_PATH" ./config_nix.lua
|
cp -f "$INIT_PATH" ./config_nix.lua
|
||||||
@ -10,6 +11,7 @@ chmod +w ./config_nix.lua
|
|||||||
echo "Fixed permission for ./config.lua and ./config_nix.lua"
|
echo "Fixed permission for ./config.lua and ./config_nix.lua"
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
|
# Copy all plugins
|
||||||
rm -rf ./store/*
|
rm -rf ./store/*
|
||||||
echo "Cleared ./store/"
|
echo "Cleared ./store/"
|
||||||
|
|
||||||
@ -24,6 +26,7 @@ chmod -R +w ./store/*
|
|||||||
echo "Fixed permissions for ./store"
|
echo "Fixed permissions for ./store"
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
|
# Fix plugin paths
|
||||||
for IDENTIFIER in "treesitter-parsers" "lazy-plugins" "nvim-treesitter"
|
for IDENTIFIER in "treesitter-parsers" "lazy-plugins" "nvim-treesitter"
|
||||||
do
|
do
|
||||||
CURRENT_PATH=$(eza -1 ./store | grep $IDENTIFIER)
|
CURRENT_PATH=$(eza -1 ./store | grep $IDENTIFIER)
|
||||||
|
|||||||
89
config/neovim/store/lazy-plugins/vimplugin-nvim-lazydev/.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
89
config/neovim/store/lazy-plugins/vimplugin-nvim-lazydev/.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
name: Bug Report
|
||||||
|
description: File a bug/issue
|
||||||
|
title: "bug: "
|
||||||
|
labels: [bug]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
**Before** reporting an issue, make sure to read the [documentation](https://github.com/folke/lazydev.nvim) and search [existing issues](https://github.com/folke/lazydev.nvim/issues). Usage questions such as ***"How do I...?"*** belong in [Discussions](https://github.com/folke/lazydev.nvim/discussions) and will be closed.
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Did you check docs and existing issues?
|
||||||
|
description: Make sure you checked all of the below before submitting an issue
|
||||||
|
options:
|
||||||
|
- label: I have read all the lazydev.nvim docs
|
||||||
|
required: true
|
||||||
|
- label: I have searched the existing issues of lazydev.nvim
|
||||||
|
required: true
|
||||||
|
- label: I have searched the existing issues of plugins related to this issue
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: "Neovim version (nvim -v)"
|
||||||
|
placeholder: "0.8.0 commit db1b0ee3b30f"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: "Operating system/version"
|
||||||
|
placeholder: "MacOS 11.5"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Describe the bug
|
||||||
|
description: A clear and concise description of what the bug is. Please include any related errors you see in Neovim.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Steps To Reproduce
|
||||||
|
description: Steps to reproduce the behavior.
|
||||||
|
placeholder: |
|
||||||
|
1.
|
||||||
|
2.
|
||||||
|
3.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Expected Behavior
|
||||||
|
description: A concise description of what you expected to happen.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
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")
|
||||||
|
|
||||||
|
-- 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",
|
||||||
|
"folke/lazydev.nvim",
|
||||||
|
-- add any other plugins here
|
||||||
|
}
|
||||||
|
require("lazy").setup(plugins, {
|
||||||
|
root = root .. "/plugins",
|
||||||
|
})
|
||||||
|
|
||||||
|
vim.cmd.colorscheme("tokyonight")
|
||||||
|
-- add anything else here
|
||||||
|
render: Lua
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
@ -0,0 +1,36 @@
|
|||||||
|
name: Feature Request
|
||||||
|
description: Suggest a new feature
|
||||||
|
title: "feature: "
|
||||||
|
labels: [enhancement]
|
||||||
|
body:
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Did you check the docs?
|
||||||
|
description: Make sure you read all the docs before submitting a feature request
|
||||||
|
options:
|
||||||
|
- label: I have read all the lazydev.nvim docs
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
attributes:
|
||||||
|
label: Is your feature request related to a problem? Please describe.
|
||||||
|
description: A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||||
|
- type: textarea
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
attributes:
|
||||||
|
label: Describe the solution you'd like
|
||||||
|
description: A clear and concise description of what you want to happen.
|
||||||
|
- type: textarea
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
attributes:
|
||||||
|
label: Describe alternatives you've considered
|
||||||
|
description: A clear and concise description of any alternative solutions or features you've considered.
|
||||||
|
- type: textarea
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
attributes:
|
||||||
|
label: Additional context
|
||||||
|
description: Add any other context or screenshots about the feature request here.
|
||||||
84
config/neovim/store/lazy-plugins/vimplugin-nvim-lazydev/.github/workflows/ci.yml
vendored
Normal file
84
config/neovim/store/lazy-plugins/vimplugin-nvim-lazydev/.github/workflows/ci.yml
vendored
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
name: CI
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
tests:
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
# os: [ubuntu-latest, windows-latest]
|
||||||
|
os: [ubuntu-latest]
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- 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
|
||||||
|
nvim --headless -u tests/init.lua -c "PlenaryBustedDirectory tests/ {minimal_init = 'tests/init.lua', sequential = true}"
|
||||||
|
docs:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: tests
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- 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: Generate docs
|
||||||
|
# run: |
|
||||||
|
# nvim --version
|
||||||
|
# nvim --headless -u tests/init.lua -l "lua/lazydev/docs.lua"
|
||||||
|
- name: panvimdoc
|
||||||
|
uses: kdheepak/panvimdoc@main
|
||||||
|
with:
|
||||||
|
vimdoc: lazydev.nvim
|
||||||
|
version: "Neovim >= 0.8.0"
|
||||||
|
demojify: true
|
||||||
|
treesitter: true
|
||||||
|
- name: Push changes
|
||||||
|
uses: stefanzweifel/git-auto-commit-action@v4
|
||||||
|
with:
|
||||||
|
commit_message: "chore(build): auto-generate vimdoc"
|
||||||
|
commit_user_name: "github-actions[bot]"
|
||||||
|
commit_user_email: "github-actions[bot]@users.noreply.github.com"
|
||||||
|
commit_author: "github-actions[bot] <github-actions[bot]@users.noreply.github.com>"
|
||||||
|
release:
|
||||||
|
name: release
|
||||||
|
if: ${{ github.ref == 'refs/heads/main' }}
|
||||||
|
needs:
|
||||||
|
- docs
|
||||||
|
- tests
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: google-github-actions/release-please-action@v3
|
||||||
|
id: release
|
||||||
|
with:
|
||||||
|
release-type: simple
|
||||||
|
package-name: lazydev.nvim
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- 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
|
||||||
@ -0,0 +1,115 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
## [1.4.0](https://github.com/folke/lazydev.nvim/compare/v1.3.0...v1.4.0) (2024-06-04)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* added a `LazyDev` debugging command that shows libraries and settings for the current buffer ([3f6320d](https://github.com/folke/lazydev.nvim/commit/3f6320d43198bb847cbad6fd2a577dda18554f29))
|
||||||
|
* added support for loading libraries based on words/mods ([7fabc0d](https://github.com/folke/lazydev.nvim/commit/7fabc0d5a44b3002b88c7c32b2b67bd3742c23ae))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **pkg:** luvit-meta/library not found using native package system ([#19](https://github.com/folke/lazydev.nvim/issues/19)) ([96062a7](https://github.com/folke/lazydev.nvim/commit/96062a7b94d5e6c3b4ec746b5d8d2a69e6389761))
|
||||||
|
* **workspace:** make sure we always add the /lua root of the current project ([50927b4](https://github.com/folke/lazydev.nvim/commit/50927b4e70dce1ff68103ef1f2c197f1b75f4ac4))
|
||||||
|
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* only update single when needed ([fe37da2](https://github.com/folke/lazydev.nvim/commit/fe37da2cc14d4faffbe96be09b3fd08aa58ae972))
|
||||||
|
|
||||||
|
## [1.3.0](https://github.com/folke/lazydev.nvim/compare/v1.2.1...v1.3.0) (2024-06-03)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **config:** make it easier to specify plugin paths in library ([890c7d5](https://github.com/folke/lazydev.nvim/commit/890c7d5b982b829e2881f21d739e689772c7971e))
|
||||||
|
* prettier debug ([fe68a25](https://github.com/folke/lazydev.nvim/commit/fe68a25bb37c8e683e233f09a5dd6c80c3ea9c64))
|
||||||
|
* prettier debug ([766931a](https://github.com/folke/lazydev.nvim/commit/766931a928787e12dd42efef605b4aecdccffc11))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* added single file support. Fixes [#10](https://github.com/folke/lazydev.nvim/issues/10) ([0592c8f](https://github.com/folke/lazydev.nvim/commit/0592c8f80a7c9bb99b7ea4d8a047d2d3bddeebd1))
|
||||||
|
* fixup for debug. See [#10](https://github.com/folke/lazydev.nvim/issues/10) ([f3b3795](https://github.com/folke/lazydev.nvim/commit/f3b3795c6daf11da989220d859c0468b82d766ae))
|
||||||
|
* **lsp:** dont error when workspace not loaded yet. Fixes [#10](https://github.com/folke/lazydev.nvim/issues/10) ([41e5bb1](https://github.com/folke/lazydev.nvim/commit/41e5bb150020d0841fffdd52e6a4942f51004986))
|
||||||
|
* **lsp:** try to avoid incorrect temporary diagnostics ([22473af](https://github.com/folke/lazydev.nvim/commit/22473afec50117716db4a25e0b064437b8c6a1bd))
|
||||||
|
* pass root_dir to enabled instead of lsp client ([37ba8ac](https://github.com/folke/lazydev.nvim/commit/37ba8ac79ab48762486deb9891547fde88a86763))
|
||||||
|
* remove lazy.nvim dep ([4bd9af4](https://github.com/folke/lazydev.nvim/commit/4bd9af4b388c5f937c3f2308a1ead2ea2f68b09d))
|
||||||
|
* revert set_handlers for now ([f2fe955](https://github.com/folke/lazydev.nvim/commit/f2fe95553b21fb7596c7cb060063886f17eb38c8))
|
||||||
|
* windows fixes [#12](https://github.com/folke/lazydev.nvim/issues/12) ([f98d85a](https://github.com/folke/lazydev.nvim/commit/f98d85a16771282caceeefa0d9a65336f8b44437))
|
||||||
|
* **workspace:** don't add workspace folder as library. See [#13](https://github.com/folke/lazydev.nvim/issues/13) ([ae12a62](https://github.com/folke/lazydev.nvim/commit/ae12a6224c466315f6ecbe6ed1ee7c5641f21d40))
|
||||||
|
* **workspace:** resolve real paths. Fixes [#13](https://github.com/folke/lazydev.nvim/issues/13) ([b32bc5a](https://github.com/folke/lazydev.nvim/commit/b32bc5a0c6d50d0c2c3f5101a3f967d2222a539e))
|
||||||
|
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* debounce LuaLS updates ([7d843b9](https://github.com/folke/lazydev.nvim/commit/7d843b9f3aa9240e38854e7bc4df389929dbe44a))
|
||||||
|
* dont return workspace library for the fallback scope ([2e715cd](https://github.com/folke/lazydev.nvim/commit/2e715cd4629df2b47d92468935226655cb7e88ed))
|
||||||
|
* **lsp:** explicitely disable the fallback scope when no scopeUri and in a workspace ([b9ecd40](https://github.com/folke/lazydev.nvim/commit/b9ecd4034358a39859216d64b8548fa2b577af95))
|
||||||
|
* properly track library usage per workspace folder ([48267c8](https://github.com/folke/lazydev.nvim/commit/48267c807750610f3f8f7cb1469308f68243f081))
|
||||||
|
|
||||||
|
## [1.2.1](https://github.com/folke/lazydev.nvim/compare/v1.2.0...v1.2.1) (2024-06-02)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* added support for module names with forward slashes instead of dots ([3c9423a](https://github.com/folke/lazydev.nvim/commit/3c9423a021a8e2890b2029ad20d830c713720afc))
|
||||||
|
|
||||||
|
## [1.2.0](https://github.com/folke/lazydev.nvim/compare/v1.1.0...v1.2.0) (2024-06-02)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* added fast cmp completion source for require statements and module annotations ([a5c908d](https://github.com/folke/lazydev.nvim/commit/a5c908dc8eec1823c5a6dfbb07fbe8c74fce3a14))
|
||||||
|
* **buf:** added support for `---[@module](https://github.com/module) "foobar"`. Fixes [#4](https://github.com/folke/lazydev.nvim/issues/4) ([6d0aaae](https://github.com/folke/lazydev.nvim/commit/6d0aaaea20d270c2c49fb0ff8b2835717e635f0d))
|
||||||
|
* **config:** allow library to be a list of strings, or a table for easier merging ([6227a55](https://github.com/folke/lazydev.nvim/commit/6227a55bd1a4b7dcdc911377032ec5bb4eedba6b))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **buf:** implement on_reload ([1af5a6e](https://github.com/folke/lazydev.nvim/commit/1af5a6e801e16cf02a1ba0dc4808e522f2d06ae2))
|
||||||
|
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* **buf:** not needed to use treesitter to parse requires ([62c8bbf](https://github.com/folke/lazydev.nvim/commit/62c8bbff840432eb9e7fd3d994751cbb95c89e25))
|
||||||
|
|
||||||
|
## [1.1.0](https://github.com/folke/lazydev.nvim/compare/v1.0.0...v1.1.0) (2024-06-01)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* added support for Neovim's package system ([37a48c0](https://github.com/folke/lazydev.nvim/commit/37a48c05311269d5cb08f0f2131e1ad583c6a485))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* always call on_change when ataching new buffer ([f0de1e7](https://github.com/folke/lazydev.nvim/commit/f0de1e75f8e3a98e37ddf8d9b923ded039ff504e))
|
||||||
|
* **pkg:** normalize paths for packpaths ([ee3d47f](https://github.com/folke/lazydev.nvim/commit/ee3d47f3a53891483c8a3e02f8c3e49a12064434))
|
||||||
|
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* batch require changes from file in one go ([45ef0d0](https://github.com/folke/lazydev.nvim/commit/45ef0d06cabac70c8615ae679d9efc72305f2142))
|
||||||
|
* **pkg:** cache unloaded packs for packpath impl ([95aabb2](https://github.com/folke/lazydev.nvim/commit/95aabb27a0a8fec9826c6ca45ff8ba3d886a8888))
|
||||||
|
|
||||||
|
## 1.0.0 (2024-06-01)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* Config.enabled ([b2da629](https://github.com/folke/lazydev.nvim/commit/b2da6296892323254b5841d45e643dcdaa6fbeb3))
|
||||||
|
* config.enabled can be a function/boolean ([8434266](https://github.com/folke/lazydev.nvim/commit/8434266c8dd5c690134f5e66d340633e9f63e7bf))
|
||||||
|
* initial commit ([77c5029](https://github.com/folke/lazydev.nvim/commit/77c5029d68941dfdbb3eaee4910bdc97d5c9a93b))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* automatically add `/lua` when needed ([feef58f](https://github.com/folke/lazydev.nvim/commit/feef58f427d54ffebeec8f09b4d8c31dbea9b1c3))
|
||||||
|
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* update LSP with vim.schedule ([c211df9](https://github.com/folke/lazydev.nvim/commit/c211df939c5af6d8c0de0d6abfff300805fe66a7))
|
||||||
@ -0,0 +1,133 @@
|
|||||||
|
# 💻 `lazydev.nvim`
|
||||||
|
|
||||||
|
**lazydev.nvim** is a plugin that properly configures [LuaLS](https://luals.github.io/)
|
||||||
|
for editing your **Neovim** config by lazily updating your
|
||||||
|
workspace libraries.
|
||||||
|
|
||||||
|
## 🚀 Features
|
||||||
|
|
||||||
|
- much faster auto-completion, since only the modules you `require`
|
||||||
|
in open Neovim files will be loaded.
|
||||||
|
- no longer needed to configure what plugin sources you want
|
||||||
|
to have enabled for a certain project
|
||||||
|
- load third-party addons from [LLS-Addons](https://github.com/LuaLS/LLS-Addons)
|
||||||
|
- will update your workspace libraries for:
|
||||||
|
- **require** statements: `require("nvim-treesitter")`
|
||||||
|
- **module annotations**: `---@module "nvim-treesitter"`
|
||||||
|
- [nvim-cmp](https://github.com/hrsh7th/nvim-cmp) completion source for the above
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## ⚠️ Limitations
|
||||||
|
|
||||||
|
- If you have files that only use types from a plugin,
|
||||||
|
then those types won't be available in your workspace.
|
||||||
|
- completion for module names when typing `require(...)`
|
||||||
|
will only return loaded modules in your workspace.
|
||||||
|
- To get around the above, you can:
|
||||||
|
- pre-load those plugins with the `library` option.
|
||||||
|
- use the **nvim-cmp** completion source to get all available modules.
|
||||||
|
- Neovim types are **NOT** included and also no longer needed
|
||||||
|
on **Neovim >= 0.10**
|
||||||
|
|
||||||
|
## ⚡️ Requirements
|
||||||
|
|
||||||
|
- Neovim >= 0.10.0
|
||||||
|
- [lazy.nvim](https://github.com/folke/lazy.nvim) plugin manager
|
||||||
|
- **OR** a plugin manager that uses **Neovim**'s native package system
|
||||||
|
|
||||||
|
## 📦 Installation
|
||||||
|
|
||||||
|
With [lazy.nvim](https://github.com/folke/lazy.nvim):
|
||||||
|
|
||||||
|
```lua
|
||||||
|
return {
|
||||||
|
{
|
||||||
|
"folke/lazydev.nvim",
|
||||||
|
ft = "lua", -- only load on lua files
|
||||||
|
opts = {
|
||||||
|
library = {
|
||||||
|
-- See the configuration section for more details
|
||||||
|
-- Load luvit types when the `vim.uv` word is found
|
||||||
|
{ path = "luvit-meta/library", words = { "vim%.uv" } },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ "Bilal2453/luvit-meta", lazy = true }, -- optional `vim.uv` typings
|
||||||
|
{ -- optional completion source for require statements and module annotations
|
||||||
|
"hrsh7th/nvim-cmp",
|
||||||
|
opts = function(_, opts)
|
||||||
|
opts.sources = opts.sources or {}
|
||||||
|
table.insert(opts.sources, {
|
||||||
|
name = "lazydev",
|
||||||
|
group_index = 0, -- set group index to 0 to skip loading LuaLS completions
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
-- { "folke/neodev.nvim", enabled = false }, -- make sure to uninstall or disable neodev.nvim
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## ⚙️ Configuration
|
||||||
|
|
||||||
|
> [!TIP]
|
||||||
|
> You can force enable/disable **lazydev** in certain project folders using [:h 'exrc'](https://neovim.io/doc/user/options.html#'exrc')
|
||||||
|
> with `vim.g.lazydev_enabled = true` or `vim.g.lazydev_enabled = false`
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
```lua
|
||||||
|
|
||||||
|
{
|
||||||
|
"folke/lazydev.nvim",
|
||||||
|
ft = "lua", -- only load on lua files
|
||||||
|
opts = {
|
||||||
|
library = {
|
||||||
|
-- Library paths can be absolute
|
||||||
|
"~/projects/my-awesome-lib",
|
||||||
|
-- Or relative, which means they will be resolved from the plugin dir.
|
||||||
|
"lazy.nvim",
|
||||||
|
"luvit-meta/library",
|
||||||
|
-- It can also be a table with trigger words / mods
|
||||||
|
-- Only load luvit types when the `vim.uv` word is found
|
||||||
|
{ path = "luvit-meta/library", words = { "vim%.uv" } },
|
||||||
|
-- always load the LazyVim library
|
||||||
|
"LazyVim",
|
||||||
|
-- Only load the lazyvim library when the `LazyVim` global is found
|
||||||
|
{ path = "LazyVim", words = { "LazyVim" } },
|
||||||
|
-- Load the wezterm types when the `wezterm` module is required
|
||||||
|
-- Needs `justinsgithub/wezterm-types` to be installed
|
||||||
|
{ path = "wezterm-types", mods = { "wezterm" } },
|
||||||
|
},
|
||||||
|
-- always enable unless `vim.g.lazydev_enabled = false`
|
||||||
|
-- This is the default
|
||||||
|
enabled = function(root_dir)
|
||||||
|
return vim.g.lazydev_enabled == nil and true or vim.g.lazydev_enabled
|
||||||
|
end,
|
||||||
|
-- disable then a .luarc.json file is found
|
||||||
|
enabled = function(root_dir)
|
||||||
|
return not vim.uv.fs_stat(root_dir .. "/.luarc.json")
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
```
|
||||||
|
|
||||||
|
Default settings:
|
||||||
|
|
||||||
|
```lua
|
||||||
|
---@alias lazydev.Library {path:string, words:string[], mods:string[]}
|
||||||
|
---@alias lazydev.Library.spec string|{path:string, words?:string[], mods?:string[]}
|
||||||
|
---@class lazydev.Config
|
||||||
|
local defaults = {
|
||||||
|
runtime = vim.env.VIMRUNTIME --[[@as string]],
|
||||||
|
library = {}, ---@type lazydev.Library.spec[]
|
||||||
|
-- add the cmp source for completion of:
|
||||||
|
-- `require "modname"`
|
||||||
|
-- `---@module "modname"`
|
||||||
|
cmp = true,
|
||||||
|
---@type boolean|(fun(root:string):boolean?)
|
||||||
|
enabled = function(root_dir)
|
||||||
|
return vim.g.lazydev_enabled == nil and true or vim.g.lazydev_enabled
|
||||||
|
end,
|
||||||
|
}
|
||||||
|
```
|
||||||
@ -0,0 +1,159 @@
|
|||||||
|
*lazydev.nvim.txt* For Neovim >= 0.8.0 Last change: 2024 June 04
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
Table of Contents *lazydev.nvim-table-of-contents*
|
||||||
|
|
||||||
|
1. lazydev.nvim |lazydev.nvim-lazydev.nvim|
|
||||||
|
- Features |lazydev.nvim-lazydev.nvim-features|
|
||||||
|
- Limitations |lazydev.nvim-lazydev.nvim-limitations|
|
||||||
|
- Requirements |lazydev.nvim-lazydev.nvim-requirements|
|
||||||
|
- Installation |lazydev.nvim-lazydev.nvim-installation|
|
||||||
|
- Configuration |lazydev.nvim-lazydev.nvim-configuration|
|
||||||
|
2. Links |lazydev.nvim-links|
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
1. lazydev.nvim *lazydev.nvim-lazydev.nvim*
|
||||||
|
|
||||||
|
**lazydev.nvim** is a plugin that properly configures LuaLS
|
||||||
|
<https://luals.github.io/> for editing your **Neovim** config by lazily
|
||||||
|
updating your workspace libraries.
|
||||||
|
|
||||||
|
|
||||||
|
FEATURES *lazydev.nvim-lazydev.nvim-features*
|
||||||
|
|
||||||
|
- much faster auto-completion, since only the modules you `require`
|
||||||
|
in open Neovim files will be loaded.
|
||||||
|
- no longer needed to configure what plugin sources you want
|
||||||
|
to have enabled for a certain project
|
||||||
|
- load third-party addons from LLS-Addons <https://github.com/LuaLS/LLS-Addons>
|
||||||
|
- will update your workspace libraries for:
|
||||||
|
- **require** statements: `require("nvim-treesitter")`
|
||||||
|
- **module annotations**`---@module "nvim-treesitter"`
|
||||||
|
- nvim-cmp <https://github.com/hrsh7th/nvim-cmp> completion source for the above
|
||||||
|
|
||||||
|
|
||||||
|
LIMITATIONS *lazydev.nvim-lazydev.nvim-limitations*
|
||||||
|
|
||||||
|
- If you have files that only use types from a plugin,
|
||||||
|
then those types won’t be available in your workspace.
|
||||||
|
- completion for module names when typing `require(...)`
|
||||||
|
will only return loaded modules in your workspace.
|
||||||
|
- To get around the above, you can:
|
||||||
|
- pre-load those plugins with the `library` option.
|
||||||
|
- use the **nvim-cmp** completion source to get all available modules.
|
||||||
|
- Neovim types are **NOT** included and also no longer needed
|
||||||
|
on **Neovim >= 0.10**
|
||||||
|
|
||||||
|
|
||||||
|
REQUIREMENTS *lazydev.nvim-lazydev.nvim-requirements*
|
||||||
|
|
||||||
|
- Neovim >= 0.10.0
|
||||||
|
- lazy.nvim <https://github.com/folke/lazy.nvim> plugin manager
|
||||||
|
- **OR** a plugin manager that uses **Neovim**’s native package system
|
||||||
|
|
||||||
|
|
||||||
|
INSTALLATION *lazydev.nvim-lazydev.nvim-installation*
|
||||||
|
|
||||||
|
With lazy.nvim <https://github.com/folke/lazy.nvim>
|
||||||
|
|
||||||
|
>lua
|
||||||
|
return {
|
||||||
|
{
|
||||||
|
"folke/lazydev.nvim",
|
||||||
|
ft = "lua", -- only load on lua files
|
||||||
|
opts = {
|
||||||
|
library = {
|
||||||
|
-- See the configuration section for more details
|
||||||
|
-- Load luvit types when the `vim.uv` word is found
|
||||||
|
{ path = "luvit-meta/library", words = { "vim%.uv" } },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ "Bilal2453/luvit-meta", lazy = true }, -- optional `vim.uv` typings
|
||||||
|
{ -- optional completion source for require statements and module annotations
|
||||||
|
"hrsh7th/nvim-cmp",
|
||||||
|
opts = function(_, opts)
|
||||||
|
opts.sources = opts.sources or {}
|
||||||
|
table.insert(opts.sources, {
|
||||||
|
name = "lazydev",
|
||||||
|
group_index = 0, -- set group index to 0 to skip loading LuaLS completions
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
-- { "folke/neodev.nvim", enabled = false }, -- make sure to uninstall or disable neodev.nvim
|
||||||
|
}
|
||||||
|
<
|
||||||
|
|
||||||
|
|
||||||
|
CONFIGURATION *lazydev.nvim-lazydev.nvim-configuration*
|
||||||
|
|
||||||
|
|
||||||
|
[!TIP] You can force enable/disable **lazydev** in certain project folders
|
||||||
|
using |:h 'exrc'| with `vim.g.lazydev_enabled = true` or `vim.g.lazydev_enabled
|
||||||
|
= false`
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
>lua
|
||||||
|
|
||||||
|
{
|
||||||
|
"folke/lazydev.nvim",
|
||||||
|
ft = "lua", -- only load on lua files
|
||||||
|
opts = {
|
||||||
|
library = {
|
||||||
|
-- Library paths can be absolute
|
||||||
|
"~/projects/my-awesome-lib",
|
||||||
|
-- Or relative, which means they will be resolved from the plugin dir.
|
||||||
|
"lazy.nvim",
|
||||||
|
"luvit-meta/library",
|
||||||
|
-- It can also be a table with trigger words / mods
|
||||||
|
-- Only load luvit types when the `vim.uv` word is found
|
||||||
|
{ path = "luvit-meta/library", words = { "vim%.uv" } },
|
||||||
|
-- always load the LazyVim library
|
||||||
|
"LazyVim",
|
||||||
|
-- Only load the lazyvim library when the `LazyVim` global is found
|
||||||
|
{ path = "LazyVim", words = { "LazyVim" } },
|
||||||
|
-- Load the wezterm types when the `wezterm` module is required
|
||||||
|
-- Needs `justinsgithub/wezterm-types` to be installed
|
||||||
|
{ path = "wezterm-types", mods = { "wezterm" } },
|
||||||
|
},
|
||||||
|
-- always enable unless `vim.g.lazydev_enabled = false`
|
||||||
|
-- This is the default
|
||||||
|
enabled = function(root_dir)
|
||||||
|
return vim.g.lazydev_enabled == nil and true or vim.g.lazydev_enabled
|
||||||
|
end,
|
||||||
|
-- disable then a .luarc.json file is found
|
||||||
|
enabled = function(root_dir)
|
||||||
|
return not vim.uv.fs_stat(root_dir .. "/.luarc.json")
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
<
|
||||||
|
|
||||||
|
Default settings:
|
||||||
|
|
||||||
|
>lua
|
||||||
|
---@alias lazydev.Library {path:string, words:string[], mods:string[]}
|
||||||
|
---@alias lazydev.Library.spec string|{path:string, words?:string[], mods?:string[]}
|
||||||
|
---@class lazydev.Config
|
||||||
|
local defaults = {
|
||||||
|
runtime = vim.env.VIMRUNTIME --[[@as string]],
|
||||||
|
library = {}, ---@type lazydev.Library.spec[]
|
||||||
|
-- add the cmp source for completion of:
|
||||||
|
-- `require "modname"`
|
||||||
|
-- `---@module "modname"`
|
||||||
|
cmp = true,
|
||||||
|
---@type boolean|(fun(root:string):boolean?)
|
||||||
|
enabled = function(root_dir)
|
||||||
|
return vim.g.lazydev_enabled == nil and true or vim.g.lazydev_enabled
|
||||||
|
end,
|
||||||
|
}
|
||||||
|
<
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
2. Links *lazydev.nvim-links*
|
||||||
|
|
||||||
|
1. *2024-06-01_21-02-40*: https://github.com/folke/lazydev.nvim/assets/292349/c5f23225-88eb-454d-9b4e-1bf9183f7ff8
|
||||||
|
|
||||||
|
Generated by panvimdoc <https://github.com/kdheepak/panvimdoc>
|
||||||
|
|
||||||
|
vim:tw=78:ts=8:noet:ft=help:norl:
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
lazydev.nvim-lazydev.nvim lazydev.nvim.txt /*lazydev.nvim-lazydev.nvim*
|
||||||
|
lazydev.nvim-lazydev.nvim-configuration lazydev.nvim.txt /*lazydev.nvim-lazydev.nvim-configuration*
|
||||||
|
lazydev.nvim-lazydev.nvim-features lazydev.nvim.txt /*lazydev.nvim-lazydev.nvim-features*
|
||||||
|
lazydev.nvim-lazydev.nvim-installation lazydev.nvim.txt /*lazydev.nvim-lazydev.nvim-installation*
|
||||||
|
lazydev.nvim-lazydev.nvim-limitations lazydev.nvim.txt /*lazydev.nvim-lazydev.nvim-limitations*
|
||||||
|
lazydev.nvim-lazydev.nvim-requirements lazydev.nvim.txt /*lazydev.nvim-lazydev.nvim-requirements*
|
||||||
|
lazydev.nvim-links lazydev.nvim.txt /*lazydev.nvim-links*
|
||||||
|
lazydev.nvim-table-of-contents lazydev.nvim.txt /*lazydev.nvim-table-of-contents*
|
||||||
|
lazydev.nvim.txt lazydev.nvim.txt /*lazydev.nvim.txt*
|
||||||
@ -0,0 +1,175 @@
|
|||||||
|
local Config = require("lazydev.config")
|
||||||
|
local Lsp = require("lazydev.lsp")
|
||||||
|
local Pkg = require("lazydev.pkg")
|
||||||
|
local Util = require("lazydev.util")
|
||||||
|
local Workspace = require("lazydev.workspace")
|
||||||
|
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
---@type table<number,number>
|
||||||
|
M.attached = {}
|
||||||
|
|
||||||
|
---@type table<string, vim.loader.ModuleInfo|false>
|
||||||
|
M.modules = {}
|
||||||
|
|
||||||
|
function M.setup()
|
||||||
|
for _, lib in ipairs(Config.libs) do
|
||||||
|
if #lib.words == 0 and #lib.mods == 0 then
|
||||||
|
Workspace.global():add(lib.path)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- debounce updates
|
||||||
|
local update = vim.schedule_wrap(M.update)
|
||||||
|
local timer = assert(vim.uv.new_timer())
|
||||||
|
M.update = function()
|
||||||
|
timer:start(100, 0, update)
|
||||||
|
end
|
||||||
|
|
||||||
|
local group = vim.api.nvim_create_augroup("lazydev", { clear = true })
|
||||||
|
|
||||||
|
vim.api.nvim_create_autocmd("LspAttach", {
|
||||||
|
group = group,
|
||||||
|
callback = function(ev)
|
||||||
|
local client = vim.lsp.get_client_by_id(ev.data.client_id)
|
||||||
|
if client and client.name == "lua_ls" then
|
||||||
|
M.on_attach(client, ev.buf)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Attach to all existing clients
|
||||||
|
for _, client in ipairs(M.get_clients()) do
|
||||||
|
for buf in pairs(client.attached_buffers) do
|
||||||
|
M.on_attach(client, buf)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Check for library changes
|
||||||
|
M.update()
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Gets all LuaLS clients that are enabled
|
||||||
|
function M.get_clients()
|
||||||
|
return Util.get_clients({ name = "lua_ls" })
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Attach to the buffer
|
||||||
|
---@param client vim.lsp.Client
|
||||||
|
function M.on_attach(client, buf)
|
||||||
|
local root = Workspace.get_root(client, buf)
|
||||||
|
if not Config.is_enabled(root) then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
if M.attached[buf] then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
M.attached[buf] = buf
|
||||||
|
-- Attach to buffer events
|
||||||
|
vim.api.nvim_buf_attach(buf, false, {
|
||||||
|
on_lines = function(_, b, _, first, _, last)
|
||||||
|
M.on_lines(b, first, last)
|
||||||
|
end,
|
||||||
|
on_detach = function()
|
||||||
|
M.attached[buf] = nil
|
||||||
|
end,
|
||||||
|
on_reload = function()
|
||||||
|
M.on_lines(buf, 0, vim.api.nvim_buf_line_count(buf))
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
-- Trigger initial scan
|
||||||
|
M.on_lines(buf, 0, vim.api.nvim_buf_line_count(buf))
|
||||||
|
M.update()
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Triggered when lines are changed
|
||||||
|
---@param buf number
|
||||||
|
---@param first number
|
||||||
|
---@param last number
|
||||||
|
function M.on_lines(buf, first, last)
|
||||||
|
local lines = vim.api.nvim_buf_get_lines(buf, first, last, false)
|
||||||
|
for _, line in ipairs(lines) do
|
||||||
|
M.on_line(buf, line)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param buf number
|
||||||
|
---@param line string
|
||||||
|
function M.on_line(buf, line)
|
||||||
|
-- Check for words
|
||||||
|
for word, paths in pairs(Config.words) do
|
||||||
|
if line:find(word) then
|
||||||
|
Workspace.find(buf):add(paths)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- Check for modules
|
||||||
|
local module = Pkg.get_module(line)
|
||||||
|
if module then
|
||||||
|
M.on_mod(buf, module)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Check if a module is available and add it to the library
|
||||||
|
---@param buf number
|
||||||
|
---@param modname string
|
||||||
|
function M.on_mod(buf, modname)
|
||||||
|
-- Check for configured modules
|
||||||
|
if Config.mods[modname] then
|
||||||
|
Workspace.find(buf):add(Config.mods[modname])
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Check for modules in Neovim plugins
|
||||||
|
local mod = M.modules[modname]
|
||||||
|
|
||||||
|
if mod == nil then
|
||||||
|
mod = vim.loader.find(modname)[1]
|
||||||
|
if not mod then
|
||||||
|
local paths = Pkg.get_unloaded(modname)
|
||||||
|
mod = vim.loader.find(modname, { rtp = false, paths = paths })[1]
|
||||||
|
end
|
||||||
|
M.modules[modname] = mod or false
|
||||||
|
end
|
||||||
|
|
||||||
|
if mod then
|
||||||
|
local lua = mod.modpath:find("/lua/", 1, true)
|
||||||
|
local path = lua and mod.modpath:sub(1, lua + 3) or mod.modpath
|
||||||
|
if path then
|
||||||
|
Workspace.find(buf):add(path)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Update LuaLS settings with the current library
|
||||||
|
function M.update()
|
||||||
|
if package.loaded["neodev"] then
|
||||||
|
vim.notify_once(
|
||||||
|
"Please disable `neodev.nvim` in your config.\nThis is no longer needed when you use `lazydev.nvim`",
|
||||||
|
vim.log.levels.WARN
|
||||||
|
)
|
||||||
|
end
|
||||||
|
for _, client in ipairs(M.get_clients()) do
|
||||||
|
local update = false
|
||||||
|
|
||||||
|
---@param ws lsp.WorkspaceFolder
|
||||||
|
local folders = vim.tbl_map(function(ws)
|
||||||
|
return Workspace.get(client.id, ws.name)
|
||||||
|
end, client.workspace_folders or {})
|
||||||
|
|
||||||
|
if #folders == 0 then
|
||||||
|
folders = { Workspace.single(client) }
|
||||||
|
end
|
||||||
|
|
||||||
|
for _, w in ipairs(folders) do
|
||||||
|
if w:update() then
|
||||||
|
update = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if update then
|
||||||
|
Lsp.attach(client)
|
||||||
|
Lsp.update(client)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
@ -0,0 +1,62 @@
|
|||||||
|
local Util = require("lazydev.util")
|
||||||
|
local Workspace = require("lazydev.workspace")
|
||||||
|
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
---@type table<string, fun(args: string[])>
|
||||||
|
M.commands = {
|
||||||
|
debug = function()
|
||||||
|
local buf = vim.api.nvim_get_current_buf()
|
||||||
|
local ws = Workspace.find(buf)
|
||||||
|
if not ws then
|
||||||
|
return Util.warn("No **LuaLS** workspace found.\nUse `:LazyDev lsp` to see settings of attached LSP clients.")
|
||||||
|
end
|
||||||
|
ws:debug({ details = true })
|
||||||
|
end,
|
||||||
|
lsp = function()
|
||||||
|
local clients = Util.get_clients({ bufnr = 0 })
|
||||||
|
local lines = {} ---@type string[]
|
||||||
|
for _, client in ipairs(clients) do
|
||||||
|
lines[#lines + 1] = "## " .. client.name
|
||||||
|
lines[#lines + 1] = "```lua"
|
||||||
|
lines[#lines + 1] = "settings = " .. vim.inspect(client.settings)
|
||||||
|
lines[#lines + 1] = "```"
|
||||||
|
end
|
||||||
|
Util.info(lines)
|
||||||
|
end,
|
||||||
|
}
|
||||||
|
|
||||||
|
function M.execute(input)
|
||||||
|
local prefix, args = M.parse(input.args)
|
||||||
|
prefix = prefix and prefix ~= "" and prefix or "debug"
|
||||||
|
if not M.commands[prefix or ""] then
|
||||||
|
return Util.error("Invalid command")
|
||||||
|
end
|
||||||
|
M.commands[prefix](args)
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.complete(_, line)
|
||||||
|
local prefix, args = M.parse(line)
|
||||||
|
if #args > 0 then
|
||||||
|
return {}
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param key string
|
||||||
|
return vim.tbl_filter(function(key)
|
||||||
|
return key:find(prefix, 1, true) == 1
|
||||||
|
end, vim.tbl_keys(M.commands))
|
||||||
|
end
|
||||||
|
|
||||||
|
---@return string, string[]
|
||||||
|
function M.parse(args)
|
||||||
|
local parts = vim.split(vim.trim(args), "%s+")
|
||||||
|
if parts[1]:find("LazyDev") then
|
||||||
|
table.remove(parts, 1)
|
||||||
|
end
|
||||||
|
if args:sub(-1) == " " then
|
||||||
|
parts[#parts + 1] = ""
|
||||||
|
end
|
||||||
|
return table.remove(parts, 1) or "", parts
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
@ -0,0 +1,73 @@
|
|||||||
|
local Buf = require("lazydev.buf")
|
||||||
|
local Config = require("lazydev.config")
|
||||||
|
local Pkg = require("lazydev.pkg")
|
||||||
|
|
||||||
|
local Source = {}
|
||||||
|
|
||||||
|
function Source:get_trigger_characters()
|
||||||
|
return { '"', "'", ".", "/" }
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param params cmp.SourceCompletionApiParams
|
||||||
|
---@param callback fun(items: lsp.CompletionItem[])
|
||||||
|
function Source:complete(params, callback)
|
||||||
|
local cmp = require("cmp")
|
||||||
|
local before = params.context.cursor_before_line
|
||||||
|
---@type string?
|
||||||
|
local req, forward_slash = Pkg.get_module(before, { before = true })
|
||||||
|
if not req then
|
||||||
|
return callback({})
|
||||||
|
end
|
||||||
|
local items = {} ---@type table<string,lsp.CompletionItem>
|
||||||
|
|
||||||
|
---@param modname string
|
||||||
|
---@param modpath string
|
||||||
|
local function add(modname, modpath)
|
||||||
|
items[modname] = items[modname]
|
||||||
|
or {
|
||||||
|
label = forward_slash and modname:gsub("%.", "/") or modname,
|
||||||
|
kind = cmp.lsp.CompletionItemKind.Module,
|
||||||
|
}
|
||||||
|
local item = items[modname]
|
||||||
|
|
||||||
|
local plugin = Pkg.get_plugin_name(modpath)
|
||||||
|
if plugin then
|
||||||
|
if item.documentation then
|
||||||
|
item.documentation.value = item.documentation.value .. "\n- `" .. plugin .. "`"
|
||||||
|
else
|
||||||
|
item.documentation = {
|
||||||
|
kind = cmp.lsp.MarkupKind.Markdown,
|
||||||
|
value = "# Plugins:\n" .. "- `" .. plugin .. "`",
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if not req:find(".", 1, true) then
|
||||||
|
Pkg.topmods(add)
|
||||||
|
for _, lib in ipairs(Config.libs) do
|
||||||
|
for _, mod in ipairs(lib.mods) do
|
||||||
|
add(mod, lib.path)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
Pkg.lsmod(req:gsub("%.[^%.]*$", ""), add)
|
||||||
|
end
|
||||||
|
|
||||||
|
callback(vim.tbl_values(items))
|
||||||
|
end
|
||||||
|
|
||||||
|
function Source:is_available()
|
||||||
|
return Buf.attached[vim.api.nvim_get_current_buf()]
|
||||||
|
end
|
||||||
|
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
function M.setup()
|
||||||
|
local ok, cmp = pcall(require, "cmp")
|
||||||
|
if ok then
|
||||||
|
cmp.register_source("lazydev", Source)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
@ -0,0 +1,99 @@
|
|||||||
|
---@class lazydev.Config.mod: lazydev.Config
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
---@alias lazydev.Library {path:string, words:string[], mods:string[]}
|
||||||
|
---@alias lazydev.Library.spec string|{path:string, words?:string[], mods?:string[]}
|
||||||
|
---@class lazydev.Config
|
||||||
|
local defaults = {
|
||||||
|
runtime = vim.env.VIMRUNTIME --[[@as string]],
|
||||||
|
library = {}, ---@type lazydev.Library.spec[]
|
||||||
|
---@type boolean|(fun(root:string):boolean?)
|
||||||
|
enabled = function(root_dir)
|
||||||
|
return vim.g.lazydev_enabled == nil and true or vim.g.lazydev_enabled
|
||||||
|
end,
|
||||||
|
-- add the cmp source for completion of:
|
||||||
|
-- `require "modname"`
|
||||||
|
-- `---@module "modname"`
|
||||||
|
cmp = true,
|
||||||
|
debug = false,
|
||||||
|
}
|
||||||
|
|
||||||
|
M.libs = {} ---@type lazydev.Library[]
|
||||||
|
M.words = {} ---@type table<string, string[]>
|
||||||
|
M.mods = {} ---@type table<string, string[]>
|
||||||
|
|
||||||
|
---@type lazydev.Config
|
||||||
|
local options
|
||||||
|
|
||||||
|
---@param root string
|
||||||
|
---@return boolean
|
||||||
|
function M.is_enabled(root)
|
||||||
|
local enabled = M.enabled
|
||||||
|
if type(enabled) == "function" then
|
||||||
|
return enabled(root) and true or false
|
||||||
|
end
|
||||||
|
return enabled
|
||||||
|
end
|
||||||
|
|
||||||
|
M.have_0_10 = vim.fn.has("nvim-0.10") == 1
|
||||||
|
|
||||||
|
---@param opts? lazydev.Config
|
||||||
|
function M.setup(opts)
|
||||||
|
if not M.have_0_10 then
|
||||||
|
local msg = "lazydev.nvim requires Neovim >= 0.10"
|
||||||
|
vim.notify_once(msg, vim.log.levels.ERROR, { title = "lazydev.nvim" })
|
||||||
|
error(msg)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
options = vim.tbl_deep_extend("force", {}, options or defaults, opts or {})
|
||||||
|
|
||||||
|
M.libs, M.words, M.mods = {}, {}, {}
|
||||||
|
local runtime = require("lazydev.util").norm(options.runtime)
|
||||||
|
table.insert(M.libs, {
|
||||||
|
path = vim.uv.fs_stat(runtime) and runtime or vim.env.VIMRUNTIME,
|
||||||
|
words = {},
|
||||||
|
mods = {},
|
||||||
|
})
|
||||||
|
for _, lib in pairs(M.library) do
|
||||||
|
table.insert(M.libs, {
|
||||||
|
path = type(lib) == "table" and lib.path or lib,
|
||||||
|
words = type(lib) == "table" and lib.words or {},
|
||||||
|
mods = type(lib) == "table" and lib.mods or {},
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
for _, lib in ipairs(M.libs) do
|
||||||
|
for _, word in ipairs(lib.words) do
|
||||||
|
M.words[word] = M.words[word] or {}
|
||||||
|
table.insert(M.words[word], lib.path)
|
||||||
|
end
|
||||||
|
for _, mod in ipairs(lib.mods) do
|
||||||
|
M.mods[mod] = M.mods[mod] or {}
|
||||||
|
table.insert(M.mods[mod], lib.path)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
vim.api.nvim_create_user_command("LazyDev", function(...)
|
||||||
|
require("lazydev.cmd").execute(...)
|
||||||
|
end, {
|
||||||
|
nargs = "*",
|
||||||
|
complete = function(...)
|
||||||
|
return require("lazydev.cmd").complete(...)
|
||||||
|
end,
|
||||||
|
desc = "lazydev.nvim",
|
||||||
|
})
|
||||||
|
|
||||||
|
vim.schedule(function()
|
||||||
|
require("lazydev.buf").setup()
|
||||||
|
require("lazydev.cmp").setup()
|
||||||
|
end)
|
||||||
|
return options
|
||||||
|
end
|
||||||
|
|
||||||
|
return setmetatable(M, {
|
||||||
|
__index = function(_, key)
|
||||||
|
options = options or M.setup()
|
||||||
|
return options[key]
|
||||||
|
end,
|
||||||
|
})
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
local M = {}
|
||||||
|
|
||||||
|
---@param opts? lazydev.Config
|
||||||
|
function M.setup(opts)
|
||||||
|
require("lazydev.config").setup(opts)
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
@ -0,0 +1,58 @@
|
|||||||
|
local Workspace = require("lazydev.workspace")
|
||||||
|
|
||||||
|
local M = {}
|
||||||
|
M.attached = {} ---@type table<number,number>
|
||||||
|
|
||||||
|
---@param client vim.lsp.Client
|
||||||
|
function M.attach(client)
|
||||||
|
if M.attached[client.id] then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
M.attached[client.id] = client.id
|
||||||
|
---@param params lsp.ConfigurationParams
|
||||||
|
client.handlers["workspace/configuration"] = function(err, params, ctx, cfg)
|
||||||
|
if not params.items or #params.items == 0 then
|
||||||
|
return {}
|
||||||
|
end
|
||||||
|
|
||||||
|
-- fallback scope
|
||||||
|
if #(client.workspace_folders or {}) > 0 and not params.items[1].scopeUri then
|
||||||
|
return {}
|
||||||
|
end
|
||||||
|
|
||||||
|
local response = {}
|
||||||
|
for _, item in ipairs(params.items) do
|
||||||
|
if item.section then
|
||||||
|
local settings = client.settings
|
||||||
|
if item.section == "Lua" then
|
||||||
|
local ws = item.scopeUri and Workspace.get(client, vim.uri_to_fname(item.scopeUri))
|
||||||
|
or Workspace.single(client)
|
||||||
|
if ws:enabled() then
|
||||||
|
settings = ws.settings
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local keys = vim.split(item.section, ".", { plain = true }) --- @type string[]
|
||||||
|
local value = vim.tbl_get(settings or {}, unpack(keys))
|
||||||
|
-- For empty sections with no explicit '' key, return settings as is
|
||||||
|
if value == nil and item.section == "" then
|
||||||
|
value = settings
|
||||||
|
end
|
||||||
|
if value == nil then
|
||||||
|
value = vim.NIL
|
||||||
|
end
|
||||||
|
table.insert(response, value)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return response
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param client vim.lsp.Client
|
||||||
|
function M.update(client)
|
||||||
|
client.notify("workspace/didChangeConfiguration", {
|
||||||
|
settings = { Lua = {} },
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
@ -0,0 +1,156 @@
|
|||||||
|
---@class lazydev.Pkg
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
M.PAT_MODULE_BASE = "%-%-%-%s*@module%s*[\"']([%w%.%-_/]+)"
|
||||||
|
M.PAT_REQUIRE_BASE = "require%s*%(?%s*['\"]([%w%.%-_/]+)"
|
||||||
|
M.PAT_MODULE_BEFORE = M.PAT_MODULE_BASE .. "$"
|
||||||
|
M.PAT_REQUIRE_BEFORE = M.PAT_REQUIRE_BASE .. "$"
|
||||||
|
M.PAT_MODULE = M.PAT_MODULE_BASE .. "[\"']"
|
||||||
|
M.PAT_REQUIRE = M.PAT_REQUIRE_BASE .. "[\"']"
|
||||||
|
|
||||||
|
local is_lazy = type(package.loaded.lazy) == "table"
|
||||||
|
|
||||||
|
---@param modname string
|
||||||
|
---@return string[]
|
||||||
|
function M.lazy_unloaded(modname)
|
||||||
|
local Util = require("lazy.core.util")
|
||||||
|
return Util.get_unloaded_rtp(modname)
|
||||||
|
end
|
||||||
|
|
||||||
|
---@type string[]
|
||||||
|
local packs = nil
|
||||||
|
|
||||||
|
function M.pack_unloaded()
|
||||||
|
if packs then
|
||||||
|
return packs
|
||||||
|
end
|
||||||
|
|
||||||
|
local sites = vim.opt.packpath:get() ---@type string[]
|
||||||
|
local default_site = vim.fn.stdpath("data") .. "/site"
|
||||||
|
if not vim.tbl_contains(sites, default_site) then
|
||||||
|
sites[#sites + 1] = default_site
|
||||||
|
end
|
||||||
|
local Util = require("lazydev.util")
|
||||||
|
packs = {} ---@type string[]
|
||||||
|
for _, site in pairs(sites) do
|
||||||
|
for _, pack in ipairs(vim.fn.expand(site .. "/pack/*/opt/*", false, true)) do
|
||||||
|
if not pack:find("*", 1, true) then
|
||||||
|
packs[#packs + 1] = Util.norm(pack)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return packs
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param modname string
|
||||||
|
---@return string[]
|
||||||
|
function M.get_unloaded(modname)
|
||||||
|
return is_lazy and M.lazy_unloaded(modname) or M.pack_unloaded()
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.get_plugin_path(name)
|
||||||
|
if is_lazy then
|
||||||
|
local Config = require("lazy.core.config")
|
||||||
|
local plugin = Config.spec.plugins[name]
|
||||||
|
return plugin and plugin.dir
|
||||||
|
else
|
||||||
|
for _, dir in ipairs(vim.opt.rtp:get()) do
|
||||||
|
local basename = vim.fs.basename(dir)
|
||||||
|
if basename == name then
|
||||||
|
return dir
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for _, dir in ipairs(M.pack_unloaded()) do
|
||||||
|
local basename = vim.fs.basename(dir)
|
||||||
|
if basename == name then
|
||||||
|
return dir
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param modname string
|
||||||
|
---@return string[]
|
||||||
|
function M.find_roots(modname)
|
||||||
|
local ret = vim.loader.find(modname, {
|
||||||
|
rtp = true,
|
||||||
|
paths = M.get_unloaded(modname),
|
||||||
|
patterns = { "", ".lua" },
|
||||||
|
all = true,
|
||||||
|
})
|
||||||
|
return vim.tbl_map(
|
||||||
|
---@param mod vim.loader.ModuleInfo
|
||||||
|
function(mod)
|
||||||
|
local path = mod.modpath:gsub("/init%.lua$", ""):gsub("%.lua$", "")
|
||||||
|
return path
|
||||||
|
end,
|
||||||
|
ret
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param fn fun(modname:string, modpath:string)
|
||||||
|
function M.topmods(fn)
|
||||||
|
local ret = vim.loader.find("*", {
|
||||||
|
all = true,
|
||||||
|
rtp = true,
|
||||||
|
paths = M.get_unloaded(""),
|
||||||
|
})
|
||||||
|
for _, mod in ipairs(ret) do
|
||||||
|
fn(mod.modname, mod.modpath)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Get the module name from a line,
|
||||||
|
--- either `---@module "modname"` or `require "modname"`
|
||||||
|
---@param line string
|
||||||
|
---@param opts? {before?:boolean}
|
||||||
|
---@return string?, boolean? forward_slash
|
||||||
|
function M.get_module(line, opts)
|
||||||
|
local patterns = opts and opts.before and {
|
||||||
|
M.PAT_MODULE_BEFORE,
|
||||||
|
M.PAT_REQUIRE_BEFORE,
|
||||||
|
} or {
|
||||||
|
M.PAT_MODULE,
|
||||||
|
M.PAT_REQUIRE,
|
||||||
|
}
|
||||||
|
for _, pat in ipairs(patterns) do
|
||||||
|
local match = line:match(pat)
|
||||||
|
if match then
|
||||||
|
return match:gsub("/", "."), match:find("/", 1, true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param path string
|
||||||
|
---@return string?
|
||||||
|
function M.get_plugin_name(path)
|
||||||
|
local lua = path:find("/lua/", 1, true)
|
||||||
|
if lua then
|
||||||
|
local name = path:sub(1, lua - 1)
|
||||||
|
local slash = name:reverse():find("/", 1, true)
|
||||||
|
if slash then
|
||||||
|
name = name:sub(#name - slash + 2)
|
||||||
|
return name
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param modname string
|
||||||
|
---@param fn fun(modname:string, modpath:string)
|
||||||
|
function M.lsmod(modname, fn)
|
||||||
|
local roots = M.find_roots(modname)
|
||||||
|
for _, root in ipairs(roots) do
|
||||||
|
for name, type in vim.fs.dir(root) do
|
||||||
|
local path = vim.fs.joinpath(root, name)
|
||||||
|
if name == "init.lua" then
|
||||||
|
fn(modname, path)
|
||||||
|
elseif (type == "file" or type == "link") and name:sub(-4) == ".lua" then
|
||||||
|
fn(modname .. "." .. name:sub(1, -5), path)
|
||||||
|
elseif type == "directory" and vim.uv.fs_stat(path .. "/init.lua") then
|
||||||
|
fn(modname .. "." .. name, path .. "/init.lua")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
@ -0,0 +1,59 @@
|
|||||||
|
local M = {}
|
||||||
|
|
||||||
|
---@alias NotifyOpts {level?: number, title?: string, once?: boolean}
|
||||||
|
|
||||||
|
---@param msg string|string[]
|
||||||
|
---@param opts? NotifyOpts
|
||||||
|
function M.notify(msg, opts)
|
||||||
|
opts = opts or {}
|
||||||
|
msg = type(msg) == "table" and table.concat(msg, "\n") or msg
|
||||||
|
---@cast msg string
|
||||||
|
msg = vim.trim(msg)
|
||||||
|
return vim[opts.once and "notify_once" or "notify"](msg, opts.level, {
|
||||||
|
title = opts.title or "lazydev.nvim",
|
||||||
|
on_open = function(win)
|
||||||
|
vim.wo.conceallevel = 3
|
||||||
|
vim.wo.concealcursor = "n"
|
||||||
|
vim.wo.spell = false
|
||||||
|
vim.treesitter.start(vim.api.nvim_win_get_buf(win), "markdown")
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
M.get_clients = vim.lsp.get_clients or vim.lsp.get_active_clients
|
||||||
|
|
||||||
|
---@param path string
|
||||||
|
function M.is_absolute(path)
|
||||||
|
return path:sub(1, 1) == "/" or path:sub(2, 2) == ":"
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param path string
|
||||||
|
function M.norm(path)
|
||||||
|
path = vim.fs.normalize(path)
|
||||||
|
-- Special case for Windows drive letters
|
||||||
|
-- vim.fs.normalize doesn't handle them correctly
|
||||||
|
if path:sub(2, 2) == ":" then
|
||||||
|
path = path:sub(1, 1):lower() .. path:sub(2)
|
||||||
|
end
|
||||||
|
return path
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param msg string|string[]
|
||||||
|
---@param opts? NotifyOpts
|
||||||
|
function M.warn(msg, opts)
|
||||||
|
M.notify(msg, vim.tbl_extend("keep", { level = vim.log.levels.WARN }, opts or {}))
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param msg string|string[]
|
||||||
|
---@param opts? NotifyOpts
|
||||||
|
function M.error(msg, opts)
|
||||||
|
M.notify(msg, vim.tbl_extend("keep", { level = vim.log.levels.ERROR }, opts or {}))
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param msg string|string[]
|
||||||
|
---@param opts? NotifyOpts
|
||||||
|
function M.info(msg, opts)
|
||||||
|
M.notify(msg, vim.tbl_extend("keep", { level = vim.log.levels.INFO }, opts or {}))
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
@ -0,0 +1,188 @@
|
|||||||
|
local Config = require("lazydev.config")
|
||||||
|
local Pkg = require("lazydev.pkg")
|
||||||
|
local Util = require("lazydev.util")
|
||||||
|
|
||||||
|
---@class lazydev.Workspace
|
||||||
|
---@field root string
|
||||||
|
---@field client_id number
|
||||||
|
---@field settings table
|
||||||
|
---@field library string[]
|
||||||
|
local M = {}
|
||||||
|
M.__index = M
|
||||||
|
M.SINGLE = "single"
|
||||||
|
M.GLOBAL = "global"
|
||||||
|
|
||||||
|
---@type table<string,lazydev.Workspace>
|
||||||
|
M.workspaces = {}
|
||||||
|
|
||||||
|
function M.is_special(root)
|
||||||
|
return root == M.SINGLE or root == M.GLOBAL
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param client_id number
|
||||||
|
---@param root string
|
||||||
|
function M.new(client_id, root)
|
||||||
|
local self = setmetatable({
|
||||||
|
root = root,
|
||||||
|
client_id = client_id,
|
||||||
|
settings = {},
|
||||||
|
library = {},
|
||||||
|
}, M)
|
||||||
|
if not M.is_special(root) then
|
||||||
|
self:add(root)
|
||||||
|
end
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param client vim.lsp.Client|number
|
||||||
|
---@param root string
|
||||||
|
function M.get(client, root)
|
||||||
|
root = M.is_special(root) and root or Util.norm(root)
|
||||||
|
local client_id = type(client) == "number" and client or client.id
|
||||||
|
local id = client_id .. root
|
||||||
|
if not M.workspaces[id] then
|
||||||
|
M.workspaces[id] = M.new(client_id, root)
|
||||||
|
end
|
||||||
|
return M.workspaces[id]
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.global()
|
||||||
|
return M.get(-1, M.GLOBAL)
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param client vim.lsp.Client
|
||||||
|
function M.single(client)
|
||||||
|
return M.get(client, M.SINGLE)
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.find(buf)
|
||||||
|
local client = Util.get_clients({
|
||||||
|
name = "lua_ls",
|
||||||
|
bufnr = buf,
|
||||||
|
})[1]
|
||||||
|
return client and M.get(client.id, M.get_root(client, buf))
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param client vim.lsp.Client
|
||||||
|
---@param buf number
|
||||||
|
function M.get_root(client, buf)
|
||||||
|
local uri = vim.uri_from_bufnr(buf)
|
||||||
|
for _, ws in ipairs(client.workspace_folders or {}) do
|
||||||
|
if (uri .. "/"):sub(1, #ws.uri + 1) == ws.uri .. "/" then
|
||||||
|
return ws.name
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return client.root_dir or "single"
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param path string|string[]
|
||||||
|
function M:add(path)
|
||||||
|
if type(path) == "table" then
|
||||||
|
for _, p in ipairs(path) do
|
||||||
|
self:add(p)
|
||||||
|
end
|
||||||
|
return
|
||||||
|
end
|
||||||
|
---@cast path string
|
||||||
|
-- ignore special workspaces
|
||||||
|
if M.is_special(path) then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
-- normalize
|
||||||
|
path = Util.norm(path)
|
||||||
|
-- try to resolve to a plugin path
|
||||||
|
if not Util.is_absolute(path) and not vim.uv.fs_stat(path) then
|
||||||
|
local name, extra = path:match("([^/]+)(/?.*)")
|
||||||
|
if name then
|
||||||
|
local pp = Pkg.get_plugin_path(name)
|
||||||
|
path = pp and (pp .. extra) or path
|
||||||
|
end
|
||||||
|
end
|
||||||
|
path = vim.uv.fs_realpath(path) or path
|
||||||
|
path = Util.norm(path) -- normalize again
|
||||||
|
-- append /lua if it exists
|
||||||
|
if not path:find("/lua/?$") and vim.uv.fs_stat(path .. "/lua") then
|
||||||
|
path = path .. "/lua"
|
||||||
|
end
|
||||||
|
if path ~= self.root and not vim.tbl_contains(self.library, path) then
|
||||||
|
table.insert(self.library, path)
|
||||||
|
if self.root ~= M.GLOBAL then
|
||||||
|
require("lazydev.buf").update()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function M:client()
|
||||||
|
return vim.lsp.get_client_by_id(self.client_id)
|
||||||
|
end
|
||||||
|
|
||||||
|
function M:enabled()
|
||||||
|
return self.root == M.GLOBAL or Config.is_enabled(self.root)
|
||||||
|
end
|
||||||
|
|
||||||
|
function M:update()
|
||||||
|
local client = self:client()
|
||||||
|
if not client then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
if not self:enabled() then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local settings = vim.deepcopy(client.settings or {})
|
||||||
|
|
||||||
|
local libs = {} ---@type string[]
|
||||||
|
vim.list_extend(libs, M.global().library)
|
||||||
|
vim.list_extend(libs, self.library)
|
||||||
|
|
||||||
|
---@type string[]
|
||||||
|
local library = vim.tbl_get(settings, "Lua", "workspace", "library") or {}
|
||||||
|
for _, path in ipairs(libs) do
|
||||||
|
if not vim.tbl_contains(library, path) then
|
||||||
|
table.insert(library, path)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
settings = vim.tbl_deep_extend("force", settings, {
|
||||||
|
Lua = {
|
||||||
|
runtime = {
|
||||||
|
version = "LuaJIT",
|
||||||
|
path = { "?.lua", "?/init.lua" },
|
||||||
|
pathStrict = true,
|
||||||
|
},
|
||||||
|
workspace = {
|
||||||
|
checkThirdParty = false,
|
||||||
|
library = library,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
if not vim.deep_equal(settings, self.settings) then
|
||||||
|
self.settings = settings
|
||||||
|
if Config.debug then
|
||||||
|
self:debug()
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param opts? {details: boolean}
|
||||||
|
function M:debug(opts)
|
||||||
|
opts = opts or {}
|
||||||
|
local root = M.is_special(self.root) and "[" .. self.root .. "]" or vim.fn.fnamemodify(self.root, ":~")
|
||||||
|
local lines = { "## " .. root }
|
||||||
|
---@type string[]
|
||||||
|
local library = vim.tbl_get(self.settings, "Lua", "workspace", "library") or {}
|
||||||
|
for _, lib in ipairs(library) do
|
||||||
|
lib = vim.fn.fnamemodify(lib, ":~")
|
||||||
|
local plugin = Pkg.get_plugin_name(lib .. "/")
|
||||||
|
table.insert(lines, "- " .. (plugin and "**" .. plugin .. "** " or "") .. ("`" .. lib .. "`"))
|
||||||
|
end
|
||||||
|
if opts.details then
|
||||||
|
lines[#lines + 1] = "```lua"
|
||||||
|
lines[#lines + 1] = "settings = " .. vim.inspect(self.settings)
|
||||||
|
lines[#lines + 1] = "```"
|
||||||
|
end
|
||||||
|
Util.info(lines)
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
@ -0,0 +1,4 @@
|
|||||||
|
std = "vim"
|
||||||
|
|
||||||
|
[lints]
|
||||||
|
mixed_table = "allow"
|
||||||
@ -0,0 +1,6 @@
|
|||||||
|
indent_type = "Spaces"
|
||||||
|
indent_width = 2
|
||||||
|
column_width = 120
|
||||||
|
[sort_requires]
|
||||||
|
enabled = true
|
||||||
|
|
||||||
@ -0,0 +1,49 @@
|
|||||||
|
[selene]
|
||||||
|
base = "lua51"
|
||||||
|
name = "vim"
|
||||||
|
|
||||||
|
[vim]
|
||||||
|
any = true
|
||||||
|
|
||||||
|
[jit]
|
||||||
|
any = true
|
||||||
|
|
||||||
|
[[describe.args]]
|
||||||
|
type = "string"
|
||||||
|
[[describe.args]]
|
||||||
|
type = "function"
|
||||||
|
|
||||||
|
[[it.args]]
|
||||||
|
type = "string"
|
||||||
|
[[it.args]]
|
||||||
|
type = "function"
|
||||||
|
|
||||||
|
[[before_each.args]]
|
||||||
|
type = "function"
|
||||||
|
[[after_each.args]]
|
||||||
|
type = "function"
|
||||||
|
|
||||||
|
[assert.is_not]
|
||||||
|
any = true
|
||||||
|
|
||||||
|
[[assert.equals.args]]
|
||||||
|
type = "any"
|
||||||
|
[[assert.equals.args]]
|
||||||
|
type = "any"
|
||||||
|
[[assert.equals.args]]
|
||||||
|
type = "any"
|
||||||
|
required = false
|
||||||
|
|
||||||
|
[[assert.same.args]]
|
||||||
|
type = "any"
|
||||||
|
[[assert.same.args]]
|
||||||
|
type = "any"
|
||||||
|
|
||||||
|
[[assert.truthy.args]]
|
||||||
|
type = "any"
|
||||||
|
|
||||||
|
[[assert.spy.args]]
|
||||||
|
type = "any"
|
||||||
|
|
||||||
|
[[assert.stub.args]]
|
||||||
|
type = "any"
|
||||||
Reference in New Issue
Block a user