about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/default.nix1
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/lsp-progress-nvim/default.nix50
-rw-r--r--home-manager/soispha/config/neovim/nixvim/plugins/lsp-progress-nvim/lua/lsp-progress-nvim.lua160
3 files changed, 211 insertions, 0 deletions
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/default.nix b/home-manager/soispha/config/neovim/nixvim/plugins/default.nix
index 00d1d660..37aba5a5 100644
--- a/home-manager/soispha/config/neovim/nixvim/plugins/default.nix
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/default.nix
@@ -6,6 +6,7 @@
     ./leap
     ./lf-nvim
     ./lsp
+    ./lsp-progress-nvim
     ./lspkind
     ./lualine
     ./luasnip
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/lsp-progress-nvim/default.nix b/home-manager/soispha/config/neovim/nixvim/plugins/lsp-progress-nvim/default.nix
new file mode 100644
index 00000000..71385a91
--- /dev/null
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/lsp-progress-nvim/default.nix
@@ -0,0 +1,50 @@
+{
+  lib,
+  pkgs,
+  ...
+}: {
+  programs.nixvim = {
+    # TODO package lsp-progress-nvim though a module
+    extraConfigLuaPost = ''
+      ${lib.strings.fileContents ./lua/lsp-progress-nvim.lua}
+    '';
+    extraPlugins = [
+      pkgs.vimExtraPlugins.lsp-progress-nvim
+    ];
+
+    # Status line setup
+    autoGroups.lsp_refresh.clear = true;
+    autoCmd = [
+      {
+        event = ["User LspProgressStatusUpdated"];
+        pattern = ["*"];
+        callback =
+          /*
+          lua
+          */
+          {
+            __raw = ''
+              require("lualine").refresh
+            '';
+          };
+        group = "lsp_refresh";
+        description = "Refresh the statusbar when the lsp status was updated.";
+      }
+    ];
+    plugins.lualine = let
+      get_lsp_progress = {
+        __raw =
+          /*
+          lua
+          */
+          ''
+            require('lsp-progress').progress
+          '';
+      };
+    in {
+      sections = {
+        lualine_c = [{name = get_lsp_progress;}];
+      };
+    };
+  };
+}
diff --git a/home-manager/soispha/config/neovim/nixvim/plugins/lsp-progress-nvim/lua/lsp-progress-nvim.lua b/home-manager/soispha/config/neovim/nixvim/plugins/lsp-progress-nvim/lua/lsp-progress-nvim.lua
new file mode 100644
index 00000000..80c01e4a
--- /dev/null
+++ b/home-manager/soispha/config/neovim/nixvim/plugins/lsp-progress-nvim/lua/lsp-progress-nvim.lua
@@ -0,0 +1,160 @@
+--- @type table<string, any>
+require("lsp-progress").setup({
+    -- Spinning icons.
+    --
+    --- @type string[]
+    spinner = { "⣾", "⣽", "⣻", "⢿", "⡿", "⣟", "⣯", "⣷" },
+
+    -- Spinning update time in milliseconds.
+    --
+    --- @type integer
+    spin_update_time = 200,
+
+    -- Last message cached decay time in milliseconds.
+    --
+    -- Message could be really fast(appear and disappear in an
+    -- instant) that user cannot even see it, thus we cache the last message
+    -- for a while for user view.
+    --
+    --- @type integer
+    decay = 700,
+
+    -- User event name.
+    --
+    --- @type string
+    event = "LspProgressStatusUpdated",
+
+    -- Event update time limit in milliseconds.
+    --
+    -- Sometimes progress handler could emit many events in an instant, while
+    -- refreshing statusline cause too heavy synchronized IO, so we limit the
+    -- event rate to reduce this cost.
+    --
+    --- @type integer
+    event_update_time_limit = 100,
+
+    -- Max progress string length, by default -1 is unlimited.
+    --
+    --- @type integer
+    max_size = -1,
+
+    -- Regular internal update time.
+    --
+    -- Emit user event to update the lsp progress status, even there's no new
+    -- message.
+    --
+    --- @type integer
+    regular_internal_update_time = 500,
+
+    -- Disable emitting events on specific mode/filetype.
+    -- User events would interrupt insert mode, thus break which-key like plugins behaviour.
+    -- See:
+    --  * https://github.com/linrongbin16/lsp-progress.nvim/issues/50
+    --  * https://neovim.io/doc/user/builtin.html#mode()
+    --
+    --- @type table[]
+    disable_events_opts = {
+        {
+            mode = "i",
+            filetype = "TelescopePrompt",
+        },
+    },
+
+    -- Format series message.
+    --
+    -- By default it looks like: `formatting isort (100%) - done`.
+    --
+    --- @param title string|nil
+    ---     Message title.
+    --- @param message string|nil
+    ---     Message body.
+    --- @param percentage number|nil
+    ---     Progress in percentage numbers: 0-100.
+    --- @param done boolean
+    ---     Indicate whether this series is the last one in progress.
+    --- @return string|nil messages
+    ---     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)
+        local builder = {}
+        local has_title = false
+        local has_message = false
+        if title and title ~= "" then
+            table.insert(builder, title)
+            has_title = true
+        end
+        if message and message ~= "" then
+            table.insert(builder, message)
+            has_message = true
+        end
+        if percentage and (has_title or has_message) then
+            table.insert(builder, string.format("(%.0f%%%%)", percentage))
+        end
+        if done and (has_title or has_message) then
+            table.insert(builder, "- done")
+        end
+        return table.concat(builder, " ")
+    end,
+
+    -- Format client message.
+    --
+    -- By default it looks like:
+    -- `[null-ls] ⣷ formatting isort (100%) - done, formatting black (50%)`.
+    --
+    --- @param client_name string
+    ---     Client name.
+    --- @param spinner string
+    ---     Spinner icon.
+    --- @param series_messages string[]|table[]
+    ---     Messages array.
+    --- @return string|nil messages
+    ---     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)
+        return #series_messages > 0
+            and ("[" .. client_name .. "] " .. spinner .. " " .. table.concat(
+                series_messages,
+                ", "
+            ))
+            or nil
+    end,
+
+    -- Format (final) message.
+    --
+    -- By default it looks like:
+    -- ` LSP [null-ls] ⣷ formatting isort (100%) - done, formatting black (50%)`
+    --
+    --- @param client_messages string[]|table[]
+    ---     Client messages array.
+    --- @return nil|string message
+    ---     The returned value will be returned from `progress` API.
+    format = function(client_messages)
+        local sign = " LSP" -- nf-fa-gear \uf013
+        return #client_messages > 0
+            and (sign .. " " .. table.concat(client_messages, " "))
+            or sign
+    end,
+
+    -- Enable debug.
+    --
+    --- @type boolean
+    debug = false,
+
+    -- Print log to console(command line).
+    --
+    --- @type boolean
+    console_log = false,
+
+    -- Print log to file.
+    --
+    --- @type boolean
+    file_log = true,
+
+    -- Log file to write, work with `file_log=true`.
+    --
+    -- For Windows: `$env:USERPROFILE\AppData\Local\nvim-data\lsp-progress.log`.
+    -- For *NIX: `~/.local/share/nvim/lsp-progress.log`.
+    --
+    --- @type string
+    file_log_name = "lsp-progress.log",
+})