about summary refs log tree commit diff stats
path: root/modules/by-name/nv/nvim/plgs/lsp-progress-nvim
diff options
context:
space:
mode:
Diffstat (limited to 'modules/by-name/nv/nvim/plgs/lsp-progress-nvim')
-rw-r--r--modules/by-name/nv/nvim/plgs/lsp-progress-nvim/default.nix53
-rw-r--r--modules/by-name/nv/nvim/plgs/lsp-progress-nvim/lua/lsp-progress-nvim.lua146
2 files changed, 199 insertions, 0 deletions
diff --git a/modules/by-name/nv/nvim/plgs/lsp-progress-nvim/default.nix b/modules/by-name/nv/nvim/plgs/lsp-progress-nvim/default.nix
new file mode 100644
index 00000000..1a2fb6eb
--- /dev/null
+++ b/modules/by-name/nv/nvim/plgs/lsp-progress-nvim/default.nix
@@ -0,0 +1,53 @@
+{
+  lib,
+  config,
+  pkgs,
+  ...
+}: let
+  cfg = config.soispha.programs.nvim;
+in {
+  home-manager.users.soispha.programs.nixvim = lib.mkIf cfg.enable {
+    # 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/modules/by-name/nv/nvim/plgs/lsp-progress-nvim/lua/lsp-progress-nvim.lua b/modules/by-name/nv/nvim/plgs/lsp-progress-nvim/lua/lsp-progress-nvim.lua
new file mode 100644
index 00000000..5a2cff26
--- /dev/null
+++ b/modules/by-name/nv/nvim/plgs/lsp-progress-nvim/lua/lsp-progress-nvim.lua
@@ -0,0 +1,146 @@
+--- @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",
+})