summaryrefslogtreecommitdiff
path: root/.config/nvim/lua/custom/config/lualine.lua
blob: ce581c4f819635915716cb1f0f164e70d088821a (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
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,
        },
        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,
})