summaryrefslogtreecommitdiff
path: root/.config/nvim/lua/plugins/lualine.lua
blob: 821b2550cff8880b77c69f3c7b998cb3d3b1effc (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
return {
    'nvim-lualine/lualine.nvim',
    dependencies = { 'nvim-tree/nvim-web-devicons', 'linrongbin16/lsp-progress.nvim' },
    event = 'VeryLazy',
    config = function()
        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,
                    {
                        require('noice').api.status.mode.get,
                        cond = require('noice').api.status.mode.has,
                        color = { fg = '#ff9e64' },
                    },
                },
                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,
        })
    end,
}