diff options
| author | srdusr <trevorgray@srdusr.com> | 2022-10-14 23:43:14 +0200 |
|---|---|---|
| committer | srdusr <trevorgray@srdusr.com> | 2022-10-14 23:43:14 +0200 |
| commit | 2d2c18e3b61a1883190fcd3c9dd9ab86002ddeab (patch) | |
| tree | 614ed8e17635606d70f198c916591f5011d36155 /lua/plugins/heirline.backup2.lua | |
| parent | 86628d459cabd0c29f0cdbb699e2e18807b958ed (diff) | |
| download | dotfiles-2d2c18e3b61a1883190fcd3c9dd9ab86002ddeab.tar.gz dotfiles-2d2c18e3b61a1883190fcd3c9dd9ab86002ddeab.zip | |
Updated nvim-cmp & lsp: config/saga
Diffstat (limited to 'lua/plugins/heirline.backup2.lua')
| -rw-r--r-- | lua/plugins/heirline.backup2.lua | 1921 |
1 files changed, 1921 insertions, 0 deletions
diff --git a/lua/plugins/heirline.backup2.lua b/lua/plugins/heirline.backup2.lua new file mode 100644 index 0000000..9f5c4ca --- /dev/null +++ b/lua/plugins/heirline.backup2.lua @@ -0,0 +1,1921 @@ +local conditions = require("heirline.conditions") +local utils = require("heirline.utils") + +-- Colors +--local colors = { +-- bright_bg = utils.get_highlight("Folded").bg, +-- bright_fg = utils.get_highlight("Folded").fg, +-- red = utils.get_highlight("DiagnosticError").fg, +-- dark_red = utils.get_highlight("DiffDelete").bg, +-- green = utils.get_highlight("String").fg, +-- blue = utils.get_highlight("Function").fg, +-- gray = utils.get_highlight("NonText").fg, +-- orange = utils.get_highlight("Constant").fg, +-- purple = utils.get_highlight("Statement").fg, +-- cyan = utils.get_highlight("Special").fg, +-- diag_warn = utils.get_highlight("DiagnosticWarn").fg, +-- diag_error = utils.get_highlight("DiagnosticError").fg, +-- diag_hint = utils.get_highlight("DiagnosticHint").fg, +-- diag_info = utils.get_highlight("DiagnosticInfo").fg, +-- git_del = utils.get_highlight("diffDeleted").fg, +-- git_add = utils.get_highlight("diffAdded").fg, +-- git_change = utils.get_highlight("diffChanged").fg, +--} + +--local colors = { +-- gray = '#23232e', +-- lightgray = '#5f6a8e', +-- orange = '#ffb86c', +-- purple = '#bd93f9', +-- red = '#ff5555', +-- yellow = '#f1fa8c', +-- green = '#50fa7b', +-- white = '#f8f8f2', +-- black = '#282a36', +--} +local colors = { + bg = "#333842", + nobg = nil, + bright_fg = "#ffffff", + bright_bg = "#000000", + brown = "#504945", + white = "#f8f8f0", + grey = "#8F908A", + pink = "#f92672", + --green = "#a6e22e", + green = "#AAD94C", + --blue = "#66d9ef", + blue = "#39BAE6", + yellow = "#e6db74", + --orange = "#fd971f", + orange = "#FA8D3F", + purple = "#ae81ff", + --red = "#e95678", + red = "#F07171", + cyan = "#66d9eC", + mode_fg = "#242424", + diag = { + warn = utils.get_highlight("DiagnosticSignWarn").fg, + error = utils.get_highlight("DiagnosticSignError").fg, + hint = utils.get_highlight("DiagnosticSignHint").fg, + info = utils.get_highlight("DiagnosticSignInfo").fg, + }, + git = { + del = "#e95678", + add = "#a6e22e", + change = "#ae81ff", + }, +} + +require("heirline").load_colors(colors) + +--local mode_lable = { +-- n = 'NORMAL', +-- no = 'OPPEND', +-- nov = 'N?', +-- noV = 'N?', +-- ['no\22'] = 'N?', +-- niI = 'Ni', +-- niR = 'Nr', +-- niV = 'Nv', +-- nt = 'N-TERM', +-- v = 'VISUAL', +-- vs = 'Vs', +-- V = 'V-LINE', +-- Vs = 'Vs', +-- ['\22'] = 'V-BLCK', +-- ['\22s'] = '^V', +-- s = 'SELECT', +-- S = 'S-LINE', +-- ['\19'] = 'S-BLCK', +-- i = 'INSERT', +-- ic = 'ICOMPL', +-- ix = 'Ix', +-- R = 'REPLACE', +-- Rc = 'Rc', +-- Rx = 'Rx', +-- Rv = 'VRPLCE', +-- Rvc = 'Rv', +-- Rvx = 'Rv', +-- c = 'CMMAND', +-- cv = 'PROMPT', +-- r = '...', +-- rm = 'MORE', +-- ['r?'] = 'CNFIRM', +-- ['!'] = 'SHELL', +-- t = 'TERM', +--} +-- +--local mode_colors_table = { +-- n = 'red', +-- no = 'blue', +-- nov = 'blue', +-- noV = 'blue', +-- niI = 'red', +-- niR = 'red', +-- niV = 'red', +-- nt = 'red', +-- v = 'cyan', +-- vs = 'cyan', +-- V = 'cyan', +-- Vs = 'cyan', +-- ['\22'] = 'cyan', +-- ['\22s'] = 'cyan', +-- s = 'purple', +-- S = 'purple', +-- ['\19'] = 'purple', +-- i = 'blue', +-- ic = 'blue', +-- ix = 'blue', +-- R = 'orange', +-- Rc = 'orange', +-- Rx = 'orange', +-- Rv = 'orange', +-- Rvc = 'orange', +-- Rvx = 'orange', +-- c = 'green', +-- cv = 'green', +-- r = 'green', +-- rm = 'green', +-- ['r?'] = 'green', +-- ['!'] = 'red', +-- t = 'red', +--} +-- +--local mode_colors = setmetatable({ +-- n = { fg = 'red' } +--}, { +-- __index = function(_, mode) +-- return { +-- fg = 'mode_fg', +-- bg = mode_colors_table[mode], +-- } +-- end +--}) +-- +-- +--local VimModeNormal = { +-- condition = function(self) +-- return self.mode == 'n' +-- end, +-- provider = ' ●', +--} +-- +--local VimModeOthers = { +-- condition = function(self) +-- return self.mode ~= 'n' +-- end, +-- +-- utils.surround({ '', '' }, +-- function(self) +-- return mode_colors[self.mode].bg +-- end, +-- { +-- { +-- provider = function(self) +-- return '● ' .. mode_lable[self.mode] +-- end, +-- }, +-- hl = function(self) +-- return mode_colors[self.mode] +-- end +-- } +-- ), +--} +-- +--local ViMode = { +-- init = function(self) +-- self.mode = vim.fn.mode(1) +-- end, +-- +-- VimModeNormal, VimModeOthers, +-- +-- update = { 'ModeChanged' } +--} +--local colors = require'kanagawa.colors'.setup() -- wink + +--utils.surround({ "", "" }, function(self) return self:mode_color() end, {Ruler, hl = {fg = 'black'}} ), +-- we are surrounding the component and adjusting the foreground in one go! + +-- ViMode truemode +--local ViMode = { +-- -- get vim current mode, this information will be required by the provider +-- -- and the highlight functions, so we compute it only once per component +-- -- evaluation and store it as a component attribute +-- init = function(self) +-- self.mode = vim.fn.mode(1) -- :h mode() +-- +-- -- execute this only once, this is required if you want the ViMode +-- -- component to be updated on operator pending mode +-- if not self.once then +-- vim.api.nvim_create_autocmd("ModeChanged", { +-- pattern = "*:*o", +-- command = "redrawstatus", +-- }) +-- self.once = true +-- end +-- end, +-- -- Now we define some dictionaries to map the output of mode() to the +-- -- corresponding string and color. We can put these into `static` to compute +-- -- them at initialisation time. +-- static = { +-- mode_names = { -- change the strings if you like it vvvvverbose! +-- ["n"] = "NORMAL ", +-- ["no"] = "N·OPERATOR PENDING ", +-- ["v"] = "VISUAL ", +-- ["V"] = "V·LINE ", +-- [""] = "V·BLOCK ", +-- ["s"] = "SELECT ", +-- ["S"] = "S·LINE ", +-- [""] = "S·BLOCK ", +-- ["i"] = "INSERT ", +-- ["R"] = "REPLACE ", +-- ["Rv"] = "V·REPLACE ", +-- ["c"] = "COMMAND ", +-- ["cv"] = "VIM EX ", +-- ["ce"] = "EX ", +-- ["r"] = "PROMPT ", +-- ["rm"] = "MORE ", +-- ["r?"] = "CONFIRM ", +-- ["!"] = "SHELL ", +-- ["t"] = "TERMINAL ", +-- }, +-- mode_colors = { +-- n = colors.blue, +-- i = colors.green, +-- v = colors.purple, +-- V = colors.purple, +-- [""] = colors.purple, +-- c = colors.red, +-- s = colors.purple, +-- S = colors.purple, +-- [""] = colors.purple, +-- R = colors.orange, +-- r = colors.orange, +-- ["!"] = colors.red, +-- t = colors.red, +-- --n = "blue" , +-- --i = "green", +-- --v = "cyan", +-- --V = "cyan", +-- --["\22"] = "cyan", +-- --c = "orange", +-- --s = "purple", +-- --S = "purple", +-- --["\19"] = "purple", +-- --R = "orange", +-- --r = "orange", +-- --["!"] = "red", +-- --t = "red", +-- }, +-- }, +-- -- We can now access the value of mode() that, by now, would have been +-- -- computed by `init()` and use it to index our strings dictionary. +-- -- note how `static` fields become just regular attributes once the +-- -- component is instantiated. +-- -- To be extra meticulous, we can also add some vim statusline syntax to +-- -- control the padding and make sure our string is always at least 2 +-- -- characters long. Plus a nice Icon. +-- provider = function(self) +-- return " %2(" .. self.mode_names[self.mode] .. "%)" +-- --return " %2("..self.mode_names[self.mode].."%)" +-- -- +-- -- +-- -- +-- end, +-- -- Same goes for the highlight. Now the foreground will change according to the current mode. +-- hl = function(self) +-- local mode = self.mode:sub(1, 1) -- get only the first mode character +-- --return { fg = self.mode_colors[mode], bold = true, } +-- return { bg = self.mode_colors[mode], fg = colors.bg, bold = true } +-- end, +-- -- Re-evaluate the component only on ModeChanged event! +-- -- This is not required in any way, but it's there, and it's a small +-- -- performance improvement. +-- update = { +-- "ModeChanged", +-- }, --optional +--} +local ViMode = { + static = { + mode_names = { -- change the strings if you like it vvvvverbose! + ["n"] = "NORMAL ", + ["no"] = "N·OPERATOR PENDING ", + ["v"] = "VISUAL ", + ["V"] = "V·LINE ", + [""] = "V·BLOCK ", + ["s"] = "SELECT ", + ["S"] = "S·LINE ", + [""] = "S·BLOCK ", + ["i"] = "INSERT ", + ["R"] = "REPLACE ", + ["Rv"] = "V·REPLACE ", + ["c"] = "COMMAND ", + ["cv"] = "VIM EX ", + ["ce"] = "EX ", + ["r"] = "PROMPT ", + ["rm"] = "MORE ", + ["r?"] = "CONFIRM ", + ["!"] = "SHELL ", + ["t"] = "TERMINAL ", + }, + }, + provider = function(self) + return " %2(" .. self.mode_names[vim.fn.mode(1)] .. "%)" + end, + hl = function(self) + local color = self:mode_color() -- here! + return { bg = color, fg = colors.bg, bold = true } + end, +} + +local ViModeColor = { + static = { + mode_colors_map = { + n = colors.blue, + i = colors.green, + v = colors.purple, + V = colors.purple, + [""] = colors.purple, + c = colors.red, + s = colors.purple, + S = colors.purple, + [""] = colors.purple, + R = colors.orange, + r = colors.orange, + ["!"] = colors.red, + t = colors.red, + }, + mode_color = function(self) + local mode = conditions.is_active() and vim.fn.mode() or "n" + return self.mode_colors_map[mode] + end, + }, +} + +-- LSP + +--local LSPActive = { +-- condition = conditions.lsp_attached, +-- update = {'LspAttach', 'LspDetach'}, +-- +-- -- You can keep it simple, +-- -- provider = " [LSP]", +-- +-- -- Or complicate things a bit and get the servers names +-- provider = function() +-- local names = {} +-- for i, server in pairs(vim.lsp.buf_get_clients(0)) do +-- table.insert(names, server.name) +-- end +-- return " [" .. table.concat(names, " ") .. "]" +-- end, +-- hl = { fg = "green", bold = true }, +-- on_click = { +-- callback = function() +-- vim.defer_fn(function() +-- vim.cmd("LspInfo") +-- end, 100) +-- end, +-- name = "heirline_LSP", +-- }, +--} +-- +---- lsp status +---- I personally use it only to display progress messages! +---- See lsp-status/README.md for configuration options. +-- +---- Note: check "j-hui/fidget.nvim" for a nice statusline-free alternative. +--local LSPMessages = { +-- provider = require("lsp-status").status, +-- hl = { fg = "gray" }, +--} + +-- Nvim Navic +--local Navic = { +-- condition = require("nvim-navic").is_available, +-- provider = require("nvim-navic").get_location, +--} +--local Navic = utils.make_flexible_component(3, Navic, { provider = "" }) + +-- Full nerd (with icon colors)! +local Navic = { + condition = require("nvim-navic").is_available, + static = { + -- create a type highlight map + type_hl = { + File = "Directory", + Module = "Include", + Namespace = "TSNamespace", + Package = "Include", + Class = "Struct", + Method = "Method", + Property = "TSProperty", + Field = "TSField", + Constructor = "TSConstructor ", + Enum = "TSField", + Interface = "Type", + Function = "Function", + Variable = "TSVariable", + Constant = "Constant", + String = "String", + Number = "Number", + Boolean = "Boolean", + Array = "TSField", + Object = "Type", + Key = "TSKeyword", + Null = "Comment", + EnumMember = "TSField", + Struct = "Struct", + Event = "Keyword", + Operator = "Operator", + TypeParameter = "Type", + }, + }, + init = function(self) + local data = require("nvim-navic").get_data() or {} + local children = {} + -- create a child for each level + for i, d in ipairs(data) do + local child = { + { + provider = d.icon, + hl = self.type_hl[d.type], + }, + { + provider = d.name, + -- highlight icon only or location name as well + -- hl = self.type_hl[d.type], + }, + } + -- add a separator only if needed + if #data > 1 and i < #data then + table.insert(child, { + provider = " > ", + hl = { fg = "bright_fg" }, + }) + end + table.insert(children, child) + end + -- instantiate the new child, overwriting the previous one + self[1] = self:new(children, 1) + end, + hl = { fg = "gray" }, +} + +-- Diagnostics +local Diagnostics = { + + condition = conditions.has_diagnostics, + + static = { + error_icon = vim.fn.sign_getdefined("DiagnosticSignError")[1].text, + warn_icon = vim.fn.sign_getdefined("DiagnosticSignWarn")[1].text, + info_icon = vim.fn.sign_getdefined("DiagnosticSignInfo")[1].text, + hint_icon = vim.fn.sign_getdefined("DiagnosticSignHint")[1].text, + }, + + init = function(self) + self.errors = #vim.diagnostic.get(0, { severity = vim.diagnostic.severity.ERROR }) + self.warnings = #vim.diagnostic.get(0, { severity = vim.diagnostic.severity.WARN }) + self.hints = #vim.diagnostic.get(0, { severity = vim.diagnostic.severity.HINT }) + self.info = #vim.diagnostic.get(0, { severity = vim.diagnostic.severity.INFO }) + end, + + update = { "DiagnosticChanged", "BufEnter" }, + + { + provider = function(self) + -- 0 is just another output, we can decide to print it or not! + return self.errors > 0 and (self.error_icon .. self.errors .. " ") + end, + hl = { fg = colors.diag.error, bg = colors.bg }, + }, + { + provider = function(self) + return self.warnings > 0 and (self.warn_icon .. self.warnings .. " ") + end, + hl = { fg = colors.diag.warn, bg = colors.bg }, + }, + { + provider = function(self) + return self.info > 0 and (self.info_icon .. self.info .. " ") + end, + hl = { fg = colors.diag.info, bg = colors.bg }, + }, + { + provider = function(self) + return self.hints > 0 and (self.hint_icon .. self.hints) + end, + hl = { fg = colors.diag.hint, bg = colors.bg }, + }, + --{ + -- provider = "]", + --}, + on_click = { + callback = function() + require("trouble").toggle({ mode = "document_diagnostics" }) + -- or + -- vim.diagnostic.setqflist() + end, + name = "heirline_diagnostics", + }, +} + +-- Git +-- For the ones who're not (too) afraid of changes! Uses gitsigns. +local Git = { + condition = conditions.is_git_repo, + + init = function(self) + self.status_dict = vim.b.gitsigns_status_dict + self.has_changes = self.status_dict.added ~= 0 or self.status_dict.removed ~= 0 or self.status_dict.changed ~= 0 + end, + --hl = { fg = "orange" }, + hl = { fg = colors.orange, bg = colors.bg }, + { -- git branch name + provider = function(self) + return " " .. self.status_dict.head + end, + --hl = { bold = true }, + hl = { bold = true, bg = colors.bg }, + }, + -- You could handle delimiters, icons and counts similar to Diagnostics + { + condition = function(self) + return self.has_changes + end, + --provider = "(" + provider = " ", + }, + { + provider = function(self) + local count = self.status_dict.added or 0 + --return count > 0 and ("+" .. count) + return count > 0 and (" " .. count) + end, + --hl = { fg = "git_add" }, + hl = { fg = colors.git.add, bg = colors.bg }, + }, + { + provider = function(self) + local count = self.status_dict.removed or 0 + --return count > 0 and ("-" .. count) + return count > 0 and (" " .. count) + end, + --hl = { fg = "git_del" }, + hl = { fg = colors.git.del, bg = colors.bg }, + }, + { + provider = function(self) + local count = self.status_dict.changed or 0 + --return count > 0 and ("~" .. count) + return count > 0 and (" " .. count) + end, + --hl = { fg = "git_change" }, + hl = { fg = colors.git.change, bg = colors.bg }, + }, + --{ + -- condition = function(self) + -- return self.has_changes + -- end, + -- provider = ")", + --}, + on_click = { + callback = function() + -- If you want to use Fugitive: + -- vim.cmd("G") + + -- If you prefer Lazygit + -- use vim.defer_fn() if the callback requires + -- opening of a floating window + -- (this also applies to telescope) + vim.defer_fn(function() + vim.cmd("Lazygit") + end, 100) + end, + name = "heirline_git", + }, +} + +-- Debugger +-- Display informations from nvim-dap! +local DAPMessages = { + -- display the dap messages only on the debugged file + condition = function() + local session = require("dap").session() + if session then + local filename = vim.api.nvim_buf_get_name(0) + if session.config then + local progname = session.config.program + return filename == progname + end + end + return false + end, + provider = function() + return " " .. require("dap").status() + end, + hl = { fg = utils.get_highlight("Debug").fg }, + -- Debugger on_click: step-over, step-into, next, previous, stop buttons + -- coming soon! +} + +-- Tests +-- This requires the great ultest. +--local UltTest = { +-- condition = function() +-- return vim .api.nvim_call_function("ultest#is_test_file", {}) ~= 0 +-- end, +-- static = { +-- passed_icon = vim.fn.sign_getdefined("test_pass")[1].text, +-- failed_icon = vim.fn.sign_getdefined("test_fail")[1].text, +-- passed_hl = { fg = utils.get_highlight("UltestPass").fg }, +-- failed_hl = { fg = utils.get_highlight("UltestFail").fg }, +-- }, +-- init = function(self) +-- self.status = vim.api.nvim_call_function("ultest#status", {}) +-- end, +-- +-- -- again, if you'd like icons and numbers to be colored differently, +-- -- just split the component in two +-- { +-- provider = function(self) +-- return self.passed_icon .. self.status.passed .. " " +-- end, +-- hl = function(self) +-- return self.passed_hl +-- end, +-- }, +-- { +-- provider = function(self) +-- return self.failed_icon .. self.status.failed .. " " +-- end, +-- hl = function(self) +-- return self.failed_hl +-- end, +-- }, +-- { +-- provider = function(self) +-- return "of " .. self.status.tests - 1 +-- end, +-- }, +--} + +-- FileName and Friends + +--local Align = { provider = "%=" } +local Align = { provider = "%=", hl = { bg = colors.bg } } +local Space = { provider = " ", hl = { bg = colors.bg } } +local fill = { provider = "%=", hl = { bg = colors.nobg } } +--local LeftSep = { provider = "" hl = { fg = colors.bg } } +--local RightSep = { provider = "" hl = { fg = colors.bg }} + +local FileNameBlock = { + -- let's first set up some attributes needed by this component and it's children + init = function(self) + self.filename = vim.api.nvim_buf_get_name(0) + end, + --hl = { fg = utils.get_highlight("Statusline").fg, bold = true, bg = colors.bg }, + hl = { bg = colors.bg }, +} +-- We can now define some children separately and add them later +-- + +local FileIcon = { + init = function(self) + local filename = self.filename + local extension = vim.fn.fnamemodify(filename, ":e") + self.icon, self.icon_color = + require("nvim-web-devicons").get_icon_color(filename, extension, { default = true }) + end, + provider = function(self) + return self.icon and (self.icon .. " ") + end, + hl = function(self) + --return { fg = self.icon_color } + return { fg = self.icon_color, bg = colors.bg } + end, +} + +local FileName = { + provider = function(self) + -- first, trim the pattern relative to the current directory. For other + -- options, see :h filename-modifers + local filename = vim.fn.fnamemodify(self.filename, ":.") + if filename == "" then + return "[No Name]" + end + -- now, if the filename would occupy more than 1/4th of the available + -- space, we trim the file path to its initials + -- See Flexible Components section below for dynamic truncation + if not conditions.width_percent_below(#filename, 0.25) then + filename = vim.fn.pathshorten(filename) + end + return filename + end, + --hl = { fg = utils.get_highlight("Directory").fg, bg = colors.bg }, + hl = { fg = utils.get_highlight("Statusline").fg, bold = true, bg = colors.bg }, +} + +local FileFlags = { + { + provider = function() + if vim.bo.modified then + return " [+]" + end + end, + hl = { fg = colors.green, bg = colors.bg }, + }, + { + provider = function() + if not vim.bo.modifiable or vim.bo.readonly then + return "" + end + end, + --hl = { fg = colors.orange }, + hl = { fg = colors.orange, bold = true, bg = colors.bg }, + }, +} +-- Now, let's say that we want the filename color to change if the buffer is +-- modified. Of course, we could do that directly using the FileName.hl field, +-- but we'll see how easy it is to alter existing components using a "modifier" +-- component + +local FileNameModifer = { + hl = function() + if vim.bo.modified then + -- use `force` because we need to override the child's hl foreground + --return { fg = "cyan", bold = true, force = true } + return { fg = "blue", bold = true, force = true, bg = colors.bg } + end + end, +} + +-- FileType, FileEncoding and FileFormat +local FileType = { + provider = function() + -- return string.upper(vim.bo.filetype) + --end, + ----hl = { fg = utils.get_highlight("Type").fg, bold = true }, + --hl = { fg = utils.get_highlight("Type").fg, bold = true, bg = colors.bg }, + return vim.bo.filetype + end, + hl = { fg = utils.get_highlight("Statusline").fg, bold = true, bg = colors.bg }, +} + +--local FileEncoding = { +-- provider = function() +-- local enc = (vim.bo.fenc ~= "" and vim.bo.fenc) or vim.o.enc -- :h 'enc' +-- return enc ~= "utf-8" and enc:upper() +-- end, +--} +local FileEncoding = { + Space, + provider = function() + local enc = (vim.bo.fenc ~= "" and vim.bo.fenc) or vim.o.enc -- :h 'enc' + return enc:upper() + end, + --hl = { fg = utils.get_highlight("Statusline").fg, bold = true, bg = colors.bg }, + hl = { bg = colors.bg }, +} + +local FileFormat = { + provider = function() + local fmt = vim.bo.fileformat + return fmt ~= "unix" and fmt:upper() + end, + hl = { fg = utils.get_highlight("Statusline").fg, bold = true, bg = colors.bg }, +} + +-- FileSize and FileLastModified +local FileSize = { + provider = function() + -- stackoverflow, compute human readable file size + local suffix = { "b", "k", "M", "G", "T", "P", "E" } + local fsize = vim.fn.getfsize(vim.api.nvim_buf_get_name(0)) + fsize = (fsize < 0 and 0) or fsize + if fsize < 1024 then + return fsize .. suffix[1] + end + local i = math.floor((math.log(fsize) / math.log(1024))) + return string.format("%.2g%s", fsize / math.pow(1024, i), suffix[i + 1]) + end, + hl = { fg = utils.get_highlight("Statusline").fg, bold = true, bg = colors.bg }, +} + +local FileLastModified = { + -- did you know? Vim is full of functions! + provider = function() + local ftime = vim.fn.getftime(vim.api.nvim_buf_get_name(0)) + return (ftime > 0) and os.date("%c", ftime) + end, + hl = { fg = utils.get_highlight("Statusline").fg, bold = true, bg = colors.bg }, +} + +-- Spell +-- Add indicator when spell is set! +local Spell = { + condition = function() + return vim.wo.spell + end, + provider = "SPELL ", + hl = { bold = true, fg = "orange" }, +} + +-- Cursor position: Ruler and ScrollBar +-- We're getting minimalists here! +local Ruler = { + -- We're getting minimalists here! + -- %l = current line number + -- %L = number of lines in the buffer + -- %c = column number + -- %P = percentage through file of displayed window + provider = "%3(%2l%):%c %P", + --provider = "%7(%l/%3L%):%2c %P", + --provider = "%3(%P%)", + --provider = "%7(%l/%3L%):%2c %P", + --provider = "%7 %p%% Ln %l, Col %c", + hl = { fg = utils.get_highlight("Statusline").fg, bold = true, bg = colors.bg }, +} +--local ScrollBar = { +-- static = { +-- --sbar = { "▁", "▂", "▃", "▄", "▅", "▆", "▇", "█" }, +-- sbar = { "🭶", "🭷", "🭸", "🭹", "🭺", "🭻" }, +-- }, +-- provider = function(self) +-- local curr_line = vim.api.nvim_win_get_cursor(0)[1] +-- local lines = vim.api.nvim_buf_line_count(0) +-- local i = math.floor((curr_line - 1) / lines * #self.sbar) + 1 +-- return string.rep(self.sbar[i], 2) +-- end, +-- --hl = { fg = "blue", bg = "bright_bg" }, +-- hl = { fg = utils.get_highlight("Statusline").fg, bold = true, bg = colors.bg }, +--} +local WordCount = { + condition = function() + return conditions.buffer_matches({ + filetype = { + "markdown", + "txt", + "vimwiki", + }, + }) + end, + Space, + { + provider = function() + return "W:" .. vim.fn.wordcount().words + end, + }, +} + +local Position = { + Space, + { provider = "%l:%c" }, + hl = { bg = colors.bg }, +} + +local Percentage = { + Space, + { provider = "%p%%" }, + hl = { bg = colors.bg }, +} +-- Working Directory +local WorkDir = { + provider = function(self) + self.icon = (vim.fn.haslocaldir(0) == 1 and "l" or "g") .. " " .. " " + local cwd = vim.fn.getcwd(0) + self.cwd = vim.fn.fnamemodify(cwd, ":~") + end, + --hl = { fg = "blue", bold = true }, + hl = { fg = colors.blue, bold = true, bg = colors.bg }, + + utils.make_flexible_component(1, { + -- evaluates to the full-lenth path + provider = function(self) + local trail = self.cwd:sub(-1) == "/" and "" or "/" + return self.icon .. self.cwd .. trail .. " " + end, + }, { + -- evaluates to the shortened path + provider = function(self) + local cwd = vim.fn.pathshorten(self.cwd) + local trail = self.cwd:sub(-1) == "/" and "" or "/" + return self.icon .. cwd .. trail .. " " + end, + }, { + -- evaluates to "", hiding the component + provider = "", + }), +} + +-- Terminal Name +-- Special handling of the built-in terminal bufname. See conditional statuslines below to see an example of dedicated statusline for terminals! + +local TerminalName = { + -- we could add a condition to check that buftype == 'terminal' + -- or we could do that later (see #conditional-statuslines below) + provider = function() + local tname, _ = vim.api.nvim_buf_get_name(0):gsub(".*:", "") + return " " .. tname + end, + --hl = { fg = "blue", bold = true }, + hl = { bold = true, bg = colors.bg }, +} + +-- Snippets Indicator +-- This requires ultisnips +--local Snippets = { +-- -- check that we are in insert or select mode +-- condition = function() +-- return vim.tbl_contains({'s', 'i'}, vim.fn.mode()) +-- end, +-- provider = function() +-- local forward = (vim.fn["UltiSnips#CanJumpForwards"]() == 1) and "" or "" +-- local backward = (vim.fn["UltiSnips#CanJumpBackwards"]() == 1) and " " or "" +-- return backward .. forward +-- end, +-- hl = { fg = "red", bold = true }, +--} + +-- let's add the children to our FileNameBlock component +--FileNameBlock = utils.insert( +-- FileNameBlock, +--FileEncoding, +--Space, +--FileIcon, +--FileType, +--FileLastModified, +--FileSize, +--FileFormat, +--FileNameModifer, +-- unpack(FileFlags), +-- { provider = "%<" } -- this means that the statusline is cut here when there's not enough space +--) +-- let's add the children to our FileNameBlock component +FileNameBlock = utils.insert( + FileNameBlock, + FileIcon, + utils.insert(FileNameModifer, FileName), -- a new table where FileName is a child of FileNameModifier + unpack(FileFlags), -- A small optimisation, since their parent does nothing + { provider = "%<" } -- this means that the statusline is cut here when there's not enough space +) + +local FileInfoBlock = { + -- let's first set up some attributes needed by this component and it's children + init = function(self) + self.filename = vim.api.nvim_buf_get_name(0) + end, +} + +FileInfoBlock = utils.insert( + FileInfoBlock, + FileEncoding, + Space, + FileIcon, + FileType, + { provider = "%<" } -- this means that the statusline is cut here when there's not enough space +) +--FileNameBlock = utils.insert( +-- FileNameBlock, +-- FileIcon, +-- utils.insert(FileNameModifer, FileName), -- a new table where FileName is a child of FileNameModifier +-- unpack(FileFlags), -- A small optimisation, since their parent does nothing +-- { provider = "%<" } -- this means that the statusline is cut here when there's not enough space +--) + +-- Statusline + +local Surrr = { + utils.surround({ "", "" }, "red", { + utils.surround({ "", "" }, "green", utils.surround({ "", "" }, "blue", { provider = "heyya" })), + { provider = "Normal" }, + }), +} +--ViMode = utils.surround({ "", "" }, "bright_bg", { ViMode, Snippets }) +ViMode = utils.surround({ "", "" }, function(self) + return self:mode_color() +end, { ViMode, hl = { fg = utils.get_highlight("statusline").bg, force = true } }) + +--ViMode = utils.surround({ "◥", "" }, function(self) return self:mode_color() end, { +-- utils.surround({ "█", "" }, function(self) return self:mode_color() end, utils.surround({ "", "" }, function(self) return self:mode_color() end, { {provider = "normal" }, ViMode, hl = { fg = utils.get_highlight("statusline").bg, force = true } } )), +-- { provider = "heyya" }, +-- }) + +--utils.surround({ "█", "█" }, function(self) return self:mode_color() end, { FileNameBlock, hl = { fg = colors.bg, force = true } } ), +local DefaultStatusline = { + ViMode, + Space, + FileNameBlock, + Space, + Git, + Space, + Diagnostics, + Align, + Navic, + DAPMessages, + Align, + Space, + FileInfoBlock, + Space, + WordCount, + Ruler, + Space, + --Position, + --Percentage, + --ScrollBar, + --Space, + --LSPActive, Space, LSPMessages, Space, UltTest, Space, FileType, Space, Ruler, Space, ScrollBar +} + +--local InactiveStatusline = { +-- condition = conditions.is_not_active, +-- FileType, +-- Space, +-- FileName, +-- Align, +--} + +local SpecialStatusline = { + condition = function() + return conditions.buffer_matches({ + buftype = { "nofile", "prompt", "help", "quickfix" }, + filetype = { "^git.*", "fugitive" }, + }) + end, + + FileType, + Space, + Align, + --FileType, Space, HelpFileName, Align +} + +local TerminalStatusline = { + + condition = function() + return conditions.buffer_matches({ buftype = { "terminal" } }) + end, + + hl = { bg = "dark_red" }, + + -- Quickly add a condition to the ViMode to only show it when buffer is active! + { condition = conditions.is_active, ViMode, Space }, + FileType, + Space, + TerminalName, + Align, +} + +--local StatusLines = { +-- +-- hl = function() +-- if conditions.is_active() then +-- return "StatusLine" +-- else +-- return "StatusLineNC" +-- end +-- end, +-- +-- -- the first statusline with no condition, or which condition returns true is used. +-- -- think of it as a switch case with breaks to stop fallthrough. +-- fallthrough = false, +-- +-- SpecialStatusline, +-- TerminalStatusline, +-- --InactiveStatusline, +-- DefaultStatusline, +--} +local StatusLines = { + + hl = function() + if conditions.is_active() then + return "StatusLine" + else + return "StatusLineNC" + end + end, + + static = { + mode_colors_map = { + n = colors.blue, + i = colors.green, + v = colors.purple, + V = colors.purple, + [""] = colors.purple, + c = colors.red, + s = colors.purple, + S = colors.purple, + [""] = colors.purple, + R = colors.orange, + r = colors.orange, + ["!"] = colors.red, + t = colors.red, + }, + mode_color = function(self) + local mode = conditions.is_active() and vim.fn.mode() or "n" + return self.mode_colors_map[mode] + end, + }, + fallthrough = false, + + SpecialStatusline, + TerminalStatusline, + --InactiveStatusline, + DefaultStatusline, +} +--hl = { fg = utils.get_highlight("Statusline").fg, bold = true, bg = colors.bg }, +-- hl = { bg = colors.bg }, +--require("heirline").setup(StatusLines) +-- we're done. + +--local FelineStyle = { +-- +-- -- stop at child where buftype/filetype/bufname matches +-- fallthrough = false, +-- +-- { -- Identify the buftype/filetype/bufname first +-- condtion = function() +-- return conditions.buffer_matches({...}) +-- end, +-- +-- -- Evaluate only the "active" or "inactive" child +-- fallthrough = false, +-- +-- { -- If it's the current window, display some components +-- condition = conditions.is_active +-- {...} -- +-- }, +-- { -- Otherwise, display some other components +-- {...} -- +-- } +-- }, +-- { -- this block can be exactly as the one above for a different kind of +-- -- buffer +-- ... +-- } +--} + +-- WinBar + +vim.api.nvim_create_autocmd("User", { + pattern = "HeirlineInitWinbar", + callback = function(args) + local buf = args.buf + local buftype = vim.tbl_contains({ "prompt", "nofile", "help", "quickfix" }, vim.bo[buf].buftype) + local filetype = vim.tbl_contains({ "gitcommit", "fugitive" }, vim.bo[buf].filetype) + if buftype or filetype then + vim.opt_local.winbar = nil + end + end, +}) +local active_middle_segment = { --{{{ + -- provider = "%999X %X", + + --provider = function(self) + -- --return " %999X %999X " + -- return " %2("..self.mode_names[self.mode].."%)" + -- -- + -- -- + -- -- + --end, + fallthrough = false, + { -- Hide the winbar for special buffers + condition = function() + return conditions.buffer_matches({ + buftype = { "nofile", "prompt", "help", "quickfix" }, + filetype = { "^git.*", "fugitive" }, + }) + end, + init = function() + vim.opt_local.winbar = nil + end, + }, + static = { + mode_colors_map = { + n = colors.blue, + i = colors.green, + v = colors.purple, + V = colors.purple, + [""] = colors.purple, + c = colors.red, + s = colors.purple, + S = colors.purple, + [""] = colors.purple, + R = colors.orange, + r = colors.orange, + ["!"] = colors.red, + t = colors.red, + }, + mode_color = function(self) + local mode = conditions.is_active() and vim.fn.mode() or "n" + return self.mode_colors_map[mode] + end, + provider = "%f", + hl = function(self) + local color = self:mode_color() -- here! + return { fg = color } + end, + -- self.filename will be defined later, just keep looking at the example! + }, + { -- A special winbar for terminals + condition = function() + return conditions.buffer_matches({ buftype = { "terminal" } }) + end, + utils.surround({ "", "" }, "dark_red", { + FileType, + Space, + TerminalName, + }), + }, + { -- An inactive winbar for regular files + condition = function() + return not conditions.is_active() + end, + --utils.surround({ "", "" }, "bright_bg", { hl = { fg = "gray", force = true }, FileNameBlock }), + --utils.surround({ "", "" }, function(self) return self:mode_color() end, { FileNameBlock, hl = { fg = colors.bg, force = true } } ), + }, + -- A winbar for regular files + --utils.surround({ "", "" }, "bright_bg", FileNameBlock), + --█🙼🙽🙼█⮘██⮚ + --utils.surround({ "", "" }, function(self) return self:mode_color() end, { FileNameBlock, hl = function(self) + -- local color = self:mode_color() -- here! + -- return { bg = color, bold = true, force = true } + --end, + --}), + --utils.surround({ "", "" }, function(self) return self:mode_color() end, FileNameBlock), +} + +--utils.surround({ "", "" }, function(self) return self:mode_color() end, { active_middle_segment, hl = { fg = colors.bg, force = true } }) + +local WinBars = { + fill, + active_middle_segment, + fill, +} +-- --utils.surround({ " ", " " }, colors.nobg, { fill, active_middle_segment, fill }) +-- --static = { +-- -- mode_colors_map = { +-- -- n = colors.blue, +-- -- i = colors.green, +-- -- v = colors.purple, +-- -- V = colors.purple, +-- -- [""] = colors.purple, +-- -- c = colors.red, +-- -- s = colors.purple, +-- -- S = colors.purple, +-- -- [""] = colors.purple, +-- -- R = colors.orange, +-- -- r = colors.orange, +-- -- ["!"] = colors.red, +-- -- t = colors.red, +-- -- }, +-- -- mode_color = function(self) +-- -- local mode = conditions.is_active() and vim.fn.mode() or "n" +-- -- return self.mode_colors_map[mode] +-- -- end, +-- --}, +-- --utils.surround({ " ", " " }, colors.nobg, { active_middle_segment, hl = function(self) +-- -- local color = self:mode_color() -- here! +-- -- return { bg = color, bold = true, force = true } +-- --end, +-- --}) +--} +on_click = { + -- get the window id of the window in which the component was evaluated + minwid = function() + return vim.api.nvim_get_current_win() + end, + callback = function(_, minwid) + -- winid is the window id of the window the component was clicked from + local winid = minwid + -- do something with the window id, e.g.: + local buf = vim.api.nvim_win_get_buf(winid) + -- ... + end, +} + +local CloseButton = { + condition = function(self) + return not vim.bo.modified + end, + -- a small performance improvement: + -- re register the component callback only on layout/buffer changes. + update = { "WinNew", "WinClosed", "BufEnter" }, + { provider = " " }, + { + provider = "", + hl = { fg = "gray" }, + on_click = { + minwid = function() + return vim.api.nvim_get_current_win() + end, + callback = function(_, minwid) + vim.api.nvim_win_close(minwid, true) + end, + name = "heirline_winbar_close_button", + }, + }, +} + +-- Use it anywhere! +--local WinBarFileName = utils.surround({ "", "" }, "bright_bg", { +-- hl = function() +-- if not conditions.is_active() then +-- return { fg = "gray", force = true } +-- end +-- end, +-- FileNameBlock, +-- Space, +-- CloseButton, +--}) + +--local WinBars = { +-- -- init = utils.pick_child_on_condition, +-- fallthrough = false, +-- { +-- condition = function() +-- return conditions.buffer_matches({ +-- buftype = { "nofile", "prompt", "help", "quickfix" }, +-- filetype = { "^git.*", "fugitive" }, +-- }) +-- end, +-- init = function() +-- vim.opt_local.winbar = nil +-- end, +-- }, +-- { +-- condition = function() +-- return conditions.buffer_matches({ buftype = { "terminal" } }) +-- end, +-- utils.surround({ "", "" }, "dark_red", { +-- FileType, +-- Space, +-- TerminalName, +-- CloseButton, +-- }), +-- }, +-- utils.surround({ "", "" }, "bright_bg", { +-- hl = function() +-- if conditions.is_not_active() then +-- return { fg = "gray", force = true } +-- end +-- end, +-- +-- FileNameBlock, +-- CloseButton, +-- }), +--} + +-- TabLine +--local TabLine ={ +-- hl = { bg = colors.bg }, +--} +local TablineBufnr = { + provider = function(self) + return tostring(self.bufnr) .. ". " + end, + --hl = "Comment", + --hl = { fg = utils.get_highlight("Statusline").fg, bold = true, bg = colors.bg }, + hl = { fg = utils.get_highlight("Statusline").fg, bold = true }, +} + +-- we redefine the filename component, as we probably only want the tail and not the relative path +local TablineFileName = { + provider = function(self) + -- self.filename will be defined later, just keep looking at the example! + local filename = self.filename + filename = filename == "" and "[No Name]" or vim.fn.fnamemodify(filename, ":t") + return filename + end, + hl = function(self) + return { bold = self.is_active or self.is_visible, italic = true } + end, +} + +-- this looks exactly like the FileFlags component that we saw in +-- #crash-course-part-ii-filename-and-friends, but we are indexing the bufnr explicitly +-- also, we are adding a nice icon for terminal buffers. +--local TablineFileFlags = { +-- { +-- condition = function(self) +-- return vim.api.nvim_buf_get_option(self.bufnr, "modified") +-- end, +-- provider = "[+]", +-- --hl = { fg = colors.green }, +-- hl = { fg = colors.green, bold = true, bg = colors.bg }, +-- }, +-- { +-- condition = function(self) +-- return not vim.api.nvim_buf_get_option(self.bufnr, "modifiable") +-- or vim.api.nvim_buf_get_option(self.bufnr, "readonly") +-- end, +-- provider = function(self) +-- if vim.api.nvim_buf_get_option(self.bufnr, "buftype") == "terminal" then +-- return " " +-- else +-- return "" +-- end +-- end, +-- hl = { fg = "orange", bg = colors.bg }, +-- }, +--} + +local TablineFileFlags = { + { + provider = function(self) + if vim.bo[self.bufnr].modified then + return " [+]" + end + end, + hl = { fg = colors.green }, + }, + { + provider = function(self) + if not vim.bo[self.bufnr].modifiable or vim.bo[self.bufnr].readonly then + return "" + end + end, + hl = { fg = "orange" }, + }, +} + +local TablineFileIcon = { + init = function(self) + local filename = self.filename + local extension = vim.fn.fnamemodify(filename, ":e") + self.icon, self.icon_color = + require("nvim-web-devicons").get_icon_color(filename, extension, { default = true }) + end, + provider = function(self) + return self.icon and (" " .. self.icon .. " ") + end, + hl = function(self) + return { fg = self.icon_color } + end, +} + +-- Here the filename block finally comes together +local TablineFileNameBlock = { + init = function(self) + self.filename = vim.api.nvim_buf_get_name(self.bufnr) + end, + hl = function(self) + if self.is_active then + return "TabLineSel" + -- why not? + --elseif not vim.api.nvim_buf_is_loaded(self.bufnr) then + --return { fg = "gray", bg = colors.bg } + else + return "TabLine" + end + end, + on_click = { + callback = function(_, minwid, _, button) + if button == "m" then -- close on mouse middle click + vim.api.nvim_buf_delete(minwid, { force = false }) + else + vim.api.nvim_win_set_buf(0, minwid) + end + end, + minwid = function(self) + return self.bufnr + end, + name = "heirline_tabline_buffer_callback", + }, + TablineBufnr, + --FileIcon, -- turns out the version defined in #crash-course-part-ii-filename-and-friends can be reutilized as is here! + TablineFileIcon, + TablineFileName, + TablineFileFlags, +} + +-- a nice "x" button to close the buffer +local TablineCloseButton = { + condition = function(self) + return not vim.api.nvim_buf_get_option(self.bufnr, "modified") + end, + { provider = " " }, + { + provider = " ", + --hl = { fg = "red", bg = colors.bg }, + hl = { fg = "red" }, + on_click = { + callback = function(_, minwid) + vim.api.nvim_buf_delete(minwid, { force = false }) + end, + minwid = function(self) + return self.bufnr + end, + name = "heirline_tabline_close_buffer_callback", + }, + }, +} + +-- The final touch! +--local TablineBufferBlock = utils.surround({ "", "", hl = { bg =colors.bg } }, function(self) +-- if self.is_active then +-- return utils.get_highlight("TabLineSel").fg, utils.get_highlight("TabLineSel").bg +-- else +-- return utils.get_highlight("TabLine").fg, utils.get_highlight("TabLine").bg +-- end +----end, { TabLine, TablineFileNameBlock, TablineCloseButton }) +--end, { TablineFileNameBlock, TablineCloseButton }) + +--local TablineBufferBlock = utils.surround({ "█", "█" }, "bg", { +-- hl = function() +-- if not conditions.is_active() then +-- return { fg = "gray", force = true, bg = colors.bg } +-- end +-- end, +-- TablineFileNameBlock, +-- TablineCloseButton, +--}) +--local TablineBufferBlock = utils.surround({ "█", "█" }, +-- { hl = function(self) +-- local mode = self.mode:sub(1, 1) -- get only the first mode character +-- --return { fg = self.mode_colors[mode], bold = true, } +-- return { bg = self.mode_colors[mode], fg = colors.bg, bold = true } +-- end, }, +--{ TablineFileNameBlock, TablineCloseButton, { hl = ViMode }, }) + +--local TablineBufferBlock = { +-- init = function(self) +-- +-- self.mode = vim.fn.mode(1) -- :h mode() +-- +-- vim.api.nvim_create_autocmd("ModeChanged", { +-- pattern = "*:*o", +-- command = "redrawstatus", +-- }) +-- self.once = true +-- end, +-- static = { +-- mode_colors = { +-- n = colors.blue, +-- i = colors.green, +-- v = colors.purple, +-- V = colors.purple, +-- [""] = colors.purple, +-- c = colors.red, +-- s = colors.purple, +-- S = colors.purple, +-- [""] = colors.purple, +-- R = colors.orange, +-- r = colors.orange, +-- ["!"] = colors.red, +-- t = colors.red, +-- }, +-- }, +-- hl = function(self) +-- if self.is_active then +-- local mode = self.mode:sub(1, 1) -- get only the first mode character +-- --return { fg = self.mode_colors[mode], bold = true, } +-- return { bg = self.mode_colors[mode], fg = colors.bg, bold = true } +-- else +-- return utils.get_highlight("TabLine").bg +-- end +-- end, +-- update = { +-- "ModeChanged", +-- }, --optional +-- { TablineFileNameBlock, TablineCloseButton } +--} + +--local TabLineSel = { +-- hl = { bg = self.mode_colors[mode], fg = colors.bg, bold = true } +--} +--local ViMode2 = { +-- init = function(self) +-- self.mode = vim.fn.mode() +-- end, +-- static = { +-- mode_colors = { +-- n = "red", +-- i = "green", +-- v = "blue", +-- c = "orange" +-- +-- } +-- }, +-- provider = function(self) +-- return string.upper(self.mode) +-- end, +-- hl = function(self) +-- return { fg = self.mode_colors[self.mode], bold = true, } +-- end +--} +--local surrr = { +-- utils.surround({ "", "" }, "red", { +-- utils.surround({ "", "" }, "green", utils.surround({ "", "" }, "blue", { provider = "heyya" })), +-- { provider = "Normal" }, +-- }), +--} +--local statusline = ViMode + +--local TablineBufferBlock = utils.surround({ "", "" }, function(self) +-- if self.is_active then +-- --self.mode = vim.fn.mode(1) -- :h mode() +-- +-- --return utils.get_highlight(vim.api.nvim_get_mode().mode).bg +-- return utils.get_highlight("TabLineSel").bg +-- --return utils.get_highlight("Normal").bg +-- --local mode = self.mode:sub(1, 1) -- get only the first mode character +-- --return { bg = TabLineSel, fg = colors.bg, bold = true } +-- else +-- return utils.get_highlight("TabLine").bg +-- end +--end, { TablineFileNameBlock, TablineCloseButton }) + +local TablineBufferBlock = utils.surround({ "█", "▎" }, function(self) + --local TablineBufferBlock = utils.surround({ "█", "█" }, function(self) + if self.is_active then + return utils.get_highlight("TabLineSel").bg + else + return utils.get_highlight("TabLine").bg + end +end, { TablineFileNameBlock, TablineCloseButton }) +--█ +--local TablineBufferBlock = { +-- init = function(self) +-- self.mode = vim.fn.mode() +-- end, +-- static = { +-- mode_colors = { +-- n = colors.blue, +-- i = colors.green, +-- v = colors.purple, +-- V = colors.purple, +-- [""] = colors.purple, +-- c = colors.red, +-- s = colors.purple, +-- S = colors.purple, +-- [""] = colors.purple, +-- R = colors.orange, +-- r = colors.orange, +-- ["!"] = colors.red, +-- t = colors.red, +-- }, +-- }, +-- hl = function(self) +-- if conditions.is_active() then +-- return { bg = self.mode_colors[self.mode], fg = colors.bg, bold = true } +-- else +-- return utils.get_highlight("Tabline").bg +-- end +-- end, +-- update = { +-- "ModeChanged", +-- }, --optional +-- { TablineFileNameBlock, TablineCloseButton }, +--} + +--local TablineBufferBlock = { +-- static = { +-- mode_colors_map = { +-- n = colors.blue, +-- i = colors.green, +-- v = colors.purple, +-- V = colors.purple, +-- [""] = colors.purple, +-- c = colors.red, +-- s = colors.purple, +-- S = colors.purple, +-- [""] = colors.purple, +-- R = colors.orange, +-- r = colors.orange, +-- ["!"] = colors.red, +-- t = colors.red, +-- }, +-- mode_color = function(self) +-- local mode = conditions.is_active() and vim.fn.mode() or "n" +-- return self.mode_colors_map[mode] +-- end, +-- }, +-- { -- A special winbar for terminals +-- condition = function() +-- return conditions.buffer_matches({ buftype = { "terminal" } }) +-- end, +-- utils.surround({ "", "" }, "dark_red", { +-- FileType, +-- Space, +-- TerminalName, +-- }), +-- }, +-- { -- An inactive winbar for regular files +-- condition = function() +-- return conditions.is_not_active() +-- end, +-- utils.surround({ "█", "█" }, function() return utils.get_highlight("TabLine").bg end, { TablineFileNameBlock, TablineCloseButton } ) +-- }, +-- { +-- condition = function() +-- return conditions.is_active() +-- end, +-- utils.surround({ "█", "█" }, function(self) return self:mode_color() end, { TablineFileNameBlock, TablineCloseButton, hl = { fg = colors.bg, force = true } } ) +-- }, +--function() +--if self.is_active then +--utils.surround({ "", "" }, "bright_bg", { hl = { fg = "gray", force = true }, FileNameBlock }), +--utils.surround({ "", "" }, function(self) return self:mode_color() end, { FileNameBlock, hl = { fg = colors.bg, force = true } } ), +--utils.surround({ "█", "█" }, function() return utils.get_highlight("TabLine").bg end, { TablineFileNameBlock, TablineCloseButton, hl = { fg = colors.bg, force = true } } ), +--} +--ViMode = utils.surround({ "", "" }, function(self) +-- if self.is_active then +-- return self:mode_color() +-- else +-- return utils.get_highlight("TabLine").bg +-- end +-- end, { ViMode, hl = { fg = utils.get_highlight("statusline").bg, force = true } } ) +-- +----} +--local TablineBufferBlock = { +-- ViMode, +-- TablineFileName, +-- TablineCloseButton, +--} +-- A winbar for regular files +--utils.surround({ "", "" }, "bright_bg", FileNameBlock), +--utils.surround({ "", "" }, function(self) return self:mode_color() end, FileNameBlock), +local BufferLine = utils.make_buflist( + TablineBufferBlock, + { provider = "", hl = { fg = "gray" } }, -- left truncation, optional (defaults to "<") + { provider = "", hl = { fg = "gray" } } -- right trunctation, also optional (defaults to ...... yep, ">") + --{ provider = "", hl = { fg = "gray" } }, -- left truncation, optional (defaults to "<") + --{ provider = "", hl = { fg = "gray" } } -- right trunctation, also optional (defaults to ...... yep, ">") + -- by the way, open a lot of buffers and try clicking them ;) +) + +-- if self.is_active then +-- return utils.get_highlight("TabLineSel").bg +-- else +-- return utils.get_highlight("TabLine").bg +-- end +--end, { TablineFileNameBlock, TablineCloseButton, } ) +-- TabList +local Tabpage = { + provider = function(self) + return "%" .. self.tabnr .. "T " .. self.tabnr .. " %T" + end, + hl = function(self) + if not self.is_active then + return "TabLine" + else + return "TabLineSel" + end + end, +} + +local TabpageClose = { + provider = "%999X %X", + --hl = "TabLine", + hl = { fg = colors.red, bg = colors.bg }, +} + +local TabPages = { + -- only show this component if there's 2 or more tabpages + condition = function() + return #vim.api.nvim_list_tabpages() >= 2 + end, + { provider = "%=" }, + utils.make_tablist(Tabpage), + TabpageClose, +} + +-- TabLineOffset +local TabLineOffset = { + condition = function(self) + local win = vim.api.nvim_tabpage_list_wins(0)[1] + local bufnr = vim.api.nvim_win_get_buf(win) + self.winid = win + + if vim.bo[bufnr].filetype == "NvimTree" then + self.title = "NvimTree" + return true + -- elseif vim.bo[bufnr].filetype == "TagBar" then + -- ... + end + end, + + provider = function(self) + local title = self.title + local width = vim.api.nvim_win_get_width(self.winid) + local pad = math.ceil((width - #title) / 2) + return string.rep(" ", pad) .. title .. string.rep(" ", pad) + end, + + hl = function(self) + if vim.api.nvim_get_current_win() == self.winid then + return "TablineSel" + else + return "Tabline" + end + end, +} + +local TabLine = { + --hl = { bg = colors.bg }, + fallthrough = false, + TabLineOffset, + BufferLine, + TabPages, +} + +vim.cmd([[au FileType * if index(['wipe', 'delete', 'unload'], &bufhidden) >= 0 | set nobuflisted | endif]]) +--local StatusLines = { +-- +-- hl = function() +-- if conditions.is_active() then +-- return "StatusLine" +-- else +-- return "StatusLineNC" +-- end +-- end, +-- +-- -- the first statusline with no condition, or which condition returns true is used. +-- -- think of it as a switch case with breaks to stop fallthrough. +-- fallthrough = false, +-- +-- SpecialStatusline, +-- TerminalStatusline, +-- --InactiveStatusline, +-- DefaultStatusline, +--} +-- +-- --hl = { fg = utils.get_highlight("Statusline").fg, bold = true, bg = colors.bg }, +-- hl = { bg = colors.bg }, +--local TabLine ={ +-- hl = { bg = colors.bg }, +--} +-- Window Close button: Let the callback know from which window it was clicked from! +-- The following is the recommended way of achieving that: +require("heirline").setup(StatusLines, WinBars, TabLine) + +-- Yep, with heirline we're driving manual! +vim.cmd([[au FileType * if index(['wipe', 'delete', 'unload'], &bufhidden) >= 0 | set nobuflisted | endif]]) + +vim.api.nvim_create_augroup("Heirline", { clear = true }) +vim.api.nvim_create_autocmd("ColorScheme", { + callback = function() + local colors = setup_colors() + utils.on_colorscheme(colors) + end, + group = "Heirline", +}) + +local function get_bufs() + return vim.tbl_filter(function(bufnr) + return vim.api.nvim_buf_is_loaded(bufnr) and vim.bo[bufnr].buflisted + end, vim.api.nvim_list_bufs()) +end + +local function goto_buf(index) + local bufs = get_bufs() + if index > #bufs then + index = #bufs + end + vim.api.nvim_win_set_buf(0, bufs[index]) +end + +local function addKey(key, index) + vim.keymap.set("", "<A-" .. key .. ">", function() + goto_buf(index) + end, { noremap = true, silent = true }) +end + +for i = 1, 9 do + addKey(i, i) +end +addKey("0", 10) +-- Theming +--local function setup_colors() +-- return { +-- bright_bg = utils.get_highlight("Folded").bg, +-- bright_fg = utils.get_highlight("Folded").fg, +-- red = utils.get_highlight("DiagnosticError").fg, +-- dark_red = utils.get_highlight("DiffDelete").bg, +-- green = utils.get_highlight("String").fg, +-- blue = utils.get_highlight("Function").fg, +-- gray = utils.get_highlight("NonText").fg, +-- orange = utils.get_highlight("Constant").fg, +-- purple = utils.get_highlight("Statement").fg, +-- cyan = utils.get_highlight("Special").fg, +-- diag_warn = utils.get_highlight("DiagnosticWarn").fg, +-- diag_error = utils.get_highlight("DiagnosticError").fg, +-- diag_hint = utils.get_highlight("DiagnosticHint").fg, +-- diag_info = utils.get_highlight("DiagnosticInfo").fg, +-- git_del = utils.get_highlight("diffDeleted").fg, +-- git_add = utils.get_highlight("diffAdded").fg, +-- git_change = utils.get_highlight("diffChanged").fg, +-- } +--end +--require('heirline').load_colors(setup_colors()) +-- +--vim.api.nvim_create_augroup("Heirline", { clear = true }) +--vim.api.nvim_create_autocmd("ColorScheme", { +-- callback = function() +-- local colors = setup_colors() +-- utils.on_colorscheme(colors) +-- end, +-- group = "Heirline", +--}) |
