Humble beginning...
This commit is contained in:
parent
9df724e7a1
commit
ea0a8eefb9
3 changed files with 171 additions and 0 deletions
|
@ -228,6 +228,8 @@ M.setup = function()
|
||||||
if vim.v.errmsg ~= '' then
|
if vim.v.errmsg ~= '' then
|
||||||
vim.notify(('Colorscheme %s not found!'):format(colorscheme), vim.log.levels.WARN)
|
vim.notify(('Colorscheme %s not found!'):format(colorscheme), vim.log.levels.WARN)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
require('testline').setup()
|
||||||
end
|
end
|
||||||
|
|
||||||
return M
|
return M
|
||||||
|
|
169
config/nvim/lua/testline.lua
Normal file
169
config/nvim/lua/testline.lua
Normal file
|
@ -0,0 +1,169 @@
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
local object = (function()
|
||||||
|
local obj = {}
|
||||||
|
obj.__index = obj
|
||||||
|
|
||||||
|
function obj:init(...) end
|
||||||
|
|
||||||
|
function obj:new(...)
|
||||||
|
local new = setmetatable({}, self)
|
||||||
|
new:init(...)
|
||||||
|
return new
|
||||||
|
end
|
||||||
|
|
||||||
|
function obj:extend()
|
||||||
|
local cls = {}
|
||||||
|
cls.__index = cls
|
||||||
|
cls.super = self
|
||||||
|
return setmetatable(cls, self)
|
||||||
|
end
|
||||||
|
|
||||||
|
return obj
|
||||||
|
end)()
|
||||||
|
|
||||||
|
local segment = (function()
|
||||||
|
local segment = object:extend()
|
||||||
|
|
||||||
|
function segment:init(opts)
|
||||||
|
self.opts = opts or {}
|
||||||
|
end
|
||||||
|
|
||||||
|
function segment:render()
|
||||||
|
return self.opts
|
||||||
|
end
|
||||||
|
|
||||||
|
function segment.make(f)
|
||||||
|
local new = segment:extend()
|
||||||
|
function new:render(...) return f(...) end
|
||||||
|
return new
|
||||||
|
end
|
||||||
|
|
||||||
|
return segment
|
||||||
|
end)()
|
||||||
|
|
||||||
|
local mode = (function()
|
||||||
|
local mode = segment:extend()
|
||||||
|
|
||||||
|
mode.map = {
|
||||||
|
['n'] = '', -- 'Normal ', -- Normal
|
||||||
|
['no'] = '', -- 'O-Pend ', -- Operator-pending
|
||||||
|
['ni'] = '', -- 'Normal ', -- Normal via i_CTRL-O
|
||||||
|
['v'] = '', -- 'Visual ', -- Visual by character
|
||||||
|
[''] = '', -- 'V-Block', -- Visual blockwise
|
||||||
|
['s'] = '', -- 'Select ', -- Select by character
|
||||||
|
[''] = '', -- 'S-Block', -- Select blockwise
|
||||||
|
['i'] = '', -- 'Insert ', -- Insert
|
||||||
|
['r'] = '', -- 'Replace', -- Replace
|
||||||
|
['rv'] = '', -- 'V-Repl ', -- Virtual Replace
|
||||||
|
['c'] = '', -- 'Command', -- Command-line
|
||||||
|
['cv'] = '', -- ' Ex ', -- Ex mode
|
||||||
|
['rm'] = '', -- ' modeore ', -- -- modeORE --
|
||||||
|
['r?'] = '', -- 'Confirm', -- :confirm
|
||||||
|
['!'] = '', -- ' Shell ', -- External command executing
|
||||||
|
['t'] = '', -- ' Term ', -- Terminal
|
||||||
|
}
|
||||||
|
|
||||||
|
function mode:render()
|
||||||
|
-- if not is_focused then return ' ' end -- TODO: handle inactive windows
|
||||||
|
local code = vim.api.nvim_get_mode().mode:lower()
|
||||||
|
local symbol = mode.map[code:sub(1, 2)] or mode.map[code:sub(1, 1)] or code
|
||||||
|
return ' ' .. symbol .. ' '
|
||||||
|
end
|
||||||
|
|
||||||
|
return mode
|
||||||
|
end)()
|
||||||
|
|
||||||
|
-- FIX: actually find the branch
|
||||||
|
local branch = segment.make(function() return ' main' end)
|
||||||
|
|
||||||
|
local filename = segment.make(function() return vim.fn.expand('%:~:.') end)
|
||||||
|
|
||||||
|
local modified = segment.make(function() return vim.bo.modified and '' or '' end)
|
||||||
|
|
||||||
|
local readonly = segment.make(function() return (vim.bo.readonly or not vim.bo.modifiable) and '' or '' end)
|
||||||
|
|
||||||
|
local searchcount = segment.make(function()
|
||||||
|
if vim.v.hlsearch == 1 then
|
||||||
|
local count = vim.fn.searchcount { maxcount = 999, timeout = 250 }
|
||||||
|
if count.total > 1 then
|
||||||
|
return (' %d/%s'):format(
|
||||||
|
count.current,
|
||||||
|
count.total > count.maxcount and '' or ('%d'):format(count.total))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return ''
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- TODO: handle inactive windows
|
||||||
|
-- TODO: add icons
|
||||||
|
local filetype = segment.make(function() return vim.bo.filetype end)
|
||||||
|
|
||||||
|
local fileformat = segment.make(function()
|
||||||
|
local icons = { unix = '', dos = '', mac = '' }
|
||||||
|
return icons[vim.bo.fileformat] or vim.bo.fileformat
|
||||||
|
end)
|
||||||
|
|
||||||
|
local progress = segment.make(function()
|
||||||
|
local line, total = vim.fn.line('.'), vim.fn.line('$')
|
||||||
|
return
|
||||||
|
line == 1 and ' ' or
|
||||||
|
line == total and ' ' or
|
||||||
|
('%2d%%%%'):format(math.floor(100 * line / total))
|
||||||
|
end)
|
||||||
|
|
||||||
|
local location = segment.make(function() return ('%3d:%-2d'):format(vim.fn.line('.'), vim.fn.virtcol('.')) end)
|
||||||
|
|
||||||
|
local whitespace = segment.make(function()
|
||||||
|
local trailing = [[\s\+$]]
|
||||||
|
local line = vim.fn.search(trailing, 'nwc')
|
||||||
|
if line == 0 then
|
||||||
|
return ''
|
||||||
|
else
|
||||||
|
local result = (' %d'):format(line)
|
||||||
|
local total = vim.fn.searchcount({ pattern = trailing }).total
|
||||||
|
return result .. (total > 1 and (' (%d total)'):format(total) or '')
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
local literal = function(s) return segment.make(function() return s end) end
|
||||||
|
|
||||||
|
local defaults = {
|
||||||
|
-- TODO: paste
|
||||||
|
mode,
|
||||||
|
branch,
|
||||||
|
modified,
|
||||||
|
readonly,
|
||||||
|
filename,
|
||||||
|
literal '%=',
|
||||||
|
searchcount,
|
||||||
|
literal '%=',
|
||||||
|
-- TODO: diagnostics
|
||||||
|
filetype,
|
||||||
|
fileformat,
|
||||||
|
progress,
|
||||||
|
location,
|
||||||
|
whitespace,
|
||||||
|
}
|
||||||
|
|
||||||
|
M.render = function()
|
||||||
|
local rendered = vim.tbl_map(function(comp) return comp:render() end, defaults)
|
||||||
|
local non_empty = vim.tbl_filter(function(item) return #item > 0 end, rendered)
|
||||||
|
return vim.fn.join(non_empty, ' ')
|
||||||
|
end
|
||||||
|
|
||||||
|
M.setup = function()
|
||||||
|
local colors = require('gruvbox').colors()
|
||||||
|
vim.api.nvim_set_hl(0, 'StatusLine', { fg = colors.fg2, bg = colors.bg1 })
|
||||||
|
|
||||||
|
-- vim.api.nvim_set_hl(0, 'TestlineNormal', { fg = colors.bg0, bg = colors.blue })
|
||||||
|
-- vim.api.nvim_set_hl(0, 'TestlineInsert', { fg = colors.bg0, bg = colors.green })
|
||||||
|
-- vim.api.nvim_set_hl(0, 'TestlineVisual', { fg = colors.bg0, bg = colors.purple })
|
||||||
|
-- vim.api.nvim_set_hl(0, 'TestlineReplace', { fg = colors.bg0, bg = colors.red })
|
||||||
|
-- vim.api.nvim_set_hl(0, 'TestlineCommand', { fg = colors.bg0, bg = colors.yellow })
|
||||||
|
|
||||||
|
vim.opt.statusline=[[%{%v:lua.require('testline').render()%}]]
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
|
|
Loading…
Add table
Reference in a new issue