summaryrefslogtreecommitdiff
path: root/.config/nvim/lua/custom/statusline.lua
blob: 8b607d38f7c752723e3afd5ca004dff094316f79 (plain)
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
local lualine = require('lualine')
local lsp_progress = require('lsp-progress')

local progress_filled = '█'
local progress_empty = '░'
local function progress_bar(percentage, width)
    -- Ensure i is an integer between 0 and width (inclusive)
    local i = math.max(0, math.min(math.floor(width * percentage), width))
    return string.rep(progress_filled, i) .. string.rep(progress_empty, width - i)
end

local progress_bar_width = 10
lsp_progress.setup({
    format = function(client_messages) -- global
        local sign = ' LSP'
        if #client_messages > 0 then
            return sign .. ' ' .. table.concat(client_messages, ' ')
        end
        if #require('lsp-progress.api').lsp_clients() > 0 then
            return sign
        end
        return ''
    end,
    client_format = function(_, _, series_messages) -- per lsp
        return #series_messages > 0 and table.concat(series_messages, ', ') or nil
    end,
    series_format = function(title, message, percentage, done) -- per progress
        local builder = {}
        local has_title = false
        local has_message = false
        if type(title) == 'string' and string.len(title) > 0 then
            table.insert(builder, title .. ':')
            has_title = true
        end
        if percentage then
            table.insert(builder, string.format('%.0f%%', percentage))
            table.insert(builder, 1, progress_bar(percentage / 100, progress_bar_width))
        end
        if type(message) == 'string' and string.len(message) > 0 then
            table.insert(builder, string.format('(%s)', message))
            has_message = true
        end
        if done and (has_title or has_message) then
            table.insert(builder, ' ')
        end
        return table.concat(builder, ' ')
    end,
})

lualine.setup({
    options = {
        globalstatus = true,
        theme = 'auto',
    },
    sections = {
        lualine_a = { { 'mode', icon = '' } },
        lualine_b = {
            require('auto-session.lib').current_session_name,
            { 'branch', icon = '' },
            {
                'diagnostics',
                symbols = {
                    error = '󰅙 ',
                    warn = '󰀦 ',
                    info = '󰋼 ',
                    hint = '󰌵 ',
                },
            },
        },
        lualine_c = {
            function()
                return lsp_progress.progress()
            end,
            -- {
            --     'lsp_progress',
            --     -- separators = { spinner = { pre = '⟨', post = '⟩' } },
            --     -- display_components = { 'lsp_client_name', 'spinner', { 'title', 'percentage', 'message' } },
            --     display_components = { 'spinner', { 'title', 'percentage', 'message' } },
            --     -- spinner_symbols = { -- 20 wide
            --     --     '░░░░░░░░░░░░░░░░░░░░',
            --     --     '█░░░░░░░░░░░░░░░░░░░',
            --     --     '██░░░░░░░░░░░░░░░░░░',
            --     --     '███░░░░░░░░░░░░░░░░░',
            --     --     '████░░░░░░░░░░░░░░░░',
            --     --     '█████░░░░░░░░░░░░░░░',
            --     --     '██████░░░░░░░░░░░░░░',
            --     --     '███████░░░░░░░░░░░░░',
            --     --     '████████░░░░░░░░░░░░',
            --     --     '█████████░░░░░░░░░░░',
            --     --     '██████████░░░░░░░░░░',
            --     --     '███████████░░░░░░░░░',
            --     --     '████████████░░░░░░░░',
            --     --     '█████████████░░░░░░░',
            --     --     '██████████████░░░░░░',
            --     --     '███████████████░░░░░',
            --     --     '████████████████░░░░',
            --     --     '█████████████████░░░',
            --     --     '██████████████████░░',
            --     --     '███████████████████░',
            --     --     '████████████████████',
            --     -- },
            -- },
        },
        lualine_x = {
            'searchcount',
            'encoding',
            'fileformat',
            'filetype',
        },
        lualine_y = { 'progress' },
        lualine_z = { 'location' },
    },
    extensions = { 'oil', 'trouble' },
})

-- Refresh lualine when lsp progress is updated
vim.api.nvim_create_autocmd('User', {
    group = vim.api.nvim_create_augroup('lualine_augroup', { clear = true }),
    pattern = 'LspProgressStatusUpdated',
    callback = require('lualine').refresh,
})