mirror of
https://github.com/linrongbin16/lsp-progress.nvim.git
synced 2024-09-16 14:24:06 +02:00
perf(data source): support 'LspProgress' event in v0.10 (#109)
docs(install): update installation and integration
This commit is contained in:
parent
509b17fb21
commit
2032169287
10 changed files with 231 additions and 222 deletions
|
@ -6,4 +6,4 @@ insert_final_newline = false
|
|||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
indent_size = 2
|
||||
|
|
34
.github/workflows/ci.yml
vendored
34
.github/workflows/ci.yml
vendored
|
@ -14,8 +14,7 @@ jobs:
|
|||
if: ${{ github.ref != 'refs/heads/main' }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v4
|
||||
# - uses: webiny/action-conventional-commits@v1.1.0
|
||||
- uses: ytanikin/PRConventionalCommits@1.1.0
|
||||
with:
|
||||
|
@ -24,28 +23,23 @@ jobs:
|
|||
name: Lua check
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: LuaLs typecheck
|
||||
uses: stevearc/nvim-typecheck-action@v1
|
||||
- uses: actions/checkout@v4
|
||||
- uses: stevearc/nvim-typecheck-action@v1
|
||||
with:
|
||||
path: lua
|
||||
level: Information
|
||||
configpath: ".luarc.json"
|
||||
neodev-version: stable
|
||||
- name: Luacheck
|
||||
uses: lunarmodules/luacheck@v1
|
||||
- uses: lunarmodules/luacheck@v1
|
||||
with:
|
||||
args: lua --config .luacheckrc
|
||||
- name: Stylua
|
||||
uses: JohnnyMorganz/stylua-action@v3
|
||||
- uses: JohnnyMorganz/stylua-action@v3
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
version: latest
|
||||
args: --config-path .stylua.toml lua/ test/
|
||||
- name: Auto Commit
|
||||
- uses: stefanzweifel/git-auto-commit-action@v4
|
||||
if: ${{ github.ref != 'refs/heads/main' }}
|
||||
uses: stefanzweifel/git-auto-commit-action@v4
|
||||
with:
|
||||
commit_message: "chore(pr): auto-commit"
|
||||
unit_test:
|
||||
|
@ -55,20 +49,16 @@ jobs:
|
|||
nvim_version: [stable, nightly, v0.6.0]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Install neovim
|
||||
uses: rhysd/action-setup-vim@v1
|
||||
- uses: actions/checkout@v4
|
||||
- uses: rhysd/action-setup-vim@v1
|
||||
id: vim
|
||||
with:
|
||||
neovim: true
|
||||
version: ${{ matrix.nvim_version }}
|
||||
- name: Install luajit
|
||||
uses: leafo/gh-actions-lua@v10
|
||||
- uses: leafo/gh-actions-lua@v10
|
||||
with:
|
||||
luaVersion: "luajit-2.1.0-beta3"
|
||||
- name: Install luarocks
|
||||
uses: leafo/gh-actions-luarocks@v4
|
||||
- uses: leafo/gh-actions-luarocks@v4
|
||||
- name: Run test cases
|
||||
shell: bash
|
||||
run: |
|
||||
|
@ -88,8 +78,7 @@ jobs:
|
|||
ls -l .
|
||||
echo "cat ./luacov.report.out"
|
||||
cat ./luacov.report.out
|
||||
- name: Upload coverage reports to Codecov
|
||||
uses: codecov/codecov-action@v3
|
||||
- uses: codecov/codecov-action@v3
|
||||
with:
|
||||
files: luacov.report.out
|
||||
env:
|
||||
|
@ -122,7 +111,6 @@ jobs:
|
|||
LUAROCKS_API_KEY: ${{ secrets.LUAROCKS_API_KEY }}
|
||||
with:
|
||||
version: ${{ steps.release.outputs.tag_name }}
|
||||
summary: "A performant lsp progress status for Neovim."
|
||||
labels: |
|
||||
vim
|
||||
neovim
|
||||
|
|
3
.nvim.lua
Normal file
3
.nvim.lua
Normal file
|
@ -0,0 +1,3 @@
|
|||
vim.opt.tabstop = 2
|
||||
vim.opt.softtabstop = 2
|
||||
vim.opt.shiftwidth = 2
|
191
README.md
191
README.md
|
@ -1,16 +1,31 @@
|
|||
<!-- markdownlint-disable MD001 MD013 MD034 MD033 MD051 -->
|
||||
|
||||
# lsp-progress.nvim
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/neovim/neovim/releases/v0.6.0"><img alt="Neovim" src="https://img.shields.io/badge/Neovim-v0.6-57A143?logo=neovim&logoColor=57A143" /></a>
|
||||
<a href="https://luarocks.org/modules/linrongbin16/lsp-progress.nvim"><img alt="luarocks" src="https://custom-icon-badges.demolab.com/luarocks/v/linrongbin16/lsp-progress.nvim?label=LuaRocks&labelColor=063B70&logo=tag&logoColor=fff&color=008B8B" /></a>
|
||||
<a href="https://github.com/neovim/neovim/releases/v0.6.0"><img alt="Neovim" src="https://img.shields.io/badge/Neovim-v0.6+-57A143?logo=neovim&logoColor=57A143" /></a>
|
||||
<a href="https://luarocks.org/modules/linrongbin16/lsp-progress.nvim"><img alt="luarocks" src="https://custom-icon-badges.demolab.com/luarocks/v/linrongbin16/lsp-progress.nvim?label=LuaRocks&labelColor=2C2D72&logo=tag&logoColor=fff&color=blue" /></a>
|
||||
<a href="https://github.com/linrongbin16/lsp-progress.nvim/actions/workflows/ci.yml"><img alt="ci.yml" src="https://img.shields.io/github/actions/workflow/status/linrongbin16/lsp-progress.nvim/ci.yml?label=GitHub%20CI&labelColor=181717&logo=github&logoColor=fff" /></a>
|
||||
<a href="https://app.codecov.io/github/linrongbin16/lsp-progress.nvim"><img alt="codecov" src="https://img.shields.io/codecov/c/github/linrongbin16/lsp-progress.nvim?logo=codecov&logoColor=F01F7A&label=Codecov" /></a>
|
||||
</p>
|
||||
|
||||
A performant lsp progress status for Neovim.
|
||||
<p align="center"><i> A performant lsp progress status for Neovim. </i></p>
|
||||
|
||||
<!-- https://github.com/linrongbin16/lsp-progress.nvim/assets/6496887/a0436100-d35c-48a1-a9c4-4346b09d6b25 -->
|
||||
|
||||
![default](https://github.com/linrongbin16/lsp-progress.nvim/assets/6496887/e089234b-d465-45ae-840f-72a57b846b0d)
|
||||
|
||||
<details>
|
||||
<summary><i>Click here to see how to configure</i></summary>
|
||||
|
||||
```lua
|
||||
require("lsp-progress").setup()
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- https://github.com/linrongbin16/lsp-progress.nvim/assets/6496887/84f17744-9404-4a7b-bbdf-aac5babc0ed3 -->
|
||||
|
||||
![client-names](https://github.com/linrongbin16/lsp-progress.nvim/assets/6496887/01dac7a0-678a-421d-a243-9dba2576b15b)
|
||||
|
||||
<details>
|
||||
|
@ -18,59 +33,61 @@ A performant lsp progress status for Neovim.
|
|||
|
||||
```lua
|
||||
require("lsp-progress").setup({
|
||||
client_format = function(client_name, spinner, series_messages)
|
||||
if #series_messages == 0 then
|
||||
return nil
|
||||
end
|
||||
return {
|
||||
name = client_name,
|
||||
body = spinner .. " " .. table.concat(series_messages, ", "),
|
||||
}
|
||||
end,
|
||||
format = function(client_messages)
|
||||
--- @param name string
|
||||
--- @param msg string?
|
||||
--- @return string
|
||||
local function stringify(name, msg)
|
||||
return msg and string.format("%s %s", name, msg) or name
|
||||
end
|
||||
client_format = function(client_name, spinner, series_messages)
|
||||
if #series_messages == 0 then
|
||||
return nil
|
||||
end
|
||||
return {
|
||||
name = client_name,
|
||||
body = spinner .. " " .. table.concat(series_messages, ", "),
|
||||
}
|
||||
end,
|
||||
format = function(client_messages)
|
||||
--- @param name string
|
||||
--- @param msg string?
|
||||
--- @return string
|
||||
local function stringify(name, msg)
|
||||
return msg and string.format("%s %s", name, msg) or name
|
||||
end
|
||||
|
||||
local sign = "" -- nf-fa-gear \uf013
|
||||
local lsp_clients = vim.lsp.get_active_clients()
|
||||
local messages_map = {}
|
||||
for _, climsg in ipairs(client_messages) do
|
||||
messages_map[climsg.name] = climsg.body
|
||||
end
|
||||
local sign = "" -- nf-fa-gear \uf013
|
||||
local lsp_clients = vim.lsp.get_active_clients()
|
||||
local messages_map = {}
|
||||
for _, climsg in ipairs(client_messages) do
|
||||
messages_map[climsg.name] = climsg.body
|
||||
end
|
||||
|
||||
if #lsp_clients > 0 then
|
||||
table.sort(lsp_clients, function(a, b)
|
||||
return a.name < b.name
|
||||
end)
|
||||
local builder = {}
|
||||
for _, cli in ipairs(lsp_clients) do
|
||||
if
|
||||
type(cli) == "table"
|
||||
and type(cli.name) == "string"
|
||||
and string.len(cli.name) > 0
|
||||
then
|
||||
if messages_map[cli.name] then
|
||||
table.insert(builder, stringify(cli.name, messages_map[cli.name]))
|
||||
else
|
||||
table.insert(builder, stringify(cli.name))
|
||||
if #lsp_clients > 0 then
|
||||
table.sort(lsp_clients, function(a, b)
|
||||
return a.name < b.name
|
||||
end)
|
||||
local builder = {}
|
||||
for _, cli in ipairs(lsp_clients) do
|
||||
if
|
||||
type(cli) == "table"
|
||||
and type(cli.name) == "string"
|
||||
and string.len(cli.name) > 0
|
||||
then
|
||||
if messages_map[cli.name] then
|
||||
table.insert(builder, stringify(cli.name, messages_map[cli.name]))
|
||||
else
|
||||
table.insert(builder, stringify(cli.name))
|
||||
end
|
||||
end
|
||||
end
|
||||
if #builder > 0 then
|
||||
return sign .. " " .. table.concat(builder, ", ")
|
||||
end
|
||||
end
|
||||
if #builder > 0 then
|
||||
return sign .. " " .. table.concat(builder, ", ")
|
||||
end
|
||||
end
|
||||
return ""
|
||||
end,
|
||||
return ""
|
||||
end,
|
||||
})
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- https://github.com/linrongbin16/lsp-progress.nvim/assets/6496887/9436de63-ea94-4ada-adb7-3812681a5106 -->
|
||||
|
||||
![green-check](https://github.com/linrongbin16/lsp-progress.nvim/assets/6496887/2666b105-4939-4985-8b5e-74bc43e5615c)
|
||||
|
||||
<details>
|
||||
|
@ -130,11 +147,8 @@ require("lsp-progress").setup({
|
|||
- [Performance](#performance)
|
||||
- [Requirement](#requirement)
|
||||
- [Install](#install)
|
||||
- [packer.nvim](#packernvim)
|
||||
- [lazy.nvim](#lazynvim)
|
||||
- [vim-plug](#vim-plug)
|
||||
- [Usage](#usage)
|
||||
- [Statusline Integration](#statusline-integration)
|
||||
- [Lualine Integration](#lualine-integration)
|
||||
- [Configuration](#configuration)
|
||||
- [Credit](#credit)
|
||||
- [Contribute](#contribute)
|
||||
|
@ -150,100 +164,67 @@ For more details, please see [Design & Technics](https://github.com/linrongbin16
|
|||
|
||||
## Requirement
|
||||
|
||||
- Neovim version ≥ 0.6.0.
|
||||
- Neovim ≥ 0.6.0.
|
||||
- [Nerd fonts](https://www.nerdfonts.com/) for icons.
|
||||
|
||||
## Install
|
||||
|
||||
### [packer.nvim](https://github.com/wbthomason/packer.nvim)
|
||||
<details>
|
||||
<summary><b>With <a href="https://github.com/wbthomason/packer.nvim">packer.nvim</a></b></summary>
|
||||
|
||||
```lua
|
||||
-- lua
|
||||
return require('packer').startup(function(use)
|
||||
|
||||
use {'nvim-tree/nvim-web-devicons'},
|
||||
use {
|
||||
'linrongbin16/lsp-progress.nvim',
|
||||
config = function()
|
||||
require('lsp-progress').setup()
|
||||
end
|
||||
}
|
||||
|
||||
-- integrate with lualine
|
||||
use {
|
||||
'nvim-lualine/lualine.nvim',
|
||||
config = ...,
|
||||
}
|
||||
|
||||
-- integrate with heirline
|
||||
use {
|
||||
'rebelot/heirline.nvim',
|
||||
config = ...,
|
||||
}
|
||||
end)
|
||||
```
|
||||
|
||||
### [lazy.nvim](https://github.com/folke/lazy.nvim)
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><b>With <a href="https://github.com/folke/lazy.nvim">lazy.nvim</a></b></summary>
|
||||
|
||||
```lua
|
||||
-- lua
|
||||
require("lazy").setup({
|
||||
|
||||
{
|
||||
'linrongbin16/lsp-progress.nvim',
|
||||
dependencies = { 'nvim-tree/nvim-web-devicons' },
|
||||
config = function()
|
||||
require('lsp-progress').setup()
|
||||
end
|
||||
}
|
||||
|
||||
-- integrate with lualine
|
||||
{
|
||||
'nvim-lualine/lualine.nvim',
|
||||
dependencies = {
|
||||
'nvim-tree/nvim-web-devicons',
|
||||
'linrongbin16/lsp-progress.nvim',
|
||||
},
|
||||
config = ...
|
||||
},
|
||||
|
||||
-- integrate with heirline
|
||||
{
|
||||
'rebelot/heirline.nvim',
|
||||
dependencies = {
|
||||
'linrongbin16/lsp-progress.nvim',
|
||||
},
|
||||
config = ...
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
### [vim-plug](https://github.com/junegunn/vim-plug)
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><b>With <a href="https://github.com/junegunn/vim-plug">vim-plug</a></b></summary>
|
||||
|
||||
```vim
|
||||
" vim
|
||||
call plug#begin()
|
||||
|
||||
Plug 'nvim-tree/nvim-web-devicons'
|
||||
Plug 'linrongbin16/lsp-progress.nvim'
|
||||
|
||||
" integrate with lualine
|
||||
Plug 'nvim-lualine/lualine.nvim'
|
||||
|
||||
" integrate with heirline
|
||||
Plug 'rebelot/heirline.nvim'
|
||||
|
||||
call plug#end()
|
||||
|
||||
lua require('lsp-progress').setup()
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
## Usage
|
||||
|
||||
- `LspProgressStatusUpdated`: user event to notify new status, and trigger statusline
|
||||
refresh.
|
||||
- `require('lsp-progress').progress(option)`: get lsp progress status, parameter
|
||||
`option` is an optional lua table:
|
||||
- `require('lsp-progress').progress(opts)`: get lsp progress status, parameter
|
||||
`opts` is an optional lua table:
|
||||
|
||||
```lua
|
||||
require('lsp-progress').progress({
|
||||
|
@ -252,12 +233,10 @@ lua require('lsp-progress').setup()
|
|||
})
|
||||
```
|
||||
|
||||
The fields share the same schema with `setup(option)` (see [Configuration](#configuration))
|
||||
The fields are the same value passing to `setup` (see [Configuration](#configuration))
|
||||
to provide more dynamic abilities.
|
||||
|
||||
### Statusline Integration
|
||||
|
||||
#### [lualine](https://github.com/nvim-lualine/lualine.nvim)
|
||||
### [lualine.nvim](https://github.com/nvim-lualine/lualine.nvim) Integration
|
||||
|
||||
```lua
|
||||
require("lualine").setup({
|
||||
|
@ -281,7 +260,7 @@ vim.api.nvim_create_autocmd("User", {
|
|||
})
|
||||
```
|
||||
|
||||
#### [heirline](https://github.com/rebelot/heirline.nvim)
|
||||
### [heirline.nvim](https://github.com/rebelot/heirline.nvim) Integration
|
||||
|
||||
```lua
|
||||
local LspProgress = {
|
||||
|
@ -299,6 +278,8 @@ local StatusLine = {
|
|||
-- Other StatusLine components
|
||||
{ ... },
|
||||
{ ... },
|
||||
|
||||
-- Lsp progress status component here
|
||||
LspProgress
|
||||
}
|
||||
|
||||
|
@ -312,10 +293,10 @@ require('heirline').setup({
|
|||
To configure options, please use:
|
||||
|
||||
```lua
|
||||
require('lsp-progress').setup(option)
|
||||
require('lsp-progress').setup(opts)
|
||||
```
|
||||
|
||||
The `option` is an optional lua table that override the default options.
|
||||
The `opts` is an optional lua table that overwrite the default options.
|
||||
|
||||
For complete options and defaults, please check [defaults.lua](https://github.com/linrongbin16/lsp-progress.nvim/blob/main/lua/lsp-progress/defaults.lua).
|
||||
|
||||
|
|
|
@ -8,31 +8,30 @@ local Client = require("lsp-progress.client").Client
|
|||
|
||||
local Registered = false
|
||||
|
||||
--- @type Configs
|
||||
--- @type lsp_progress.Configs
|
||||
local Configs = {}
|
||||
|
||||
-- client manager {
|
||||
|
||||
--- @type table<integer, Client>
|
||||
--- @type table<lsp_progress.ClientId, lsp_progress.Client>
|
||||
local LspClients = {}
|
||||
|
||||
--- @package
|
||||
--- @param client_id integer
|
||||
--- @param client_id lsp_progress.ClientId
|
||||
--- @return boolean
|
||||
local function _has_client(client_id)
|
||||
return LspClients[client_id] ~= nil
|
||||
end
|
||||
|
||||
--- @package
|
||||
--- @param client_id integer
|
||||
--- @return Client
|
||||
--- @param client_id lsp_progress.ClientId
|
||||
--- @return lsp_progress.Client
|
||||
local function _get_client(client_id)
|
||||
return LspClients[client_id]
|
||||
end
|
||||
|
||||
--- @package
|
||||
--- @param client_id integer
|
||||
--- @return nil
|
||||
--- @param client_id lsp_progress.ClientId
|
||||
local function _remove_client(client_id)
|
||||
LspClients[client_id] = nil
|
||||
if not next(LspClients) then
|
||||
|
@ -41,9 +40,8 @@ local function _remove_client(client_id)
|
|||
end
|
||||
|
||||
--- @package
|
||||
--- @param client_id integer
|
||||
--- @param client_id lsp_progress.ClientId
|
||||
--- @param client_name string
|
||||
--- @return nil
|
||||
local function _register_client(client_id, client_name)
|
||||
if not _has_client(client_id) then
|
||||
LspClients[client_id] = Client:new(client_id, client_name)
|
||||
|
@ -56,11 +54,9 @@ end
|
|||
|
||||
-- client manager }
|
||||
|
||||
--- @param client_id integer
|
||||
--- @param token string
|
||||
--- @return nil
|
||||
--- @param client_id lsp_progress.ClientId
|
||||
--- @param token lsp_progress.SeriesToken
|
||||
local function spin(client_id, token)
|
||||
--- @return nil
|
||||
local function spin_again()
|
||||
spin(client_id, token)
|
||||
end
|
||||
|
@ -164,20 +160,19 @@ local function spin(client_id, token)
|
|||
event.emit()
|
||||
end
|
||||
|
||||
--- @param err any
|
||||
--- @param msg table<string, any>
|
||||
--- @param ctx table<string, any>
|
||||
--- @return nil
|
||||
local function progress_handler(err, msg, ctx)
|
||||
local client_id = ctx.client_id
|
||||
local nvim_lsp_client = vim.lsp.get_client_by_id(client_id)
|
||||
local client_name = nvim_lsp_client and nvim_lsp_client.name or "unknown"
|
||||
--- @alias lsp_progress.LspClientObj {id:lsp_progress.ClientId,name:string}
|
||||
--- @alias lsp_progress.LspProgressObj {token:lsp_progress.SeriesToken,value:{kind:"begin"|"report"|"end",title:string?,message:string?,percentage:integer?}}
|
||||
--- @param client lsp_progress.LspClientObj
|
||||
--- @param progress lsp_progress.LspProgressObj
|
||||
local function update_progress(client, progress)
|
||||
local client_id = client.id
|
||||
local client_name = client.name
|
||||
|
||||
-- register client id if not exist
|
||||
_register_client(client_id, client_name)
|
||||
|
||||
local value = msg.value
|
||||
local token = msg.token
|
||||
local token = progress.token
|
||||
local value = progress.value
|
||||
|
||||
local cli = _get_client(client_id)
|
||||
if value.kind == "begin" then
|
||||
|
@ -238,7 +233,37 @@ local function progress_handler(err, msg, ctx)
|
|||
event.emit()
|
||||
end
|
||||
|
||||
--- @param option Configs?
|
||||
--- @param err string?
|
||||
--- @param msg table<string, any>
|
||||
--- @param ctx table<string, any>
|
||||
local function method_handler(err, msg, ctx)
|
||||
local client = vim.lsp.get_client_by_id(ctx.client_id) --[[@as table]]
|
||||
update_progress(client, msg)
|
||||
end
|
||||
|
||||
local function _is_lsp_client_obj(c)
|
||||
return type(c) == "table" and c.id and type(c.name) == "string"
|
||||
end
|
||||
|
||||
local function _is_lsp_progress_obj(p)
|
||||
return type(p) == "table" and p.token and type(p.value) == "table"
|
||||
end
|
||||
|
||||
local function event_handler()
|
||||
local lsp_clients = vim.lsp.get_active_clients()
|
||||
for _, client in ipairs(lsp_clients) do
|
||||
if _is_lsp_client_obj(client) and type(client.progress) == "table" then
|
||||
for progress in client.progress do
|
||||
-- logger.debug("|setup| v0.10 progress:%s", vim.inspect(progress))
|
||||
if _is_lsp_progress_obj(progress) then
|
||||
update_progress(client, progress)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--- @param option lsp_progress.Configs?
|
||||
--- @return string?
|
||||
local function progress(option)
|
||||
option = vim.tbl_deep_extend("force", vim.deepcopy(Configs), option or {})
|
||||
|
@ -285,8 +310,7 @@ local function progress(option)
|
|||
return content
|
||||
end
|
||||
|
||||
--- @param option table<string, any>
|
||||
--- @return nil
|
||||
--- @param option lsp_progress.Configs
|
||||
local function setup(option)
|
||||
-- setup config
|
||||
Configs = defaults.setup(option)
|
||||
|
@ -313,17 +337,24 @@ local function setup(option)
|
|||
-- init client
|
||||
require("lsp-progress.client").setup(Configs.client_format, Configs.spinner)
|
||||
|
||||
if not Registered then
|
||||
if vim.lsp.handlers["$/progress"] then
|
||||
local old_handler = vim.lsp.handlers["$/progress"]
|
||||
vim.lsp.handlers["$/progress"] = function(...)
|
||||
old_handler(...)
|
||||
progress_handler(...)
|
||||
if vim.fn.has("nvim-0.10") > 0 then
|
||||
-- see:
|
||||
-- https://github.com/neovim/neovim/blob/582d7f47905d82f315dc852a9d2937cd5b655e55/runtime/doc/news.txt#L44
|
||||
-- https://github.com/neovim/neovim/blob/582d7f47905d82f315dc852a9d2937cd5b655e55/runtime/lua/vim/lsp/util.lua#L348
|
||||
vim.api.nvim_create_autocmd("LspProgress", { callback = event_handler })
|
||||
else
|
||||
if not Registered then
|
||||
if vim.lsp.handlers["$/progress"] then
|
||||
local old_handler = vim.lsp.handlers["$/progress"]
|
||||
vim.lsp.handlers["$/progress"] = function(...)
|
||||
old_handler(...)
|
||||
method_handler(...)
|
||||
end
|
||||
else
|
||||
vim.lsp.handlers["$/progress"] = method_handler
|
||||
end
|
||||
else
|
||||
vim.lsp.handlers["$/progress"] = progress_handler
|
||||
Registered = true
|
||||
end
|
||||
Registered = true
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -1,25 +1,28 @@
|
|||
local logger = require("lsp-progress.logger")
|
||||
|
||||
--- @alias ClientFormatResult string|any|nil
|
||||
--- @alias ClientFormat fun(client_name:string,spinner:string,series_messages:string[]|table[]):ClientFormatResult
|
||||
--- @type ClientFormat?
|
||||
--- @alias lsp_progress.ClientFormatResult string|any|nil
|
||||
--- @alias lsp_progress.ClientFormat fun(client_name:string,spinner:string,series_messages:string[]|table[]):lsp_progress.ClientFormatResult
|
||||
--- @type lsp_progress.ClientFormat?
|
||||
local ClientFormat = nil
|
||||
|
||||
--- @type string[]|nil
|
||||
local Spinner = nil
|
||||
|
||||
--- @class Client
|
||||
--- @field client_id integer|nil
|
||||
---@alias lsp_progress.ClientId integer
|
||||
---@alias lsp_progress.SeriesToken integer|string
|
||||
---
|
||||
--- @class lsp_progress.Client
|
||||
--- @field client_id lsp_progress.ClientId?
|
||||
--- @field client_name string|nil
|
||||
--- @field spin_index integer
|
||||
--- @field serieses table<string, Series> map: key => SeriesObject.
|
||||
--- @field private _format_cache ClientFormatResult
|
||||
--- @field private _deduped_tokens table<string, string> map: title+message => token.
|
||||
--- @field serieses table<lsp_progress.SeriesToken, lsp_progress.Series> map series token => series object.
|
||||
--- @field private _format_cache lsp_progress.ClientFormatResult
|
||||
--- @field private _deduped_tokens table<string, lsp_progress.SeriesToken> map: title+message => token.
|
||||
local Client = {}
|
||||
|
||||
--- @param client_id integer
|
||||
--- @param client_id lsp_progress.ClientId
|
||||
--- @param client_name string
|
||||
--- @return Client
|
||||
--- @return lsp_progress.Client
|
||||
function Client:new(client_id, client_name)
|
||||
local o = {
|
||||
client_id = client_id,
|
||||
|
@ -38,7 +41,7 @@ function Client:new(client_id, client_name)
|
|||
return o
|
||||
end
|
||||
|
||||
--- @param token string
|
||||
--- @param token lsp_progress.SeriesToken
|
||||
--- @return boolean
|
||||
function Client:has_series(token)
|
||||
return self.serieses[token] ~= nil
|
||||
|
@ -63,7 +66,7 @@ end
|
|||
--- @package
|
||||
--- @param title string
|
||||
--- @param message string
|
||||
--- @param token string
|
||||
--- @param token lsp_progress.SeriesToken
|
||||
function Client:_set_dedup_token(title, message, token)
|
||||
self._deduped_tokens[_get_dedup_key(title, message)] = token
|
||||
end
|
||||
|
@ -78,12 +81,12 @@ end
|
|||
--- @package
|
||||
--- @param title string
|
||||
--- @param message string
|
||||
--- @return string token
|
||||
--- @return lsp_progress.SeriesToken
|
||||
function Client:_get_dedup_token(title, message)
|
||||
return self._deduped_tokens[_get_dedup_key(title, message)]
|
||||
end
|
||||
|
||||
--- @param token string
|
||||
--- @param token lsp_progress.SeriesToken
|
||||
function Client:remove_series(token)
|
||||
if self:has_series(token) then
|
||||
local series = self:get_series(token)
|
||||
|
@ -102,14 +105,14 @@ function Client:remove_series(token)
|
|||
self:format()
|
||||
end
|
||||
|
||||
--- @param token string
|
||||
--- @return Series
|
||||
--- @param token lsp_progress.SeriesToken
|
||||
--- @return lsp_progress.Series
|
||||
function Client:get_series(token)
|
||||
return self.serieses[token]
|
||||
end
|
||||
|
||||
--- @param token string
|
||||
--- @param series Series
|
||||
--- @param token lsp_progress.SeriesToken
|
||||
--- @param series lsp_progress.Series
|
||||
function Client:add_series(token, series)
|
||||
self:_set_dedup_token(series.title, series.message, token)
|
||||
self.serieses[token] = series
|
||||
|
@ -135,18 +138,19 @@ function Client:increase_spin_index()
|
|||
self:format()
|
||||
end
|
||||
|
||||
--- @return string
|
||||
function Client:get_spin_index()
|
||||
assert(Spinner ~= nil, "Spinner cannot be nil")
|
||||
assert(#Spinner > 0, "Spinner length must greater than 0")
|
||||
return Spinner[self.spin_index + 1]
|
||||
end
|
||||
|
||||
--- @return ClientFormatResult
|
||||
--- @return lsp_progress.ClientFormatResult
|
||||
function Client:format()
|
||||
--- @type SeriesFormatResult[]
|
||||
--- @type lsp_progress.SeriesFormatResult[]
|
||||
local series_messages = {}
|
||||
|
||||
--- @type table<string, boolean>
|
||||
--- @type table<lsp_progress.SeriesToken, boolean>
|
||||
local visited_tokens = {}
|
||||
|
||||
for dedup_key, token in pairs(self._deduped_tokens) do
|
||||
|
@ -188,14 +192,13 @@ function Client:format()
|
|||
return self._format_cache
|
||||
end
|
||||
|
||||
--- @return ClientFormatResult
|
||||
--- @return lsp_progress.ClientFormatResult
|
||||
function Client:format_result()
|
||||
return self._format_cache
|
||||
end
|
||||
|
||||
--- @param client_format ClientFormat
|
||||
--- @param client_format lsp_progress.ClientFormat
|
||||
--- @param spinner string[]
|
||||
--- @return nil
|
||||
local function setup(client_format, spinner)
|
||||
ClientFormat = client_format
|
||||
Spinner = spinner
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
--- @alias Configs table<any, any>
|
||||
--- @type Configs
|
||||
--- @alias lsp_progress.Configs table<any, any>
|
||||
--- @type lsp_progress.Configs
|
||||
local Defaults = {
|
||||
-- Spinning icons.
|
||||
--
|
||||
|
@ -52,7 +52,7 @@ local Defaults = {
|
|||
-- * https://github.com/linrongbin16/lsp-progress.nvim/issues/50
|
||||
-- * https://neovim.io/doc/user/builtin.html#mode()
|
||||
--
|
||||
--- @type DisableEventOpt[]
|
||||
--- @type lsp_progress.DisableEventOpt[]
|
||||
disable_events_opts = {
|
||||
{
|
||||
mode = "i",
|
||||
|
@ -72,7 +72,7 @@ local Defaults = {
|
|||
--- Progress in percentage numbers: 0-100.
|
||||
--- @param done boolean
|
||||
--- Indicate whether this series is the last one in progress.
|
||||
--- @return SeriesFormatResult
|
||||
--- @return lsp_progress.SeriesFormatResult
|
||||
--- The returned value will be passed to function `client_format` as
|
||||
--- one of the `series_messages` array, or ignored if return nil.
|
||||
series_format = function(title, message, percentage, done)
|
||||
|
@ -109,7 +109,7 @@ local Defaults = {
|
|||
--- Spinner icon.
|
||||
--- @param series_messages string[]|table[]
|
||||
--- Messages array.
|
||||
--- @return ClientFormatResult
|
||||
--- @return lsp_progress.ClientFormatResult
|
||||
--- The returned value will be passed to function `format` as one of the
|
||||
--- `client_messages` array, or ignored if return nil.
|
||||
client_format = function(client_name, spinner, series_messages)
|
||||
|
@ -131,7 +131,8 @@ local Defaults = {
|
|||
--- @return string
|
||||
--- The returned value will be returned as the result of `progress` API.
|
||||
format = function(client_messages)
|
||||
local sign = " LSP" -- nf-fa-gear \uf013
|
||||
-- icon: nf-fa-gear \uf013
|
||||
local sign = " LSP"
|
||||
if #client_messages > 0 then
|
||||
return sign .. " " .. table.concat(client_messages, " ")
|
||||
end
|
||||
|
@ -165,8 +166,8 @@ local Defaults = {
|
|||
file_log_name = "lsp-progress.log",
|
||||
}
|
||||
|
||||
--- @param option Configs
|
||||
--- @return Configs
|
||||
--- @param option lsp_progress.Configs
|
||||
--- @return lsp_progress.Configs
|
||||
local function setup(option)
|
||||
local config =
|
||||
vim.tbl_deep_extend("force", vim.deepcopy(Defaults), option or {})
|
||||
|
@ -174,7 +175,7 @@ local function setup(option)
|
|||
end
|
||||
|
||||
--- @package
|
||||
--- @return Configs
|
||||
--- @return lsp_progress.Configs
|
||||
local function _get_defaults()
|
||||
return Defaults
|
||||
end
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
local logger = require("lsp-progress.logger")
|
||||
|
||||
--- @type Configs
|
||||
--- @type lsp_progress.Configs
|
||||
local Configs = {
|
||||
--- @type string?
|
||||
name = nil,
|
||||
|
@ -12,7 +12,7 @@ local Configs = {
|
|||
emit = false,
|
||||
}
|
||||
|
||||
--- @class DisableEventOpt
|
||||
--- @class lsp_progress.DisableEventOpt
|
||||
--- @field mode string?
|
||||
--- @field filetype string?
|
||||
local DisableEventOpt = {
|
||||
|
@ -21,8 +21,8 @@ local DisableEventOpt = {
|
|||
}
|
||||
|
||||
--- @package
|
||||
--- @param opts Configs
|
||||
--- @return DisableEventOpt
|
||||
--- @param opts lsp_progress.Configs
|
||||
--- @return lsp_progress.DisableEventOpt
|
||||
function DisableEventOpt:new(opts)
|
||||
local o = {
|
||||
mode = opts.mode,
|
||||
|
@ -57,15 +57,15 @@ function DisableEventOpt:match()
|
|||
return mode_match and filetype_match
|
||||
end
|
||||
|
||||
--- @class DisableEventOptsManager
|
||||
--- @field disable_event_opts DisableEventOpt[]
|
||||
--- @class lsp_progress.DisableEventOptsManager
|
||||
--- @field disable_event_opts lsp_progress.DisableEventOpt[]
|
||||
local DisableEventOptsManager = {
|
||||
disable_event_opts = {},
|
||||
}
|
||||
|
||||
--- @package
|
||||
--- @param opts Configs[]?
|
||||
--- @return DisableEventOptsManager
|
||||
--- @param opts lsp_progress.Configs[]?
|
||||
--- @return lsp_progress.DisableEventOptsManager
|
||||
function DisableEventOptsManager:new(opts)
|
||||
local disable_event_opts = {}
|
||||
if type(opts) == "table" then
|
||||
|
@ -92,7 +92,7 @@ function DisableEventOptsManager:match()
|
|||
return false
|
||||
end
|
||||
|
||||
--- @type DisableEventOptsManager?
|
||||
--- @type lsp_progress.DisableEventOptsManager?
|
||||
local GlobalDisabledEventOptsManager = nil
|
||||
|
||||
--- @package
|
||||
|
@ -128,8 +128,7 @@ end
|
|||
--- @param event_name string
|
||||
--- @param event_update_time_limit integer
|
||||
--- @param internal_regular_update_time integer
|
||||
--- @param disable_events_opts Configs[]?
|
||||
--- @return nil
|
||||
--- @param disable_events_opts lsp_progress.Configs[]?
|
||||
local function setup(
|
||||
event_name,
|
||||
event_update_time_limit,
|
||||
|
@ -145,7 +144,6 @@ local function setup(
|
|||
regular_update()
|
||||
end
|
||||
|
||||
--- @type table<string, any>
|
||||
local M = {
|
||||
setup = setup,
|
||||
emit = emit,
|
||||
|
|
|
@ -1,3 +1,6 @@
|
|||
local uv = (vim.fn.has("nvim-0.10") > 0 and vim.uv ~= nil) and vim.uv
|
||||
or vim.loop
|
||||
|
||||
local PATH_SEPARATOR = (vim.fn.has("win32") > 0 or vim.fn.has("win64") > 0)
|
||||
and "\\"
|
||||
or "/"
|
||||
|
@ -27,7 +30,7 @@ local LogHighlights = {
|
|||
[4] = "ErrorMsg",
|
||||
}
|
||||
|
||||
--- @type Configs
|
||||
--- @type lsp_progress.Configs
|
||||
local Configs = {
|
||||
level = LogLevels.INFO,
|
||||
console_log = true,
|
||||
|
@ -39,7 +42,6 @@ local Configs = {
|
|||
--- @param console_log boolean
|
||||
--- @param file_log boolean
|
||||
--- @param file_log_name string
|
||||
--- @return nil
|
||||
local function setup(level, console_log, file_log, file_log_name)
|
||||
Configs.level = LogLevels[level]
|
||||
Configs.console_log = console_log
|
||||
|
@ -76,10 +78,12 @@ local function log(level, msg)
|
|||
local fp = io.open(Configs.file_name, "a")
|
||||
if fp then
|
||||
for _, line in ipairs(msg_lines) do
|
||||
local secs, ms = uv.gettimeofday()
|
||||
fp:write(
|
||||
string.format(
|
||||
"%s [%s]: %s\n",
|
||||
os.date("%Y-%m-%d %H:%M:%S"),
|
||||
"%s.%03d [%s]: %s\n",
|
||||
os.date("%Y-%m-%d %H:%M:%S", secs),
|
||||
math.floor(ms / 1000),
|
||||
LogLevelNames[level],
|
||||
line
|
||||
)
|
||||
|
|
|
@ -1,22 +1,22 @@
|
|||
local logger = require("lsp-progress.logger")
|
||||
|
||||
--- @alias SeriesFormatResult string|any|nil
|
||||
--- @alias SeriesFormat fun(title:string?,message:string?,percentage:integer?,done:boolean):SeriesFormatResult
|
||||
--- @type SeriesFormat?
|
||||
--- @alias lsp_progress.SeriesFormatResult string|any|nil
|
||||
--- @alias lsp_progress.SeriesFormat fun(title:string?,message:string?,percentage:integer?,done:boolean):lsp_progress.SeriesFormatResult
|
||||
--- @type lsp_progress.SeriesFormat?
|
||||
local SeriesFormat = nil
|
||||
|
||||
--- @class Series
|
||||
--- @class lsp_progress.Series
|
||||
--- @field title string?
|
||||
--- @field message string?
|
||||
--- @field percentage integer?
|
||||
--- @field done boolean
|
||||
--- @field private _format_cache SeriesFormatResult
|
||||
--- @field private _format_cache lsp_progress.SeriesFormatResult
|
||||
local Series = {}
|
||||
|
||||
--- @param title string?
|
||||
--- @param message string?
|
||||
--- @param percentage integer?
|
||||
--- @return Series
|
||||
--- @return lsp_progress.Series
|
||||
function Series:new(title, message, percentage)
|
||||
local o = {
|
||||
title = title,
|
||||
|
@ -36,7 +36,7 @@ function Series:new(title, message, percentage)
|
|||
end
|
||||
|
||||
--- @package
|
||||
--- @return SeriesFormatResult
|
||||
--- @return lsp_progress.SeriesFormatResult
|
||||
function Series:_format()
|
||||
assert(SeriesFormat ~= nil, "SeriesFormat cannot be null")
|
||||
|
||||
|
@ -92,12 +92,12 @@ function Series:finish(message)
|
|||
-- logger.debug("|series - Series:finish| finish: %s", vim.inspect(self))
|
||||
end
|
||||
|
||||
--- @return SeriesFormatResult
|
||||
--- @return lsp_progress.SeriesFormatResult
|
||||
function Series:format_result()
|
||||
return self._format_cache
|
||||
end
|
||||
|
||||
--- @param series_format SeriesFormat
|
||||
--- @param series_format lsp_progress.SeriesFormat
|
||||
local function setup(series_format)
|
||||
SeriesFormat = series_format
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue