return { -- colorscheme { "folke/tokyonight.nvim", lazy = false, priority = 1000, config = function() require("tokyonight").setup({ style = "night", styles = { sidebars = "dark", floats = "dark", }, sidebars = { "qf", "help", "Outline" }, on_colors = function(colors) colors.bg = "#16161E" colors.bg_dark = "#0d0d12" end, on_highlights = function(hl, colors) hl.DiagnosticVirtualTextError = { fg = colors.comment } hl.DiagnosticVirtualTextHint = { fg = colors.comment } hl.DiagnosticVirtualTextInfo = { fg = colors.comment } hl.DiagnosticVirtualTextWarn = { fg = colors.comment } end, }) vim.cmd.colorscheme("tokyonight") end, }, -- icons { "nvim-tree/nvim-web-devicons", }, -- statusline { "nvim-lualine/lualine.nvim", event = "VeryLazy", config = function() local lualine = require("lualine") local themecolor = require("tokyonight.colors").setup() local colors = { bg = "#0d0d12", fg = themecolor.fg_dark, yellow = themecolor.yellow, cyan = themecolor.cyan, green = themecolor.green, magenta = themecolor.magenta, blue = themecolor.blue, red = themecolor.red, low = themecolor.terminal_black, mode = themecolor.terminal_black, bg2 = "#292e42", bg3 = "#16161e" } local mode_color = { n = colors.blue, i = colors.green, v = colors.magenta, ["^V"] = colors.magenta, V = colors.magenta, c = colors.blue, no = colors.red, ic = colors.yellow, R = colors.red, Rv = colors.red, cv = colors.red, ce = colors.red, r = colors.blue, rm = colors.blue, ["r?"] = colors.blue, ["!"] = colors.blue, t = colors.blue, } local conditions = { buffer_not_empty = function() return vim.fn.empty(vim.fn.expand("%:t")) ~= 1 end, hide_in_width = function() return vim.fn.winwidth(0) > 80 end, check_git_workspace = function() local filepath = vim.fn.expand("%:p:h") local gitdir = vim.fn.finddir(".git", filepath .. ";") return gitdir and #gitdir > 0 and #gitdir < #filepath end, } local config = { options = { component_separators = "", section_separators = "", disabled_filetypes = { "help", "lazy", "mason", "fzf", "lspinfo", "alpha" }, theme = { normal = { c = { fg = colors.fg, bg = colors.bg3 } }, inactive = { c = { fg = colors.fg, bg = colors.bg3 } }, }, }, sections = { lualine_a = {}, lualine_b = {}, lualine_y = {}, lualine_z = {}, lualine_c = {}, lualine_x = {}, }, inactive_sections = { lualine_a = {}, lualine_b = {}, lualine_y = {}, lualine_z = {}, lualine_c = {}, lualine_x = {}, }, } local function ins_left(component) table.insert(config.sections.lualine_c, component) end local function ins_right(component) table.insert(config.sections.lualine_x, component) end ins_left({ function() return "" end, color = { fg = colors.bg2, bg = colors.bg3 }, padding = { left = 0, right = 0 }, }) ins_left({ function() return " " -- return " " -- return " " end, color = function() return { fg = mode_color[vim.fn.mode()], bg = colors.bg2 } end, padding = { left = 0, right = 0 }, }) ins_left({ function() return "" end, color = { fg = colors.bg2 }, padding = { left = 0, right = 1 }, }) ins_left({ "buffers", buffers_color = { active = { fg = colors.magenta, bg = colors.bg3 }, inactive = { fg = colors.low, bg = colors.bg3 }, }, symbols = { modified = " ●", alternate_file = "", }, cond = conditions.buffer_not_empty, color = { fg = colors.magenta, gui = "bold" }, }) ins_right({ function() if vim.bo.filetype == "txt" or vim.bo.filetype == "markdown" or vim.bo.filetype == "tex" then if vim.fn.wordcount().visual_words == 1 then return tostring(vim.fn.wordcount().visual_words) .. " word" elseif not (vim.fn.wordcount().visual_words == nil) then return tostring(vim.fn.wordcount().visual_words) .. " words" else return tostring(vim.fn.wordcount().words) .. " words" end else return "" end end, color = { fg = colors.low }, }) ins_right({ -- Lsp server name function() local msg = "Inactive" local buf_ft = vim.api.nvim_buf_get_option(0, "filetype") local clients = vim.lsp.get_active_clients() if next(clients) == nil then return msg end for _, client in ipairs(clients) do local filetypes = client.config.filetypes if filetypes and vim.fn.index(filetypes, buf_ft) ~= -1 then return client.name end end return msg end, icon = " ", color = { fg = colors.low }, }) ins_right({ "branch", icon = "", color = { fg = colors.low, gui = "bold" }, }) ins_right({ "diff", symbols = { added = " ", modified = " ", removed = " " }, diff_color = { added = { fg = colors.low }, modified = { fg = colors.low }, removed = { fg = colors.low }, }, cond = conditions.hide_in_width, }) ins_right({ "location", color = function() return { fg = mode_color[vim.fn.mode()] } end, padding = { left = 0, right = 1 }, }) ins_right({ function() return "" end, color = { fg = colors.bg2 }, padding = { left = 0, right = 0 }, }) ins_right({ "progress", color = function() return { fg = mode_color[vim.fn.mode()], bg = colors.bg2, gui = "bold" } end, padding = { left = 0, right = 0 }, }) ins_right({ function() return "" end, color = { fg = colors.bg2, bg = colors.bg3 }, padding = { left = 0, right = 0 }, }) lualine.setup(config) end, }, -- indentation lines { "lukas-reineke/indent-blankline.nvim", main = "ibl", event = "VeryLazy", opts = { -- scope = { enabled = false }, scope = { enabled = true }, exclude = { filetypes = { "help", "lazy", "mason", "outline", "toggleterm", "fzf", "lspinfo" }, }, }, }, -- dashboard { "goolord/alpha-nvim", event = "VimEnter", config = function() local dashboard = require("alpha.themes.dashboard") local create_gradient = function(start, finish, steps) local r1, g1, b1 = tonumber("0x" .. start:sub(2, 3)), tonumber("0x" .. start:sub(4, 5)), tonumber("0x" .. start:sub(6, 7)) local r2, g2, b2 = tonumber("0x" .. finish:sub(2, 3)), tonumber("0x" .. finish:sub(4, 5)), tonumber("0x" .. finish:sub(6, 7)) local r_step = (r2 - r1) / steps local g_step = (g2 - g1) / steps local b_step = (b2 - b1) / steps local gradient = {} for i = 1, steps do local r = math.floor(r1 + r_step * i) local g = math.floor(g1 + g_step * i) local b = math.floor(b1 + b_step * i) table.insert(gradient, string.format("#%02x%02x%02x", r, g, b)) end return gradient end local function apply_gradient_hl(text) local gradient = create_gradient("#7aa2f7", "#414868", #text) local lines = {} for i, line in ipairs(text) do local tbl = { type = "text", val = line, opts = { hl = "HeaderGradient" .. i, shrink_margin = false, position = "center", }, } table.insert(lines, tbl) -- create hl group vim.api.nvim_set_hl(0, "HeaderGradient" .. i, { fg = gradient[i] }) end return { type = "group", val = lines, opts = { position = "center" }, } end local headers = require("ascii") dashboard.section.buttons.val = { dashboard.button("r", " Recent files", ":lua require('fzf-lua').oldfiles()"), dashboard.button("e", " New file", ":ene startinsert "), dashboard.button("p", " Projects", function() local contents = require("project_nvim").get_recent_projects() local reverse = {} for i = #contents, 1, -1 do reverse[#reverse + 1] = contents[i] end require("fzf-lua").fzf_exec(reverse, { actions = { ["default"] = function(e) -- vim.cmd.cd(e[1]) require("fzf-lua").files({ cwd = e[1] }) end, ["ctrl-d"] = function(x) local choice = vim.fn.confirm("Delete '" .. #x .. "' projects? ", "&Yes\n&No", 2) if choice == 1 then local history = require("project_nvim.utils.history") for _, v in ipairs(x) do history.delete_project(v) end end end, }, winopts = { height = 0.3, width = 0.5, }, }) end), dashboard.button("f", " Find file", ":lua require('fzf-lua').files()"), dashboard.button("t", "󱎸 Find text", ":lua require('fzf-lua').live_grep_native()"), dashboard.button("s", " Restore Session", ":lua require('persistence').load()"), dashboard.button("n", "󰠮 Notes", ":lua require('fzf-lua').files({cwd =[[~/notes]]})"), dashboard.button("c", " Configuration", ":e $MYVIMRC "), dashboard.button("z", "󰒲 Lazy", ":Lazy"), dashboard.button("q", " Quit Neovim", ":qa"), } dashboard.section.buttons.opts.spacing = 0 vim.api.nvim_create_autocmd("User", { pattern = "LazyVimStarted", callback = function() local stats = require("lazy").stats() local ms = (math.floor(stats.startuptime * 100 + 0.5) / 100) dashboard.section.footer.val = "󱎫 " .. ms .. " ms" pcall(vim.cmd.AlphaRedraw) end, }) local headerKeys = {} for key, _ in pairs(headers) do table.insert(headerKeys, key) end local randomHeader = headerKeys[math.random(#headerKeys)] dashboard.config.layout = { { type = "padding", val = 3 }, -- options = randomHeader, raven, yggdrasil, -- void_stranger, aot, meatboy, isaac, gta, -- hydra, spider, morse, sharp, galaxy, apply_gradient_hl(headers[randomHeader]), { type = "padding", val = 4 }, dashboard.section.buttons, { type = "padding", val = 4 }, dashboard.section.footer, } dashboard.opts.opts.noautocmd = true require("alpha").setup(dashboard.opts) end, }, -- zen-mode { "folke/zen-mode.nvim", opts = { window = { backdrop = 0, width = 100, height = 0.85, }, plugins = { gitsigns = { enabled = false }, kitty = { enabled = true, font = "+2", }, }, }, keys = { { "z", ":lua require('zen-mode').toggle()", desc = "[Z]en Mode", silent = true }, }, }, }