644 lines
17 KiB
Lua
644 lines
17 KiB
Lua
local gl = require('galaxyline')
|
||
local condition = require('galaxyline.condition')
|
||
local gps = require('nvim-gps')
|
||
|
||
local get_relative_gitpath = function()
|
||
local fpath = vim.fn.expand('%:h')
|
||
local fname = vim.fn.expand('%:t')
|
||
local gitpath = vim.fn.systemlist('git rev-parse --show-toplevel')[1]
|
||
local ellipsis = '...'
|
||
local relative_gitpath = fpath:gsub(gitpath, '') .. '/' .. fname
|
||
|
||
if vim.fn.winwidth(0) < 200 and #relative_gitpath > 30 then
|
||
return ellipsis .. relative_gitpath:sub(25, #relative_gitpath)
|
||
end
|
||
|
||
return relative_gitpath
|
||
end
|
||
|
||
local function u(code)
|
||
if type(code) == 'string' then
|
||
code = tonumber('0x' .. code)
|
||
end
|
||
local c = string.char
|
||
if code <= 0x7f then
|
||
return c(code)
|
||
end
|
||
local t = {}
|
||
|
||
if code <= 0x07ff then
|
||
t[1] = c(bit.bor(0xc0, bit.rshift(code, 6)))
|
||
t[2] = c(bit.bor(0x80, bit.band(code, 0x3f)))
|
||
elseif code <= 0xffff then
|
||
t[1] = c(bit.bor(0xe0, bit.rshift(code, 12)))
|
||
t[2] = c(bit.bor(0x80, bit.band(bit.rshift(code, 6), 0x3f)))
|
||
t[3] = c(bit.bor(0x80, bit.band(code, 0x3f)))
|
||
else
|
||
t[1] = c(bit.bor(0xf0, bit.rshift(code, 18)))
|
||
t[2] = c(bit.bor(0x80, bit.band(bit.rshift(code, 12), 0x3f)))
|
||
t[3] = c(bit.bor(0x80, bit.band(bit.rshift(code, 6), 0x3f)))
|
||
t[4] = c(bit.bor(0x80, bit.band(code, 0x3f)))
|
||
end
|
||
|
||
return table.concat(t)
|
||
end
|
||
|
||
local function highlight(group, fg, bg, gui)
|
||
local cmd = string.format('highlight %s guifg=%s guibg=%s', group, fg, bg)
|
||
|
||
if gui ~= nil then
|
||
cmd = cmd .. ' gui=' .. gui
|
||
end
|
||
|
||
vim.cmd(cmd)
|
||
end
|
||
|
||
local lineLengthWarning = 80
|
||
local lineLengthError = 120
|
||
local leftbracket = '' -- Curve.
|
||
local rightbracket = '' -- Curve.
|
||
|
||
gl.short_line_list = { 'NvimTree', 'vista', 'dbui', 'packer', 'tagbar' }
|
||
local gls = gl.section
|
||
|
||
local colors = {
|
||
bg = nil,
|
||
modetext = '#000000',
|
||
|
||
giticon = '#FF8800',
|
||
gitbg = '#5C2C2E',
|
||
gittext = '#C5C5C5',
|
||
|
||
diagerror = '#F44747',
|
||
diagwarn = '#FF8800',
|
||
diaghint = '#4FC1FF',
|
||
diaginfo = '#FFCC66',
|
||
|
||
lspicon = '#68AF00',
|
||
lspbg = '#304B2E',
|
||
lsptext = '#C5C5C5',
|
||
|
||
typeicon = '#FF8800',
|
||
typebg = '#5C2C2E',
|
||
typetext = '#C5C5C5',
|
||
|
||
statsicon = '#9CDCFE',
|
||
statsbg = '#5080A0',
|
||
statstext = '#000000',
|
||
|
||
lineokfg = '#000000',
|
||
lineokbg = '#5080A0',
|
||
linelongerrorfg = '#FF0000',
|
||
linelongwarnfg = '#FFFF00',
|
||
linelongbg = '#5080A0',
|
||
|
||
shortbg = '#DCDCAA',
|
||
shorttext = '#000000',
|
||
|
||
shortrightbg = '#3F3F3F',
|
||
shortrighttext = '#7C4C4E',
|
||
|
||
gpsbg = '#5C00A3',
|
||
gpstext = '#C5C5C5',
|
||
|
||
red = '#D16969',
|
||
yellow = '#DCDCAA',
|
||
magenta = '#D16D9E',
|
||
green = '#608B4E',
|
||
orange = '#FF8800',
|
||
purple = '#C586C0',
|
||
blue = '#569CD6',
|
||
cyan = '#4EC9B0',
|
||
}
|
||
|
||
local mode_map = {
|
||
['n'] = { '#569CD6', 'NORMAL' },
|
||
['i'] = { '#D16969', 'INSERT' },
|
||
['R'] = { '#D16969', 'REPLACE' },
|
||
['c'] = { '#608B4E', 'COMMAND' },
|
||
['v'] = { '#C586C0', 'VISUAL' },
|
||
['V'] = { '#C586C0', 'VIS-LN' },
|
||
[''] = { '#C586C0', 'VIS-BLK' },
|
||
['s'] = { '#FF8800', 'SELECT' },
|
||
['S'] = { '#FF8800', 'SEL-LN' },
|
||
[''] = { '#DCDCAA', 'SEL-BLK' },
|
||
['t'] = { '#569CD6', 'TERMINAL' },
|
||
['Rv'] = { '#D16D69', 'VIR-REP' },
|
||
['rm'] = { '#FF0000', '- More -' },
|
||
['r'] = { '#FF0000', '- Hit-Enter -' },
|
||
['r?'] = { '#FF0000', '- Confirm -' },
|
||
['cv'] = { '#569CD6', 'Vim Ex Mode' },
|
||
['ce'] = { '#569CD6', 'Normal Ex Mode' },
|
||
['!'] = { '#569CD6', 'Shell Running' },
|
||
['ic'] = { '#DCDCAA', 'Insert mode completion |compl-generic|' },
|
||
['no'] = { '#DCDCAA', 'Operator-pending' },
|
||
['nov'] = { '#DCDCAA', 'Operator-pending (forced charwise |o_v|)' },
|
||
['noV'] = { '#DCDCAA', 'Operator-pending (forced linewise |o_V|)' },
|
||
['noCTRL-V'] = { '#DCDCAA', 'Operator-pending (forced blockwise |o_CTRL-V|) CTRL-V is one character' },
|
||
['niI'] = { '#DCDCAA', 'Normal using |i_CTRL-O| in |Insert-mode|' },
|
||
['niR'] = { '#DCDCAA', 'Normal using |i_CTRL-O| in |Replace-mode|' },
|
||
['niV'] = { '#DCDCAA', 'Normal using |i_CTRL-O| in |Virtual-Replace-mode|' },
|
||
['ix'] = { '#DCDCAA', 'Insert mode |i_CTRL-X| completion' },
|
||
['Rc'] = { '#DCDCAA', 'Replace mode completion |compl-generic|' },
|
||
['Rx'] = { '#DCDCAA', 'Replace mode |i_CTRL-X| completion' },
|
||
}
|
||
|
||
local icons = {
|
||
vim = u('e62b'),
|
||
dos = u('e70f'),
|
||
unix = u('f17c'),
|
||
mac = u('f179'),
|
||
}
|
||
|
||
local function setLineWidthColours()
|
||
local colbg = colors.statsbg
|
||
local linebg = colors.statsbg
|
||
|
||
if vim.fn.col('.') > lineLengthError then
|
||
colbg = colors.linelongerrorfg
|
||
elseif vim.fn.col('.') > lineLengthWarning then
|
||
colbg = colors.linelongwarnfg
|
||
end
|
||
|
||
if vim.fn.strwidth(vim.fn.getline('.')) > lineLengthError then
|
||
linebg = colors.linelongerrorfg
|
||
elseif vim.fn.strwidth(vim.fn.getline('.')) > lineLengthWarning then
|
||
linebg = colors.linelongwarnfg
|
||
end
|
||
|
||
highlight('LinePosHighlightStart', colbg, colors.statsbg)
|
||
highlight('LinePosHighlightColNum', colors.statstext, colbg)
|
||
highlight('LinePosHighlightMid', linebg, colbg)
|
||
highlight('LineLenHighlightLenNum', colors.statstext, linebg)
|
||
highlight('LinePosHighlightEnd', linebg, colors.statsbg)
|
||
end
|
||
gls.left = {}
|
||
|
||
table.insert(gls.left, {
|
||
ViModeSpaceOnFarLeft = {
|
||
provider = function()
|
||
return ' '
|
||
end,
|
||
highlight = { colors.giticon, colors.bg },
|
||
},
|
||
})
|
||
table.insert(gls.left, {
|
||
ViModeLeft = {
|
||
provider = function()
|
||
highlight('ViModeHighlight', mode_map[vim.fn.mode()][1], colors.bg)
|
||
return leftbracket
|
||
end,
|
||
highlight = 'ViModeHighlight',
|
||
},
|
||
})
|
||
table.insert(gls.left, {
|
||
ViModeIconAndText = {
|
||
provider = function()
|
||
highlight('GalaxyViMode', colors.modetext, mode_map[vim.fn.mode()][1])
|
||
|
||
return icons['vim'] .. ' ' .. mode_map[vim.fn.mode()][2]
|
||
end,
|
||
highlight = 'GalaxyViMode',
|
||
},
|
||
})
|
||
table.insert(gls.left, {
|
||
ViModeRight = {
|
||
provider = function()
|
||
return rightbracket
|
||
end,
|
||
separator = ' ',
|
||
separator_highlight = 'ViModeHighlight',
|
||
highlight = 'ViModeHighlight',
|
||
},
|
||
})
|
||
|
||
table.insert(gls.left, {
|
||
GitStart = {
|
||
provider = function()
|
||
return leftbracket
|
||
end,
|
||
condition = condition.check_git_workspace,
|
||
highlight = { colors.giticon, colors.bg },
|
||
},
|
||
})
|
||
table.insert(gls.left, {
|
||
GitIcon = {
|
||
provider = function()
|
||
return ' '
|
||
end,
|
||
condition = condition.check_git_workspace,
|
||
separator = '',
|
||
separator_highlight = { 'NONE', colors.giticon },
|
||
highlight = { colors.gitbg, colors.giticon },
|
||
},
|
||
})
|
||
table.insert(gls.left, {
|
||
GitMid = {
|
||
provider = function()
|
||
return rightbracket .. ' '
|
||
end,
|
||
condition = condition.check_git_workspace,
|
||
highlight = { colors.giticon, colors.gitbg },
|
||
},
|
||
})
|
||
table.insert(gls.left, {
|
||
GitBranch = {
|
||
provider = 'GitBranch',
|
||
condition = condition.check_git_workspace,
|
||
separator = ' ',
|
||
separator_highlight = { 'NONE', colors.gitbg },
|
||
highlight = { colors.gittext, colors.gitbg },
|
||
},
|
||
})
|
||
|
||
table.insert(gls.left, {
|
||
DiffAdd = {
|
||
provider = 'DiffAdd',
|
||
condition = condition.check_git_workspace,
|
||
icon = ' ',
|
||
highlight = { colors.green, colors.gitbg },
|
||
},
|
||
})
|
||
table.insert(gls.left, {
|
||
DiffModified = {
|
||
provider = 'DiffModified',
|
||
condition = condition.check_git_workspace,
|
||
icon = ' ',
|
||
highlight = { colors.blue, colors.gitbg },
|
||
},
|
||
})
|
||
table.insert(gls.left, {
|
||
DiffRemove = {
|
||
provider = 'DiffRemove',
|
||
condition = condition.check_git_workspace,
|
||
icon = ' ',
|
||
highlight = { colors.red, colors.gitbg },
|
||
},
|
||
})
|
||
table.insert(gls.left, {
|
||
EndGit = {
|
||
provider = function()
|
||
return rightbracket
|
||
end,
|
||
condition = condition.check_git_workspace,
|
||
separator = ' ',
|
||
separator_highlight = { colors.gitbg, colors.bg },
|
||
highlight = { colors.gitbg, colors.bg },
|
||
},
|
||
})
|
||
|
||
table.insert(gls.left, {
|
||
LspStart = {
|
||
provider = function()
|
||
return leftbracket
|
||
end,
|
||
highlight = { colors.lspicon, colors.bg },
|
||
},
|
||
})
|
||
table.insert(gls.left, {
|
||
LspIcon = {
|
||
provider = function()
|
||
local name = ''
|
||
if gl.lspclient ~= nil then
|
||
name = gl.lspclient()
|
||
end
|
||
return '' .. name
|
||
end,
|
||
highlight = { colors.lspbg, colors.lspicon },
|
||
},
|
||
})
|
||
table.insert(gls.left, {
|
||
LspMid = {
|
||
provider = function()
|
||
return rightbracket .. ' '
|
||
end,
|
||
highlight = { colors.lspicon, colors.lspbg },
|
||
},
|
||
})
|
||
table.insert(gls.left, {
|
||
ShowLspClient = {
|
||
provider = 'GetLspClient',
|
||
highlight = { colors.textbg, colors.lspbg },
|
||
},
|
||
})
|
||
table.insert(gls.left, {
|
||
LspSpace = {
|
||
provider = function()
|
||
return ' '
|
||
end,
|
||
highlight = { colors.lspicon, colors.lspbg },
|
||
},
|
||
})
|
||
|
||
table.insert(gls.left, {
|
||
DiagnosticError = {
|
||
provider = 'DiagnosticError',
|
||
icon = ' ',
|
||
separator_highlight = { colors.gitbg, colors.bg },
|
||
highlight = { colors.diagerror, colors.lspbg },
|
||
},
|
||
})
|
||
table.insert(gls.left, {
|
||
DiagnosticWarn = {
|
||
provider = 'DiagnosticWarn',
|
||
icon = ' ',
|
||
highlight = { colors.diagwarn, colors.lspbg },
|
||
},
|
||
})
|
||
table.insert(gls.left, {
|
||
DiagnosticHint = {
|
||
provider = 'DiagnosticHint',
|
||
icon = ' ',
|
||
highlight = { colors.diaghint, colors.lspbg },
|
||
},
|
||
})
|
||
table.insert(gls.left, {
|
||
DiagnosticInfo = {
|
||
provider = 'DiagnosticInfo',
|
||
icon = ' ',
|
||
highlight = { colors.diaginfo, colors.lspbg },
|
||
},
|
||
})
|
||
table.insert(gls.left, {
|
||
LspSectionEnd = {
|
||
provider = function()
|
||
return rightbracket .. ' '
|
||
end,
|
||
highlight = { colors.lspbg, colors.bg },
|
||
},
|
||
})
|
||
|
||
table.insert(gls.left, {
|
||
nvimGPS = {
|
||
provider = function()
|
||
return gps.get_location()
|
||
end,
|
||
condition = function()
|
||
return gps.is_available() and #gps.get_location() > 0
|
||
end,
|
||
highlight = { colors.gpstext, colors.bg },
|
||
},
|
||
})
|
||
|
||
gls.right = {}
|
||
|
||
table.insert(gls.right, {
|
||
TypeStart = {
|
||
provider = function()
|
||
return leftbracket
|
||
end,
|
||
highlight = { colors.typeicon, colors.bg },
|
||
},
|
||
})
|
||
table.insert(gls.right, {
|
||
TypeFileFormatIcon = {
|
||
provider = function()
|
||
local icon = icons[vim.bo.fileformat] or ''
|
||
return string.format(' %s', icon)
|
||
end,
|
||
highlight = { colors.typebg, colors.typeicon },
|
||
},
|
||
})
|
||
table.insert(gls.right, {
|
||
TypeMid = {
|
||
provider = function()
|
||
return rightbracket .. ' '
|
||
end,
|
||
highlight = { colors.typeicon, colors.typebg },
|
||
},
|
||
})
|
||
|
||
table.insert(gls.right, {
|
||
FileName = {
|
||
provider = function()
|
||
if #vim.fn.expand('%:p') == 0 then
|
||
return ''
|
||
end
|
||
return get_relative_gitpath() .. ' '
|
||
end,
|
||
separator_highlight = { 'NONE', colors.typebg },
|
||
highlight = { colors.typetext, colors.typebg },
|
||
},
|
||
})
|
||
table.insert(gls.right, {
|
||
FileIcon = {
|
||
provider = 'FileIcon',
|
||
highlight = { colors.typeicon, colors.typebg },
|
||
},
|
||
})
|
||
table.insert(gls.right, {
|
||
BufferType = {
|
||
provider = 'FileTypeName',
|
||
highlight = { colors.typetext, colors.typebg },
|
||
},
|
||
})
|
||
table.insert(gls.right, {
|
||
FileSize = {
|
||
provider = 'FileSize',
|
||
separator = ' ',
|
||
separator_highlight = { colors.typeicon, colors.typebg },
|
||
highlight = { colors.typetext, colors.typebg },
|
||
},
|
||
})
|
||
table.insert(gls.right, {
|
||
FileEncode = {
|
||
provider = 'FileEncode',
|
||
separator = '',
|
||
separator_highlight = { colors.typeicon, colors.typebg },
|
||
highlight = { colors.typetext, colors.typebg },
|
||
},
|
||
})
|
||
table.insert(gls.right, {
|
||
TypeSectionEnd = {
|
||
provider = function()
|
||
return rightbracket
|
||
end,
|
||
highlight = { colors.typebg, colors.bg },
|
||
},
|
||
})
|
||
table.insert(gls.right, {
|
||
Space = {
|
||
provider = function()
|
||
return ' '
|
||
end,
|
||
highlight = { colors.typebg, colors.bg },
|
||
},
|
||
})
|
||
|
||
table.insert(gls.right, {
|
||
StatsSectionStart = {
|
||
provider = function()
|
||
return leftbracket
|
||
end,
|
||
highlight = { colors.statsicon, colors.bg },
|
||
},
|
||
})
|
||
table.insert(gls.right, {
|
||
StatsIcon = {
|
||
provider = function()
|
||
return '⅑'
|
||
end,
|
||
highlight = { colors.statsbg, colors.statsicon },
|
||
},
|
||
})
|
||
table.insert(gls.right, {
|
||
StatsMid = {
|
||
provider = function()
|
||
return rightbracket .. ' '
|
||
end,
|
||
highlight = { colors.statsicon, colors.statsbg },
|
||
},
|
||
})
|
||
table.insert(gls.right, {
|
||
PerCent = {
|
||
provider = 'LinePercent',
|
||
highlight = { colors.statstext, colors.statsbg },
|
||
},
|
||
})
|
||
table.insert(gls.right, {
|
||
VerticalPosAndSize = {
|
||
provider = function()
|
||
return string.format('%4i /%4i ', vim.fn.line('.'), vim.fn.line('$'))
|
||
end,
|
||
separator = ' ',
|
||
separator_highlight = { colors.statsicon, colors.statsbg },
|
||
highlight = { colors.statstext, colors.statsbg },
|
||
},
|
||
})
|
||
table.insert(gls.right, {
|
||
CursorColumnStart = {
|
||
provider = function()
|
||
return leftbracket
|
||
end,
|
||
separator = ' ',
|
||
separator_highlight = { colors.statsicon, colors.statsbg },
|
||
highlight = 'LinePosHighlightStart',
|
||
},
|
||
})
|
||
table.insert(gls.right, {
|
||
CursorColumn = {
|
||
provider = function()
|
||
setLineWidthColours()
|
||
return '' .. string.format('%3i', vim.fn.col('.')) .. ' /'
|
||
end,
|
||
highlight = 'LinePosHighlightColNum',
|
||
},
|
||
})
|
||
table.insert(gls.right, {
|
||
LineLengthStart = {
|
||
provider = function()
|
||
return ' ' .. leftbracket
|
||
end,
|
||
highlight = 'LinePosHighlightMid',
|
||
},
|
||
})
|
||
table.insert(gls.right, {
|
||
LineLength = {
|
||
provider = function()
|
||
return ' ' .. string.format('%3i', string.len(vim.fn.getline('.')))
|
||
end,
|
||
highlight = 'LineLenHighlightLenNum',
|
||
},
|
||
})
|
||
table.insert(gls.right, {
|
||
LineLengthEnd = {
|
||
provider = function()
|
||
return ' ' .. rightbracket .. ' '
|
||
end,
|
||
highlight = 'LinePosHighlightEnd',
|
||
},
|
||
})
|
||
table.insert(gls.right, {
|
||
TabOrSpace = {
|
||
provider = function()
|
||
if vim.bo.expandtab then
|
||
return ' '
|
||
else
|
||
return ' '
|
||
end
|
||
end,
|
||
condition = condition.hide_in_width,
|
||
highlight = { colors.statsicon, colors.statsbg },
|
||
},
|
||
})
|
||
table.insert(gls.right, {
|
||
Tabstop = {
|
||
provider = function()
|
||
if vim.bo.expandtab then
|
||
return vim.bo.shiftwidth
|
||
else
|
||
return vim.bo.shiftwidth
|
||
end
|
||
end,
|
||
condition = condition.hide_in_width,
|
||
highlight = { colors.statstext, colors.statsbg },
|
||
},
|
||
})
|
||
table.insert(gls.right, {
|
||
StatsSpcSectionEnd = {
|
||
provider = function()
|
||
return rightbracket .. ' '
|
||
end,
|
||
highlight = { colors.statsbg, colors.bg },
|
||
},
|
||
})
|
||
|
||
gls.short_line_left = {}
|
||
|
||
table.insert(gls.short_line_left, {
|
||
ShortSectionStart = {
|
||
provider = function()
|
||
return leftbracket
|
||
end,
|
||
highlight = { colors.shortbg, colors.bg },
|
||
},
|
||
})
|
||
table.insert(gls.short_line_left, {
|
||
ShortSectionSpace = {
|
||
provider = function()
|
||
return ' '
|
||
end,
|
||
highlight = { colors.shorttext, colors.shortbg },
|
||
},
|
||
})
|
||
table.insert(gls.short_line_left, {
|
||
LeftShortName = {
|
||
provider = 'FileTypeName',
|
||
highlight = { colors.shorttext, colors.shortbg },
|
||
},
|
||
})
|
||
table.insert(gls.short_line_left, {
|
||
ShortSectionMid = {
|
||
provider = function()
|
||
return ' '
|
||
end,
|
||
highlight = { colors.shortbg, colors.shortbg },
|
||
},
|
||
})
|
||
table.insert(gls.short_line_left, {
|
||
LeftShortFileName = {
|
||
provider = 'SFileName',
|
||
condition = condition.buffer_not_empty,
|
||
separator_highlight = { colors.shorttext, colors.shortbg },
|
||
highlight = { colors.shorttext, colors.shortbg },
|
||
},
|
||
})
|
||
table.insert(gls.short_line_left, {
|
||
ShortSectionEnd = {
|
||
provider = function()
|
||
return rightbracket
|
||
end,
|
||
highlight = { colors.shortbg, colors.bg },
|
||
},
|
||
})
|
||
|
||
gls.short_line_right = {}
|
||
|
||
table.insert(gls.short_line_right, {
|
||
BufferIcon = {
|
||
provider = 'BufferIcon',
|
||
separator_highlight = { colors.shorttext, colors.bg },
|
||
highlight = { colors.shortrighttext, colors.bg },
|
||
},
|
||
})
|