Minimal feline configuration.

February 3, 2024 · View on GitHub

local present, feline = pcall(require, "feline") if not present then return end

-- Customizations {{{ local theme = { aqua = "#7AB0DF", bg = "#1C212A", blue = "#5FB0FC", cyan = "#70C0BA", darkred = "#FB7373", fg = "#C7C7CA", gray = "#222730", green = "#79DCAA", lime = "#54CED6", orange = "#FFD064", pink = "#D997C8", purple = "#C397D8", red = "#F87070", yellow = "#FFE59E" }

local mode_theme = { ["NORMAL"] = theme.green, ["OP"] = theme.cyan, ["INSERT"] = theme.aqua, ["VISUAL"] = theme.yellow, ["LINES"] = theme.darkred, ["BLOCK"] = theme.orange, ["REPLACE"] = theme.purple, ["V-REPLACE"] = theme.pink, ["ENTER"] = theme.pink, ["MORE"] = theme.pink, ["SELECT"] = theme.darkred, ["SHELL"] = theme.cyan, ["TERM"] = theme.lime, ["NONE"] = theme.gray, ["COMMAND"] = theme.blue, }

local modes = setmetatable({ ["n"] = "N", ["no"] = "N", ["v"] = "V", ["V"] = "VL", [""] = "VB", ["s"] = "S", ["S"] = "SL", [""] = "SB", ["i"] = "I", ["ic"] = "I", ["R"] = "R", ["Rv"] = "VR", ["c"] = "C", ["cv"] = "EX", ["ce"] = "X", ["r"] = "P", ["rm"] = "M", ["r?"] = "C", ["!"] = "SH", ["t"] = "T", }, { __index = function() return "-" end }) -- }}}

-- Components {{{ local component = {}

component.vim_mode = { provider = function() return modes[vim.api.nvim_get_mode().mode] end, hl = function() return { fg = "bg", bg = require("feline.providers.vi_mode").get_mode_color(), style = "bold", name = "NeovimModeHLColor", } end, left_sep = "block", right_sep = "block", }

component.git_branch = { provider = "git_branch", hl = { fg = "fg", bg = "bg", style = "bold", }, left_sep = "block", right_sep = "", }

component.git_add = { provider = "git_diff_added", hl = { fg = "green", bg = "bg", }, left_sep = "", right_sep = "", }

component.git_delete = { provider = "git_diff_removed", hl = { fg = "red", bg = "bg", }, left_sep = "", right_sep = "", }

component.git_change = { provider = "git_diff_changed", hl = { fg = "purple", bg = "bg", }, left_sep = "", right_sep = "", }

component.separator = { provider = "", hl = { fg = "bg", bg = "bg", }, }

component.diagnostic_errors = { provider = "diagnostic_errors", hl = { fg = "red", }, }

component.diagnostic_warnings = { provider = "diagnostic_warnings", hl = { fg = "yellow", }, }

component.diagnostic_hints = { provider = "diagnostic_hints", hl = { fg = "aqua", }, }

component.diagnostic_info = { provider = "diagnostic_info", }

component.lsp = { provider = function() if not rawget(vim, "lsp") then return "" end

local progress = vim.lsp.util.get_progress_messages()[1]
if vim.o.columns < 120 then
  return ""
end

local clients = vim.lsp.get_active_clients({ bufnr = 0 })
if #clients ~= 0 then
  if progress then
    local spinners = {
      "◜ ",
      "◠ ",
      "◝ ",
      "◞ ",
      "◡ ",
      "◟ ",
    }
    local ms = vim.loop.hrtime() / 1000000
    local frame = math.floor(ms / 120) % #spinners
    local content = string.format("%%<%s", spinners[frame + 1])
    return content or ""
  else
    return "לּ LSP"
  end
end
return ""

end, hl = function() local progress = vim.lsp.util.get_progress_messages()[1] return { fg = progress and "yellow" or "green", bg = "gray", style = "bold", } end, left_sep = "", right_sep = "block", }

component.file_type = { provider = { name = "file_type", opts = { filetype_icon = true, }, }, hl = { fg = "fg", bg = "gray", }, left_sep = "block", right_sep = "block", }

component.scroll_bar = { provider = function() local chars = setmetatable({ " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", }, { __index = function() return " " end }) local line_ratio = vim.api.nvim_win_get_cursor(0)[1] / vim.api.nvim_buf_line_count(0) local position = math.floor(line_ratio * 100)

local icon = chars[math.floor(line_ratio * #chars)] .. position
if position <= 5 then
  icon = " TOP"
elseif position >= 95 then
  icon = " BOT"
end
return icon

end, hl = function() local position = math.floor(vim.api.nvim_win_get_cursor(0)[1] / vim.api.nvim_buf_line_count(0) * 100) local fg local style

if position <= 5 then
  fg = "aqua"
  style = "bold"
elseif position >= 95 then
  fg = "red"
  style = "bold"
else
  fg = "purple"
  style = nil
end
return {
  fg = fg,
  style = style,
  bg = "bg",
}

end, left_sep = "block", right_sep = "block", } -- }}}

-- Arrangements -- {{{ vim.api.nvim_set_hl(0, "StatusLine", { bg = "#101317", fg = "#7AB0DF" }) feline.setup({ components = { active = { {}, -- left {}, -- middle { -- right component.vim_mode, component.file_type, component.lsp, component.git_branch, component.git_add, component.git_delete, component.git_change, component.separator, component.diagnostic_errors, component.diagnostic_warnings, component.diagnostic_info, component.diagnostic_hints, component.scroll_bar, }, }, }, theme = theme, vi_mode_colors = mode_theme, }) -- }}}