Port custom statusline from vimscript & change colors
This commit is contained in:
parent
0656de97fa
commit
3353b099be
1
init.lua
1
init.lua
@ -3,6 +3,7 @@ require('mappings')
|
||||
require('netrw')
|
||||
require('autocmds')
|
||||
require('build')
|
||||
require('statusline')
|
||||
|
||||
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
|
||||
if not vim.loop.fs_stat(lazypath) then
|
||||
|
@ -1,20 +0,0 @@
|
||||
return {
|
||||
'ojroques/nvim-hardline',
|
||||
config = function()
|
||||
require('hardline').setup({
|
||||
sections = {
|
||||
{ class = 'mode', item = require('hardline.parts.mode').get_item },
|
||||
-- { class = 'high', item = require('hardline.parts.git').get_item, hide = 100 },
|
||||
{ class = 'med', item = require('hardline.parts.filename').get_item },
|
||||
'%<',
|
||||
{ class = 'med', item = '%=' },
|
||||
{ class = 'low', item = require('hardline.parts.wordcount').get_item, hide = 100 },
|
||||
{ class = 'error', item = require('hardline.parts.lsp').get_error },
|
||||
{ class = 'warning', item = require('hardline.parts.lsp').get_warning },
|
||||
{ class = 'warning', item = require('hardline.parts.whitespace').get_item },
|
||||
{ class = 'high', item = require('hardline.parts.filetype').get_item, hide = 60 },
|
||||
{ class = 'mode', item = require('hardline.parts.line').get_item },
|
||||
}
|
||||
})
|
||||
end
|
||||
}
|
185
lua/statusline.lua
Normal file
185
lua/statusline.lua
Normal file
@ -0,0 +1,185 @@
|
||||
local statusline = {}
|
||||
|
||||
local theme = {
|
||||
light_green = { fg = '#262626', bg = '#59946f' },
|
||||
light_blue = { fg = '#262626', bg = '#5c91bf' },
|
||||
light_orange = { fg = '#262626', bg = '#b6927b' },
|
||||
light_red = { fg = '#262626', bg = '#e46876' },
|
||||
light_grey = { fg = '#262626', bg = '#808080' },
|
||||
light_violet = { fg = '#262626', bg = '#957fb8' },
|
||||
dark_white = { fg = '#ffffff', bg = '#121212' },
|
||||
dark_yellow = { fg = '#c4b28a', bg = '#121212' },
|
||||
dark_grey = { fg = '#808080', bg = '#121212' },
|
||||
}
|
||||
|
||||
local modes = {}
|
||||
modes[110] = { name = 'Normal', color = 'light_green' }
|
||||
modes[105] = { name = 'Insert', color = 'light_blue' }
|
||||
modes[99] = { name = 'Command', color = 'light_green' }
|
||||
modes[118] = { name = 'Visual', color = 'light_violet' }
|
||||
modes[86] = { name = 'V-Line', color = 'light_violet' }
|
||||
modes[22] = { name = 'V-Block', color = 'light_violet' }
|
||||
modes[82] = { name = 'Replace', color = 'light_red' }
|
||||
modes[115] = { name = 'Select', color = 'light_orange' }
|
||||
modes[83] = { name = 'S-Line', color = 'light_orange' }
|
||||
modes[19] = { name = 'S-Block', color = 'light_orange' }
|
||||
modes[116] = { name = 'Terminal', color = 'light_blue' }
|
||||
modes[33] = { name = 'Shell', color = 'light_grey' }
|
||||
|
||||
local function highlight(group, color, attrs)
|
||||
local command = 'highlight ' .. group ..
|
||||
' guifg=' .. color.fg .. ' guibg=' .. color.bg
|
||||
if attrs then
|
||||
command = command .. ' gui=' .. attrs
|
||||
end
|
||||
vim.cmd(command)
|
||||
end
|
||||
|
||||
-- StatusLineLight is shows the mode and cursor information, it is dynamically
|
||||
-- changed by statusline#mode(), give it a default.
|
||||
highlight('StatusLineLight', theme.light_grey)
|
||||
-- StatusLineDusk is shows additional information which is not always present,
|
||||
-- give it a muted color.
|
||||
highlight('StatusLineDusk', theme.light_grey, 'bold')
|
||||
-- StatusLineDark shows the filename and filetype and takes up most of the
|
||||
-- statusline, give it a dark background.
|
||||
highlight('StatusLineDark', theme.dark_white)
|
||||
-- StatusLineChange shows changes in the file by changing the colour of the
|
||||
-- filename, give if a dark background.
|
||||
highlight('StatusLineChange', theme.dark_yellow)
|
||||
-- StatusLineFade shows the status of completion engines but using colors which
|
||||
-- fade into the background to avoid grabbing attention.
|
||||
highlight('StatusLineDuskFade', theme.dark_grey)
|
||||
|
||||
-- Get statusline mode and update StatusLineLight.
|
||||
local function get_mode()
|
||||
-- Map modes to a human readable name and a color.
|
||||
local current_mode = modes[vim.fn.char2nr(vim.fn.mode())]
|
||||
-- Update the StatusLineLight color.
|
||||
highlight('StatusLineLight', theme[current_mode.color], 'bold')
|
||||
return current_mode.name
|
||||
end
|
||||
|
||||
-- Construct a statusline for special buffer types.
|
||||
local function special(group, name, title)
|
||||
-- Display current mode with dynamic highlights.
|
||||
local line = '%#' .. group .. '# ' .. name .. ' '
|
||||
-- Display filename with dark highlights.
|
||||
line = line .. '%#StatusLineDark# ' .. title
|
||||
-- Display current/total lines and column with dynamic highlights.
|
||||
line = line .. '%=' .. '%#' .. group .. '# ☰%l/%L ·%2c '
|
||||
-- Combine the elements into a single string to be evaluated.
|
||||
return line
|
||||
end
|
||||
|
||||
-- Construct a statusline for generic buffer types.
|
||||
local function generic(group, name, show_lsp)
|
||||
-- Display current mode with dynamic highlights.
|
||||
local line = '%#' .. group .. '# ' .. name .. ' '
|
||||
-- Display spell or paste if set with dusk highlights in a group to swallow
|
||||
-- the spaces when empty.
|
||||
line = line .. '%#StatusLineDusk#%( ' .. '%{&spell ? "Spell " : ""}' ..
|
||||
'%{&paste ? "Paste " : ""}' .. '%)'
|
||||
-- Display filename with dark or changed highlights.
|
||||
if vim.o.modified then
|
||||
line = line .. '%#StatusLineChange#'
|
||||
else
|
||||
line = line .. '%#StatusLineDark#'
|
||||
end
|
||||
line = line .. ' %<%f'
|
||||
-- Display readonly and nomodifiable if set.
|
||||
line = line
|
||||
.. '%#StatusLineDark#'
|
||||
.. '%{&readonly ? " 🔒" : ""}'
|
||||
.. '%{&modifiable ? "" : " ⛔"}'
|
||||
-- FIXME: if show_lsp and vim.fn.exists('*coc#status') then
|
||||
-- -- Display LSP status.
|
||||
-- line = line .. '%#StatusLineDuskFade#%( %{coc#status()}%)'
|
||||
-- end
|
||||
-- Display filetype if set.
|
||||
line = line .. '%=' .. '%#StatusLineDark# %{&filetype} '
|
||||
-- Display fileencoding if not utf-8 and fileformat if not unix with dusk
|
||||
-- highlights in a group to swallow spaces when empty.
|
||||
line = line .. '%#StatusLineDusk#%( ' ..
|
||||
'%{&fileencoding ==# "utf-8" ? "" : &fileencoding}' ..
|
||||
'%{&fileformat ==# "unix" ? "" : "[".&fileformat."]"}' .. ' %)'
|
||||
-- Display current/total lines and column with dynamic highlights.
|
||||
line = line .. '%#' .. group .. '# ☰ %l/%L %2c '
|
||||
-- Combine the elements into a single string to be evaluated.
|
||||
return line
|
||||
end
|
||||
|
||||
-- Define active statusline, this statusline is dynamic with StatusLineLight
|
||||
-- being updated based on the current mode and only used for current buffer.
|
||||
function statusline.active()
|
||||
local mode = get_mode()
|
||||
if vim.o.buftype == 'help' then
|
||||
if mode == 'Normal' then mode = 'Help' end
|
||||
return special('StatusLineDusk', 'Help', '%F')
|
||||
elseif vim.o.buftype == 'quickfix' then
|
||||
-- Quickfix list and location list have the same buftype, the window has a
|
||||
-- loclist flag, query the window info.
|
||||
local info = vim.fn.getwininfo(vim.fn.win_getid())[1]
|
||||
if mode == 'Normal' then
|
||||
if info.loclist then mode = 'Location' else mode = 'Quickfix' end
|
||||
end
|
||||
local title = info.variables.quickfix_title
|
||||
return special('StatusLineLight', mode, title)
|
||||
elseif vim.o.buftype == 'terminal' then
|
||||
return special('StatusLineLight', 'Terminal', '%f')
|
||||
elseif vim.o.previewwindow then
|
||||
if mode == 'Normal' then mode = 'Preview' end
|
||||
return generic('StatusLineLight', mode, false)
|
||||
elseif vim.o.filetype == 'man' then
|
||||
return special('StatusLineDusk', 'Manual', '%f')
|
||||
end
|
||||
return generic('StatusLineLight', mode, true)
|
||||
end
|
||||
|
||||
function statusline.inactive()
|
||||
local mode = modes[vim.fn.char2nr(vim.fn.mode())].name
|
||||
local line = ''
|
||||
if vim.o.buftype == 'help' then
|
||||
line = special('StatusLineDusk', 'Help', '%F')
|
||||
elseif vim.o.buftype == 'quickfix' then
|
||||
-- Quickfix list and location list have the same buftype, the window has a
|
||||
-- loclist flag, query the window info.
|
||||
local info = vim.fn.getwininfo(vim.fn.win_getid())[1]
|
||||
if info['loclist'] then mode = 'Location' else mode = 'Quickfix' end
|
||||
line = special('StatusLineDusk', mode, info.variables.quickfix_title)
|
||||
elseif vim.o.buftype == 'terminal' then
|
||||
line = special('StatusLineDusk', 'Terminal', '%f')
|
||||
elseif vim.o.previewwindow then
|
||||
line = generic('StatusLineDusk', 'Preview', false)
|
||||
elseif vim.o.filetype == 'man' then
|
||||
line = special('StatusLineDusk', 'Manual', '%f')
|
||||
else
|
||||
line = generic('StatusLineDusk', 'Idle', false)
|
||||
end
|
||||
-- Escape spaces and double quotes for use in setlocal.
|
||||
-- FIXME: let l:statusline = substitute(l:statusline, '\([ "]\)', '\\\0', 'g')
|
||||
return line
|
||||
end
|
||||
|
||||
-- Setup autocmds to set the statusline per buffer.
|
||||
local group = vim.api.nvim_create_augroup('statusline', { clear = true })
|
||||
-- Dynamically update the current buffer mode and color changes using %! to
|
||||
-- call a function which is always evaluated on statusline update.
|
||||
vim.api.nvim_create_autocmd({ 'BufEnter', 'WinEnter', 'BufWinEnter' }, {
|
||||
pattern = '*',
|
||||
group = group,
|
||||
callback = function()
|
||||
vim.cmd [[ setlocal statusline=%{%v:lua.require('statusline').active()%} ]]
|
||||
end
|
||||
})
|
||||
|
||||
-- Statically set the statusline when leaving the buffer.
|
||||
vim.api.nvim_create_autocmd({ 'BufLeave', 'WinLeave' }, {
|
||||
pattern = '*',
|
||||
group = group,
|
||||
callback = function()
|
||||
vim.cmd [[ setlocal statusline=%{%v:lua.require('statusline').inactive()%} ]]
|
||||
end
|
||||
})
|
||||
|
||||
return statusline
|
Loading…
x
Reference in New Issue
Block a user