Skip to content

Instantly share code, notes, and snippets.

@dharmx
Last active March 21, 2024 06:14
Show Gist options
  • Star 11 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dharmx/47139967b0c4303572e3742af725300c to your computer and use it in GitHub Desktop.
Save dharmx/47139967b0c4303572e3742af725300c to your computer and use it in GitHub Desktop.
Minimal feline configuration.
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,
})
-- }}}
@dharmx
Copy link
Author

dharmx commented Dec 4, 2022

see https://github.com/sindresorhus/cli-spinners/blob/main/spinners.json for more spinners.

@vulbyte
Copy link

vulbyte commented Jul 12, 2023

hey there, so if this is a stupid question but i love this theme and have spent the last few hours trying to get it to work, so maybe i'm just not understanding it. so if you have a second i would love a moment of your time for a bit of help

i have a ./nvim/lua/vulbyte/packer.lua file and a ./nvim/feline.lua, the latter containing your theme, and in the packer file (where i initialize all my packages) i attempt to init and call it with:

 use("freddiehaddad/feline.nvim")
            require('feline').setup()
            require('feline').winbar.setup()
            require('feline').statuscolumn.setup()
            require('feline').add_theme('mode_theme', mode_theme)

i have attempted to modify it to be a global var but that seems to have failed as well.

sorry again if this is something obvious i'm just missing

@dharmx
Copy link
Author

dharmx commented Jul 13, 2023

Location of feline.lua: ~/.config/nvim/lua/plugins/feline.lua

For packer:

use({
  "freddiehaddad/feline.nvim",
  config = function()
    require("plugins.feline") -- the location of this GIST.
  end,
})

For lazy:

{
  "freddiehaddad/feline.nvim",
  config = function()
    require("plugins.feline") -- the location of this GIST.
  end,
}

@sphyrnidae8
Copy link

Hi dharmx! Im also amazed by your theme.
I did what you suggested to vulbyte and get this error

Error detected while processing /Users/sphyrnidae/.config/nvim/init.lua:
Invalid spec module: plugins.feline
Expected a table of specs, but a boolean was returned instead

Do you know what this could be?

@dharmx
Copy link
Author

dharmx commented Feb 3, 2024

For that to work you'd need to create a plugins folder after /Users/sphyrnidae/.config, for instance.
Then create a file called feline.lua and paste the contents of the gist there.
After that you'd add a new entry defining the feline.nvim plugin (if you already have them defined then use the existing one).

It is hard to say but that error seems to be lazy.nvim specific. I think you have placed the gist in your specs folder but, this gist does not follow lazy.nvim specification format.

@Deeepkk
Copy link

Deeepkk commented Mar 9, 2024

@sphyrnidae8 I don't think it is lazy.nvim specific error. Just paste the whole gist code , in place of require("plugins.feline").
Or create files init.lua, dharmx.lua in lua/plugins/feline/ and call it by require("plugins.feline.dharmx") in feline/init.lua

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment