about summary refs log tree commit diff stats
path: root/modules/home/conf/nvim/plgs/lsp-progress-nvim/lua/lsp-progress-nvim.lua
blob: efb15720e4d75bb2cc87e9ff7a98a0c9f0b33c68 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
--- @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",
})